/** * View details of a recurring contribution. */ public function view() { $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->id = $this->_id; if ($recur->find(TRUE)) { $values = array(); CRM_Core_DAO::storeValues($recur, $values); // if there is a payment processor ID, get the name of the payment processor if (!empty($values['payment_processor_id'])) { $values['payment_processor'] = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', $values['payment_processor_id'], 'name'); } $idFields = array('contribution_status_id', 'campaign_id'); if (CRM_Contribute_BAO_ContributionRecur::supportsFinancialTypeChange($values['id'])) { $idFields[] = 'financial_type_id'; } foreach ($idFields as $idField) { if (!empty($values[$idField])) { $values[substr($idField, 0, -3)] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_ContributionRecur', $idField, $values[$idField]); } } // Get financial type name if (!empty($values['financial_type_id'])) { $values['financial_type_name'] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_Contribution', 'financial_type_id', $values['financial_type_id']); } // Get Paid By label if (!empty($values['payment_instrument_id'])) { $values['payment_instrument'] = CRM_Core_OptionGroup::getLabel('payment_instrument', $values['payment_instrument_id']); } $this->assign('recur', $values); $this->assign('customDataType', 'ContributionRecur'); $groupTree = CRM_Core_BAO_CustomGroup::getTree('ContributionRecur', $this, $this->_id); CRM_Core_BAO_CustomGroup::buildCustomDataView($this, $groupTree); } }
/** * View details of a recurring contribution * * @return void * @access public */ function view() { $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->id = $this->_id; if ($recur->find(TRUE)) { $values = array(); CRM_Core_DAO::storeValues($recur, $values); // if there is a payment processor ID, get the name of the payment processor if (!empty($values['payment_processor_id'])) { $values['payment_processor'] = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', $values['payment_processor_id'], 'name'); } // get contribution status label if (!empty($values['contribution_status_id'])) { $values['contribution_status'] = CRM_Core_OptionGroup::getLabel('contribution_status', $values['contribution_status_id']); } $this->assign('recur', $values); } }
/** * View details of a recurring contribution. */ public function view() { $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->id = $this->_id; if ($recur->find(TRUE)) { $values = array(); CRM_Core_DAO::storeValues($recur, $values); // if there is a payment processor ID, get the name of the payment processor if (!empty($values['payment_processor_id'])) { $values['payment_processor'] = CRM_Core_DAO::getFieldValue('CRM_Financial_DAO_PaymentProcessor', $values['payment_processor_id'], 'name'); } $idFields = array('contribution_status_id', 'campaign_id'); if (CRM_Contribute_BAO_ContributionRecur::supportsFinancialTypeChange($values['id'])) { $idFields[] = 'financial_type_id'; } foreach ($idFields as $idField) { if (!empty($values[$idField])) { $values[substr($idField, 0, -3)] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_ContributionRecur', $idField, $values[$idField]); } } $this->assign('recur', $values); } }
/** * Get list of recurring contribution of contact Ids. * * @param int $contactId * Contact ID. * * @return array * list of recurring contribution fields * */ public static function getRecurContributions($contactId) { $params = array(); $recurDAO = new CRM_Contribute_DAO_ContributionRecur(); $recurDAO->contact_id = $contactId; $recurDAO->find(); $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(); while ($recurDAO->fetch()) { $params[$recurDAO->id]['id'] = $recurDAO->id; $params[$recurDAO->id]['contactId'] = $recurDAO->contact_id; $params[$recurDAO->id]['start_date'] = $recurDAO->start_date; $params[$recurDAO->id]['end_date'] = $recurDAO->end_date; $params[$recurDAO->id]['next_sched_contribution_date'] = $recurDAO->next_sched_contribution_date; $params[$recurDAO->id]['amount'] = $recurDAO->amount; $params[$recurDAO->id]['currency'] = $recurDAO->currency; $params[$recurDAO->id]['frequency_unit'] = $recurDAO->frequency_unit; $params[$recurDAO->id]['frequency_interval'] = $recurDAO->frequency_interval; $params[$recurDAO->id]['installments'] = $recurDAO->installments; $params[$recurDAO->id]['contribution_status_id'] = $recurDAO->contribution_status_id; $params[$recurDAO->id]['contribution_status'] = CRM_Utils_Array::value($recurDAO->contribution_status_id, $contributionStatus); $params[$recurDAO->id]['is_test'] = $recurDAO->is_test; $params[$recurDAO->id]['payment_processor_id'] = $recurDAO->payment_processor_id; } return $params; }
/** * called when action is browse. */ public function listContribution() { $controller = new CRM_Core_Controller_Simple('CRM_Contribute_Form_Search', ts('Contributions'), NULL, FALSE, FALSE, TRUE, FALSE); $controller->setEmbedded(TRUE); $controller->reset(); $controller->set('limit', 12); $controller->set('cid', $this->_contactId); $controller->set('context', 'user'); $controller->set('force', 1); $controller->process(); $controller->run(); //add honor block $params = CRM_Contribute_BAO_Contribution::getHonorContacts($this->_contactId); if (!empty($params)) { // assign vars to templates $this->assign('honorRows', $params); $this->assign('honor', TRUE); } $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->contact_id = $this->_contactId; $recur->is_test = 0; $recur->find(); $config = CRM_Core_Config::singleton(); $recurStatus = CRM_Contribute_PseudoConstant::contributionStatus(); $recurRow = array(); $recurIDs = array(); while ($recur->fetch()) { $mode = $recur->is_test ? 'test' : 'live'; $paymentProcessor = CRM_Contribute_BAO_ContributionRecur::getPaymentProcessor($recur->id, $mode); if (!$paymentProcessor) { continue; } require_once 'api/v3/utils.php'; //@todo calling api functions directly is not supported _civicrm_api3_object_to_array($recur, $values); $values['recur_status'] = $recurStatus[$values['contribution_status_id']]; $recurRow[$values['id']] = $values; $action = array_sum(array_keys(CRM_Contribute_Page_Tab::recurLinks($recur->id, 'dashboard'))); $details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recur->id, 'recur'); $hideUpdate = $details->membership_id & $details->auto_renew; if ($hideUpdate) { $action -= CRM_Core_Action::UPDATE; } $recurRow[$values['id']]['action'] = CRM_Core_Action::formLink(CRM_Contribute_Page_Tab::recurLinks($recur->id, 'dashboard'), $action, array('cid' => $this->_contactId, 'crid' => $values['id'], 'cxt' => 'contribution'), ts('more'), FALSE, 'contribution.dashboard.recurring', 'Contribution', $values['id']); $recurIDs[] = $values['id']; //reset $paymentObject for checking other paymenet processor //recurring url $paymentObject = NULL; } if (is_array($recurIDs) && !empty($recurIDs)) { $getCount = CRM_Contribute_BAO_ContributionRecur::getCount($recurIDs); foreach ($getCount as $key => $val) { $recurRow[$key]['completed'] = $val; $recurRow[$key]['link'] = CRM_Utils_System::url('civicrm/contribute/search', "reset=1&force=1&recur={$key}"); } } $this->assign('recurRows', $recurRow); if (!empty($recurRow)) { $this->assign('recur', TRUE); } else { $this->assign('recur', FALSE); } }
/** * Cancel Recurring contribution. * * @param integer $recurId recur contribution id. * @param array $objects an array of objects that is to be cancelled like * contribution, membership, event. At least contribution object is a must. * * @return true / false. * @access public * @static */ static function cancelRecurContribution($recurId, $objects) { if (!$recurId) { return false; } require_once 'CRM/Contribute/PseudoConstant.php'; $contributionStatus = CRM_Contribute_PseudoConstant::contributionStatus(null, 'name'); $canceledId = array_search('Cancelled', $contributionStatus); $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->id = $recurId; $recur->whereAdd("contribution_status_id != {$canceledId}"); if ($recur->find(true)) { require_once 'CRM/Core/Transaction.php'; $transaction = new CRM_Core_Transaction(); $recur->contribution_status_id = $canceledId; $recur->start_date = CRM_Utils_Date::isoToMysql($recur->start_date); $recur->create_date = CRM_Utils_Date::isoToMysql($recur->create_date); $recur->modified_date = CRM_Utils_Date::isoToMysql($recur->modified_date); $recur->cancel_date = date('YmdHis'); $recur->save(); require_once 'CRM/Core/Payment/BaseIPN.php'; $baseIPN = new CRM_Core_Payment_BaseIPN(); return $baseIPN->cancelled($objects, $transaction); } return false; }
function loadObjects(&$input, &$ids, &$objects, $required) { $contribution =& $objects['contribution']; $objects['membership'] = null; $objects['contributionRecur'] = null; $objects['contributionType'] = null; $objects['event'] = null; $objects['participant'] = null; $objects['pledge_payment'] = null; require_once 'CRM/Contribute/DAO/ContributionType.php'; $contributionType = new CRM_Contribute_DAO_ContributionType(); $contributionType->id = $contribution->contribution_type_id; if (!$contributionType->find(true)) { CRM_Core_Error::debug_log_message("Could not find contribution type record: {$contributionTypeID}"); echo "Failure: Could not find contribution type record for {$contributionTypeID}<p>"; return false; } $objects['contributionType'] = $contributionType; $paymentProcessorID = null; if ($input['component'] == 'contribute') { // retrieve the other optional objects first so // stuff down the line can use this info and do things // CRM-6056 if (isset($ids['membership'])) { require_once 'CRM/Member/DAO/Membership.php'; $membership = new CRM_Member_DAO_Membership(); $membership->id = $ids['membership']; if (!$membership->find(true)) { CRM_Core_Error::debug_log_message("Could not find membership record: {$membershipID}"); echo "Failure: Could not find membership record: {$membershipID}<p>"; return false; } $membership->join_date = CRM_Utils_Date::isoToMysql($membership->join_date); $membership->start_date = CRM_Utils_Date::isoToMysql($membership->start_date); $membership->end_date = CRM_Utils_Date::isoToMysql($membership->end_date); $membership->reminder_date = CRM_Utils_Date::isoToMysql($membership->reminder_date); $objects['membership'] =& $membership; } if (isset($ids['pledge_payment'])) { require_once 'CRM/Pledge/DAO/Payment.php'; $objects['pledge_payment'] = array(); foreach ($ids['pledge_payment'] as $key => $paymentID) { $payment = new CRM_Pledge_DAO_Payment(); $payment->id = $paymentID; if (!$payment->find(true)) { CRM_Core_Error::debug_log_message("Could not find pledge payment record: {$pledge_paymentID}"); echo "Failure: Could not find pledge payment record: {$pledge_paymentID}<p>"; return false; } $objects['pledge_payment'][] = $payment; } } if (isset($ids['contributionRecur'])) { require_once 'CRM/Contribute/DAO/ContributionRecur.php'; $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->id = $ids['contributionRecur']; if (!$recur->find(true)) { CRM_Core_Error::debug_log_message("Could not find recur record: {$contributionRecurID}"); echo "Failure: Could not find recur record: {$contributionRecurID}<p>"; return false; } $objects['contributionRecur'] =& $recur; //get payment processor id from recur object. $paymentProcessorID = $recur->payment_processor_id; } //for normal contribution get the payment processor id. if (!$paymentProcessorID) { if ($contribution->contribution_page_id) { // get the payment processor id from contribution page $paymentProcessorID = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionPage', $contribution->contribution_page_id, 'payment_processor_id'); } //fail to load payment processor id. if (!$paymentProcessorID && !$contribution->contribution_page_id && !CRM_Utils_Array::value('pledge_payment', $ids)) { $loadObjectSuccess = true; if ($required) { $loadObjectSuccess = false; CRM_Core_Error::debug_log_message("Could not find contribution page for contribution record: {$contributionID}"); echo "Failure: Could not find contribution page for contribution record: {$contributionID}<p>"; } return $loadObjectSuccess; } } } else { // we are in event mode // make sure event exists and is valid require_once 'CRM/Event/DAO/Event.php'; $event = new CRM_Event_DAO_Event(); $event->id = $ids['event']; if ($ids['event'] && !$event->find(true)) { CRM_Core_Error::debug_log_message("Could not find event: {$eventID}"); echo "Failure: Could not find event: {$eventID}<p>"; return false; } $objects['event'] =& $event; require_once 'CRM/Event/DAO/Participant.php'; $participant = new CRM_Event_DAO_Participant(); $participant->id = $ids['participant']; if ($ids['participant'] && !$participant->find(true)) { CRM_Core_Error::debug_log_message("Could not find participant: {$participantID}"); echo "Failure: Could not find participant: {$participantID}<p>"; return false; } $participant->register_date = CRM_Utils_Date::isoToMysql($participant->register_date); $objects['participant'] =& $participant; if (!$paymentProcessorID) { $paymentProcessorID = $objects['event']->payment_processor_id; } } $loadObjectSuccess = true; if ($paymentProcessorID) { require_once 'CRM/Core/BAO/PaymentProcessor.php'; $paymentProcessor = CRM_Core_BAO_PaymentProcessor::getPayment($paymentProcessorID, $contribution->is_test ? 'test' : 'live'); $ids['paymentProcessor'] = $paymentProcessorID; $objects['paymentProcessor'] =& $paymentProcessor; } else { if ($required) { $loadObjectSuccess = false; CRM_Core_Error::debug_log_message("Could not find payment processor for contribution record: {$contributionID}"); echo "Failure: Could not find payment processor for contribution record: {$contributionID}<p>"; } } return $loadObjectSuccess; }
/** * Global form rule. * * @param array $fields * The input form values. * @param array $files * The uploaded files if any. * @param $self * * @return bool|array * true if no errors, else array of errors */ public static function formRule($fields, $files, $self) { $errors = array(); // Check for Credit Card Contribution. if ($self->_mode) { if (empty($fields['payment_processor_id'])) { $errors['payment_processor_id'] = ts('Payment Processor is a required field.'); } else { // validate payment instrument (e.g. credit card number) CRM_Core_Payment_Form::validatePaymentInstrument($fields['payment_processor_id'], $fields, $errors, NULL); } } // Do the amount validations. if (empty($fields['total_amount']) && empty($self->_lineItems)) { if ($priceSetId = CRM_Utils_Array::value('price_set_id', $fields)) { CRM_Price_BAO_PriceField::priceSetValidation($priceSetId, $fields, $errors); } } $softErrors = CRM_Contribute_Form_SoftCredit::formRule($fields, $errors, $self); if (!empty($fields['total_amount']) && (!empty($fields['net_amount']) || !empty($fields['fee_amount']))) { $sum = CRM_Utils_Rule::cleanMoney($fields['net_amount']) + CRM_Utils_Rule::cleanMoney($fields['fee_amount']); // For taxable contribution we need to deduct taxable amount from // (net amount + fee amount) before comparing it with total amount if (!empty($self->_values['tax_amount'])) { $componentDetails = CRM_Contribute_BAO_Contribution::getComponentDetails($self->_id); if (!(CRM_Utils_Array::value('membership', $componentDetails) || CRM_Utils_Array::value('participant', $componentDetails))) { $sum = CRM_Utils_Money::format($sum - $self->_values['tax_amount'], NULL, '%a'); } } if (CRM_Utils_Rule::cleanMoney($fields['total_amount']) != $sum) { $errors['total_amount'] = ts('The sum of fee amount and net amount must be equal to total amount'); } } //CRM-16285 - Function to handle validation errors on form, for recurring contribution field. CRM_Contribute_BAO_ContributionRecur::validateRecurContribution($fields, $files, $self, $errors); // Form rule for status http://wiki.civicrm.org/confluence/display/CRM/CiviAccounts+4.3+Data+Flow if ($self->_action & CRM_Core_Action::UPDATE && $self->_id && $self->_values['contribution_status_id'] != $fields['contribution_status_id']) { CRM_Contribute_BAO_Contribution::checkStatusValidation($self->_values, $fields, $errors); } // CRM-16015, add form-rule to restrict change of financial type if using price field of different financial type if ($self->_action & CRM_Core_Action::UPDATE && $self->_id && $self->_values['financial_type_id'] != $fields['financial_type_id']) { CRM_Contribute_BAO_Contribution::checkFinancialTypeChange(NULL, $self->_id, $errors); } //FIXME FOR NEW DATA FLOW http://wiki.civicrm.org/confluence/display/CRM/CiviAccounts+4.3+Data+Flow if (!empty($fields['fee_amount']) && !empty($fields['financial_type_id']) && ($financialType = CRM_Contribute_BAO_Contribution::validateFinancialType($fields['financial_type_id']))) { $errors['financial_type_id'] = ts("Financial Account of account relationship of 'Expense Account is' is not configured for Financial Type : ") . $financialType; } // $trxn_id must be unique CRM-13919 if (!empty($fields['trxn_id'])) { $queryParams = array(1 => array($fields['trxn_id'], 'String')); $query = 'select count(*) from civicrm_contribution where trxn_id = %1'; if ($self->_id) { $queryParams[2] = array((int) $self->_id, 'Integer'); $query .= ' and id !=%2'; } $tCnt = CRM_Core_DAO::singleValueQuery($query, $queryParams); if ($tCnt) { $errors['trxn_id'] = ts('Transaction ID\'s must be unique. Transaction \'%1\' already exists in your database.', array(1 => $fields['trxn_id'])); } } if (!empty($fields['contribution_recur_id'])) { $contributionRecur = new CRM_Contribute_DAO_ContributionRecur(); $contributionRecur->id = $fields['contribution_recur_id']; $contributionRecur->find(TRUE); if ($fields['financial_type_id'] != $contributionRecur->financial_type_id || $fields['payment_instrument_id'] != $contributionRecur->payment_instrument_id) { $errors['contribution_recur_id'] = ts("Financial Type OR Paid By of the recurring contribution does not match with this contribution record."); } } $errors = array_merge($errors, $softErrors); return $errors; }
/** * This function is called when action is browse * * return null * @access public */ function listContribution() { $controller = new CRM_Core_Controller_Simple('CRM_Contribute_Form_Search', ts('Contributions'), null); $controller->setEmbedded(true); $controller->reset(); $controller->set('limit', 12); $controller->set('cid', $this->_contactId); $controller->set('context', 'user'); $controller->set('force', 1); $controller->process(); $controller->run(); //add honor block require_once 'CRM/Contribute/BAO/Contribution.php'; $params = array(); $params = CRM_Contribute_BAO_Contribution::getHonorContacts($this->_contactId); if (!empty($params)) { // assign vars to templates $this->assign('honorRows', $params); $this->assign('honor', true); } require_once 'CRM/Contribute/Form/ContributionBase.php'; require_once 'CRM/Contribute/BAO/ContributionRecur.php'; $recur = new CRM_Contribute_DAO_ContributionRecur(); $recur->contact_id = $this->_contactId; $recur->is_test = 0; $recur->find(); $config = CRM_Core_Config::singleton(); $recurStatus = CRM_Contribute_PseudoConstant::contributionStatus(); require_once 'CRM/Core/Payment.php'; require_once 'api/v2/utils.php'; $recurRow = array(); $recurIDs = array(); while ($recur->fetch()) { $mode = $recur->is_test ? 'test' : 'live'; $paymentProcessor = CRM_Contribute_BAO_ContributionRecur::getPaymentProcessor($recur->id, $mode); if (!$paymentProcessor) { continue; } // note that we are passing a CRM_Core_Page object ($this) as if it were a form here: $paymentObject =& CRM_Core_Payment::singleton($mode, $paymentProcessor, $this); _civicrm_object_to_array($recur, $values); $values['cancelSubscriptionUrl'] = $paymentObject->cancelSubscriptionURL(); $values['recur_status'] = $recurStatus[$values['contribution_status_id']]; $recurRow[$values['id']] = $values; $recurIDs[] = $values['id']; //reset $paymentObject for checking other paymenet processor //recurring url $paymentObject = null; } if (is_array($recurIDs) && !empty($recurIDs)) { $getCount = CRM_Contribute_BAO_ContributionRecur::getCount($recurIDs); foreach ($getCount as $key => $val) { $recurRow[$key]['completed'] = $val; $recurRow[$key]['link'] = CRM_Utils_System::url('civicrm/contribute/search', "reset=1&force=1&recur={$key}"); } } $this->assign('recurRows', $recurRow); if (!empty($recurRow)) { $this->assign('recur', true); } else { $this->assign('recur', false); } }
function _process_csv($csv_array, $csv_name, $mail_date) { $this->_addToSummary("Processing {$csv_name}"); foreach ($csv_array as $row) { $this->_addToSummary(null); // insert blank line. // check if this is a blank line if (count($row) <= 1) { continue; } $subscriptionId = $row[0]; $subscriptionStatus = $row[1]; $paymentNum = $row[2]; $totalRecurrences = $row[3]; $transactionId = $row[4]; $amount = $row[5]; $currency = $row[6]; $custFirstName = $row[8]; $custLastName = $row[9]; $contributionStatus = $row[10]; $recur = new CRM_Contribute_DAO_ContributionRecur(); $first_contribution = new CRM_Contribute_DAO_Contribution(); // If this is the first payment, load recurring contribution and update if ($paymentNum == 1) { // Load contribution using SubscriptionID as trxn_id $first_contribution->trxn_id = $subscriptionId; if (!$first_contribution->find(true)) { $this->_addToSummary("THE RECURRING TRANSACTION FOR SUBSCRIPTION {$subscriptionId} COULD NOT BE FOUND. A TRANSACTION HAS OCCURED THAT WAS NOT EXPECTED. PLEASE REVIEW {$csv_name}."); continue; } // Load recurring contribution from contribution $recur->id = $first_contribution->contribution_recur_id; if (!$recur->find(true)) { $this->_addToSummary("INITIAL RECURRING CONTRIBUTION NOT FOUND FOR {$subscriptionId}. PLEASE REVIEW {$csv_name}"); continue; } $recur->start_date = $mail_date; $recur->processor_id = $subscriptionId; $recur->trxn_id = $subscriptionId; $recur->contribution_status_id = _CRM_PROCESS_AUTHORIZE_REPORT_STATUS_CURRENT; // update transaction id for contribution $first_contribution->trxn_id = $transactionId; $first_contribution->receive_date = $mail_date; $first_contribution->contribution_status_id = $this->_get_contribution_status($contributionStatus); // load contribution page $contribution_page = new CRM_Contribute_DAO_ContributionPage(); $contribution_page->id = $first_contribution->contribution_page_id; if (!$contribution_page->find(true)) { $this->_addToSummary("COULD NOT FIND CONTRIBUTION PAGE FOR {$subscriptionId}. PLEASE REVIEW {$csv_name}"); continue; } // is there an email receipt if ($contribution_page->is_email_receipt) { $first_contribution->receipt_date = date('YmdHis'); } } else { $recur->processor_id = $subscriptionId; if (!$recur->find(true)) { $this->_addToSummary("THE RECURRING TRANSACTION FOR SUBSCRIPTION {$subscriptionId} COULD NOT BE FOUND. A TRANSACTION HAS OCCURED THAT WAS NOT EXPECTED. PLEASE REVIEW {$csv_name}."); continue; } $recur->modified_date = $mail_date; // load first contribution $first_contribution->contribution_recur_id = $recur->id; $first_contribution->orderBy('receive_date'); $first_contribution->limit(1); if (!$first_contribution->find(true)) { $this->_addToSummary("CONTRIBUTION RECORD FOR SUBSCRIPTION {$subscriptonId} COULD NOT BE FOUND. PLEASE REVIEW {$csv_name}"); continue; } // load contribution page $contribution_page = new CRM_Contribute_DAO_ContributionPage(); $contribution_page->id = $first_contribution->contribution_page_id; if (!$contribution_page->find(true)) { $this->_addToSummary("COULD NOT FIND CONTRIBUTION PAGE FOR {$subscriptionId}. PLEASE REVIEW {$csv_name}"); continue; } } // is this valid for failed transactions also? if ($amount != $recur->amount) { $this->_addToSummary("AN UNEXPECTED AMOUNT WAS RECEIVED FOR SUBSCRIPTION {$subscriptionId}. SKIPPING THIS TRANSACTION. PLEASE REVIEW {$csv_name}"); continue; } // Verify contact exists if (!$recur->contact_id) { // assuming if contact_id is set, contact exists $this->_addToSummary("NO USER IS ASSOCIATED WITH THE CONTRIBUTION FOR SUBSCRIPTION {$subscrptionId}, EXPECTED '{$custFirstName} {$custLastName}'. PLEASE REVIEW {$csv_name}"); continue; } // Verify number of recurrences if ($recur->installments != $totalRecurrences) { $this->_addToSummary("SUBSCRIPTION {$subscriptionId} EXPECTS {$recur->installments}, OFFERED {$totalRecurrences}. PLEASE REVIEW {$csv_name}"); continue; } // Check if this contribution is complete if (!empty($recur->end_date) && $recur->end_date != '0000-00-00 00:00:00') { $this->_addToSummary("SUBSCRIPTION {$subscriptionId} IS MARKED AS COMPLETE. PLEASE REVIEW {$csv_name}"); continue; } if (!empty($recur->cancel_date) && $recur->cancel_date != '0000-00-00 00:00:00') { $this->_addToSummary("SUBSCRIPTION {$subscriptionId} IS MARKED AS CANCELLED. PLEASE REVIEW {$csv_name}"); continue; } if ($paymentNum == $totalRecurrences) { $recur->end_date = $mail_date; $recur->contribution_status_id = _CRM_PROCESS_AUTHORIZE_REPORT_STATUS_COMPLETE; } if ($contributionStatus != CRM_Core_Payment_AuthorizeNet::AUTH_APPROVED) { $recur->failure_count++; } CRM_Core_DAO::transaction('BEGIN'); if (!$recur->save()) { $this->_addToSummary("THE RECURRING CONTRIBUTION COULD NOT BE UPDATED. PLEASE REVIEW {$csv_name} FOR subscription_id={$subscription_id}"); CRM_Core_DAO::transaction('ROLLBACK'); continue; } $this->_addToSummary("The recurring transaction has been updated."); if ($paymentNum == 1) { // update first contribution if (!$first_contribution->save()) { $this->_addToSummary("THE CONTRIBUTION COULD NOT BE UPDATED. PLEASE REVIEW {$csv_name} FOR subscription_id={$subscription_id}"); CRM_Core_DAO::transaction('ROLLBACK'); continue; } // copy $first_contribution to $contribution for use later $contribution = $first_contribution; } else { // create a contribution and then get it processed $contribution = new CRM_Contribute_DAO_Contribution(); // make sure that the transaction doesn't already exist $contribution->trxn_id = $transactionId; if ($contribution->find()) { $this->_addToSummary("THE TRANSACTION {$transaction_id} ALREADY EXISTS IN CIVICRM. PLEASE REVIEW {$csv_name} FOR subscription_id={$subscription_id}"); CRM_Core_DAO::transaction('ROLLBACK'); continue; } $contribution->contribution_recur_id = $recur->id; $contribution->receive_date = $mail_date; $contribution->total_amount = $amount; $contribution->net_amount = $amount; $contribution->trxn_id = $transactionId; $contribution->currency = $currency; $contribution->contribution_status_id = $this->_get_contribution_status($contributionStatus); $contribution->contact_id = $first_contribution->contact_id; $contribution->contribution_type_id = $first_contribution->contribution_type_id; $contribution->contribution_page_id = $first_contribution->contribution_page_id; $contribution->payment_instrument_id = $first_contribution->payment_instrument_id; $contribution->is_test = $first_contribution->is_test; $contribution->invoice_id = md5(uniqid(rand(), true)); if ($contribution_page->is_email_receipt) { $contribution->receipt_date = date('YmdHis'); } if (!$contribution->save()) { $this->_addToSummary("THE CONTRIBUTION COULD NOT BE SAVED. PLEASE REVIEW {$csv_name} FOR subscription_id={$subscription_id}"); CRM_Core_DAO::transaction('ROLLBACK'); continue; } } $this->_addToSummary('Contribution saved'); // create the transaction record $trxnParams = array('entity_table' => 'civicrm_contribution', 'entity_id' => $contribution->id, 'trxn_date' => $mail_date, 'trxn_type' => 'Debit', 'total_amount' => $amount, 'fee_amount' => $contribution->fee_amount, 'net_amount' => $contribution->net_amount, 'currency' => $contribution->currency, 'payment_processor' => 'AuthNet_AIM', 'trxn_id' => $contribution->trxn_id); require_once 'CRM/Contribute/BAO/FinancialTrxn.php'; $trxn =& CRM_Contribute_BAO_FinancialTrxn::create($trxnParams); if (is_a($trxn, 'CRM_Core_Error')) { $this->_addToSummary("A TRANSACTION RECORD COULD NOT BE CREATED. PLEASE REVIEW {$csv_name} FOR subscription_id={$subscription_id}"); CRM_Core_DAO::transaction('ROLLBACK'); continue; } else { $this->_addToSummary("Transaction record created."); } // get the title of the contribution page $title = $contribution_page->title; // format the money require_once 'CRM/Utils/Money.php'; $formattedAmount = CRM_Utils_Money::format($amount, $contribution->currency); CRM_Core_DAO::transaction('COMMIT'); // get the contribution type require_once 'CRM/Contribute/BAO/ContributionType.php'; $contribution_type_name = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_ContributionType', $contribution->contribution_type_id, 'name'); // create an activity history record $ahParams = array('entity_table' => 'civicrm_contact', 'entity_id' => $recur->contact_id, 'activity_type' => $contribution_type_name, 'module' => 'CiviContribute', 'callback' => 'CRM_Contribute_Page_Contribution::details', 'activity_id' => $contribution->id, 'activity_summary' => "{$formattedAmount} - {$title} (online)", 'activity_date' => $mail_date); require_once 'api/History.php'; if (is_a(crm_create_activity_history($ahParams), 'CRM_Core_Error')) { $this->_addToSummary("AN ACTIVITY HISTORY RECORD COULD NOT BE CREATED."); } else { $this->_addToSummary("Activity History record created."); } $this->_addToSummary("Transaction {$transactionId} has been processed."); $first_contribution->free(); $contribution_page->free(); $contribution->free(); $recur->free(); $trxn->free(); } $this->_addToSummary("Done processing {$csv_name}"); $this->_addToSummary(''); }