CRM-20611: fix financial records of cancelled line-items on event fee change selection
authordeb.monish <monish.deb@jmaconsulting.biz>
Mon, 22 May 2017 09:33:46 +0000 (15:03 +0530)
committerdeb.monish <monish.deb@jmaconsulting.biz>
Mon, 22 May 2017 11:27:50 +0000 (16:57 +0530)
CRM/Contribute/BAO/Contribution.php
CRM/Event/BAO/Participant.php
tests/phpunit/CRM/Event/BAO/CRM19273Test.php

index 89bd90869e83a80024f9f7dad742cd1192a38fba..91277bd93f3633199dcf5584fa985b26204a1f5f 100644 (file)
@@ -3936,7 +3936,7 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']})
       }
     }
     elseif ($paymentType == 'refund') {
-      $trxnsData['total_amount'] = -$trxnsData['total_amount'];
+      $trxnsData['total_amount'] = $trxnsData['net_amount'] = -$trxnsData['total_amount'];
       $trxnsData['from_financial_account_id'] = $arAccountId;
       $trxnsData['status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Refunded');
       // record the entry
@@ -3954,11 +3954,16 @@ WHERE eft.financial_trxn_id IN ({$trxnId}, {$baseTrxnId['financialTrxnId']})
       $lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($contributionDAO->id);
       if (!empty($lineItems)) {
         foreach ($lineItems as $lineItemId => $lineItemValue) {
+          // don't record financial item for cancelled line-item
+          if ($lineItemValue['qty'] == 0) {
+            continue;
+          }
           $paid = $lineItemValue['line_total'] * ($financialTrxn->total_amount / $contributionDAO->total_amount);
           $addFinancialEntry = array(
             'transaction_date' => $financialTrxn->trxn_date,
             'contact_id' => $contributionDAO->contact_id,
             'amount' => round($paid, 2),
+            'currency' => $contributionDAO->currency,
             'status_id' => array_search('Paid', $financialItemStatus),
             'entity_id' => $lineItemId,
             'entity_table' => 'civicrm_line_item',
index 20b94c04892494ee0ab049a71e9f082e624bf9d4..492ece8ccb0ebcc4c0fbd39439208c0499c664a6 100644 (file)
@@ -2185,6 +2185,7 @@ WHERE (entity_table = 'civicrm_participant' AND entity_id = {$participantId} AND
         'from_financial_account_id' => NULL,
         'to_financial_account_id' => $toFinancialAccount,
         'total_amount' => $balanceAmt,
+        'net_amount' => $balanceAmt,
         'status_id' => $completedStatusId,
         'payment_instrument_id' => $updatedContribution->payment_instrument_id,
         'contribution_id' => $updatedContribution->id,
index 0b04ba580a536dde30ee2495547662c223741dad..fc61c1bdab40b67ae872900f1cbbd5bfc74fdfa3 100644 (file)
@@ -243,6 +243,51 @@ class CRM_Event_BAO_CRM19273 extends CiviUnitTestCase {
 
     CRM_Event_BAO_Participant::changeFeeSelections($PSparams, $this->participantID, $this->_contributionId, $this->_feeBlock, $lineItem, $this->_expensiveFee, $this->_priceSetID);
     $this->balanceCheck($this->_veryExpensive);
+
+  }
+
+  /**
+   * Test that proper financial items are recorded for cancelled line items
+   */
+  public function testCRM20611() {
+    $PSparams['price_1'] = 1;
+    $lineItem = CRM_Price_BAO_LineItem::getLineItems($this->participantID, 'participant');
+    CRM_Event_BAO_Participant::changeFeeSelections($PSparams, $this->participantID, $this->_contributionId, $this->_feeBlock, $lineItem, $this->_expensiveFee, $this->_priceSetID);
+    $this->balanceCheck($this->_expensiveFee);
+
+    $PSparams['price_1'] = 2;
+    $lineItem = CRM_Price_BAO_LineItem::getLineItems($this->participantID, 'participant');
+    CRM_Event_BAO_Participant::changeFeeSelections($PSparams, $this->participantID, $this->_contributionId, $this->_feeBlock, $lineItem, $this->_expensiveFee, $this->_priceSetID);
+    $this->balanceCheck($this->_cheapFee);
+
+    //Complete the refund payment.
+    $submittedValues = array(
+      'total_amount' => 120,
+      'payment_instrument_id' => 3,
+    );
+    CRM_Contribute_BAO_Contribution::recordAdditionalPayment($this->_contributionId, $submittedValues, 'refund', $this->participantID);
+
+    // retrieve the cancelled line-item information
+    $cancelledLineItem = $this->callAPISuccessGetSingle('LineItem', array(
+      'entity_table' => 'civicrm_participant',
+      'entity_id' => $this->participantID,
+      'qty' => 0,
+    ));
+    // retrieve the related financial lin-items
+    $financialItems = $this->callAPISuccess('FinancialItem', 'Get', array(
+      'entity_id' => $cancelledLineItem['id'],
+      'entity_table' => 'civicrm_line_item',
+    ));
+    $this->assertEquals($financialItems['count'], 2, 'Financial Items for Cancelled fee is not proper');
+
+    $contributionCompletedStatusID = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Completed');
+    $expectedAmount = 100.00;
+    foreach ($financialItems['values'] as $id => $financialItem) {
+      $this->assertEquals($expectedAmount, $financialItem['amount']);
+      $this->assertNotEmpty($financialItem['financial_account_id']);
+      $this->assertEquals($contributionCompletedStatusID, $financialItem['status_id']);
+      $expectedAmount = -$expectedAmount;
+    }
   }
 
 }