From cd125a40afa674f082be2d84691b9186d3f3d534 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Frank=20J=2E=20G=C3=B3mez?= Date: Sun, 27 Apr 2014 17:18:15 -0700 Subject: [PATCH] Fix for CRM-14354 - Additional gift breaks ARB (auto-renewing) memberships. ---------------------------------------- * CRM-14354: Additional gift breaks ARB (auto-renewing) memberships https://issues.civicrm.org/jira/browse/CRM-14354 --- CRM/Contribute/BAO/Contribution/Utils.php | 15 +++++++++ CRM/Core/Payment/AuthorizeNet.php | 8 ++--- CRM/Member/BAO/Membership.php | 41 +++++++++++++++++++---- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution/Utils.php b/CRM/Contribute/BAO/Contribution/Utils.php index 3ca834ebbb..f0d861b1c0 100644 --- a/CRM/Contribute/BAO/Contribution/Utils.php +++ b/CRM/Contribute/BAO/Contribution/Utils.php @@ -209,6 +209,17 @@ class CRM_Contribute_BAO_Contribution_Utils { // When we get a callback from the payment processor $paymentParams['contactID'] = $contactID; + + // Fix for CRM-14354. If the membership is recurring, don't create a + // civicrm_contribution_recur record for the additional contribution + // (i.e., the amount NOT associated with the membership). Temporarily + // cache the is_recur values so we can process the additional gift as a + // one-off payment. + $cachedFormValue = CRM_Utils_Array::value('is_recur', $form->_values); + unset($form->_values['is_recur']); + $cachedParamValue = CRM_Utils_Array::value('is_recur', $paymentParams); + unset($paymentParams['is_recur']); + $contribution = CRM_Contribute_Form_Contribution_Confirm::processContribution( $form, $paymentParams, @@ -218,6 +229,10 @@ class CRM_Contribute_BAO_Contribution_Utils { TRUE, TRUE, TRUE ); + // restore cached values (part of fix for CRM-14354) + $form->_values['is_recur'] = $cachedFormValue; + $paymentParams['is_recur'] = $cachedParamValue; + $paymentParams['contributionID'] = $contribution->id; $paymentParams['contributionTypeID'] = $contribution->financial_type_id; $paymentParams['contributionPageID'] = $contribution->contribution_page_id; diff --git a/CRM/Core/Payment/AuthorizeNet.php b/CRM/Core/Payment/AuthorizeNet.php index 21c2e5e270..9ec56c4418 100644 --- a/CRM/Core/Payment/AuthorizeNet.php +++ b/CRM/Core/Payment/AuthorizeNet.php @@ -100,9 +100,7 @@ class CRM_Core_Payment_AuthorizeNet extends CRM_Core_Payment { * & giving it a change to act on the params array */ $newParams = $params; - if (!empty($params['is_recur']) && - $params['contributionRecurID'] - ) { + if (!empty($params['is_recur']) && !empty($params['contributionRecurID'])) { CRM_Utils_Hook::alterPaymentProcessorParams($this, $params, $newParams @@ -112,9 +110,7 @@ class CRM_Core_Payment_AuthorizeNet extends CRM_Core_Payment { $this->_setParam($field, $value); } - if (!empty($params['is_recur']) && - $params['contributionRecurID'] - ) { + if (!empty($params['is_recur']) && !empty($params['contributionRecurID'])) { $result = $this->doRecurPayment(); if (is_a($result, 'CRM_Core_Error')) { return $result; diff --git a/CRM/Member/BAO/Membership.php b/CRM/Member/BAO/Membership.php index 8a9d5b41bc..dffb84db88 100644 --- a/CRM/Member/BAO/Membership.php +++ b/CRM/Member/BAO/Membership.php @@ -1291,19 +1291,15 @@ AND civicrm_membership.is_test = %2"; $invoiceID = md5(uniqid(rand(), TRUE)); $tempParams['invoiceID'] = $invoiceID; - //we don't allow recurring membership.CRM-3781. - if (!empty($tempParams['is_recur'])) { - $tempParams['is_recur'] = 0; - } $result = NULL; if ($form->_values['is_monetary'] && !$form->_params['is_pay_later'] && $minimumFee > 0.0) { $payment = CRM_Core_Payment::singleton($form->_mode, $form->_paymentProcessor, $form); if ($form->_contributeMode == 'express') { - $result = &$payment->doExpressCheckout($tempParams); + $result = $payment->doExpressCheckout($tempParams); } else { - $result = &$payment->doDirectPayment($tempParams); + $result = $payment->doDirectPayment($tempParams); } } @@ -1367,6 +1363,9 @@ AND civicrm_membership.is_test = %2"; $customFieldsFormatted, CRM_Utils_Array::value($memType, $typesTerms, 1) ); + // update recurring id for membership record + self::updateRecurMembership($membership, $contribution[$index]); + $createdMemberships[$memType] = $membership; if (isset($contribution[$index])) { //insert payment record @@ -1405,6 +1404,10 @@ AND civicrm_membership.is_test = %2"; CRM_Utils_Array::value('cms_contactID', $membershipParams), $customFieldsFormatted, CRM_Utils_Array::value('types_terms', $membershipParams, 1) ); + + // update recurring id for membership record + self::updateRecurMembership($membership, $contribution[$index]); + if (isset($contribution[$index])) { //insert payment record $dao = new CRM_Member_DAO_MembershipPayment(); @@ -1469,6 +1472,32 @@ AND civicrm_membership.is_test = %2"; ); } + /** + * Function for updating a membership record's contribution_recur_id + * + * @param object CRM_Member_BAO_Membership $membership + * @param object CRM_Contribute_BAO_Contribution $contribution + * + * @return void + * @static + * @access public + */ + static public function updateRecurMembership(CRM_Member_BAO_Membership &$membership, + CRM_Contribute_BAO_Contribution &$contribution) { + + if (empty($contribution->contribution_recur_id)) { + return; + } + + $params = array( + 1 => array($contribution->contribution_recur_id, 'Integer'), + 2 => array($membership->id, 'Integer'), + ); + + $sql = "UPDATE civicrm_membership SET contribution_recur_id = %1 WHERE id = %2"; + CRM_Core_DAO::executeQuery($sql, $params); + } + /** * @todo - this form method needs to have the interaction with the form layer removed from it * as a BAO function. Note that the api now supports membership renewals & it is not clear this function does anything -- 2.25.1