/** * Submit function. * * This is the guts of the postProcess made also accessible to the test suite. * * @param array $params * Submitted values. */ public function submit($params) { //carry campaign from profile. if (array_key_exists('contribution_campaign_id', $params)) { $params['campaign_id'] = $params['contribution_campaign_id']; } $params['currencyID'] = CRM_Core_Config::singleton()->defaultCurrency; $is_quick_config = 0; if (!empty($params['priceSetId'])) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { $priceField = new CRM_Price_DAO_PriceField(); $priceField->price_set_id = $params['priceSetId']; $priceField->orderBy('weight'); $priceField->find(); $priceOptions = array(); while ($priceField->fetch()) { CRM_Price_BAO_PriceFieldValue::getValues($priceField->id, $priceOptions); if (($selectedPriceOptionID = CRM_Utils_Array::value("price_{$priceField->id}", $params)) != FALSE && $selectedPriceOptionID > 0) { switch ($priceField->name) { case 'membership_amount': $this->_params['selectMembership'] = $params['selectMembership'] = CRM_Utils_Array::value('membership_type_id', $priceOptions[$selectedPriceOptionID]); $this->set('selectMembership', $params['selectMembership']); case 'contribution_amount': $params['amount'] = $selectedPriceOptionID; if ($priceField->name == 'contribution_amount' || $priceField->name == 'membership_amount' && CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) == 0) { $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); } $this->_values[$selectedPriceOptionID]['value'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['label'] = CRM_Utils_Array::value('label', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['amount_id'] = CRM_Utils_Array::value('id', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['weight'] = CRM_Utils_Array::value('weight', $priceOptions[$selectedPriceOptionID]); break; case 'other_amount': $params['amount_other'] = $selectedPriceOptionID; break; } } } } } if (!empty($this->_ccid) && !empty($this->_pendingAmount)) { $params['amount'] = $this->_pendingAmount; } else { // from here on down, $params['amount'] holds a monetary value (or null) rather than an option ID $params['amount'] = self::computeAmount($params, $this->_values); } $params['separate_amount'] = $params['amount']; $memFee = NULL; if (!empty($params['selectMembership'])) { if (empty($this->_membershipTypeValues)) { $this->_membershipTypeValues = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, (array) $params['selectMembership']); } $membershipTypeValues = $this->_membershipTypeValues[$params['selectMembership']]; $memFee = $membershipTypeValues['minimum_fee']; if (!$params['amount'] && !$this->_separateMembershipPayment) { $params['amount'] = $memFee ? $memFee : 0; } } //If the membership & contribution is used in contribution page & not separate payment $fieldId = $memPresent = $membershipLabel = $fieldOption = $is_quick_config = NULL; $proceFieldAmount = 0; if (property_exists($this, '_separateMembershipPayment') && $this->_separateMembershipPayment == 0) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_priceSet['fields'] as $fieldKey => $fieldVal) { if ($fieldVal['name'] == 'membership_amount' && !empty($params['price_' . $fieldKey])) { $fieldId = $fieldVal['id']; $fieldOption = $params['price_' . $fieldId]; $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; $memPresent = TRUE; } else { if (!empty($params['price_' . $fieldKey]) && $memPresent && ($fieldVal['name'] == 'other_amount' || $fieldVal['name'] == 'contribution_amount')) { $fieldId = $fieldVal['id']; if ($fieldVal['name'] == 'other_amount') { $proceFieldAmount += $this->_submitValues['price_' . $fieldId]; } elseif ($fieldVal['name'] == 'contribution_amount' && $this->_submitValues['price_' . $fieldId] > 0) { $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; } unset($params['price_' . $fieldId]); break; } } } } } if (!isset($params['amount_other'])) { $this->set('amount_level', CRM_Utils_Array::value('amount_level', $params)); } if (!empty($this->_ccid)) { $this->set('lineItem', $this->_lineItem); } elseif ($priceSetId = CRM_Utils_Array::value('priceSetId', $params)) { $lineItem = array(); $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_values['fee'] as $key => &$val) { if ($val['name'] == 'other_amount' && $val['html_type'] == 'Text' && !empty($params['price_' . $key])) { // Clean out any currency symbols. $params['price_' . $key] = CRM_Utils_Rule::cleanMoney($params['price_' . $key]); if ($params['price_' . $key] != 0) { foreach ($val['options'] as $optionKey => &$options) { $options['amount'] = CRM_Utils_Array::value('price_' . $key, $params); break; } } $params['price_' . $key] = 1; break; } } } $component = ''; if ($this->_membershipBlock) { $component = 'membership'; } CRM_Price_BAO_PriceSet::processAmount($this->_values['fee'], $params, $lineItem[$priceSetId], $component); if ($params['tax_amount']) { $this->set('tax_amount', $params['tax_amount']); } if ($proceFieldAmount) { $lineItem[$params['priceSetId']][$fieldOption]['unit_price'] = $proceFieldAmount; $lineItem[$params['priceSetId']][$fieldOption]['line_total'] = $proceFieldAmount; if (isset($lineItem[$params['priceSetId']][$fieldOption]['tax_amount'])) { $proceFieldAmount += $lineItem[$params['priceSetId']][$fieldOption]['tax_amount']; } if (!$this->_membershipBlock['is_separate_payment']) { //require when separate membership not used $params['amount'] = $proceFieldAmount; } } $this->set('lineItem', $lineItem); } if ($params['amount'] != 0 && ($this->_values['is_pay_later'] && empty($this->_paymentProcessor) && !array_key_exists('hidden_processor', $params) || CRM_Utils_Array::value('payment_processor_id', $params) == 0)) { $params['is_pay_later'] = 1; } else { $params['is_pay_later'] = 0; } // Would be nice to someday understand the point of this set. $this->set('is_pay_later', $params['is_pay_later']); // assign pay later stuff $this->_params['is_pay_later'] = CRM_Utils_Array::value('is_pay_later', $params, FALSE); $this->assign('is_pay_later', $params['is_pay_later']); if ($params['is_pay_later']) { $this->assign('pay_later_text', $this->_values['pay_later_text']); $this->assign('pay_later_receipt', $this->_values['pay_later_receipt']); } if ($this->_membershipBlock['is_separate_payment'] && !empty($params['separate_amount'])) { $this->set('amount', $params['separate_amount']); } else { $this->set('amount', $params['amount']); } // generate and set an invoiceID for this transaction $invoiceID = md5(uniqid(rand(), TRUE)); $this->set('invoiceID', $invoiceID); $params['invoiceID'] = $invoiceID; $params['description'] = ts('Online Contribution') . ': ' . (!empty($this->_pcpInfo['title']) ? $this->_pcpInfo['title'] : $this->_values['title']); $params['button'] = $this->controller->getButtonName(); // required only if is_monetary and valid positive amount // @todo it seems impossible for $memFee to be greater than 0 & $params['amount'] not to // be & by requiring $memFee down here we make it harder to do a sensible refactoring of the function // above (ie. extract the amount in a small function). if ($this->_values['is_monetary'] && !empty($this->_paymentProcessor) && ((double) $params['amount'] > 0.0 || $memFee > 0.0)) { // The concept of contributeMode is deprecated - as should be the 'is_monetary' setting. $this->setContributeMode(); // Really this setting of $this->_params & params within it should be done earlier on in the function // probably the values determined here should be reused in confirm postProcess as there is no opportunity to alter anything // on the confirm page. However as we are dealing with a stable release we go as close to where it is used // as possible. // In general the form has a lack of clarity of the logic of why things are set on the form in some cases & // the logic around when $this->_params is used compared to other params arrays. $this->_params = array_merge($params, $this->_params); $this->setRecurringMembershipParams(); if ($this->_paymentProcessor && $this->_paymentProcessor['object']->supports('preApproval')) { $this->handlePreApproval($this->_params); } } }
/** * This function sets the fields. * * - $this->_params['amount_level'] * - $this->_params['selectMembership'] * And under certain circumstances sets * $this->_params['amount'] = null; * * @param int $priceSetID */ public function setFormAmountFields($priceSetID) { $isQuickConfig = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_params['priceSetId'], 'is_quick_config'); $priceField = new CRM_Price_DAO_PriceField(); $priceField->price_set_id = $priceSetID; $priceField->orderBy('weight'); $priceField->find(); $paramWeDoNotUnderstand = NULL; while ($priceField->fetch()) { if ($priceField->name == "contribution_amount") { $paramWeDoNotUnderstand = $priceField->id; } if ($isQuickConfig && !empty($this->_params["price_{$priceField->id}"])) { if ($this->_values['fee'][$priceField->id]['html_type'] != 'Text') { // @todo - stop setting amount level in this function & call the CRM_Price_BAO_PriceSet::getAmountLevel // function to get correct amount level consistently. Remove setting of the amount level in // CRM_Price_BAO_PriceSet::processAmount. Extend the unit tests in CRM_Price_BAO_PriceSetTest // to cover all variants. $this->_params['amount_level'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $this->_params["price_{$priceField->id}"], 'label'); } if ($priceField->name == "membership_amount") { $this->_params['selectMembership'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $this->_params["price_{$priceField->id}"], 'membership_type_id'); } } elseif (CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) && !empty($this->_values['fee'][$priceField->id]) && $this->_values['fee'][$priceField->id]['name'] == "other_amount" && CRM_Utils_Array::value("price_{$paramWeDoNotUnderstand}", $this->_params) < 1 && empty($this->_params["price_{$priceField->id}"])) { $this->_params['amount'] = NULL; } // Fix for CRM-14375 - If we are using separate payments and "no // thank you" is selected for the additional contribution, set // contribution amount to be null, so that it will not show // contribution amount same as membership amount. //@todo - merge with section above if ($this->_membershipBlock['is_separate_payment'] && !empty($this->_values['fee'][$priceField->id]) && CRM_Utils_Array::value('name', $this->_values['fee'][$priceField->id]) == 'contribution_amount' && CRM_Utils_Array::value("price_{$priceField->id}", $this->_params) == '-1') { $this->_params['amount'] = NULL; } } }
/** * Process the form submission. */ public function postProcess() { $config = CRM_Core_Config::singleton(); // we first reset the confirm page so it accepts new values $this->controller->resetPage('Confirm'); // get the submitted form values. $params = $this->controller->exportValues($this->_name); //carry campaign from profile. if (array_key_exists('contribution_campaign_id', $params)) { $params['campaign_id'] = $params['contribution_campaign_id']; } if (!empty($params['onbehalfof_id'])) { $params['organization_id'] = $params['onbehalfof_id']; } $params['currencyID'] = $config->defaultCurrency; if (!empty($params['priceSetId'])) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { $priceField = new CRM_Price_DAO_PriceField(); $priceField->price_set_id = $params['priceSetId']; $priceField->orderBy('weight'); $priceField->find(); $priceOptions = array(); while ($priceField->fetch()) { CRM_Price_BAO_PriceFieldValue::getValues($priceField->id, $priceOptions); if ($selectedPriceOptionID = CRM_Utils_Array::value("price_{$priceField->id}", $params)) { switch ($priceField->name) { case 'membership_amount': $this->_params['selectMembership'] = $params['selectMembership'] = CRM_Utils_Array::value('membership_type_id', $priceOptions[$selectedPriceOptionID]); $this->set('selectMembership', $params['selectMembership']); if (CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) == 0) { $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); } break; case 'contribution_amount': $params['amount'] = $selectedPriceOptionID; $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['value'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['label'] = CRM_Utils_Array::value('label', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['amount_id'] = CRM_Utils_Array::value('id', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['weight'] = CRM_Utils_Array::value('weight', $priceOptions[$selectedPriceOptionID]); break; case 'other_amount': $params['amount_other'] = $selectedPriceOptionID; break; } } } } } if ($this->_values['is_pay_later'] && empty($this->_paymentProcessor) && !array_key_exists('hidden_processor', $params) || !empty($params['payment_processor_id']) && $params['payment_processor_id'] == 0) { $params['is_pay_later'] = 1; } else { $params['is_pay_later'] = 0; } $this->set('is_pay_later', $params['is_pay_later']); // assign pay later stuff $this->_params['is_pay_later'] = CRM_Utils_Array::value('is_pay_later', $params, FALSE); $this->assign('is_pay_later', $params['is_pay_later']); if ($params['is_pay_later']) { $this->assign('pay_later_text', $this->_values['pay_later_text']); $this->assign('pay_later_receipt', $this->_values['pay_later_receipt']); } // from here on down, $params['amount'] holds a monetary value (or null) rather than an option ID $params['amount'] = self::computeAmount($params, $this->_values); $params['separate_amount'] = $params['amount']; $memFee = NULL; if (!empty($params['selectMembership'])) { if (!empty($this->_membershipTypeValues)) { $membershipTypeValues = $this->_membershipTypeValues[$params['selectMembership']]; } else { $membershipTypeValues = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, $params['selectMembership']); } $memFee = $membershipTypeValues['minimum_fee']; if (!$params['amount'] && !$this->_separateMembershipPayment) { $params['amount'] = $memFee ? $memFee : 0; } } //If the membership & contribution is used in contribution page & not separate payment $fieldId = $memPresent = $membershipLabel = $fieldOption = $is_quick_config = NULL; $proceFieldAmount = 0; if (property_exists($this, '_separateMembershipPayment') && $this->_separateMembershipPayment == 0) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_priceSet['fields'] as $fieldKey => $fieldVal) { if ($fieldVal['name'] == 'membership_amount' && !empty($params['price_' . $fieldKey])) { $fieldId = $fieldVal['id']; $fieldOption = $params['price_' . $fieldId]; $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; $memPresent = TRUE; } else { if (!empty($params['price_' . $fieldKey]) && $memPresent && ($fieldVal['name'] == 'other_amount' || $fieldVal['name'] == 'contribution_amount')) { $fieldId = $fieldVal['id']; if ($fieldVal['name'] == 'other_amount') { $proceFieldAmount += $this->_submitValues['price_' . $fieldId]; } elseif ($fieldVal['name'] == 'contribution_amount' && $this->_submitValues['price_' . $fieldId] > 0) { $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; } unset($params['price_' . $fieldId]); break; } } } } } if (!isset($params['amount_other'])) { $this->set('amount_level', CRM_Utils_Array::value('amount_level', $params)); } if ($priceSetId = CRM_Utils_Array::value('priceSetId', $params)) { $lineItem = array(); $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_values['fee'] as $key => &$val) { if ($val['name'] == 'other_amount' && $val['html_type'] == 'Text' && !empty($params['price_' . $key])) { // Clean out any currency symbols. $params['price_' . $key] = CRM_Utils_Rule::cleanMoney($params['price_' . $key]); if ($params['price_' . $key] != 0) { foreach ($val['options'] as $optionKey => &$options) { $options['amount'] = CRM_Utils_Array::value('price_' . $key, $params); break; } } $params['price_' . $key] = 1; break; } } } $component = ''; if ($this->_membershipBlock) { $component = 'membership'; } CRM_Price_BAO_PriceSet::processAmount($this->_values['fee'], $params, $lineItem[$priceSetId], $component); if ($params['tax_amount']) { $this->set('tax_amount', $params['tax_amount']); } if ($proceFieldAmount) { $lineItem[$params['priceSetId']][$fieldOption]['unit_price'] = $proceFieldAmount; $lineItem[$params['priceSetId']][$fieldOption]['line_total'] = $proceFieldAmount; if (isset($lineItem[$params['priceSetId']][$fieldOption]['tax_amount'])) { $proceFieldAmount += $lineItem[$params['priceSetId']][$fieldOption]['tax_amount']; } if (!$this->_membershipBlock['is_separate_payment']) { //require when separate membership not used $params['amount'] = $proceFieldAmount; } } $this->set('lineItem', $lineItem); } if ($this->_membershipBlock['is_separate_payment'] && !empty($params['separate_amount'])) { $this->set('amount', $params['separate_amount']); } else { $this->set('amount', $params['amount']); } // generate and set an invoiceID for this transaction $invoiceID = md5(uniqid(rand(), TRUE)); $this->set('invoiceID', $invoiceID); // required only if is_monetary and valid positive amount if ($this->_values['is_monetary'] && is_array($this->_paymentProcessor) && ((double) $params['amount'] > 0.0 || $memFee > 0.0)) { // default mode is direct $this->set('contributeMode', 'direct'); if ($this->_paymentProcessor && $this->_paymentProcessor['billing_mode'] & CRM_Core_Payment::BILLING_MODE_BUTTON) { //get the button name $buttonName = $this->controller->getButtonName(); if (in_array($buttonName, array($this->_expressButtonName, $this->_expressButtonName . '_x', $this->_expressButtonName . '_y')) && empty($params['is_pay_later'])) { $this->handlePaypalExpress($invoiceID, $params); } } elseif ($this->_paymentProcessor && $this->_paymentProcessor['billing_mode'] & CRM_Core_Payment::BILLING_MODE_NOTIFY) { $this->set('contributeMode', 'notify'); } } // should we skip the confirm page? if (empty($this->_values['is_confirm_enabled'])) { // call the post process hook for the main page before we switch to confirm $this->postProcessHook(); // build the confirm page $confirmForm =& $this->controller->_pages['Confirm']; $confirmForm->preProcess(); $confirmForm->buildQuickForm(); // the confirmation page is valid $data =& $this->controller->container(); $data['valid']['Confirm'] = 1; // confirm the contribution // mainProcess calls the hook also $confirmForm->mainProcess(); $qfKey = $this->controller->_key; // redirect to thank you page CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/transact', "_qf_ThankYou_display=1&qfKey={$qfKey}", TRUE, NULL, FALSE)); } }
/** * Function to set variables up before form is built * * @return void * @access public */ public function preProcess() { $config = CRM_Core_Config::singleton(); parent::preProcess(); // 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'] = $expressParams['payer']; $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_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; $this->_params['payment_action'] = 'Sale'; // 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'); } } 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}"]); } 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->_useForMember = $this->get('useForMember'); if (isset($this->_params['amount'])) { $priceField = new CRM_Price_DAO_PriceField(); $priceField->price_set_id = $this->_params['priceSetId']; $priceField->orderBy('weight'); $priceField->find(); $contriPriceId = NULL; $isQuickConfig = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_params['priceSetId'], 'is_quick_config'); while ($priceField->fetch()) { if ($priceField->name == "contribution_amount") { $contriPriceId = $priceField->id; } if ($isQuickConfig && !empty($this->_params["price_{$priceField->id}"])) { if ($this->_values['fee'][$priceField->id]['html_type'] != 'Text') { $this->_params['amount_level'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $this->_params["price_{$priceField->id}"], 'label'); } if ($priceField->name == "membership_amount") { $this->_params['selectMembership'] = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $this->_params["price_{$priceField->id}"], 'membership_type_id'); } } elseif (CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) && !empty($this->_values['fee'][$priceField->id]) && $this->_values['fee'][$priceField->id]['name'] == "other_amount" && CRM_Utils_Array::value("price_{$contriPriceId}", $this->_params) < 1 && empty($this->_params["price_{$priceField->id}"])) { $this->_params['amount'] = null; } } } $this->_params['currencyID'] = $config->defaultCurrency; $this->_params['payment_action'] = 'Sale'; } $this->_params['is_pay_later'] = $this->get('is_pay_later'); $this->assign('is_pay_later', $this->_params['is_pay_later']); if ($this->_params['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->_params['org_option']) && !empty($this->_params['organization_id'])) { if (!empty($this->_params['onbehalfof_id'])) { $this->_params['organization_id'] = $this->_params['onbehalfof_id']; } } $this->_params['organization_name'] = $this->_params['onbehalf']['organization_name']; $addressBlocks = array('street_address', 'city', 'state_province', 'postal_code', 'country', 'supplemental_address_1', 'supplemental_address_2', 'supplemental_address_3', 'postal_code_suffix', 'geo_code_1', 'geo_code_2', 'address_name'); $blocks = array('email', 'phone', 'im', 'url', 'openid'); foreach ($this->_params['onbehalf'] as $loc => $value) { $field = $typeId = NULL; if (strstr($loc, '-')) { list($field, $locType) = explode('-', $loc); } if (in_array($field, $addressBlocks)) { if ($locType == 'Primary') { $defaultLocationType = CRM_Core_BAO_LocationType::getDefault(); $locType = $defaultLocationType->id; } if ($field == 'country') { $value = CRM_Core_PseudoConstant::countryIsoCode($value); } elseif ($field == 'state_province') { $value = CRM_Core_PseudoConstant::stateProvinceAbbreviation($value); } $isPrimary = 1; if (isset($this->_params['onbehalf_location']['address']) && count($this->_params['onbehalf_location']['address']) > 0) { $isPrimary = 0; } $this->_params['onbehalf_location']['address'][$locType][$field] = $value; if (empty($this->_params['onbehalf_location']['address'][$locType]['is_primary'])) { $this->_params['onbehalf_location']['address'][$locType]['is_primary'] = $isPrimary; } $this->_params['onbehalf_location']['address'][$locType]['location_type_id'] = $locType; } elseif (in_array($field, $blocks)) { if (!$typeId || is_numeric($typeId)) { $blockName = $fieldName = $field; $locationType = 'location_type_id'; if ($locType == 'Primary') { $defaultLocationType = CRM_Core_BAO_LocationType::getDefault(); $locationValue = $defaultLocationType->id; } else { $locationValue = $locType; } $locTypeId = ''; $phoneExtField = array(); if ($field == 'url') { $blockName = 'website'; $locationType = 'website_type_id'; $locationValue = CRM_Utils_Array::value("{$loc}-website_type_id", $this->_params['onbehalf']); } elseif ($field == 'im') { $fieldName = 'name'; $locTypeId = 'provider_id'; $typeId = $this->_params['onbehalf']["{$loc}-provider_id"]; } elseif ($field == 'phone') { list($field, $locType, $typeId) = explode('-', $loc); $locTypeId = 'phone_type_id'; //check if extension field exists $extField = str_replace('phone', 'phone_ext', $loc); if (isset($this->_params['onbehalf'][$extField])) { $phoneExtField = array('phone_ext' => $this->_params['onbehalf'][$extField]); } } $isPrimary = 1; if (isset($this->_params['onbehalf_location'][$blockName]) && count($this->_params['onbehalf_location'][$blockName]) > 0) { $isPrimary = 0; } if ($locationValue) { $blockValues = array($fieldName => $value, $locationType => $locationValue, 'is_primary' => $isPrimary); if ($locTypeId) { $blockValues = array_merge($blockValues, array($locTypeId => $typeId)); } if (!empty($phoneExtField)) { $blockValues = array_merge($blockValues, $phoneExtField); } $this->_params['onbehalf_location'][$blockName][] = $blockValues; } } } elseif (strstr($loc, 'custom')) { if ($value && isset($this->_params['onbehalf']["{$loc}_id"])) { $value = $this->_params['onbehalf']["{$loc}_id"]; } $this->_params['onbehalf_location']["{$loc}"] = $value; } else { if ($loc == 'contact_sub_type') { $this->_params['onbehalf_location'][$loc] = $value; } else { $this->_params['onbehalf_location'][$field] = $value; } } } } elseif (!empty($this->_values['is_for_organization'])) { // no on behalf of an organization, CRM-5519 // so reset loc blocks from main params. foreach (array('phone', 'email', 'address') as $blk) { if (isset($this->_params[$blk])) { unset($this->_params[$blk]); } } } // 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']) && !$isQuickConfig) { 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'); } } if ($this->_pcpId) { $params = $this->processPcp($this, $this->_params); $this->_params = $params; } $this->_params['invoiceID'] = $this->get('invoiceID'); //carry campaign from profile. if (array_key_exists('contribution_campaign_id', $this->_params)) { $this->_params['campaign_id'] = $this->_params['contribution_campaign_id']; } // assign contribution page id to the template so we can add css class for it $this->assign('contributionPageID', $this->_id); $this->set('params', $this->_params); }
/** * Process the form submission. */ public function postProcess() { $config = CRM_Core_Config::singleton(); // we first reset the confirm page so it accepts new values $this->controller->resetPage('Confirm'); // get the submitted form values. $params = $this->controller->exportValues($this->_name); //carry campaign from profile. if (array_key_exists('contribution_campaign_id', $params)) { $params['campaign_id'] = $params['contribution_campaign_id']; } if (!empty($params['onbehalfof_id'])) { $params['organization_id'] = $params['onbehalfof_id']; } $params['currencyID'] = $config->defaultCurrency; if (!empty($params['priceSetId'])) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { $priceField = new CRM_Price_DAO_PriceField(); $priceField->price_set_id = $params['priceSetId']; $priceField->orderBy('weight'); $priceField->find(); $priceOptions = array(); while ($priceField->fetch()) { CRM_Price_BAO_PriceFieldValue::getValues($priceField->id, $priceOptions); if ($selectedPriceOptionID = CRM_Utils_Array::value("price_{$priceField->id}", $params)) { switch ($priceField->name) { case 'membership_amount': $this->_params['selectMembership'] = $params['selectMembership'] = CRM_Utils_Array::value('membership_type_id', $priceOptions[$selectedPriceOptionID]); $this->set('selectMembership', $params['selectMembership']); if (CRM_Utils_Array::value('is_separate_payment', $this->_membershipBlock) == 0) { $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); } break; case 'contribution_amount': $params['amount'] = $selectedPriceOptionID; $this->_values['amount'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['value'] = CRM_Utils_Array::value('amount', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['label'] = CRM_Utils_Array::value('label', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['amount_id'] = CRM_Utils_Array::value('id', $priceOptions[$selectedPriceOptionID]); $this->_values[$selectedPriceOptionID]['weight'] = CRM_Utils_Array::value('weight', $priceOptions[$selectedPriceOptionID]); break; case 'other_amount': $params['amount_other'] = $selectedPriceOptionID; break; } } } } } if ($this->_values['is_pay_later'] && empty($this->_paymentProcessor) && !array_key_exists('hidden_processor', $params) || !empty($params['payment_processor_id']) && $params['payment_processor_id'] == 0) { $params['is_pay_later'] = 1; } else { $params['is_pay_later'] = 0; } $this->set('is_pay_later', $params['is_pay_later']); // assign pay later stuff $this->_params['is_pay_later'] = CRM_Utils_Array::value('is_pay_later', $params, FALSE); $this->assign('is_pay_later', $params['is_pay_later']); if ($params['is_pay_later']) { $this->assign('pay_later_text', $this->_values['pay_later_text']); $this->assign('pay_later_receipt', $this->_values['pay_later_receipt']); } // from here on down, $params['amount'] holds a monetary value (or null) rather than an option ID $params['amount'] = self::computeAmount($params, $this->_values); $params['separate_amount'] = $params['amount']; $memFee = NULL; if (!empty($params['selectMembership'])) { if (!empty($this->_membershipTypeValues)) { $membershipTypeValues = $this->_membershipTypeValues[$params['selectMembership']]; } else { $membershipTypeValues = CRM_Member_BAO_Membership::buildMembershipTypeValues($this, (array) $params['selectMembership']); } $memFee = $membershipTypeValues['minimum_fee']; if (!$params['amount'] && !$this->_separateMembershipPayment) { $params['amount'] = $memFee ? $memFee : 0; } } //If the membership & contribution is used in contribution page & not separate payment $fieldId = $memPresent = $membershipLabel = $fieldOption = $is_quick_config = NULL; $proceFieldAmount = 0; if (property_exists($this, '_separateMembershipPayment') && $this->_separateMembershipPayment == 0) { $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $this->_priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_priceSet['fields'] as $fieldKey => $fieldVal) { if ($fieldVal['name'] == 'membership_amount' && !empty($params['price_' . $fieldKey])) { $fieldId = $fieldVal['id']; $fieldOption = $params['price_' . $fieldId]; $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; $memPresent = TRUE; } else { if (!empty($params['price_' . $fieldKey]) && $memPresent && ($fieldVal['name'] == 'other_amount' || $fieldVal['name'] == 'contribution_amount')) { $fieldId = $fieldVal['id']; if ($fieldVal['name'] == 'other_amount') { $proceFieldAmount += $this->_submitValues['price_' . $fieldId]; } elseif ($fieldVal['name'] == 'contribution_amount' && $this->_submitValues['price_' . $fieldId] > 0) { $proceFieldAmount += $fieldVal['options'][$this->_submitValues['price_' . $fieldId]]['amount']; } unset($params['price_' . $fieldId]); break; } } } } } if (!isset($params['amount_other'])) { $this->set('amount_level', CRM_Utils_Array::value('amount_level', $params)); } if ($priceSetId = CRM_Utils_Array::value('priceSetId', $params)) { $lineItem = array(); $is_quick_config = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceSetId, 'is_quick_config'); if ($is_quick_config) { foreach ($this->_values['fee'] as $key => &$val) { if ($val['name'] == 'other_amount' && $val['html_type'] == 'Text' && !empty($params['price_' . $key])) { // Clean out any currency symbols. $params['price_' . $key] = CRM_Utils_Rule::cleanMoney($params['price_' . $key]); if ($params['price_' . $key] != 0) { foreach ($val['options'] as $optionKey => &$options) { $options['amount'] = CRM_Utils_Array::value('price_' . $key, $params); break; } } $params['price_' . $key] = 1; break; } } } $component = ''; if ($this->_membershipBlock) { $component = 'membership'; } CRM_Price_BAO_PriceSet::processAmount($this->_values['fee'], $params, $lineItem[$priceSetId], $component); if ($params['tax_amount']) { $this->set('tax_amount', $params['tax_amount']); } if ($proceFieldAmount) { $lineItem[$params['priceSetId']][$fieldOption]['unit_price'] = $proceFieldAmount; $lineItem[$params['priceSetId']][$fieldOption]['line_total'] = $proceFieldAmount; if (isset($lineItem[$params['priceSetId']][$fieldOption]['tax_amount'])) { $proceFieldAmount += $lineItem[$params['priceSetId']][$fieldOption]['tax_amount']; } if (!$this->_membershipBlock['is_separate_payment']) { //require when separate membership not used $params['amount'] = $proceFieldAmount; } } $this->set('lineItem', $lineItem); } if ($this->_membershipBlock['is_separate_payment'] && !empty($params['separate_amount'])) { $this->set('amount', $params['separate_amount']); } else { $this->set('amount', $params['amount']); } // generate and set an invoiceID for this transaction $invoiceID = md5(uniqid(rand(), TRUE)); $this->set('invoiceID', $invoiceID); $params['invoiceID'] = $invoiceID; $params['description'] = ts('Online Contribution') . ': ' . ($this->_pcpInfo['title'] ? $this->_pcpInfo['title'] : $this->_values['title']); // required only if is_monetary and valid positive amount if ($this->_values['is_monetary'] && is_array($this->_paymentProcessor) && ((double) $params['amount'] > 0.0 || $memFee > 0.0)) { $this->setContributeMode(); if ($this->_paymentProcessor && $this->_paymentProcessor['object']->supports('preApproval')) { $this->handlePreApproval($params); } } if (empty($this->_values['is_confirm_enabled'])) { $this->skipToThankYouPage(); } }