From: Eileen McNaughton Date: Fri, 16 Jul 2021 06:27:05 +0000 (+1200) Subject: dev/core#2715 [REF] Move another 2 functions to the financial processor class X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=c259e5f3550641d2776d42936e568286209757ca;p=civicrm-core.git dev/core#2715 [REF] Move another 2 functions to the financial processor class The process involves - checking the selfs - temporarily making public - making private again once the calling function is also moved --- diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 4db525a7ce..19b6a2e800 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -1118,72 +1118,6 @@ class CRM_Contribute_BAO_Contribution extends CRM_Contribute_DAO_Contribution { CRM_Core_DAO::executeQuery($query, $fparams); } - /** - * Create the financial items for the line. - * - * @param array $params - * @param string $context - * @param array $fields - * @param array $previousLineItems - * @param array $inputParams - * @param bool $isARefund - * @param array $trxnIds - * @param int $fieldId - * - * @return array - */ - private static function createFinancialItemsForLine($params, $context, $fields, array $previousLineItems, array $inputParams, bool $isARefund, $trxnIds, $fieldId): array { - foreach ($fields as $fieldValueId => $lineItemDetails) { - $prevFinancialItem = CRM_Financial_BAO_FinancialItem::getPreviousFinancialItem($lineItemDetails['id']); - $receiveDate = CRM_Utils_Date::isoToMysql($params['prevContribution']->receive_date); - if ($params['contribution']->receive_date) { - $receiveDate = CRM_Utils_Date::isoToMysql($params['contribution']->receive_date); - } - - $financialAccount = CRM_Contribute_BAO_FinancialProcessor::getFinancialAccountForStatusChangeTrxn($params, CRM_Utils_Array::value('financial_account_id', $prevFinancialItem)); - - $currency = $params['prevContribution']->currency; - if ($params['contribution']->currency) { - $currency = $params['contribution']->currency; - } - $previousLineItemTotal = CRM_Utils_Array::value('line_total', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); - $itemParams = [ - 'transaction_date' => $receiveDate, - 'contact_id' => $params['prevContribution']->contact_id, - 'currency' => $currency, - 'amount' => self::getFinancialItemAmountFromParams($inputParams, $context, $lineItemDetails, $isARefund, $previousLineItemTotal), - 'description' => $prevFinancialItem['description'] ?? NULL, - 'status_id' => $prevFinancialItem['status_id'], - 'financial_account_id' => $financialAccount, - 'entity_table' => 'civicrm_line_item', - 'entity_id' => $lineItemDetails['id'], - ]; - $financialItem = CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); - $params['line_item'][$fieldId][$fieldValueId]['deferred_line_total'] = $itemParams['amount']; - $params['line_item'][$fieldId][$fieldValueId]['financial_item_id'] = $financialItem->id; - - if (($lineItemDetails['tax_amount'] && $lineItemDetails['tax_amount'] !== 'null') || ($context === 'changeFinancialType')) { - $taxAmount = (float) $lineItemDetails['tax_amount']; - if ($context === 'changeFinancialType' && $lineItemDetails['tax_amount'] === 'null') { - // reverse the Sale Tax amount if there is no tax rate associated with new Financial Type - $taxAmount = CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); - } - elseif ($previousLineItemTotal != $lineItemDetails['line_total']) { - $taxAmount -= CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); - } - if ($taxAmount != 0) { - $itemParams['amount'] = self::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount; - $itemParams['description'] = CRM_Invoicing_Utils::getTaxTerm(); - if ($lineItemDetails['financial_type_id']) { - $itemParams['financial_account_id'] = CRM_Financial_BAO_FinancialAccount::getSalesTaxFinancialAccount($lineItemDetails['financial_type_id']); - } - CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); - } - } - } - return $params; - } - /** * Does this contributtion status update represent a refund. * @@ -3647,11 +3581,10 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac * */ public static function updateFinancialAccounts(&$params, $context = NULL) { - $trxnID = NULL; $inputParams = $params; $isARefund = self::isContributionUpdateARefund($params['prevContribution']->contribution_status_id, $params['contribution']->contribution_status_id); - if ($context == 'changedAmount' || $context == 'changeFinancialType') { + if ($context === 'changedAmount' || $context === 'changeFinancialType') { // @todo we should stop passing $params by reference - splitting this out would be a step towards that. $params['trxnParams']['total_amount'] = $params['trxnParams']['net_amount'] = ($params['total_amount'] - $params['prevContribution']->total_amount); } @@ -3660,11 +3593,10 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac // @todo we should stop passing $params by reference - splitting this out would be a step towards that. $params['entity_id'] = $trxn->id; - $itemParams['entity_table'] = 'civicrm_line_item'; $trxnIds['id'] = $params['entity_id']; $previousLineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($params['contribution']->id); foreach ($params['line_item'] as $fieldId => $fields) { - $params = self::createFinancialItemsForLine($params, $context, $fields, $previousLineItems, $inputParams, $isARefund, $trxnIds, $fieldId); + $params = CRM_Contribute_BAO_FinancialProcessor::createFinancialItemsForLine($params, $context, $fields, $previousLineItems, $inputParams, $isARefund, $trxnIds, $fieldId); } } @@ -4449,80 +4381,6 @@ INNER JOIN civicrm_activity ON civicrm_activity_contact.activity_id = civicrm_ac return self::getValues(['id' => $contributionID]); } - /** - * Get the amount for the financial item row. - * - * Helper function to start to break down recordFinancialTransactions for readability. - * - * The logic is more historical than .. logical. Paths other than the deprecated one are tested. - * - * Codewise, several somewhat disimmilar things have been squished into recordFinancialAccounts - * for historical reasons. Going forwards we can hope to add tests & improve readibility - * of that function - * - * @param array $params - * Params as passed to contribution.create - * - * @param string $context - * changeFinancialType| changedAmount - * @param array $lineItemDetails - * Line items. - * @param bool $isARefund - * Is this a refund / negative transaction. - * @param int $previousLineItemTotal - * - * @return float - * @todo move recordFinancialAccounts & helper functions to their own class? - * - */ - protected static function getFinancialItemAmountFromParams($params, $context, $lineItemDetails, $isARefund, $previousLineItemTotal) { - if ($context == 'changedAmount') { - $lineTotal = $lineItemDetails['line_total']; - if ($lineTotal != $previousLineItemTotal) { - $lineTotal -= $previousLineItemTotal; - } - return $lineTotal; - } - elseif ($context == 'changeFinancialType') { - return -$lineItemDetails['line_total']; - } - elseif ($context == 'changedStatus') { - $cancelledTaxAmount = 0; - if ($isARefund) { - $cancelledTaxAmount = CRM_Utils_Array::value('tax_amount', $lineItemDetails, '0.00'); - } - return self::getMultiplier($params['contribution']->contribution_status_id, $context) * ((float) $lineItemDetails['line_total'] + (float) $cancelledTaxAmount); - } - elseif ($context === NULL) { - // erm, yes because? but, hey, it's tested. - return $lineItemDetails['line_total']; - } - else { - return self::getMultiplier($params['contribution']->contribution_status_id, $context) * ((float) $lineItemDetails['line_total']); - } - } - - /** - * Get the multiplier for adjusting rows. - * - * If we are dealing with a refund or cancellation then it will be a negative - * amount to reflect the negative transaction. - * - * If we are changing Financial Type it will be a negative amount to - * adjust down the old type. - * - * @param int $contribution_status_id - * @param string $context - * - * @return int - */ - protected static function getMultiplier($contribution_status_id, $context) { - if ($context == 'changeFinancialType' || self::isContributionStatusNegative($contribution_status_id)) { - return -1; - } - return 1; - } - /** * Does this transaction reflect a payment instrument change. * diff --git a/CRM/Contribute/BAO/FinancialProcessor.php b/CRM/Contribute/BAO/FinancialProcessor.php index 06a9e82438..35df6ba3cc 100644 --- a/CRM/Contribute/BAO/FinancialProcessor.php +++ b/CRM/Contribute/BAO/FinancialProcessor.php @@ -30,7 +30,7 @@ class CRM_Contribute_BAO_FinancialProcessor { * * @return int */ - public static function getFinancialAccountForStatusChangeTrxn($params, $default) { + private static function getFinancialAccountForStatusChangeTrxn($params, $default): int { if (!empty($params['financial_account_id'])) { return $params['financial_account_id']; } @@ -51,4 +51,146 @@ class CRM_Contribute_BAO_FinancialProcessor { return $default; } + /** + * Create the financial items for the line. + * + * @param array $params + * @param string $context + * @param array $fields + * @param array $previousLineItems + * @param array $inputParams + * @param bool $isARefund + * @param array $trxnIds + * @param int $fieldId + * + * @internal + * + * @return array + */ + public static function createFinancialItemsForLine($params, $context, $fields, array $previousLineItems, array $inputParams, bool $isARefund, $trxnIds, $fieldId): array { + foreach ($fields as $fieldValueId => $lineItemDetails) { + $prevFinancialItem = CRM_Financial_BAO_FinancialItem::getPreviousFinancialItem($lineItemDetails['id']); + $receiveDate = CRM_Utils_Date::isoToMysql($params['prevContribution']->receive_date); + if ($params['contribution']->receive_date) { + $receiveDate = CRM_Utils_Date::isoToMysql($params['contribution']->receive_date); + } + + $financialAccount = CRM_Contribute_BAO_FinancialProcessor::getFinancialAccountForStatusChangeTrxn($params, CRM_Utils_Array::value('financial_account_id', $prevFinancialItem)); + + $currency = $params['prevContribution']->currency; + if ($params['contribution']->currency) { + $currency = $params['contribution']->currency; + } + $previousLineItemTotal = CRM_Utils_Array::value('line_total', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); + $itemParams = [ + 'transaction_date' => $receiveDate, + 'contact_id' => $params['prevContribution']->contact_id, + 'currency' => $currency, + 'amount' => self::getFinancialItemAmountFromParams($inputParams, $context, $lineItemDetails, $isARefund, $previousLineItemTotal), + 'description' => $prevFinancialItem['description'] ?? NULL, + 'status_id' => $prevFinancialItem['status_id'], + 'financial_account_id' => $financialAccount, + 'entity_table' => 'civicrm_line_item', + 'entity_id' => $lineItemDetails['id'], + ]; + $financialItem = CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); + $params['line_item'][$fieldId][$fieldValueId]['deferred_line_total'] = $itemParams['amount']; + $params['line_item'][$fieldId][$fieldValueId]['financial_item_id'] = $financialItem->id; + + if (($lineItemDetails['tax_amount'] && $lineItemDetails['tax_amount'] !== 'null') || ($context === 'changeFinancialType')) { + $taxAmount = (float) $lineItemDetails['tax_amount']; + if ($context === 'changeFinancialType' && $lineItemDetails['tax_amount'] === 'null') { + // reverse the Sale Tax amount if there is no tax rate associated with new Financial Type + $taxAmount = CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); + } + elseif ($previousLineItemTotal != $lineItemDetails['line_total']) { + $taxAmount -= CRM_Utils_Array::value('tax_amount', CRM_Utils_Array::value($fieldValueId, $previousLineItems), 0); + } + if ($taxAmount != 0) { + $itemParams['amount'] = CRM_Contribute_BAO_FinancialProcessor::getMultiplier($params['contribution']->contribution_status_id, $context) * $taxAmount; + $itemParams['description'] = CRM_Invoicing_Utils::getTaxTerm(); + if ($lineItemDetails['financial_type_id']) { + $itemParams['financial_account_id'] = CRM_Financial_BAO_FinancialAccount::getSalesTaxFinancialAccount($lineItemDetails['financial_type_id']); + } + CRM_Financial_BAO_FinancialItem::create($itemParams, NULL, $trxnIds); + } + } + } + return $params; + } + + /** + * Get the multiplier for adjusting rows. + * + * If we are dealing with a refund or cancellation then it will be a negative + * amount to reflect the negative transaction. + * + * If we are changing Financial Type it will be a negative amount to + * adjust down the old type. + * + * @param int $contribution_status_id + * @param string $context + * + * @return int + */ + public static function getMultiplier($contribution_status_id, $context) { + if ($context === 'changeFinancialType' || CRM_Contribute_BAO_Contribution::isContributionStatusNegative($contribution_status_id)) { + return -1; + } + return 1; + } + + /** + * Get the amount for the financial item row. + * + * Helper function to start to break down recordFinancialTransactions for readability. + * + * The logic is more historical than .. logical. Paths other than the deprecated one are tested. + * + * Codewise, several somewhat disimmilar things have been squished into recordFinancialAccounts + * for historical reasons. Going forwards we can hope to add tests & improve readibility + * of that function + * + * @param array $params + * Params as passed to contribution.create + * + * @param string $context + * changeFinancialType| changedAmount + * @param array $lineItemDetails + * Line items. + * @param bool $isARefund + * Is this a refund / negative transaction. + * @param int $previousLineItemTotal + * + * @return float + * @todo move recordFinancialAccounts & helper functions to their own class? + * + */ + protected static function getFinancialItemAmountFromParams($params, $context, $lineItemDetails, $isARefund, $previousLineItemTotal) { + if ($context == 'changedAmount') { + $lineTotal = $lineItemDetails['line_total']; + if ($lineTotal != $previousLineItemTotal) { + $lineTotal -= $previousLineItemTotal; + } + return $lineTotal; + } + elseif ($context == 'changeFinancialType') { + return -$lineItemDetails['line_total']; + } + elseif ($context == 'changedStatus') { + $cancelledTaxAmount = 0; + if ($isARefund) { + $cancelledTaxAmount = CRM_Utils_Array::value('tax_amount', $lineItemDetails, '0.00'); + } + return CRM_Contribute_BAO_FinancialProcessor::getMultiplier($params['contribution']->contribution_status_id, $context) * ((float) $lineItemDetails['line_total'] + (float) $cancelledTaxAmount); + } + elseif ($context === NULL) { + // erm, yes because? but, hey, it's tested. + return $lineItemDetails['line_total']; + } + else { + return CRM_Contribute_BAO_FinancialProcessor::getMultiplier($params['contribution']->contribution_status_id, $context) * ((float) $lineItemDetails['line_total']); + } + } + }