Fix for CRM-14354 - Additional gift breaks ARB (auto-renewing) memberships.
authorFrank J. Gómez <frank@ginkgostreet.com>
Mon, 28 Apr 2014 00:18:15 +0000 (17:18 -0700)
committerFrank J. Gómez <frank@ginkgostreet.com>
Mon, 28 Apr 2014 00:18:15 +0000 (17:18 -0700)
----------------------------------------
* CRM-14354: Additional gift breaks ARB (auto-renewing) memberships
  https://issues.civicrm.org/jira/browse/CRM-14354

CRM/Contribute/BAO/Contribution/Utils.php
CRM/Core/Payment/AuthorizeNet.php
CRM/Member/BAO/Membership.php

index 3ca834ebbbe7872192bd7247a68199158ee47af9..f0d861b1c096ff34e6e92e9ed73560d07771f923 100644 (file)
@@ -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;
index 21c2e5e270de2eff82bc88deb021d1e9be53a2c8..9ec56c44184e5aa3022015ab731b6e0234fb1eeb 100644 (file)
@@ -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;
index 8a9d5b41bc9d76cc891bda85a77f9ea6c228fdde..dffb84db884982a9d5f828e56c579a6e02ed92ac 100644 (file)
@@ -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