From 4318735040bcc59a4f66ba5eaa98eef92c0cf4ba Mon Sep 17 00:00:00 2001 From: olayiwola-compucorp Date: Wed, 18 Oct 2023 06:21:05 +0100 Subject: [PATCH 1/5] BTHAB-257: Only display discount alert if discount is applied --- .../quotations/directives/quotations-create.directive.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ang/civicase-features/quotations/directives/quotations-create.directive.js b/ang/civicase-features/quotations/directives/quotations-create.directive.js index 5efdac61b..f165745f3 100644 --- a/ang/civicase-features/quotations/directives/quotations-create.directive.js +++ b/ang/civicase-features/quotations/directives/quotations-create.directive.js @@ -235,6 +235,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']; From 83c2d01a5c1848e772f3e4c0329a9e131c29b9f0 Mon Sep 17 00:00:00 2001 From: olayiwola-compucorp Date: Wed, 18 Oct 2023 08:38:50 +0100 Subject: [PATCH 2/5] BTHAB-257: Redirect quotation invoice receipt task to quotation list --- civicase.php | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/civicase.php b/civicase.php index 7d15c0fd1..db447b462 100644 --- a/civicase.php +++ b/civicase.php @@ -226,6 +226,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( @@ -309,7 +313,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']); } } @@ -603,5 +612,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'; + } + } } } From 5971179f3648778570130ae9a2bbba6d1b8489d9 Mon Sep 17 00:00:00 2001 From: olayiwola-compucorp Date: Wed, 18 Oct 2023 19:52:38 +0100 Subject: [PATCH 3/5] BTHAB-257: Validate product max price on edit --- .../directives/quotations-create.directive.js | 52 ++++++++++++++----- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/ang/civicase-features/quotations/directives/quotations-create.directive.js b/ang/civicase-features/quotations/directives/quotations-create.directive.js index f165745f3..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); + } + }); } /** @@ -330,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; } @@ -419,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._); From fcd225351dab78a1d820319829aafd6f8b224270 Mon Sep 17 00:00:00 2001 From: olayiwola-compucorp Date: Thu, 19 Oct 2023 09:24:47 +0100 Subject: [PATCH 4/5] BTHAB-257: Ensure the PDF option is always hidden in send invoice screen --- .../AttachQuotationToInvoiceMail.php | 29 ++++++++++--------- .../Form/Contribute/AttachQuotation.tpl | 2 +- 2 files changed, 17 insertions(+), 14 deletions(-) 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/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 @@ - +
From 15aa91baa86953d304d67a5033ab4098b39944e9 Mon Sep 17 00:00:00 2001 From: olayiwola-compucorp Date: Fri, 20 Oct 2023 11:29:49 +0100 Subject: [PATCH 5/5] BTHAB-257: Allow user to access quotation from Webform --- Civi/Api4/CaseSalesOrder.php | 10 ++++++++++ Civi/Api4/CaseSalesOrderLine.php | 10 ++++++++++ 2 files changed, 20 insertions(+) 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'], + ]; + } + }