Skip to content

Commit

Permalink
CRM-21245: Incorrect Contribution status 'Pending Refund' and Add tes…
Browse files Browse the repository at this point in the history
…t of CRM-17151 ported from kainuk PR
  • Loading branch information
monishdeb authored and sluc23 committed Jan 10, 2018
1 parent 82bf452 commit d063ce2
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 35 deletions.
2 changes: 1 addition & 1 deletion CRM/Event/Form/ParticipantFeeSelection.php
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,7 @@ public function postProcess() {

$feeBlock = $this->_values['fee'];
$lineItems = $this->_values['line_items'];
CRM_Price_BAO_LineItem::changeFeeSelections($params, $this->_participantId, 'participant', $this->_contributionId, $feeBlock, $lineItems, $this->_paidAmount);
CRM_Price_BAO_LineItem::changeFeeSelections($params, $this->_participantId, 'participant', $this->_contributionId, $feeBlock, $lineItems);
$this->contributionAmt = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $this->_contributionId, 'total_amount');
// email sending
if (!empty($params['send_receipt'])) {
Expand Down
5 changes: 2 additions & 3 deletions CRM/Member/Form/Membership.php
Original file line number Diff line number Diff line change
Expand Up @@ -1730,16 +1730,15 @@ protected function updateContributionOnMembershipTypeChange($inputParams, $membe

// add price field information in $inputParams
self::addPriceFieldByMembershipType($inputParams, $priceSetDetails['fields'], $membership->membership_type_id);
// paid amount
$paidAmount = CRM_Utils_Array::value('paid', CRM_Contribute_BAO_Contribution::getPaymentInfo($membership->id, 'membership'));

// update related contribution and financial records
CRM_Price_BAO_LineItem::changeFeeSelections(
$inputParams,
$membership->id,
'membership',
$contributionID,
$priceSetDetails['fields'],
$lineItems, $paidAmount
$lineItems
);
CRM_Core_Session::setStatus(ts('Associated contribution is updated on membership type change.'), ts('Success'), 'success');
}
Expand Down
52 changes: 27 additions & 25 deletions CRM/Price/BAO/LineItem.php
Original file line number Diff line number Diff line change
Expand Up @@ -611,7 +611,6 @@ public static function getLineItemArray(&$params, $entityId = NULL, $entityTable
* @param int $contributionId
* @param $feeBlock
* @param array $lineItems
* @param $paidAmount
*
*/
public static function changeFeeSelections(
Expand All @@ -620,8 +619,7 @@ public static function changeFeeSelections(
$entity,
$contributionId,
$feeBlock,
$lineItems,
$paidAmount
$lineItems
) {
$entityTable = "civicrm_" . $entity;
CRM_Price_BAO_PriceSet::processAmount($feeBlock,
Expand Down Expand Up @@ -694,8 +692,7 @@ public static function changeFeeSelections(
if (!empty($amountLevel)) {
$updateAmountLevel = CRM_Core_DAO::VALUE_SEPARATOR . implode(CRM_Core_DAO::VALUE_SEPARATOR, $amountLevel) . $displayParticipantCount . CRM_Core_DAO::VALUE_SEPARATOR;
}
$trxn = $lineItemObj->recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId, $taxAmount, $updateAmountLevel);

$trxn = $lineItemObj->_recordAdjustedAmt($updatedAmount, $contributionId, $taxAmount, $updateAmountLevel);
$contributionStatus = CRM_Core_PseudoConstant::getName('CRM_Contribute_DAO_Contribution', 'contribution_status_id', CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'contribution_status_id'));

if (!empty($financialItemsArray)) {
Expand Down Expand Up @@ -1034,18 +1031,23 @@ protected function updateEntityRecordOnChangeFeeSelection($inputParams, $entityI
* @return array $financialTrxn
*
*/
protected function getRelatedCancelFinancialTrxn($financialItemID) {
$financialTrxn = civicrm_api3('EntityFinancialTrxn', 'getsingle', array(
'entity_table' => 'civicrm_financial_item',
'entity_id' => $financialItemID,
'options' => array(
'sort' => 'id DESC',
'limit' => 1,
),
'api.FinancialTrxn.getsingle' => array(
'id' => "\$value.financial_trxn_id",
),
));
protected function _getRelatedCancelFinancialTrxn($financialItemID) {
try {
$financialTrxn = civicrm_api3('EntityFinancialTrxn', 'getsingle', array(
'entity_table' => 'civicrm_financial_item',
'entity_id' => $financialItemID,
'options' => array(
'sort' => 'id DESC',
'limit' => 1,
),
'api.FinancialTrxn.getsingle' => array(
'id' => "\$value.financial_trxn_id",
),
));
}
catch (CiviCRM_API3_Exception $e) {
return array();
}

$financialTrxn = array_merge($financialTrxn['api.FinancialTrxn.getsingle'], array(
'trxn_date' => date('YmdHis'),
Expand All @@ -1063,21 +1065,15 @@ protected function getRelatedCancelFinancialTrxn($financialItemID) {
* Record adjusted amount.
*
* @param int $updatedAmount
* @param int $paidAmount
* @param int $contributionId
*
* @param int $taxAmount
* @param bool $updateAmountLevel
*
* @return bool|\CRM_Core_BAO_FinancialTrxn
*/
protected function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionId, $taxAmount = NULL, $updateAmountLevel = NULL) {
$pendingAmount = CRM_Core_BAO_FinancialTrxn::getBalanceTrxnAmt($contributionId);
$pendingAmount = CRM_Utils_Array::value('total_amount', $pendingAmount, 0);
protected function _recordAdjustedAmt($updatedAmount, $contributionId, $taxAmount = NULL, $updateAmountLevel = NULL) {
$paidAmount = CRM_Core_BAO_FinancialTrxn::getTotalPayments($contributionId);
$balanceAmt = $updatedAmount - $paidAmount;
if ($paidAmount != $pendingAmount) {
$balanceAmt -= $pendingAmount;
}

$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses);
Expand Down Expand Up @@ -1132,6 +1128,12 @@ protected function recordAdjustedAmt($updatedAmount, $paidAmount, $contributionI
);
$adjustedTrxn = CRM_Core_BAO_FinancialTrxn::create($adjustedTrxnValues);
}
// CRM-17151: Update the contribution status to completed if balance is zero,
// because due to sucessive fee change will leave the related contribution status incorrect
else {
CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'contribution_status_id', $completedStatusId);
}

return $adjustedTrxn;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* Class CRM_Event_BAO_AdditionalPaymentTest
* @group headless
*/
class CRM_Event_BAO_CRM19273Test extends CiviUnitTestCase {
class CRM_Event_BAO_ChangeFeeSelectionTest extends CiviUnitTestCase {

protected $_priceSetID;
protected $_cheapFee = 80;
Expand Down Expand Up @@ -252,18 +252,32 @@ public function testCRM19273() {
$this->balanceCheck($this->_veryExpensive);
}

/**
* CRM-21245: Test that Contribution status doesn't changed to 'Pending Refund' from 'Partially Paid' if the partially paid amount is lower then newly selected fee amount
*/
public function testCRM21245() {
$this->registerParticipantAndPay(50);
$partiallyPaidContribuitonStatus = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Partially paid');
$this->assertEquals($this->callAPISuccessGetValue('Contribution', array('id' => $this->_contributionId, 'return' => 'contribution_status_id')), $partiallyPaidContribuitonStatus);

$priceSetParams['price_1'] = 3;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->assertEquals($this->callAPISuccessGetValue('Contribution', array('id' => $this->_contributionId, 'return' => 'contribution_status_id')), $partiallyPaidContribuitonStatus);
}

/**
* Test that proper financial items are recorded for cancelled line items
*/
public function testCRM20611() {
$priceSetParams['price_1'] = 1;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem, $this->_expensiveFee);
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->participantID, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->balanceCheck($this->_expensiveFee);

$priceSetParams['price_1'] = 2;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem, $this->_expensiveFee);
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->participantID, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->balanceCheck($this->_cheapFee);

//Complete the refund payment.
Expand Down Expand Up @@ -405,4 +419,27 @@ public function testCRM21513() {
$this->balanceCheck(20);
}

/**
* CRM-17151: Test that Contribution status change to 'Completed' if balance is zero.
*/
public function testCRM17151() {
$contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'name');
$partiallyPaidStatusId = array_search('Partially paid', $contributionStatuses);
$pendingRefundStatusId = array_search('Pending refund', $contributionStatuses);
$completedStatusId = array_search('Completed', $contributionStatuses);
$this->assertDBCompareValue('CRM_Contribute_BAO_Contribution', $this->_contributionId, 'contribution_status_id', 'id', $completedStatusId, 'Payment t be completed');
$priceSetParams['price_1'] = 2;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->assertDBCompareValue('CRM_Contribute_BAO_Contribution', $this->_contributionId, 'contribution_status_id', 'id', $pendingRefundStatusId, 'Contribution must be refunding');
$priceSetParams['price_1'] = 1;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->assertDBCompareValue('CRM_Contribute_BAO_Contribution', $this->_contributionId, 'contribution_status_id', 'id', $completedStatusId, 'Contribution must, after complete payment be in state completed');
$priceSetParams['price_1'] = 3;
$lineItem = CRM_Price_BAO_LineItem::getLineItems($this->_participantId, 'participant');
CRM_Price_BAO_LineItem::changeFeeSelections($priceSetParams, $this->_participantId, 'participant', $this->_contributionId, $this->_feeBlock, $lineItem);
$this->assertDBCompareValue('CRM_Contribute_BAO_Contribution', $this->_contributionId, 'contribution_status_id', 'id', $partiallyPaidStatusId, 'Partial Paid');
}

}
2 changes: 1 addition & 1 deletion tests/phpunit/CiviTest/CiviUnitTestCase.php
Original file line number Diff line number Diff line change
Expand Up @@ -552,7 +552,7 @@ public function assertDBCompareValue(
$expectedValue, $message
) {
$value = CRM_Core_DAO::getFieldValue($daoName, $searchValue, $returnColumn, $searchColumn, TRUE);
$this->assertEquals($value, $expectedValue, $message);
$this->assertEquals($expectedValue, $value, $message);
}

/**
Expand Down

0 comments on commit d063ce2

Please sign in to comment.