diff --git a/CRM/Contribute/Form/Contribution.php b/CRM/Contribute/Form/Contribution.php index 0f804d6c8540..5796571d343a 100644 --- a/CRM/Contribute/Form/Contribution.php +++ b/CRM/Contribute/Form/Contribution.php @@ -911,8 +911,14 @@ public static function formRule($fields, $files, $self) { } } // CRM-16189 + $order = new CRM_Financial_BAO_Order(); + $order->setPriceSelectionFromUnfilteredInput($fields); + if (isset($fields['total_amount'])) { + $order->setOverrideTotalAmount($fields['total_amount']); + } + $lineItems = $order->getLineItems(); try { - CRM_Financial_BAO_FinancialAccount::checkFinancialTypeHasDeferred($fields, $self->_id, $self->_priceSet['fields']); + CRM_Financial_BAO_FinancialAccount::checkFinancialTypeHasDeferred($fields, $self->_id, $lineItems); } catch (CRM_Core_Exception $e) { $errors['financial_type_id'] = ' '; diff --git a/CRM/Financial/BAO/FinancialAccount.php b/CRM/Financial/BAO/FinancialAccount.php index 32fe022f824e..d31f916e7905 100644 --- a/CRM/Financial/BAO/FinancialAccount.php +++ b/CRM/Financial/BAO/FinancialAccount.php @@ -375,13 +375,13 @@ public static function validateFinancialAccount($financialAccountId, $financialA * @param int $contributionID * Contribution ID * - * @param array $priceSetFields - * Array of price fields of a price set. + * @param array $orderLineItems + * The line items from the Order. * * @return bool * */ - public static function checkFinancialTypeHasDeferred($params, $contributionID = NULL, $priceSetFields = NULL) { + public static function checkFinancialTypeHasDeferred($params, $contributionID = NULL, $orderLineItems = NULL) { if (!Civi::settings()->get('deferred_revenue_enabled')) { return FALSE; } @@ -399,15 +399,8 @@ public static function checkFinancialTypeHasDeferred($params, $contributionID = $financialTypeID = $params['prevContribution']->financial_type_id; } if (($contributionID || !empty($params['price_set_id'])) && empty($lineItems)) { - if (!$contributionID) { - CRM_Price_BAO_PriceSet::processAmount($priceSetFields, - $params, $items); - } - else { - $items = CRM_Price_BAO_LineItem::getLineItems($contributionID, 'contribution', TRUE, TRUE, TRUE); - } - if (!empty($items)) { - $lineItems[] = $items; + if (!empty($orderLineItems)) { + $lineItems[] = $orderLineItems; } } $deferredFinancialType = self::getDeferredFinancialType(); diff --git a/tests/phpunit/CRM/Contribute/Form/ContributionTest.php b/tests/phpunit/CRM/Contribute/Form/ContributionTest.php index b8b4fdee7624..5c98e35c2adc 100644 --- a/tests/phpunit/CRM/Contribute/Form/ContributionTest.php +++ b/tests/phpunit/CRM/Contribute/Form/ContributionTest.php @@ -2046,4 +2046,131 @@ public function additionalInfoProvider(): array { ]; } + /** + * Test formRule + */ + public function testContributionFormRule() { + $fields = [ + 'contact_id' => $this->_individualId, + 'financial_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Donation'), + 'currency' => 'USD', + 'total_amount' => '10', + 'price_set_id' => '', + 'source' => '', + 'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'), + 'cancel_date' => '', + 'cancel_reason' => '', + 'receive_date' => date('Y-m-d H:i:s'), + 'from_email_address' => key(CRM_Core_BAO_Email::getFromEmail()), + 'receipt_date' => '', + 'payment_instrument_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'payment_instrument_id', 'Check'), + 'trxn_id' => '', + 'check_number' => '', + 'soft_credit_contact_id' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + 'soft_credit_amount' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + 'soft_credit_type' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + ]; + + $form = new CRM_Contribute_Form_Contribution(); + $this->assertSame([], $form->formRule($fields, [], $form)); + } + + /** + * Check that formRule validates you can only have one contribution with a + * given trxn_id. + */ + public function testContributionFormRuleDuplicateTrxn() { + $contribution = $this->callAPISuccess('Contribution', 'create', array_merge($this->_params, ['trxn_id' => '1234'])); + + $fields = [ + 'contact_id' => $this->_individualId, + 'financial_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'financial_type_id', 'Donation'), + 'currency' => 'USD', + 'total_amount' => '10', + 'price_set_id' => '', + 'source' => '', + 'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'), + 'cancel_date' => '', + 'cancel_reason' => '', + 'receive_date' => date('Y-m-d H:i:s'), + 'from_email_address' => key(CRM_Core_BAO_Email::getFromEmail()), + 'receipt_date' => '', + 'payment_instrument_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'payment_instrument_id', 'Check'), + 'trxn_id' => '1234', + 'check_number' => '', + 'soft_credit_contact_id' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + 'soft_credit_amount' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + 'soft_credit_type' => [ + 1 => '', + 2 => '', + 3 => '', + 4 => '', + 5 => '', + 6 => '', + 7 => '', + 8 => '', + 9 => '', + 10 => '', + ], + ]; + + $form = new CRM_Contribute_Form_Contribution(); + $this->assertEquals(['trxn_id' => "Transaction ID's must be unique. Transaction '1234' already exists in your database."], $form->formRule($fields, [], $form)); + } + }