// 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,
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;
* & 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
$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;
$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);
}
}
$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
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();
);
}
+ /**
+ * 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