- $customFieldsFormatted = $fieldTypes = array();
- if (!empty($membershipParams['onbehalf']) &&
- is_array($membershipParams['onbehalf'])
- ) {
- foreach ($membershipParams['onbehalf'] as $key => $value) {
- if (strstr($key, 'custom_')) {
- $customFieldId = explode('_', $key);
- CRM_Core_BAO_CustomField::formatCustomField(
- $customFieldId[1],
- $customFieldsFormatted,
- $value,
- 'Membership',
- NULL,
- $contactID
- );
- }
- }
- $fieldTypes = array('Contact', 'Organization', 'Membership');
- }
-
- $priceFieldIds = $this->get('memberPriceFieldIDS');
-
- if (!empty($priceFieldIds)) {
- $contributionTypeID = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceSet', $priceFieldIds['id'], 'financial_type_id');
- unset($priceFieldIds['id']);
- $membershipTypeIds = array();
- $membershipTypeTerms = array();
- foreach ($priceFieldIds as $priceFieldId) {
- if ($id = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_type_id')) {
- $membershipTypeIds[] = $id;
- //@todo the value for $term is immediately overwritten. It is unclear from the code whether it was intentional to
- // do this or a double = was intended (this ambiguity is the reason many IDEs complain about 'assignment in condition'
- $term = 1;
- if ($term = CRM_Core_DAO::getFieldValue('CRM_Price_DAO_PriceFieldValue', $priceFieldId, 'membership_num_terms')) {
- $membershipTypeTerms[$id] = ($term > 1) ? $term : 1;
- }
- else {
- $membershipTypeTerms[$id] = 1;
- }
- }
- }
- $membershipParams['selectMembership'] = $membershipTypeIds;
- $membershipParams['financial_type_id'] = $contributionTypeID;
- $membershipParams['types_terms'] = $membershipTypeTerms;
- }
- if (!empty($membershipParams['selectMembership'])) {
- // CRM-12233
- $membershipLineItems = array();
- if ($this->_separateMembershipPayment && $this->_values['amount_block_is_active']) {
- foreach ($this->_values['fee'] as $key => $feeValues) {
- if ($feeValues['name'] == 'membership_amount') {
- $fieldId = $this->_params['price_' . $key];
- $membershipLineItems[$this->_priceSetId][$fieldId] = $this->_lineItem[$this->_priceSetId][$fieldId];
- unset($this->_lineItem[$this->_priceSetId][$fieldId]);
- break;
- }
- }
- }
- $this->processMembership($membershipParams, $contactID, $customFieldsFormatted, $fieldTypes, $premiumParams, $membershipLineItems, $isPayLater);
- 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
- CRM_Contribute_BAO_Contribution_Utils::createCMSUser($membershipParams,
- $membershipParams['cms_contactID'],
- 'email-' . $this->_bltID
- );
+ CRM_Core_BAO_Note::add($noteParams, array());
+ }
+
+ if (isset($params['related_contact'])) {
+ $contactID = $params['related_contact'];
+ }
+ elseif (isset($params['cms_contactID'])) {
+ $contactID = $params['cms_contactID'];
+ }
+
+ //create contribution activity w/ individual and target
+ //activity w/ organisation contact id when onbelf, CRM-4027
+ $targetContactID = NULL;
+ if (!empty($params['hidden_onbehalf_profile'])) {
+ $targetContactID = $contribution->contact_id;
+ $contribution->contact_id = $contactID;
+ }
+
+ // create an activity record
+ if ($contribution) {
+ CRM_Activity_BAO_Activity::addActivity($contribution, NULL, $targetContactID);
+ }
+
+ $transaction->commit();
+ // CRM-13074 - create the CMSUser after the transaction is completed as it
+ // is not appropriate to delete a valid contribution if a user create problem occurs
+ CRM_Contribute_BAO_Contribution_Utils::createCMSUser($params,
+ $contactID,
+ 'email-' . $billingLocationID
+ );
+ return $contribution;
+ }
+
+ /**
+ * Create the recurring contribution record.
+ *
+ * @param CRM_Core_Form $form
+ * @param array $params
+ * @param int $contactID
+ * @param string $contributionType
+ * @param bool $online
+ *
+ * @return mixed
+ */
+ public static function processRecurringContribution(&$form, &$params, $contactID, $contributionType, $online = TRUE) {
+ // return if this page is not set for recurring
+ // or the user has not chosen the recurring option
+
+ //this is online case validation.
+ if ((empty($form->_values['is_recur']) && $online) || empty($params['is_recur'])) {
+ return NULL;
+ }
+
+ $recurParams = array('contact_id' => $contactID);
+ $recurParams['amount'] = CRM_Utils_Array::value('amount', $params);
+ $recurParams['auto_renew'] = CRM_Utils_Array::value('auto_renew', $params);
+ $recurParams['frequency_unit'] = CRM_Utils_Array::value('frequency_unit', $params);
+ $recurParams['frequency_interval'] = CRM_Utils_Array::value('frequency_interval', $params);
+ $recurParams['installments'] = CRM_Utils_Array::value('installments', $params);
+ $recurParams['financial_type_id'] = CRM_Utils_Array::value('financial_type_id', $params);
+ $recurParams['currency'] = CRM_Utils_Array::value('currency', $params);
+
+ // CRM-14354: For an auto-renewing membership with an additional contribution,
+ // if separate payments is not enabled, make sure only the membership fee recurs
+ if (!empty($form->_membershipBlock)
+ && $form->_membershipBlock['is_separate_payment'] === '0'
+ && isset($params['selectMembership'])
+ && $form->_values['is_allow_other_amount'] == '1'
+ // CRM-16331
+ && !empty($form->_membershipTypeValues)
+ && !empty($form->_membershipTypeValues[$params['selectMembership']]['minimum_fee'])
+ ) {
+ $recurParams['amount'] = $form->_membershipTypeValues[$params['selectMembership']]['minimum_fee'];
+ }
+
+ $recurParams['is_test'] = 0;
+ if (($form->_action & CRM_Core_Action::PREVIEW) ||
+ (isset($form->_mode) && ($form->_mode == 'test'))
+ ) {
+ $recurParams['is_test'] = 1;
+ }
+
+ $recurParams['start_date'] = $recurParams['create_date'] = $recurParams['modified_date'] = date('YmdHis');
+ if (!empty($params['receive_date'])) {
+ $recurParams['start_date'] = $params['receive_date'];
+ }
+ $recurParams['invoice_id'] = CRM_Utils_Array::value('invoiceID', $params);
+ $recurParams['contribution_status_id'] = CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Pending');
+ $recurParams['payment_processor_id'] = CRM_Utils_Array::value('payment_processor_id', $params);
+ $recurParams['is_email_receipt'] = CRM_Utils_Array::value('is_email_receipt', $params);
+ // we need to add a unique trxn_id to avoid a unique key error
+ // in paypal IPN we reset this when paypal sends us the real trxn id, CRM-2991
+ $recurParams['trxn_id'] = CRM_Utils_Array::value('trxn_id', $params, $params['invoiceID']);
+ $recurParams['financial_type_id'] = $contributionType->id;
+
+ if (!$online || $form->_values['is_monetary']) {
+ $recurParams['payment_instrument_id'] = 1;
+ }
+
+ $campaignId = CRM_Utils_Array::value('campaign_id', $params);
+ if ($online) {
+ if (!array_key_exists('campaign_id', $params)) {
+ $campaignId = CRM_Utils_Array::value('campaign_id', $form->_values);
+ }
+ }
+ $recurParams['campaign_id'] = $campaignId;
+
+ $recurring = CRM_Contribute_BAO_ContributionRecur::add($recurParams);
+ if (is_a($recurring, 'CRM_Core_Error')) {
+ CRM_Core_Error::displaySessionError($recurring);
+ $urlString = 'civicrm/contribute/transact';
+ $urlParams = '_qf_Main_display=true';
+ if (get_class($form) == 'CRM_Contribute_Form_Contribution') {
+ $urlString = 'civicrm/contact/view/contribution';
+ $urlParams = "action=add&cid={$form->_contactID}";
+ if ($form->_mode) {
+ $urlParams .= "&mode={$form->_mode}";