diff --git a/CRM/Civicase/Hook/BuildForm/AttachQuotationToInvoiceMail.php b/CRM/Civicase/Hook/BuildForm/AttachQuotationToInvoiceMail.php index 74a660cb0..6150bc8e4 100644 --- a/CRM/Civicase/Hook/BuildForm/AttachQuotationToInvoiceMail.php +++ b/CRM/Civicase/Hook/BuildForm/AttachQuotationToInvoiceMail.php @@ -21,8 +21,21 @@ public function run(CRM_Core_Form &$form, $formName) { return; } - $form->add('checkbox', 'attach_quote', ts('Attach Quotation')); - $form->setDefaults(array_merge($form->_defaultValues, ['attach_quote' => TRUE])); + $contributionId = CRM_Utils_Request::retrieve('id', 'Positive', $form, FALSE); + $salesOrder = Contribution::get() + ->addSelect('Opportunity_Details.Quotation') + ->addWhere('Opportunity_Details.Quotation', 'IS NOT EMPTY') + ->addWhere('id', 'IN', explode(',', $contributionId)) + ->addChain('salesOrder', CaseSalesOrder::get() + ->addWhere('id', '=', '$Opportunity_Details.Quotation') + ) + ->execute() + ->getArrayCopy(); + + if (!empty($salesOrder)) { + $form->add('checkbox', 'attach_quote', ts('Attach Quotation')); + $form->setDefaults(array_merge($form->_defaultValues, ['attach_quote' => TRUE])); + } CRM_Core_Region::instance('page-body')->add([ 'template' => "CRM/Civicase/Form/Contribute/AttachQuotation.tpl", @@ -53,17 +66,7 @@ private function shouldRun($form, $formName) { return FALSE; } - $salesOrder = Contribution::get() - ->addSelect('Opportunity_Details.Quotation') - ->addWhere('Opportunity_Details.Quotation', 'IS NOT EMPTY') - ->addWhere('id', 'IN', explode(',', $contributionId)) - ->addChain('salesOrder', CaseSalesOrder::get() - ->addWhere('id', '=', '$Opportunity_Details.Quotation') - ) - ->execute() - ->getArrayCopy(); - - return !empty($salesOrder); + return TRUE; } } diff --git a/Civi/Api4/CaseSalesOrder.php b/Civi/Api4/CaseSalesOrder.php index f74898f80..1e0ab4181 100644 --- a/Civi/Api4/CaseSalesOrder.php +++ b/Civi/Api4/CaseSalesOrder.php @@ -73,4 +73,14 @@ public static function computeTotalAmountInvoiced(bool $checkPermissions = FALSE ->setCheckPermissions($checkPermissions); } + /** + * {@inheritDoc} + */ + public static function permissions() { + return [ + 'meta' => ['access CiviCRM'], + 'default' => ['access CiviCRM'], + ]; + } + } diff --git a/Civi/Api4/CaseSalesOrderLine.php b/Civi/Api4/CaseSalesOrderLine.php index d1f999001..806fc018b 100644 --- a/Civi/Api4/CaseSalesOrderLine.php +++ b/Civi/Api4/CaseSalesOrderLine.php @@ -13,4 +13,14 @@ */ class CaseSalesOrderLine extends DAOEntity { + /** + * {@inheritDoc} + */ + public static function permissions() { + return [ + 'meta' => ['access CiviCRM'], + 'default' => ['access CiviCRM'], + ]; + } + } diff --git a/ang/civicase-features/quotations/directives/quotations-create.directive.js b/ang/civicase-features/quotations/directives/quotations-create.directive.js index 5efdac61b..b6721466e 100644 --- a/ang/civicase-features/quotations/directives/quotations-create.directive.js +++ b/ang/civicase-features/quotations/directives/quotations-create.directive.js @@ -211,18 +211,11 @@ }; const productId = $scope.salesOrder.items[index].product_id; - if (productsCache.has(productId)) { - updateProductDependentFields(productId); - return; - } - - civicaseCrmApi('Product', 'get', { id: productId }) - .then(function (result) { - if (result.count > 0) { - productsCache.set(productId, result.values[productId]); - updateProductDependentFields(productId); - } - }); + getProduct(productId).then(function (result) { + if (result) { + updateProductDependentFields(productId); + } + }); } /** @@ -235,6 +228,9 @@ select: ['membership_type_id.Product_Discounts.Product_Discount_Amount'], where: [['contact_id', '=', clientID], ['status_id.is_current_member', '=', true]] }).then(function (results) { + if (!results || results.length < 1) { + return; + } let discountPercentage = 0; results.forEach((membership) => { discountPercentage += membership['membership_type_id.Product_Discounts.Product_Discount_Amount']; @@ -327,9 +323,14 @@ * * @param {number} index index of the sales order line item */ - function validateProductPrice (index) { + async function validateProductPrice (index) { const productId = $scope.salesOrder.items[index].product_id; - const shouldCompareCost = productId && productsCache.has(productId) && parseFloat(productsCache.get(productId).cost) > 0; + if (!productId) { + return; + } + + const product = await getProduct(productId); + const shouldCompareCost = product && product.cost > 0; if (!shouldCompareCost) { return; } @@ -416,5 +417,31 @@ function formatMoney (value, currency) { return CRM.formatMoney(value, true, CurrencyCodes.getFormat(currency)); } + + /** + * Get product by ID + * + * @param {number} productId id of product to fetch + * + * @returns {Promise} product + */ + async function getProduct (productId) { + let product = null; + if (productsCache.has(productId)) { + return productsCache.get(productId); + } + + try { + const result = await civicaseCrmApi('Product', 'get', { id: productId }); + if (result.count > 0) { + product = result.values[productId]; + productsCache.set(productId, product); + } + } catch (error) { + return null; + } + + return product; + } } })(angular, CRM.$, CRM._); diff --git a/civicase.php b/civicase.php index c6ea37c15..0d0d2f9ce 100644 --- a/civicase.php +++ b/civicase.php @@ -227,6 +227,10 @@ function civicase_civicrm_buildForm($formName, &$form) { } $isSearchKit = CRM_Utils_Request::retrieve('sk', 'Positive'); + if ($formName == 'CRM_Contribute_Form_Task_PDF' && $isSearchKit) { + $form->add('hidden', 'mail_task_from_sk', $isSearchKit); + } + if ($formName == 'CRM_Contribute_Form_Task_Invoice' && $isSearchKit) { $form->add('hidden', 'mail_task_from_sk', $isSearchKit); CRM_Core_Resources::singleton()->addScriptFile( @@ -310,7 +314,12 @@ function civicase_civicrm_postProcess($formName, &$form) { $form->ajaxResponse['civicase_reload'] = $api['values']; } - if ($formName == 'CRM_Contribute_Form_Task_Invoice' && !empty($form->getVar('_submitValues')['mail_task_from_sk'])) { + if ( + in_array($formName, [ + 'CRM_Contribute_Form_Task_Invoice', 'CRM_Contribute_Form_Task_PDF', + ]) + && !empty($form->getVar('_submitValues')['mail_task_from_sk']) + ) { CRM_Utils_System::redirect($_SERVER['HTTP_REFERER']); } } @@ -604,5 +613,11 @@ function civicase_civicrm_searchTasks(string $objectName, array &$tasks) { 'url' => 'civicrm/contribute/task?reset=1&task_item=invoice&sk=1', 'key' => 'invoice', ]; + + foreach ($tasks as &$task) { + if ($task['class'] === 'CRM_Contribute_Form_Task_PDF') { + $task['url'] .= '&sk=1'; + } + } } } diff --git a/templates/CRM/Civicase/Form/Contribute/AttachQuotation.tpl b/templates/CRM/Civicase/Form/Contribute/AttachQuotation.tpl index 68e374fef..6770a4286 100644 --- a/templates/CRM/Civicase/Form/Contribute/AttachQuotation.tpl +++ b/templates/CRM/Civicase/Form/Contribute/AttachQuotation.tpl @@ -1,7 +1,7 @@ - +