X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=CRM%2FFinancial%2FBAO%2FPayment.php;h=664c193e0cc4f8d7d8533f540730384015f15dad;hb=a0741dc66a56012dca28350f8c1ddaad5ec03918;hp=fbb3e58de800cf03a6b1db3909c4f987f54b722f;hpb=5caa4dab191ace09ee6fac30a11609ec6d4c7ddf;p=civicrm-core.git diff --git a/CRM/Financial/BAO/Payment.php b/CRM/Financial/BAO/Payment.php index fbb3e58de8..664c193e0c 100644 --- a/CRM/Financial/BAO/Payment.php +++ b/CRM/Financial/BAO/Payment.php @@ -51,6 +51,7 @@ class CRM_Financial_BAO_Payment { * * @throws \API_Exception * @throws \CRM_Core_Exception + * @throws \CiviCRM_API3_Exception */ public static function create($params) { $contribution = civicrm_api3('Contribution', 'getsingle', ['id' => $params['contribution_id']]); @@ -63,7 +64,7 @@ class CRM_Financial_BAO_Payment { // should be handled through Payment.create. $isSkipRecordingPaymentHereForLegacyHandlingReasons = ($contributionStatus == 'Pending' && $isPaymentCompletesContribution); - if (!$isSkipRecordingPaymentHereForLegacyHandlingReasons) { + if (!$isSkipRecordingPaymentHereForLegacyHandlingReasons && $params['total_amount'] > 0) { $trxn = CRM_Contribute_BAO_Contribution::recordPartialPayment($contribution, $params); if (CRM_Utils_Array::value('line_item', $params) && !empty($trxn)) { @@ -99,13 +100,29 @@ class CRM_Financial_BAO_Payment { CRM_Contribute_BAO_Contribution::assignProportionalLineItems($params, $trxn->id, $contribution['total_amount']); } } + elseif ($params['total_amount'] < 0) { + $trxn = self::recordRefundPayment($params['contribution_id'], $params, FALSE); + } if ($isPaymentCompletesContribution) { - civicrm_api3('Contribution', 'completetransaction', ['id' => $contribution['id']]); - // Get the trxn - $trxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC'); - $ftParams = ['id' => $trxnId['financialTrxnId']]; - $trxn = CRM_Core_BAO_FinancialTrxn::retrieve($ftParams, CRM_Core_DAO::$_nullArray); + if ($contributionStatus == 'Pending refund') { + // Ideally we could still call completetransaction as non-payment related actions should + // be outside this class. However, for now we just update the contribution here. + // Unit test cover in CRM_Event_BAO_AdditionalPaymentTest::testTransactionInfo. + civicrm_api3('Contribution', 'create', + [ + 'id' => $contribution['id'], + 'contribution_status_id' => 'Completed', + ] + ); + } + else { + civicrm_api3('Contribution', 'completetransaction', ['id' => $contribution['id']]); + // Get the trxn + $trxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC'); + $ftParams = ['id' => $trxnId['financialTrxnId']]; + $trxn = CRM_Core_BAO_FinancialTrxn::retrieve($ftParams, CRM_Core_DAO::$_nullArray); + } } elseif ($contributionStatus === 'Pending') { civicrm_api3('Contribution', 'create', @@ -311,7 +328,7 @@ class CRM_Financial_BAO_Payment { $arAccountId = CRM_Contribute_PseudoConstant::getRelationalFinancialAccount($contributionDAO->financial_type_id, 'Accounts Receivable Account is'); $completedStatusId = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'); - $trxnData['total_amount'] = $trxnData['net_amount'] = -$trxnData['total_amount']; + $trxnData['total_amount'] = $trxnData['net_amount'] = $trxnData['total_amount']; $trxnData['from_financial_account_id'] = $arAccountId; $trxnData['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Refunded'); // record the entry