* @return array
*/
public static function calculateRecurLineItems($recurId, $total_amount, $financial_type_id) {
- $originalContributionID = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $recurId, 'id', 'contribution_recur_id');
- $lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($originalContributionID);
+ $originalContribution = civicrm_api3('Contribution', 'getsingle', array(
+ 'contribution_recur_id' => $recurId,
+ 'contribution_test' => '',
+ 'options' => ['limit' => 1],
+ 'return' => ['id', 'financial_type_id'],
+ ));
+ $lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($originalContribution['id']);
$lineSets = array();
if (count($lineItems) == 1) {
foreach ($lineItems as $index => $lineItem) {
+ if ($lineItem['financial_type_id'] != $originalContribution['financial_type_id']) {
+ // CRM-20685, Repeattransaction produces incorrect Financial Type ID (in specific circumstance) - if number of lineItems = 1, So this conditional will set the financial_type_id as the original if line_item and contribution comes with different data.
+ $financial_type_id = $lineItem['financial_type_id'];
+ }
if ($financial_type_id) {
// CRM-17718 allow for possibility of changed financial type ID having been set prior to calling this.
$lineItem['financial_type_id'] = $financial_type_id;
));
}
+ /**
+ * CRM-20685 Repeattransaction produces incorrect Financial Type ID (in specific circumstance) - if number of lineItems = 1.
+ *
+ * This case happens when the line item & contribution do not have the same type in his initiating transaction.
+ */
+ public function testRepeatTransactionUpdatedFinancialTypeAndNotEquals() {
+ $originalContribution = $this->setUpRecurringContribution(array(), array('financial_type_id' => 2));
+ // This will made the trick to get the not equals behaviour.
+ $this->callAPISuccess('line_item', 'create', array('id' => 1, 'financial_type_id' => 4));
+ $this->callAPISuccess('contribution', 'repeattransaction', array(
+ 'contribution_recur_id' => $originalContribution['id'],
+ 'contribution_status_id' => 'Completed',
+ 'trxn_id' => uniqid(),
+ ));
+ $lineItemParams = array(
+ 'entity_id' => $originalContribution['id'],
+ 'sequential' => 1,
+ 'return' => array(
+ 'entity_table',
+ 'qty',
+ 'unit_price',
+ 'line_total',
+ 'label',
+ 'financial_type_id',
+ 'deductible_amount',
+ 'price_field_value_id',
+ 'price_field_id',
+ ),
+ );
+ $this->callAPISuccessGetSingle('contribution', array(
+ 'total_amount' => 100,
+ 'financial_type_id' => 2,
+ ));
+ $lineItem1 = $this->callAPISuccess('line_item', 'get', array_merge($lineItemParams, array(
+ 'entity_id' => $originalContribution['id'],
+ )));
+ $expectedLineItem = array_merge(
+ $lineItem1['values'][0], array(
+ 'line_total' => '100.00',
+ 'unit_price' => '100.00',
+ 'financial_type_id' => 4,
+ 'contribution_type_id' => 4,
+ )
+ );
+
+ $lineItem2 = $this->callAPISuccess('line_item', 'get', array_merge($lineItemParams, array(
+ 'entity_id' => $originalContribution['id'] + 1,
+ )));
+ $this->callAPISuccess('line_item', 'create', array('id' => 1, 'financial_type_id' => 1));
+ unset($expectedLineItem['id'], $expectedLineItem['entity_id']);
+ unset($lineItem2['values'][0]['id'], $lineItem2['values'][0]['entity_id']);
+ $this->assertEquals($expectedLineItem, $lineItem2['values'][0]);
+ }
+
+
/**
* Test completing a transaction does not 'mess' with net amount (CRM-15960).
*/