Skip to content

Commit

Permalink
fix partial payment scenario
Browse files Browse the repository at this point in the history
  • Loading branch information
monishdeb committed Nov 19, 2018
1 parent d0a6fd7 commit 61feab9
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 47 deletions.
23 changes: 15 additions & 8 deletions CRM/Contribute/BAO/Contribution.php
Original file line number Diff line number Diff line change
Expand Up @@ -4931,7 +4931,7 @@ public static function assignProportionalLineItems($trxnParams, $trxnId, $contri
if (!empty($lineItems)) {
// get financial item
list($financialItems, $taxItems) = self::getLastFinancialItems($trxnParams['contribution_id']);
self::createProportionalFinancialEntries($trxnId, $lineItems, $financialItems, $taxItems);
self::createProportionalFinancialEntries($trxnId, $contributionTotalAmount, $lineItems, $financialItems, $taxItems);
}
}

Expand Down Expand Up @@ -5761,32 +5761,39 @@ public static function getLastFinancialItems($contributionId) {
* Create proportional entries in civicrm_entity_financial_trxn.
*
* @param int $trxnID
*
* @param float $trxnID$contributionTotalAmount
* @param array $lineItems
*
* @param array $financialItems
*
* @param array $taxItems
*
*/
public static function createProportionalFinancialEntries($trxnID, $lineItems, $financialItems, $taxItems) {
public static function createProportionalFinancialEntries($trxnID, $contributionTotalAmount, $lineItems, $financialItems, $taxItems) {
$eftParams = array(
'entity_table' => 'civicrm_financial_item',
'financial_trxn_id' => $trxnID,
);
$financialTxnAmount = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_FinancialTrxn', $trxnID, 'total_amount');
foreach ($lineItems as $key => $value) {
if ($value['qty'] == 0) {
continue;
}
$eftParams['entity_id'] = $financialItems[$value['price_field_value_id']]['financial_item_id'];
$eftParams['amount'] = $financialItems[$value['price_field_value_id']]['amount'];
if (0 == civicrm_api3('EntityFinancialTrxn', 'getcount', ['entity_table' => 'civicrm_financial_item', 'entity_id' => $eftParams['entity_id']])) {

// In case of partial payment, calculate proportional amount for each line-item and created respective EFT records
if ($value['line_total'] == $financialItems[$value['price_field_value_id']]['amount']) {
$eftParams['amount'] = CRM_Contribute_BAO_Contribution_Utils::formatAmount($financialItems[$value['price_field_value_id']]['amount'] * ($financialTxnAmount / $contributionTotalAmount));
}
// Else for price change, allocate financial item amount as EFT amount
else {
$eftParams['amount'] = $financialItems[$value['price_field_value_id']]['amount'];
}
if (0 == civicrm_api3('EntityFinancialTrxn', 'getcount', ['entity_table' => 'civicrm_financial_item', 'entity_id' => $eftParams['entity_id'], 'financial_trxn_id' => $trxnID])) {
civicrm_api3('EntityFinancialTrxn', 'create', $eftParams);
}
if (array_key_exists($value['price_field_value_id'], $taxItems)) {
$eftParams['entity_id'] = $taxItems[$value['price_field_value_id']]['financial_item_id'];
$eftParams['amount'] = $taxItems[$value['price_field_value_id']]['amount'];
if (0 == civicrm_api3('EntityFinancialTrxn', 'getcount', ['entity_table' => 'civicrm_financial_item', 'entity_id' => $eftParams['entity_id']])) {
if (0 == civicrm_api3('EntityFinancialTrxn', 'getcount', ['entity_table' => 'civicrm_financial_item', 'entity_id' => $eftParams['entity_id'], 'financial_trxn_id' => $trxnID])) {
civicrm_api3('EntityFinancialTrxn', 'create', $eftParams);
}
}
Expand Down
93 changes: 59 additions & 34 deletions tests/phpunit/CRM/Contribute/BAO/ContributionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1189,19 +1189,30 @@ public function testgetSalesTaxFinancialAccounts() {
public function testCreateProportionalFinancialEntries($thousandSeparator) {
$this->setCurrencySeparators($thousandSeparator);
list($contribution, $financialAccount) = $this->createContributionWithTax();
$params = array(
'total_amount' => 55,
'to_financial_account_id' => $financialAccount->financial_account_id,
'payment_instrument_id' => 1,
'trxn_date' => date('Ymd'),
'status_id' => 1,

$this->callAPISuccess('Contribution', 'create', [
'id' => $contribution['id'],
'total_amount' => 150,
]);
// Retrieve the created financial trxn ID from EntityFinancialTrxn mapping
$financialTrxnID = $this->callAPISuccess('EntityFinancialTrxn', 'getvalue', [
'entity_table' => 'civicrm_contribution',
'entity_id' => $contribution['id'],
);
$financialTrxn = $this->callAPISuccess('FinancialTrxn', 'create', $params);
'return' => 'financial_trxn_id',
'options' => [
'sort' => 'id desc',
'limit' => 1
],
]);

$lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contribution['id']);
list($financialItems, $taxItems) = CRM_Contribute_BAO_Contribution::getLastFinancialItems($contribution['id']);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxn['id'], $lineItems, $financialItems, $taxItems);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxnID, $contribution['total_amount'], $lineItems, $financialItems, $taxItems);
$eftParams = array(
'entity_table' => 'civicrm_financial_item',
'entity_id' => $financialItems[1]['financial_item_id'],
'financial_trxn_id' => $financialTrxnID,
);
$trxnTestArray = array_merge($eftParams, array(
'amount' => '50.00',
));
Expand All @@ -1218,22 +1229,32 @@ public function testCreateProportionalFinancialEntries($thousandSeparator) {
*/
public function testCreateProportionalFinancialEntriesZeroAmount($thousandSeparator) {
$this->setCurrencySeparators($thousandSeparator);
list($contribution, $financialAccount) = $this->createContributionWithTax(array('total_amount' => 0));
$params = array(
list($contribution, $financialAccount) = $this->createContributionWithTax();
$this->callAPISuccess('Contribution', 'create', [
'id' => $contribution['id'],
'total_amount' => 0,
'to_financial_account_id' => $financialAccount->financial_account_id,
'payment_instrument_id' => 1,
'trxn_date' => date('Ymd'),
'status_id' => 1,
]);
// Retrieve the created financial trxn ID from EntityFinancialTrxn mapping
$financialTrxnID = $this->callAPISuccess('EntityFinancialTrxn', 'getvalue', [
'entity_table' => 'civicrm_contribution',
'entity_id' => $contribution['id'],
);
$financialTrxn = $this->callAPISuccess('FinancialTrxn', 'create', $params);
'return' => 'financial_trxn_id',
'options' => [
'sort' => 'id desc',
'limit' => 1
],
]);

$lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contribution['id']);
list($financialItems, $taxItems) = CRM_Contribute_BAO_Contribution::getLastFinancialItems($contribution['id']);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxn['id'], $lineItems, $financialItems, $taxItems);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxnID, $contribution['total_amount'], $lineItems, $financialItems, $taxItems);
$eftParams = array(
'entity_table' => 'civicrm_financial_item',
'entity_id' => $financialItems[1]['financial_item_id'],
'financial_trxn_id' => $financialTrxnID,
);
$trxnTestArray = array_merge($eftParams, array(
'amount' => '0.00',
'amount' => '-100.00',
));
$this->callAPISuccessGetSingle('EntityFinancialTrxn', $eftParams, $trxnTestArray);
}
Expand All @@ -1255,28 +1276,32 @@ public function testgetLastFinancialItems() {
* Test for function createProportionalFinancialEntries().
*/
public function testCreateProportionalEntityFinancialEntries() {
// create a contribution with $100 and with 10% tax which is $10
list($contribution, $financialAccount) = $this->createContributionWithTax();
$params = array(
'total_amount' => 50,
'to_financial_account_id' => $financialAccount->financial_account_id,
'payment_instrument_id' => 1,
'trxn_date' => date('Ymd'),
'status_id' => 1,

// Update the contribution to $150 to ensure that a new financialTrxn of $55 (that includes tax amount) is created
// linked with two financial items of amount $50 and $5 respectively
$this->callAPISuccess('Contribution', 'create', [
'id' => $contribution['id'],
'total_amount' => 150,
]);
// Retrieve the created financial trxn ID from EntityFinancialTrxn mapping
$financialTrxnID = $this->callAPISuccess('EntityFinancialTrxn', 'getvalue', [
'entity_table' => 'civicrm_contribution',
'entity_id' => $contribution['id'],
);
$financialTrxn = $this->callAPISuccess('FinancialTrxn', 'create', $params);
$entityParams = array(
'contribution_total_amount' => $contribution['total_amount'],
'trxn_total_amount' => 55,
'trxn_id' => $financialTrxn['id'],
);
'return' => 'financial_trxn_id',
'options' => [
'sort' => 'id desc',
'limit' => 1
],
]);

$lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contribution['id']);
list($financialItems, $taxItems) = CRM_Contribute_BAO_Contribution::getLastFinancialItems($contribution['id']);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxn['id'], $lineItems, $financialItems, $taxItems);
CRM_Contribute_BAO_Contribution::createProportionalFinancialEntries($financialTrxnID, $contribution['total_amount'], $lineItems, $financialItems, $taxItems);
$eftParams = array(
'entity_table' => 'civicrm_financial_item',
'financial_trxn_id' => $financialTrxn['id'],
'financial_trxn_id' => $financialTrxnID,
);
$entityFinancialTrxn = $this->callAPISuccess('EntityFinancialTrxn', 'Get', $eftParams);
$this->assertEquals($entityFinancialTrxn['count'], 2, 'Invalid count.');
Expand Down
29 changes: 25 additions & 4 deletions tests/phpunit/CRM/Event/Form/ParticipantTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public function testPaymentAllocationOnMultiLineItemEvent() {

// Create financial type - Event Fee 2
$form = $this->getForm(array('is_monetary' => 1, 'financial_type_id' => 1));
$newFinancialTypeID = $this->createFinancialType('Event Fee 2')['id'];
CRM_Financial_BAO_FinancialType::getAvailableFinancialTypes($financialTypes);
$paramsField = array(
'label' => 'Price Field 2',
'name' => CRM_Utils_String::titleToVar('Price Field 2'),
Expand All @@ -145,7 +145,7 @@ public function testPaymentAllocationOnMultiLineItemEvent() {
'is_active' => array('1' => 1),
'price_set_id' => $this->_ids['price_set'],
'is_enter_qty' => 1,
'financial_type_id' => $newFinancialTypeID,
'financial_type_id' => array_search('Campaign Contribution', $financialTypes),
);
// Create price set and its price fields
$this->_ids['price_field'][] = CRM_Price_BAO_PriceField::create($paramsField)->id;
Expand Down Expand Up @@ -194,9 +194,30 @@ public function testPaymentAllocationOnMultiLineItemEvent() {
),
);
$form->setAction(CRM_Core_Action::ADD);
print_r(array(
'register_date' => date('Ymd'),
'status_id' => 5,
'role_id' => 1,
'event_id' => $form->_eventId,
'priceSetId' => $this->_ids['price_set'],
'price_' . $this->_ids['price_field'][0] => array(
$this->_ids['price_field_value'][0] => 1,
),
'price_' . $this->_ids['price_field'][1] => array(
$this->_ids['price_field_value'][1] => 1,
),
'amount_level' => 'Too much',
'fee_amount' => 65,
'total_amount' => 65,
'payment_processor_id' => 0,
'record_contribution' => TRUE,
'financial_type_id' => 1,
'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed'),
'payment_instrument_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'payment_instrument_id', 'Check'),
));

$form->submit(array(
'register_date' => 'now',
'register_date_time' => '00:00:00',
'register_date' => date('Ymd'),
'status_id' => 5,
'role_id' => 1,
'event_id' => $form->_eventId,
Expand Down
2 changes: 1 addition & 1 deletion tests/phpunit/api/v3/PaymentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -426,7 +426,7 @@ public function testUpdatePayment() {
'financial_trxn_id' => $payment['id'],
);
$eft = $this->callAPISuccess('EntityFinancialTrxn', 'get', $params);
$amounts = array(66.67, 33.33);
$amounts = array(-33.33, -16.67);
foreach ($eft['values'] as $value) {
$this->assertEquals($value['amount'], array_pop($amounts));
}
Expand Down

0 comments on commit 61feab9

Please sign in to comment.