$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'])) {
// 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',
$contributionID,
$priceSetDetails['fields'],
- $lineItems, $paidAmount
+ $lineItems
);
CRM_Core_Session::setStatus(ts('Associated contribution is updated on membership type change.'), ts('Success'), 'success');
}
* @param int $contributionId
* @param $feeBlock
* @param array $lineItems
- * @param $paidAmount
*
*/
public static function changeFeeSelections(
$entity,
$contributionId,
$feeBlock,
- $lineItems,
- $paidAmount
+ $lineItems
) {
$entityTable = "civicrm_" . $entity;
CRM_Price_BAO_PriceSet::processAmount($feeBlock,
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)) {
* @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'),
* 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);
);
$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;
}
* 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;
$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.
$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');
+ }
+
}
$expectedValue, $message
) {
$value = CRM_Core_DAO::getFieldValue($daoName, $searchValue, $returnColumn, $searchColumn, TRUE);
- $this->assertEquals($value, $expectedValue, $message);
+ $this->assertEquals($expectedValue, $value, $message);
}
/**