From 6401a5e0547a32f163f546cf213e0492c603d1aa Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Wed, 5 Nov 2014 14:10:36 +1300 Subject: [PATCH] CRM-15203 fix for membership payment records not being created --- CRM/Core/Payment/BaseIPN.php | 82 ++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 27 deletions(-) diff --git a/CRM/Core/Payment/BaseIPN.php b/CRM/Core/Payment/BaseIPN.php index e4a4131d3a..4f399ffd67 100644 --- a/CRM/Core/Payment/BaseIPN.php +++ b/CRM/Core/Payment/BaseIPN.php @@ -200,8 +200,9 @@ class CRM_Core_Payment_BaseIPN { $contribution->save(); //add lineitems for recurring payments - if (CRM_Utils_Array::value('contributionRecur', $objects) && $objects['contributionRecur']->id && $addLineItems) { - $this->addrecurLineItems($objects['contributionRecur']->id, $contribution->id, CRM_Core_DAO::$_nullArray); + + if (!empty($objects['contributionRecur']) && $objects['contributionRecur']->id && $addLineItems) { + $this->addRecurLineItems($objects['contributionRecur']->id, $contribution); } //copy initial contribution custom fields for recurring contributions @@ -271,8 +272,8 @@ class CRM_Core_Payment_BaseIPN { $contribution->save(); //add lineitems for recurring payments - if (CRM_Utils_Array::value('contributionRecur', $objects) && $objects['contributionRecur']->id && $addLineItems) { - $this->addrecurLineItems($objects['contributionRecur']->id, $contribution->id, CRM_Core_DAO::$_nullArray); + if (!empty($objects['contributionRecur']) && $objects['contributionRecur']->id && $addLineItems) { + $this->addRecurLineItems($objects['contributionRecur']->id, $contribution); } //copy initial contribution custom fields for recurring contributions @@ -538,8 +539,32 @@ LIMIT 1;"; $contribution->save(); //add lineitems for recurring payments - if (CRM_Utils_Array::value('contributionRecur', $objects) && $objects['contributionRecur']->id && $addLineItems) { - $this->addrecurLineItems($objects['contributionRecur']->id, $contribution->id, $input); + if (!empty($objects['contributionRecur']) && $objects['contributionRecur']->id) { + if ($addLineItems) { + $input ['line_item'] = $this->addRecurLineItems($objects['contributionRecur']->id, $contribution); + } + else { + // this is just to prevent e-notices when we call recordFinancialAccounts - per comments on that line - intention is somewhat unclear + $input['line_item'] = array(); + } + if (!empty($memberships) && $primaryContributionID != $contribution->id) { + foreach ($memberships as $membership) { + try { + $membershipPayment = array( + 'membership_id' => $membership->id, + 'contribution_id' => $contribution->id + ); + if (!civicrm_api3('membership_payment', 'getcount', $membershipPayment)) { + civicrm_api3('membership_payment', 'create', $membershipPayment); + } + } + catch (CiviCRM_API3_Exception $e) { + echo $e->getMessage(); + // we are catching & ignoring errors as an extra precaution since lost IPNs may be more serious that lost membership_payment data + // this fn is unit-tested so risk of changes elsewhere breaking it are otherwise mitigated + } + } + } } //copy initial contribution custom fields for recurring contributions @@ -580,7 +605,7 @@ LIMIT 1;"; $input['skipLineItem'] = 1; } //@todo writing a unit test I was unable to create a scenario where this line did not fatal on second - // and subsequent payments. In this case the line items are created at $this->addrecurLineItems + // and subsequent payments. In this case the line items are created at $this->addRecurLineItems // and since the contribution is saved prior to this line there is always a contribution-id, // however there is never a prevContribution (which appears to mean original contribution not previous // contribution - or preUpdateContributionObject most accurately) @@ -588,6 +613,7 @@ LIMIT 1;"; // to mean "are we updating an exisitng pending contribution" //I was able to make the unit test complete as fataling here doesn't prevent // the contribution being created - but activities would not be created or emails sent + CRM_Contribute_BAO_Contribution::recordFinancialAccounts($input, NULL); } @@ -847,28 +873,30 @@ LIMIT 1;"; ); } - function addrecurLineItems($recurId, $contributionId, &$input) { - $lineSets = $lineItems = array(); - - //Get the first contribution id with recur id - if ($recurId) { - $contriID = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $recurId, 'id', 'contribution_recur_id'); - $lineItems = CRM_Price_BAO_LineItem::getLineItems($contriID, 'contribution'); - if (!empty($lineItems)) { - foreach ($lineItems as $key => $value) { - $pricesetID = new CRM_Price_DAO_PriceField(); - $pricesetID->id = $value['price_field_id']; - $pricesetID->find(TRUE); - $lineSets[$pricesetID->price_set_id][] = $value; - } - } - if (!empty($input)) { - $input['line_item'] = $lineSets; - } - else { - CRM_Price_BAO_LineItem::processPriceSet($contributionId, $lineSets); + /** + * @param $recurId + * @param $contribution + * + * @internal param $contributionId + * + * @return array + */ + function addRecurLineItems($recurId, $contribution) { + $lineSets = array(); + + $originalContributionID = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $recurId, 'id', 'contribution_recur_id'); + $lineItems = CRM_Price_BAO_LineItem::getLineItems($originalContributionID, 'contribution'); if (!empty($lineItems)) { + foreach ($lineItems as $key => $value) { + $priceField = new CRM_Price_DAO_PriceField(); + $priceField->id = $value['price_field_id']; + $priceField->find(TRUE); + $lineSets[$priceField->price_set_id][] = $value; } } + else { + CRM_Price_BAO_LineItem::processPriceSet($contribution->id, $lineSets, $contribution); + } + return $lineSets; } // function to copy custom data of the -- 2.25.1