<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.6 |
+ | CiviCRM version 4.7 |
+--------------------------------------------------------------------+
| Copyright CiviCRM LLC (c) 2004-2015 |
+--------------------------------------------------------------------+
* Set the parameters to be passed to contribution create function.
*
* @param array $params
- * @param int $contactID
* @param int $financialTypeID
- * @param bool $online
- * @param int $contributionPageId
* @param float $nonDeductibleAmount
- * @param int $campaignId
- * @param bool $isMonetary
* @param bool $pending
- * @param $paymentProcessorOutcome
- * @param $receiptDate
+ * @param array $paymentProcessorOutcome
+ * @param string $receiptDate
* @param int $recurringContributionID
- * @param $isTest
- * @param int $addressID
- * @param int $softCreditToID
- * @param array $lineItems
*
* @return array
*/
public static function getContributionParams(
- $params, $contactID, $financialTypeID, $online, $contributionPageId, $nonDeductibleAmount, $campaignId, $isMonetary, $pending,
- $paymentProcessorOutcome, $receiptDate, $recurringContributionID, $isTest, $addressID, $softCreditToID, $lineItems) {
+ $params, $financialTypeID, $nonDeductibleAmount, $pending,
+ $paymentProcessorOutcome, $receiptDate, $recurringContributionID) {
$contributionParams = array(
- 'contact_id' => $contactID,
'financial_type_id' => $financialTypeID,
- 'contribution_page_id' => $contributionPageId,
'receive_date' => (CRM_Utils_Array::value('receive_date', $params)) ? CRM_Utils_Date::processDate($params['receive_date']) : date('YmdHis'),
'non_deductible_amount' => $nonDeductibleAmount,
'total_amount' => $params['amount'],
'amount_level' => CRM_Utils_Array::value('amount_level', $params),
'invoice_id' => $params['invoiceID'],
'currency' => $params['currencyID'],
- 'source' => (!$online || !empty($params['source'])) ? CRM_Utils_Array::value('source', $params) : CRM_Utils_Array::value('description', $params),
'is_pay_later' => CRM_Utils_Array::value('is_pay_later', $params, 0),
//configure cancel reason, cancel date and thankyou date
//from 'contribution' type profile if included
'cancel_reason' => CRM_Utils_Array::value('cancel_reason', $params, 0),
'cancel_date' => isset($params['cancel_date']) ? CRM_Utils_Date::format($params['cancel_date']) : NULL,
'thankyou_date' => isset($params['thankyou_date']) ? CRM_Utils_Date::format($params['thankyou_date']) : NULL,
- 'campaign_id' => $campaignId,
- 'is_test' => $isTest,
- 'address_id' => $addressID,
//setting to make available to hook - although seems wrong to set on form for BAO hook availability
- 'soft_credit_to' => $softCreditToID,
- 'line_item' => $lineItems,
'skipLineItem' => CRM_Utils_Array::value('skipLineItem', $params, 0),
);
- if (!$online && isset($params['thankyou_date'])) {
- $contributionParam['thankyou_date'] = $params['thankyou_date'];
- }
- if (!$online || $isMonetary) {
- if (empty($params['is_pay_later'])) {
- $contributionParams['payment_instrument_id'] = 1;
- }
- }
+
if ($paymentProcessorOutcome) {
$contributionParams['payment_processor'] = CRM_Utils_Array::value('payment_processor', $paymentProcessorOutcome);
}
// lineItem isn't set until Register postProcess
$this->_lineItem = $this->get('lineItem');
$this->_paymentProcessor = $this->get('paymentProcessor');
-
- if ($this->_contributeMode == 'express') {
- // rfp == redirect from paypal
- $rfp = CRM_Utils_Request::retrieve('rfp', 'Boolean',
- CRM_Core_DAO::$_nullObject, FALSE, NULL, 'GET'
- );
- if ($rfp) {
- $payment = CRM_Core_Payment::singleton($this->_mode, $this->_paymentProcessor, $this);
- $expressParams = $payment->getExpressCheckoutDetails($this->get('token'));
-
- $this->_params['payer'] = CRM_Utils_Array::value('payer', $expressParams);
- $this->_params['payer_id'] = $expressParams['payer_id'];
- $this->_params['payer_status'] = $expressParams['payer_status'];
-
- CRM_Core_Payment_Form::mapParams($this->_bltID, $expressParams, $this->_params, FALSE);
-
- // fix state and country id if present
- if (!empty($this->_params["billing_state_province_id-{$this->_bltID}"])) {
- $this->_params["billing_state_province-{$this->_bltID}"] = CRM_Core_PseudoConstant::stateProvinceAbbreviation($this->_params["billing_state_province_id-{$this->_bltID}"]);
- }
- if (!empty($this->_params["billing_country_id-{$this->_bltID}"]) && $this->_params["billing_country_id-{$this->_bltID}"]) {
- $this->_params["billing_country-{$this->_bltID}"] = CRM_Core_PseudoConstant::countryIsoCode($this->_params["billing_country_id-{$this->_bltID}"]);
- }
-
- // set a few other parameters for PayPal
- $this->_params['token'] = $this->get('token');
-
- $this->_params['amount'] = $this->get('amount');
-
- if (!empty($this->_membershipBlock)) {
- $this->_params['selectMembership'] = $this->get('selectMembership');
- }
- // we use this here to incorporate any changes made by folks in hooks
- $this->_params['currencyID'] = $config->defaultCurrency;
-
- // also merge all the other values from the profile fields
- $values = $this->controller->exportValues('Main');
- $skipFields = array(
- 'amount',
- 'amount_other',
- "billing_street_address-{$this->_bltID}",
- "billing_city-{$this->_bltID}",
- "billing_state_province_id-{$this->_bltID}",
- "billing_postal_code-{$this->_bltID}",
- "billing_country_id-{$this->_bltID}",
- );
- foreach ($values as $name => $value) {
- // skip amount field
- if (!in_array($name, $skipFields)) {
- $this->_params[$name] = $value;
- }
- }
- $this->set('getExpressCheckoutDetails', $this->_params);
- }
- else {
- $this->_params = $this->get('getExpressCheckoutDetails');
- }
+ $this->_params = $this->controller->exportValues('Main');
+ $this->_params['ip_address'] = CRM_Utils_System::ipAddress();
+ $this->_params['amount'] = $this->get('amount');
+ if (isset($this->_params['amount'])) {
+ $this->setFormAmountFields($this->_params['priceSetId']);
}
- else {
- $this->_params = $this->controller->exportValues('Main');
- if (!empty($this->_params["billing_state_province_id-{$this->_bltID}"])) {
- $this->_params["billing_state_province-{$this->_bltID}"] = CRM_Core_PseudoConstant::stateProvinceAbbreviation($this->_params["billing_state_province_id-{$this->_bltID}"]);
- }
- if (!empty($this->_params["billing_country_id-{$this->_bltID}"])) {
- $this->_params["billing_country-{$this->_bltID}"] = CRM_Core_PseudoConstant::countryIsoCode($this->_params["billing_country_id-{$this->_bltID}"]);
- }
+ $this->_params['tax_amount'] = $this->get('tax_amount');
+ $this->_useForMember = $this->get('useForMember');
- if (isset($this->_params['credit_card_exp_date'])) {
- $this->_params['year'] = CRM_Core_Payment_Form::getCreditCardExpirationYear($this->_params);
- $this->_params['month'] = CRM_Core_Payment_Form::getCreditCardExpirationMonth($this->_params);
- }
+ if (isset($this->_params['credit_card_exp_date'])) {
+ $this->_params['year'] = CRM_Core_Payment_Form::getCreditCardExpirationYear($this->_params);
+ $this->_params['month'] = CRM_Core_Payment_Form::getCreditCardExpirationMonth($this->_params);
+ }
- $this->_params['ip_address'] = CRM_Utils_System::ipAddress();
- $this->_params['amount'] = $this->get('amount');
- $this->_params['tax_amount'] = $this->get('tax_amount');
+ $this->_params['currencyID'] = $config->defaultCurrency;
- $this->_useForMember = $this->get('useForMember');
+ if (!empty($this->_membershipBlock)) {
+ $this->_params['selectMembership'] = $this->get('selectMembership');
+ }
+ if (!empty($this->_paymentProcessor) && $this->_paymentProcessor['object']->supports('preApproval')) {
+ $preApprovalParams = $this->_paymentProcessor['object']->getPreApprovalDetails($this->get('pre_approval_parameters'));
+ $this->_params = array_merge($this->_params, $preApprovalParams);
+ }
- if (isset($this->_params['amount'])) {
- $this->setFormAmountFields($this->_params['priceSetId']);
- }
- $this->_params['currencyID'] = $config->defaultCurrency;
+ // We may have fetched some billing details from the getPreApprovalDetails function so we
+ // want to ensure we set this after that function has been called.
+ CRM_Core_Payment_Form::mapParams($this->_bltID, $this->_params, $this->_params, FALSE);
+ if (!empty($this->_params["billing_state_province_id-{$this->_bltID}"])) {
+ $this->_params["billing_state_province-{$this->_bltID}"] = CRM_Core_PseudoConstant::stateProvinceAbbreviation($this->_params["billing_state_province_id-{$this->_bltID}"]);
+ }
+ if (!empty($this->_params["billing_country_id-{$this->_bltID}"])) {
+ $this->_params["billing_country-{$this->_bltID}"] = CRM_Core_PseudoConstant::countryIsoCode($this->_params["billing_country_id-{$this->_bltID}"]);
}
$this->_params['is_pay_later'] = $this->get('is_pay_later');
$this->assign('pay_later_receipt', $this->_values['pay_later_receipt']);
}
// if onbehalf-of-organization
- if (!empty($this->_params['hidden_onbehalf_profile'])) {
+ if (!empty($this->_values['onbehalf_profile_id']) && !empty($this->_params['onbehalf']['organization_name'])) {
// CRM-15182
- if (empty($this->_params['org_option']) && empty($this->_params['organization_id'])) {
- if (!empty($this->_params['onbehalfof_id'])) {
- $this->_params['organization_id'] = $this->_params['onbehalfof_id'];
- }
- else {
- $this->_params['organization_id'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_params['onbehalf']['organization_name'], 'id', 'display_name');
- }
- }
+ $this->_params['organization_id'] = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $this->_params['onbehalf']['organization_name'], 'id', 'display_name');
$this->_params['organization_name'] = $this->_params['onbehalf']['organization_name'];
$addressBlocks = array(
}
}
}
-
- // if auto renew checkbox is set, initiate a open-ended recurring membership
- if ((!empty($this->_params['selectMembership']) || !empty($this->_params['priceSetId'])) && !empty($this->_paymentProcessor['is_recur']) &&
- CRM_Utils_Array::value('auto_renew', $this->_params) && empty($this->_params['is_recur']) && empty($this->_params['frequency_interval'])
- ) {
-
- $this->_params['is_recur'] = $this->_values['is_recur'] = 1;
- // check if price set is not quick config
- if (!empty($this->_params['priceSetId']) && !CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_params['priceSetId'], 'is_quick_config')) {
- list($this->_params['frequency_interval'], $this->_params['frequency_unit']) = CRM_Price_BAO_PriceSet::getRecurDetails($this->_params['priceSetId']);
- }
- else {
- // FIXME: set interval and unit based on selected membership type
- $this->_params['frequency_interval'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType',
- $this->_params['selectMembership'], 'duration_interval'
- );
- $this->_params['frequency_unit'] = CRM_Core_DAO::getFieldValue('CRM_Member_DAO_MembershipType',
- $this->_params['selectMembership'], 'duration_unit'
- );
- }
- }
+ $this->setRecurringMembershipParams();
if ($this->_pcpId) {
$params = $this->processPcp($this, $this->_params);
$params = $this->_params;
// make sure we have values for it
- if ($this->_honor_block_is_active && !empty($params['soft_credit_type_id'])) {
+ if (!empty($this->_values['honoree_profile_id']) && !empty($params['soft_credit_type_id'])) {
$honorName = NULL;
$softCreditTypes = CRM_Core_OptionGroup::values("soft_credit_type", FALSE);
- $this->assign('honor_block_is_active', $this->_honor_block_is_active);
$this->assign('soft_credit_type', $softCreditTypes[$params['soft_credit_type_id']]);
- CRM_Contribute_BAO_ContributionSoft::formatHonoreeProfileFields($this, $params['honor'], $params['honoree_profile_id']);
+ CRM_Contribute_BAO_ContributionSoft::formatHonoreeProfileFields($this, $params['honor']);
$fieldTypes = array('Contact');
- $fieldTypes[] = CRM_Core_BAO_UFGroup::getContactType($params['honoree_profile_id']);
- $this->buildCustom($params['honoree_profile_id'], 'honoreeProfileFields', TRUE, 'honor', $fieldTypes);
+ $fieldTypes[] = CRM_Core_BAO_UFGroup::getContactType($this->_values['honoree_profile_id']);
+ $this->buildCustom($this->_values['honoree_profile_id'], 'honoreeProfileFields', TRUE, 'honor', $fieldTypes);
}
$this->assign('receiptFromEmail', CRM_Utils_Array::value('receipt_from_email', $this->_values));
$amount_block_is_active = $this->get('amount_block_is_active');
$this->buildCustom($this->_values['custom_pre_id'], 'customPre', TRUE);
$this->buildCustom($this->_values['custom_post_id'], 'customPost', TRUE);
- if (!empty($params['hidden_onbehalf_profile'])) {
- $ufJoinParams = array(
- 'module' => 'onBehalf',
- 'entity_table' => 'civicrm_contribution_page',
- 'entity_id' => $this->_id,
- );
- $OnBehalfProfile = CRM_Core_BAO_UFJoin::getUFGroupIds($ufJoinParams);
- $profileId = $OnBehalfProfile[0];
-
+ if (!empty($this->_values['onbehalf_profile_id']) && !empty($params['onbehalf'])) {
$fieldTypes = array('Contact', 'Organization');
$contactSubType = CRM_Contact_BAO_ContactType::subTypes('Organization');
$fieldTypes = array_merge($fieldTypes, $contactSubType);
$fieldTypes = array_merge($fieldTypes, array('Contribution'));
}
- $this->buildCustom($profileId, 'onbehalfProfile', TRUE, 'onbehalf', $fieldTypes);
+ $this->buildCustom($this->_values['onbehalf_profile_id'], 'onbehalfProfile', TRUE, 'onbehalf', $fieldTypes);
}
$this->_separateMembershipPayment = $this->get('separateMembershipPayment');
}
/**
- * Overwrite action, since we are only showing elements in frozen mode
- * no help display needed
+ * Overwrite action.
+ *
+ * Since we are only showing elements in frozen mode no help display needed.
*
* @return int
*/
*
* Note that in edit/view mode
* the default values are retrieved from the database
- *
- * @return void
*/
public function setDefaultValues() {
}
"_qf_Main_display=true&qfKey={$this->_params['qfKey']}"
));
}
+ // Presumably this is for hooks to access? Not quite clear & perhaps not required.
+ $this->set('params', $this->_params);
}
/**
* @param array $premiumParams
* @param CRM_Contribute_BAO_Contribution $contribution
*/
- public function postProcessPremium($premiumParams, $contribution) {
+ protected function postProcessPremium($premiumParams, $contribution) {
$hour = $minute = $second = 0;
// assigning Premium information to receipt tpl
$selectProduct = CRM_Utils_Array::value('selectProduct', $premiumParams);
* @param CRM_Core_Form $form
* @param array $params
* @param array $result
- * @param int $contactID
+ * @param array $contributionParams
+ * Parameters to be passed to contribution create action.
+ * This differs from params in that we are currently adding params to it and 1) ensuring they are being
+ * passed consistently & 2) documenting them here.
+ * - contact_id
+ * - line_item
+ * - is_test
+ * - campaign_id
+ * - contribution_page_id
+ * - source
+ * - payment_type_id
+ * - thankyou_date (not all forms will set this)
+ *
* @param CRM_Financial_DAO_FinancialType $financialType
- * @param bool $pending
* @param bool $online
- *
- * @param bool $isTest
- * @param array $lineItems
+ * Is the form a front end form? If so set a bunch of unpredictable things that should be passed in from the form.
*
* @param int $billingLocationID
* ID of billing location type.
&$form,
$params,
$result,
- $contactID,
+ $contributionParams,
$financialType,
- $pending,
$online,
- $isTest,
- $lineItems,
$billingLocationID
) {
$transaction = new CRM_Core_Transaction();
- $contribSoftContactId = $addressID = NULL;
- $contributeMode = $form->_contributeMode;
- $isMonetary = !empty($form->_values['is_monetary']);
+ $contactID = $contributionParams['contact_id'];
+
$isEmailReceipt = !empty($form->_values['is_email_receipt']);
- // How do these vary from params? These are currently passed to
- // - custom data function....
- $formParams = $form->_params;
- $isSeparateMembershipPayment = empty($formParams['separate_membership_payment']) ? FALSE : TRUE;
- $pledgeID = empty($formParams['pledge_id']) ? NULL : $formParams['pledge_id'];
+ $isSeparateMembershipPayment = empty($params['separate_membership_payment']) ? FALSE : TRUE;
+ $pledgeID = empty($params['pledge_id']) ? NULL : $params['pledge_id'];
if (!$isSeparateMembershipPayment && !empty($form->_values['pledge_block_id']) &&
- (!empty($formParams['is_pledge']) || $pledgeID)) {
+ (!empty($params['is_pledge']) || $pledgeID)) {
$isPledge = TRUE;
}
else {
// add these values for the recurringContrib function ,CRM-10188
$params['financial_type_id'] = $financialType->id;
- //create an contribution address
- if ($contributeMode != 'notify' && empty($params['is_pay_later']) && $isMonetary) {
- $addressID = CRM_Contribute_BAO_Contribution::createAddress($params, $billingLocationID);
- }
+ $contributionParams['address_id'] = CRM_Contribute_BAO_Contribution::createAddress($params, $billingLocationID);
//@todo - this is being set from the form to resolve CRM-10188 - an
// eNotice caused by it not being set @ the front end
$receiptDate = $now;
}
- //get the contrib page id.
- $contributionPageId = NULL;
- if ($online) {
- $contributionPageId = $form->_id;
- $campaignId = CRM_Utils_Array::value('campaign_id', $params);
- if (!array_key_exists('campaign_id', $params)) {
- $campaignId = CRM_Utils_Array::value('campaign_id', $form->_values);
- }
- }
- else {
- //also for offline we do support - CRM-7290
- $contributionPageId = CRM_Utils_Array::value('contribution_page_id', $params);
- $campaignId = CRM_Utils_Array::value('campaign_id', $params);
- }
-
- // Prepare soft contribution due to pcp or Submit Credit / Debit Card Contribution by admin.
- if (!empty($params['pcp_made_through_id']) || !empty($params['soft_credit_to'])) {
- // if its due to pcp
- if (!empty($params['pcp_made_through_id'])) {
- $contribSoftContactId = CRM_Core_DAO::getFieldValue(
- 'CRM_PCP_DAO_PCP',
- $params['pcp_made_through_id'],
- 'contact_id'
- );
- }
- else {
- $contribSoftContactId = CRM_Utils_Array::value('soft_credit_to', $params);
- }
-
- // Pass these details onto with the contribution to make them
- // available at hook_post_process, CRM-8908
- $params['soft_credit_to'] = $contribSoftContactId;
- }
-
if (isset($params['amount'])) {
- $contribParams = self::getContributionParams(
- $params, $contactID, $financialType->id, $online, $contributionPageId, $nonDeductibleAmount, $campaignId, $isMonetary, $pending, $result, $receiptDate,
- $recurringContributionID, $isTest, $addressID, $contribSoftContactId, $lineItems
+ $contributionParams = array_merge(self::getContributionParams(
+ $params, $financialType->id, $nonDeductibleAmount, TRUE,
+ $result, $receiptDate,
+ $recurringContributionID), $contributionParams
);
- $contribution = CRM_Contribute_BAO_Contribution::add($contribParams);
+ $contribution = CRM_Contribute_BAO_Contribution::add($contributionParams);
$invoiceSettings = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::CONTRIBUTE_PREFERENCES_NAME, 'contribution_invoice_settings');
$invoicing = CRM_Utils_Array::value('invoicing', $invoiceSettings);
if ($invoicing) {
$dataArray = array();
+ // @todo - interrogate the line items passed in on the params array.
+ // No reason to assume line items will be set on the form.
foreach ($form->_lineItem as $lineItemKey => $lineItemValue) {
foreach ($lineItemValue as $key => $value) {
if (isset($value['tax_amount']) && isset($value['tax_rate'])) {
$form->_contributionID = $contribution->id;
}
- //CRM-13981, processing honor contact into soft-credit contribution
- CRM_Contact_Form_ProfileContact::postProcess($form);
+ // process soft credit / pcp params first
+ CRM_Contribute_BAO_ContributionSoft::formatSoftCreditParams($params, $form);
- // process soft credit / pcp pages
- CRM_Contribute_Form_Contribution_Confirm::processPcpSoft($params, $contribution);
+ //CRM-13981, processing honor contact into soft-credit contribution
+ CRM_Contribute_BAO_ContributionSoft::processSoftContribution($params, $contribution);
//handle pledge stuff.
if ($isPledge) {
if ($pledgeID) {
//when user doing pledge payments.
//update the schedule when payment(s) are made
- foreach ($form->_params['pledge_amount'] as $paymentId => $dontCare) {
+ foreach ($params['pledge_amount'] as $paymentId => $dontCare) {
$scheduledAmount = CRM_Core_DAO::getFieldValue(
'CRM_Pledge_DAO_PledgePayment',
$paymentId,
$pledgeParams['original_installment_amount'] = $pledgeParams['installment_amount'];
//inherit campaign from contirb page.
- $pledgeParams['campaign_id'] = $campaignId;
+ $pledgeParams['campaign_id'] = CRM_Utils_Array::value('campaign_id', $contributionParams);
$pledge = CRM_Pledge_BAO_Pledge::create($pledgeParams);
}
if ($online && $contribution) {
- CRM_Core_BAO_CustomValueTable::postProcess($form->_params,
+ CRM_Core_BAO_CustomValueTable::postProcess($params,
'civicrm_contribution',
$contribution->id,
'Contribution'
* Array of fields from the onbehalf profile relevant to the organization.
*/
public static function processOnBehalfOrganization(&$behalfOrganization, &$contactID, &$values, &$params, $fields = NULL) {
- $isCurrentEmployer = FALSE;
+ $isNotCurrentEmployer = FALSE;
$dupeIDs = array();
$orgID = NULL;
- if (!empty($behalfOrganization['organization_id']) && empty($behalfOrganization['org_option'])) {
+ if (!empty($behalfOrganization['organization_id'])) {
$orgID = $behalfOrganization['organization_id'];
unset($behalfOrganization['organization_id']);
- $isCurrentEmployer = TRUE;
+ }
+ // create employer relationship with $contactID only when new organization is there
+ // else retain the existing relationship
+ else {
+ // get the Employee relationship type id
+ $relTypeId = CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_RelationshipType', 'Employee of', 'id', 'name_a_b');
+
+ // keep relationship params ready
+ $relParams['relationship_type_id'] = $relTypeId . '_a_b';
+ $relParams['is_permission_a_b'] = 1;
+ $relParams['is_active'] = 1;
+ $isNotCurrentEmployer = TRUE;
}
// formalities for creating / editing organization.
$behalfOrganization['contact_type'] = 'Organization';
- // get the relationship type id
- $relType = new CRM_Contact_DAO_RelationshipType();
- $relType->name_a_b = 'Employee of';
- $relType->find(TRUE);
- $relTypeId = $relType->id;
-
- // keep relationship params ready
- $relParams['relationship_type_id'] = $relTypeId . '_a_b';
- $relParams['is_permission_a_b'] = 1;
- $relParams['is_active'] = 1;
-
if (!$orgID) {
// check if matching organization contact exists
$dedupeParams = CRM_Dedupe_Finder::formatParams($behalfOrganization, 'Organization');
NULL, NULL, 'Organization'
);
// create relationship
- $relParams['contact_check'][$orgID] = 1;
- $cid = array('contact' => $contactID);
- CRM_Contact_BAO_Relationship::legacyCreateMultiple($relParams, $cid);
+ if ($isNotCurrentEmployer) {
+ $relParams['contact_check'][$orgID] = 1;
+ $cid = array('contact' => $contactID);
+ CRM_Contact_BAO_Relationship::legacyCreateMultiple($relParams, $cid);
+ }
// if multiple match - send a duplicate alert
if ($dupeIDs && (count($dupeIDs) > 1)) {
// required for mailing/template display ..etc
$values['related_contact'] = $contactID;
- // required for IPN
- $params['related_contact'] = $contactID;
//make this employee of relationship as current
//employer / employee relationship, CRM-3532
- if ($isCurrentEmployer &&
+ if ($isNotCurrentEmployer &&
($orgID != CRM_Core_DAO::getFieldValue('CRM_Contact_DAO_Contact', $contactID, 'employer_id'))
) {
- $isCurrentEmployer = FALSE;
+ $isNotCurrentEmployer = FALSE;
}
- if (!$isCurrentEmployer && $orgID) {
+ if (!$isNotCurrentEmployer && $orgID) {
//build current employer params
$currentEmpParams[$contactID] = $orgID;
CRM_Contact_BAO_Contact_Utils::setCurrentEmployer($currentEmpParams);
}
}
- /**
- * Function used to save pcp / soft credit entry.
- *
- * This is used by contribution and also event pcps
- *
- * @param array $params
- * @param object $contribution
- * Contribution object.
- */
- public static function processPcpSoft(&$params, &$contribution) {
- // Add soft contribution due to pcp or Submit Credit / Debit Card Contribution by admin.
- if (!empty($params['soft_credit_to'])) {
- $contributionSoftParams = array();
- foreach (array(
- 'pcp_display_in_roll',
- 'pcp_roll_nickname',
- 'pcp_personal_note',
- 'amount',
- ) as $val) {
- if (!empty($params[$val])) {
- $contributionSoftParams[$val] = $params[$val];
- }
- }
-
- $contributionSoftParams['contact_id'] = $params['soft_credit_to'];
- // add contribution id
- $contributionSoftParams['contribution_id'] = $contribution->id;
- // add pcp id
- $contributionSoftParams['pcp_id'] = $params['pcp_made_through_id'];
-
- $contributionSoftParams['soft_credit_type_id'] = CRM_Core_OptionGroup::getValue('soft_credit_type', 'pcp', 'name');
-
- $contributionSoft = CRM_Contribute_BAO_ContributionSoft::add($contributionSoftParams);
-
- //Send notification to owner for PCP
- if ($contributionSoft->id && $contributionSoft->pcp_id) {
- CRM_Contribute_Form_Contribution_Confirm::pcpNotifyOwner($contribution, $contributionSoft);
- }
- }
- }
-
/**
* Function used to send notification mail to pcp owner.
*
'donors_email' => $email,
'pcpInfoURL' => $pcpInfoURL,
'is_honor_roll_enabled' => $contributionSoft->pcp_display_in_roll,
+ 'currency' => $contributionSoft->currency,
);
$domainValues = CRM_Core_BAO_Domain::getNameAndEmail();
$sendTemplateParams = array(
* @param array $premiumParams
* @param array $membershipLineItems
* Line items specifically relating to memberships.
- * @param $isPayLater
+ * @param bool $isPayLater
*/
- public function processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams, $membershipLineItems, $isPayLater) {
- try {
- $membershipTypeIDs = (array) $membershipParams['selectMembership'];
- $membershipTypes = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, $membershipTypeIDs);
- $membershipType = empty($membershipTypes) ? array() : reset($membershipTypes);
- $isPending = $this->getIsPending();
+ protected function processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams,
+ $membershipLineItems, $isPayLater) {
+
+ $membershipTypeIDs = (array) $membershipParams['selectMembership'];
+ $membershipTypes = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, $membershipTypeIDs);
+ $membershipType = empty($membershipTypes) ? array() : reset($membershipTypes);
+ $isPending = $this->getIsPending();
+
+ $this->assign('membership_name', CRM_Utils_Array::value('name', $membershipType));
+
+ $isPaidMembership = FALSE;
+ if ($this->_amount >= 0.0 && isset($membershipParams['amount'])) {
+ //amount must be greater than zero for
+ //adding contribution record to contribution table.
+ //this condition arises when separate membership payment is
+ //enabled and contribution amount is not selected. fix for CRM-3010
+ $isPaidMembership = TRUE;
+ }
+ $isProcessSeparateMembershipTransaction = $this->isSeparateMembershipTransaction($this->_id, $this->_values['amount_block_is_active']);
+
+ if ($this->_values['amount_block_is_active']) {
+ $financialTypeID = $this->_values['financial_type_id'];
+ }
+ else {
+ $financialTypeID = CRM_Utils_Array::value('financial_type_id', $membershipType, CRM_Utils_Array::value('financial_type_id', $membershipParams));
+ }
+
+ if (CRM_Utils_Array::value('membership_source', $this->_params)) {
+ $membershipParams['contribution_source'] = $this->_params['membership_source'];
+ }
- $this->assign('membership_name', CRM_Utils_Array::value('name', $membershipType));
+ $this->postProcessMembership($membershipParams, $contactID,
+ $this, $premiumParams, $customFieldsFormatted, $fieldTypes, $membershipType, $membershipTypeIDs, $isPaidMembership, $this->_membershipId, $isProcessSeparateMembershipTransaction, $financialTypeID,
+ $membershipLineItems, $isPayLater, $isPending);
- $isPaidMembership = FALSE;
- if ($this->_amount >= 0.0 && isset($membershipParams['amount'])) {
- //amount must be greater than zero for
- //adding contribution record to contribution table.
- //this condition arises when separate membership payment is
- //enabled and contribution amount is not selected. fix for CRM-3010
- $isPaidMembership = TRUE;
+ $this->assign('membership_assign', TRUE);
+ $this->set('membershipTypeID', $membershipParams['selectMembership']);
+ }
+
+ /**
+ * Process the Memberships.
+ *
+ * @param array $membershipParams
+ * Array of membership fields.
+ * @param int $contactID
+ * Contact id.
+ * @param CRM_Contribute_Form_Contribution_Confirm $form
+ * Confirmation form object.
+ *
+ * @param array $premiumParams
+ * @param null $customFieldsFormatted
+ * @param null $includeFieldTypes
+ *
+ * @param array $membershipDetails
+ *
+ * @param array $membershipTypeIDs
+ *
+ * @param bool $isPaidMembership
+ * @param array $membershipID
+ *
+ * @param bool $isProcessSeparateMembershipTransaction
+ *
+ * @param int $financialTypeID
+ * @param array $membershipLineItems
+ * Line items specific to membership payment that is separate to contribution.
+ * @param bool $isPayLater
+ * @param bool $isPending
+ *
+ * @throws \CRM_Core_Exception
+ */
+ protected function postProcessMembership(
+ $membershipParams, $contactID, &$form, $premiumParams,
+ $customFieldsFormatted = NULL, $includeFieldTypes = NULL, $membershipDetails, $membershipTypeIDs, $isPaidMembership, $membershipID,
+ $isProcessSeparateMembershipTransaction, $financialTypeID, $membershipLineItems, $isPayLater, $isPending) {
+ $membershipContribution = NULL;
+ $isTest = CRM_Utils_Array::value('is_test', $membershipParams, FALSE);
+ $errors = $createdMemberships = $paymentResult = array();
+
+ if ($isPaidMembership) {
+ if ($isProcessSeparateMembershipTransaction) {
+ // If we have 2 transactions only one can use the invoice id.
+ $membershipParams['invoiceID'] .= '-2';
+ }
+
+ $paymentResult = CRM_Contribute_BAO_Contribution_Utils::processConfirm($form, $membershipParams,
+ $contactID,
+ $financialTypeID,
+ 'membership',
+ $isTest
+ );
+
+ if (!empty($paymentResult['contribution'])) {
+ $this->postProcessPremium($premiumParams, $paymentResult['contribution']);
+ //note that this will be over-written if we are using a separate membership transaction. Otherwise there is only one
+ $membershipContribution = $paymentResult['contribution'];
+ // Save the contribution ID so that I can be used in email receipts
+ // For example, if you need to generate a tax receipt for the donation only.
+ $form->_values['contribution_other_id'] = $membershipContribution->id;
}
- $isProcessSeparateMembershipTransaction = $this->isSeparateMembershipTransaction($this->_id, $this->_values['amount_block_is_active']);
+ }
- if ($this->_values['amount_block_is_active']) {
- $financialTypeID = $this->_values['financial_type_id'];
+ if ($isProcessSeparateMembershipTransaction) {
+ try {
+ $form->_lineItem = $membershipLineItems;
+ if (empty($form->_params['auto_renew']) && !empty($membershipParams['is_recur'])) {
+ unset($membershipParams['is_recur']);
+ }
+ $membershipContribution = $this->processSecondaryFinancialTransaction($contactID, $form, $membershipParams,
+ $isTest, $membershipLineItems, CRM_Utils_Array::value('minimum_fee', $membershipDetails, 0), CRM_Utils_Array::value('financial_type_id', $membershipDetails));
}
- else {
- $financialTypeID = CRM_Utils_Array::value('financial_type_id', $membershipType, CRM_Utils_Array::value('financial_type_id', $membershipParams));
+ catch (CRM_Core_Exception $e) {
+ $errors[2] = $e->getMessage();
+ $membershipContribution = NULL;
}
+ }
- if (CRM_Utils_Array::value('membership_source', $this->_params)) {
- $membershipParams['contribution_source'] = $this->_params['membership_source'];
+ $membership = NULL;
+ if (!empty($membershipContribution) && !is_a($membershipContribution, 'CRM_Core_Error')) {
+ $membershipContributionID = $membershipContribution->id;
+ }
+
+ //@todo - why is this nested so deep? it seems like it could be just set on the calling function on the form layer
+ if (isset($membershipParams['onbehalf']) && !empty($membershipParams['onbehalf']['member_campaign_id'])) {
+ $form->_params['campaign_id'] = $membershipParams['onbehalf']['member_campaign_id'];
+ }
+ //@todo it should no longer be possible for it to get to this point & membership to not be an array
+ if (is_array($membershipTypeIDs) && !empty($membershipContributionID)) {
+ $typesTerms = CRM_Utils_Array::value('types_terms', $membershipParams, array());
+ foreach ($membershipTypeIDs as $memType) {
+ $numTerms = CRM_Utils_Array::value($memType, $typesTerms, 1);
+ if (!empty($membershipContribution)) {
+ $pendingStatus = CRM_Core_OptionGroup::getValue('contribution_status', 'Pending', 'name');
+ $pending = ($membershipContribution->contribution_status_id == $pendingStatus) ? TRUE : FALSE;
+ }
+ else {
+ $pending = $isPending;
+ }
+ $contributionRecurID = isset($form->_params['contributionRecurID']) ? $form->_params['contributionRecurID'] : NULL;
+
+ $membershipSource = NULL;
+ if (!empty($form->_params['membership_source'])) {
+ $membershipSource = $form->_params['membership_source'];
+ }
+ elseif (isset($form->_values['title']) && !empty($form->_values['title'])) {
+ $membershipSource = ts('Online Contribution:') . ' ' . $form->_values['title'];
+ }
+ $isPayLater = NULL;
+ if (isset($form->_params)) {
+ $isPayLater = CRM_Utils_Array::value('is_pay_later', $form->_params);
+ }
+ $campaignId = NULL;
+ if (isset($form->_values) && is_array($form->_values) && !empty($form->_values)) {
+ $campaignId = CRM_Utils_Array::value('campaign_id', $form->_params);
+ if (!array_key_exists('campaign_id', $form->_params)) {
+ $campaignId = CRM_Utils_Array::value('campaign_id', $form->_values);
+ }
+ }
+
+ list($membership, $renewalMode, $dates) = CRM_Member_BAO_Membership::renewMembership(
+ $contactID, $memType, $isTest,
+ date('YmdHis'), CRM_Utils_Array::value('cms_contactID', $membershipParams),
+ $customFieldsFormatted,
+ $numTerms, $membershipID, $pending,
+ $contributionRecurID, $membershipSource, $isPayLater, $campaignId
+ );
+ $form->set('renewal_mode', $renewalMode);
+ if (!empty($dates)) {
+ $form->assign('mem_start_date',
+ CRM_Utils_Date::customFormat($dates['start_date'], '%Y%m%d')
+ );
+ $form->assign('mem_end_date',
+ CRM_Utils_Date::customFormat($dates['end_date'], '%Y%m%d')
+ );
+ }
+
+ if (!empty($membershipContribution)) {
+ // update recurring id for membership record
+ CRM_Member_BAO_Membership::updateRecurMembership($membership, $membershipContribution);
+ CRM_Member_BAO_Membership::linkMembershipPayment($membership, $membershipContribution);
+ }
}
+ if ($form->_priceSetId && !empty($form->_useForMember) && !empty($form->_lineItem)) {
+ foreach ($form->_lineItem[$form->_priceSetId] as & $priceFieldOp) {
+ if (!empty($priceFieldOp['membership_type_id']) &&
+ isset($createdMemberships[$priceFieldOp['membership_type_id']])
+ ) {
+ $membershipOb = $createdMemberships[$priceFieldOp['membership_type_id']];
+ $priceFieldOp['start_date'] = $membershipOb->start_date ? CRM_Utils_Date::customFormat($membershipOb->start_date, '%B %E%f, %Y') : '-';
+ $priceFieldOp['end_date'] = $membershipOb->end_date ? CRM_Utils_Date::customFormat($membershipOb->end_date, '%B %E%f, %Y') : '-';
+ }
+ else {
+ $priceFieldOp['start_date'] = $priceFieldOp['end_date'] = 'N/A';
+ }
+ }
+ $form->_values['lineItem'] = $form->_lineItem;
+ $form->assign('lineItem', $form->_lineItem);
+ }
+ }
+
+ if (!empty($errors)) {
+ $message = $this->compileErrorMessage($errors);
+ throw new CRM_Core_Exception($message);
+ }
+ $form->_params['createdMembershipIDs'] = array();
+
+ // CRM-7851 - Moved after processing Payment Errors
+ //@todo - the reasoning for this being here seems a little outdated
+ foreach ($createdMemberships as $createdMembership) {
+ CRM_Core_BAO_CustomValueTable::postProcess(
+ $form->_params,
+ 'civicrm_membership',
+ $createdMembership->id,
+ 'Membership'
+ );
+ $form->_params['createdMembershipIDs'][] = $createdMembership->id;
+ }
+ if (count($createdMemberships) == 1) {
+ //presumably this is only relevant for exactly 1 membership
+ $form->_params['membershipID'] = $createdMembership->id;
+ }
+
+ //CRM-15232: Check if membership is created and on the basis of it use
+ //membership receipt template to send payment receipt
+ if (count($createdMemberships)) {
+ $form->_values['isMembership'] = TRUE;
+ }
+ if (isset($membershipContributionID)) {
+ $form->_values['contribution_id'] = $membershipContributionID;
+ }
+ if ($form->_contributeMode) {
+ if ($form->_values['is_monetary'] && $form->_amount > 0.0 && !$form->_params['is_pay_later']) {
+ // call postProcess hook before leaving
+ $form->postProcessHook();
+ }
+ $payment = Civi\Payment\System::singleton()->getByProcessor($form->_paymentProcessor);
+ $paymentActionResult = $payment->doPayment($form->_params, 'contribute');
+ $this->completeTransaction($paymentActionResult, $paymentResult['contribution']->id);
+ // Do not send an email if Recurring transaction is done via Direct Mode
+ // Email will we sent when the IPN is received.
+ return;
+ }
- CRM_Member_BAO_Membership::postProcessMembership($membershipParams, $contactID,
- $this, $premiumParams, $customFieldsFormatted, $fieldTypes, $membershipType, $membershipTypeIDs, $isPaidMembership, $this->_membershipId, $isProcessSeparateMembershipTransaction, $financialTypeID,
- $membershipLineItems, $isPayLater, $isPending);
+ //finally send an email receipt
+ CRM_Contribute_BAO_ContributionPage::sendMail($contactID,
+ $form->_values,
+ $isTest, FALSE,
+ $includeFieldTypes
+ );
+ }
- $this->assign('membership_assign', TRUE);
- $this->set('membershipTypeID', $membershipParams['selectMembership']);
+ /**
+ * Turn array of errors into message string.
+ *
+ * @param array $errors
+ *
+ * @return string
+ */
+ protected function compileErrorMessage($errors) {
+ foreach ($errors as $error) {
+ if (is_string($error)) {
+ $message[] = $error;
+ }
}
- catch (CRM_Core_Exception $e) {
- CRM_Core_Session::singleton()->setStatus($e->getMessage());
- CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/transact', "_qf_Main_display=true&qfKey={$this->_params['qfKey']}"));
+ return ts('Payment Processor Error message') . ': ' . implode('<br/>', $message);
+ }
+
+ /**
+ * Where a second separate financial transaction is supported we will process it here.
+ *
+ * @param int $contactID
+ * @param CRM_Contribute_Form_Contribution_Confirm $form
+ * @param array $tempParams
+ * @param bool $isTest
+ * @param array $lineItems
+ * @param $minimumFee
+ * @param int $financialTypeID
+ *
+ * @throws CRM_Core_Exception
+ * @throws Exception
+ * @return CRM_Contribute_BAO_Contribution
+ */
+ protected function processSecondaryFinancialTransaction($contactID, &$form, $tempParams, $isTest, $lineItems, $minimumFee,
+ $financialTypeID) {
+ $financialType = new CRM_Financial_DAO_FinancialType();
+ $financialType->id = $financialTypeID;
+ $financialType->find(TRUE);
+ $tempParams['amount'] = $minimumFee;
+ $tempParams['invoiceID'] = md5(uniqid(rand(), TRUE));
+
+ //assign receive date when separate membership payment
+ //and contribution amount not selected.
+ if ($form->_amount == 0) {
+ $now = date('YmdHis');
+ $form->_params['receive_date'] = $now;
+ $receiveDate = CRM_Utils_Date::mysqlToIso($now);
+ $form->set('params', $form->_params);
+ $form->assign('receive_date', $receiveDate);
+ }
+
+ $form->set('membership_amount', $minimumFee);
+ $form->assign('membership_amount', $minimumFee);
+
+ // we don't need to create the user twice, so lets disable cms_create_account
+ // irrespective of the value, CRM-2888
+ $tempParams['cms_create_account'] = 0;
+
+ //set this variable as we are not creating pledge for
+ //separate membership payment contribution.
+ //so for differentiating membership contribution from
+ //main contribution.
+ $form->_params['separate_membership_payment'] = 1;
+ $contributionParams = array(
+ 'contact_id' => $contactID,
+ 'line_item' => $lineItems,
+ 'is_test' => $isTest,
+ 'campaign_id' => CRM_Utils_Array::value('campaign_id', $tempParams, CRM_Utils_Array::value('campaign_id',
+ $form->_values)),
+ 'contribution_page_id' => $form->_id,
+ 'source' => CRM_Utils_Array::value('source', $tempParams, CRM_Utils_Array::value('description', $tempParams)),
+ );
+ $isMonetary = !empty($form->_values['is_monetary']);
+ if ($isMonetary) {
+ if (empty($paymentParams['is_pay_later'])) {
+ $contributionParams['payment_instrument_id'] = $form->_paymentProcessor['payment_instrument_id'];
+ }
+ }
+ $membershipContribution = CRM_Contribute_Form_Contribution_Confirm::processFormContribution($form,
+ $tempParams,
+ $tempParams,
+ $contributionParams,
+ $financialType,
+ TRUE,
+ $form->_bltID
+ );
+
+ if ($form->_values['is_monetary'] && !$form->_params['is_pay_later'] && $minimumFee > 0.0) {
+ // At the moment our tests are calling this form in a way that leaves 'object' empty. For
+ // now we compensate here.
+ if (empty($form->_paymentProcessor['object'])) {
+ $payment = Civi\Payment\System::singleton()->getByProcessor($this->_paymentProcessor);
+ }
+ else {
+ $payment = $form->_paymentProcessor['object'];
+ }
+ $result = $payment->doPayment($tempParams, 'contribute');
+ $form->set('membership_trx_id', $result['trxn_id']);
+ $form->assign('membership_trx_id', $result['trxn_id']);
+ $this->completeTransaction($result, $membershipContribution->id);
}
+
+ return $membershipContribution;
}
/**
if (CRM_Utils_Array::value('id', $this->_paymentProcessor)) {
$this->_params['payment_processor_id'] = $this->_paymentProcessor['id'];
}
+
+ $premiumParams = $membershipParams = $params = $this->_params;
if (!empty($params['image_URL'])) {
CRM_Contact_BAO_Contact::processImageParams($params);
}
- $premiumParams = $membershipParams = $params = $this->_params;
+
$fields = array('email-Primary' => 1);
// get the add to groups
}
}
- if (!array_key_exists('first_name', $fields)) {
- $nameFields = array('first_name', 'middle_name', 'last_name');
- foreach ($nameFields as $name) {
- $fields[$name] = 1;
- if (array_key_exists("billing_$name", $params)) {
- $params[$name] = $params["billing_{$name}"];
- $params['preserveDBName'] = TRUE;
- }
- }
- }
+ $fields = $this->formatParamsForPaymentProcessor($fields);
// billing email address
$fields["email-{$this->_bltID}"] = 1;
//unset the billing parameters if it is pay later mode
//to avoid creation of billing location
+ // @todo - note that elsewhere we don't unset these - we simply make
+ // a sensible decision about including them when building the form
+ // and if they are submitted we handle them. Check out abstractEditPaymentForm.
if ($isPayLater && !$this->_isBillingAddressRequiredForPayLater) {
$billingFields = array(
'billing_first_name',
// organization params in a separate variable, to make sure
// normal behavior is continued. And use that variable to
// process on-behalf-of functionality.
- if (!empty($this->_params['hidden_onbehalf_profile'])) {
+ if (!empty($this->_values['onbehalf_profile_id'])) {
$behalfOrganization = array();
$orgFields = array('organization_name', 'organization_id', 'org_option');
foreach ($orgFields as $fld) {
// If onbehalf-of-organization contribution / signup, add organization
// and it's location.
- if (isset($params['hidden_onbehalf_profile']) && isset($behalfOrganization['organization_name'])) {
+ if (isset($this->_values['onbehalf_profile_id']) && isset($behalfOrganization['organization_name'])) {
$ufFields = array();
foreach ($this->_fields['onbehalf'] as $name => $value) {
$ufFields[$name] = 1;
// all the payment processors expect the name and address to be in the
// so we copy stuff over to first_name etc.
$paymentParams = $this->_params;
- $contributionTypeId = $this->_values['financial_type_id'];
- $fieldTypes = array();
if (!empty($paymentParams['onbehalf']) &&
is_array($paymentParams['onbehalf'])
) {
$this->_params[$key] = $value;
}
}
- $fieldTypes = array('Contact', 'Organization', 'Contribution');
}
- $financialTypeID = $this->wrangleFinancialTypeID($contributionTypeId);
$result = CRM_Contribute_BAO_Contribution_Utils::processConfirm($this, $paymentParams,
- $premiumParams, $contactID,
- $financialTypeID,
+ $contactID,
+ $this->wrangleFinancialTypeID($this->_values['financial_type_id']),
'contribution',
- $fieldTypes,
- ($this->_mode == 'test') ? 1 : 0,
- $isPayLater
+ ($this->_mode == 'test') ? 1 : 0
);
- if (CRM_Utils_Array::value('contribution_status_id', $result) == 1) {
- civicrm_api3('contribution', 'completetransaction', array(
- 'id' => $result['contribution']->id,
- 'trxn_id' => CRM_Utils_Array::value('trxn_id', $result),
- )
- );
+ if (empty($result['is_payment_failure'])) {
+ // @todo move premium processing to complete transaction if it truly is an 'after' action.
+ $this->postProcessPremium($premiumParams, $result['contribution']);
+ }
+ if (!empty($result['contribution'])) {
+ // Not quite sure why it would be empty at this stage but tests show it can be ... at least in tests.
+ $this->completeTransaction($result, $result['contribution']->id);
}
return $result;
}
}
}
}
- $this->processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams, $membershipLineItems, $isPayLater);
+ try {
+ $this->processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams, $membershipLineItems, $isPayLater);
+ }
+ catch (CRM_Core_Exception $e) {
+ CRM_Core_Session::singleton()->setStatus($e->getMessage());
+ CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/transact', "_qf_Main_display=true&qfKey={$this->_params['qfKey']}"));
+ }
if (!$this->_amount > 0.0 || !$membershipParams['amount']) {
// we need to explicitly create a CMS user in case of free memberships
// since it is done under processConfirm for paid memberships
}
}
+ /**
+ * Complete transaction if payment has been processed.
+ *
+ * Check the result for a success outcome & if paid then complete the transaction.
+ *
+ * Completing will trigger update of related entities and emails.
+ *
+ * @param array $result
+ * @param int $contributionID
+ *
+ * @throws \CRM_Core_Exception
+ */
+ protected function completeTransaction($result, $contributionID) {
+ if (CRM_Utils_Array::value('payment_status_id', $result) == 1) {
+ try {
+ civicrm_api3('contribution', 'completetransaction', array(
+ 'id' => $contributionID,
+ 'trxn_id' => CRM_Utils_Array::value('trxn_id', $result),
+ 'payment_processor_id' => $this->_paymentProcessor['id'],
+ 'is_transactional' => FALSE,
+ 'fee_amount' => CRM_Utils_Array::value('fee_amount', $result),
+ )
+ );
+ }
+ catch (CiviCRM_API3_Exception $e) {
+ if ($e->getErrorCode() != 'contribution_completed') {
+ throw new CRM_Core_Exception('Failed to update contribution in database');
+ }
+ }
+ }
+ }
+
}