/** * Will rebook all given contributions to the given target contact * * @param $contribution_ids an array of contribution IDs * @param $contact_id the target contact ID */ static function rebook($contribution_ids, $contact_id, $redirect_url = NULL) { $contact_id = (int) $contact_id; $excludeList = array('id', 'contribution_id', 'trxn_id', 'invoice_id', 'cancel_date', 'cancel_reason', 'address_id', 'contribution_contact_id', 'contribution_status_id'); $cancelledStatus = CRM_Core_OptionGroup::getValue('contribution_status', 'Cancelled', 'name'); $completedStatus = CRM_Core_OptionGroup::getValue('contribution_status', 'Completed', 'name'); $contribution_fieldKeys = CRM_Contribute_DAO_Contribution::fieldKeys(); $sepa_ooff_payment_id = CRM_Core_OptionGroup::getValue('payment_instrument', 'OOFF', 'name'); $contribution_count = count($contribution_ids); $session = CRM_Core_Session::singleton(); $rebooked = 0; foreach ($contribution_ids as $contributionId) { $params = array('version' => 3, 'sequential' => 1, 'id' => $contributionId); $contribution = civicrm_api('Contribution', 'getsingle', $params); if (empty($contribution['is_error'])) { // contribution exists // cancel contribution $params = array('version' => 3, 'contribution_status_id' => $cancelledStatus, 'cancel_reason' => ts('Rebooked to CiviCRM ID %1', array(1 => $contact_id, 'domain' => 'de.systopia.donrec')), 'cancel_date' => date('YmdHis'), 'currency' => $contribution['currency'], 'id' => $contribution['id']); $cancelledContribution = civicrm_api('Contribution', 'create', $params); if (!empty($cancelledContribution['is_error']) && !empty($cancelledContribution['error_message'])) { CRM_Core_Session::setStatus($cancelledContribution['error_message'], ts("Error", array('domain' => 'de.systopia.donrec')), "error"); } // Now compile $attributes, taking the exclusionList into account $attributes = array('version' => 3, 'contribution_contact_id' => $contact_id, 'contribution_status_id' => $completedStatus, 'payment_instrument_id' => CRM_Core_OptionGroup::getValue('payment_instrument', $contribution['instrument_id'], 'id')); foreach ($contribution as $key => $value) { if (!in_array($key, $excludeList) && in_array($key, $contribution_fieldKeys)) { // to be sure that this keys really exists $attributes[$key] = $value; } if (strstr($key, 'custom')) { // get custom fields // load custom field spec for exception handling $custom_field_id = substr($key, 7); $custom_field = civicrm_api('CustomField', 'getsingle', array('id' => $custom_field_id, 'version' => 3)); // Exception 1: dates are not properly formatted if ($custom_field['data_type'] == 'Date') { if (!empty($value)) { $value = date('YmdHis', strtotime($value)); } } $attributes[$key] = $value; } } // create new contribution $newContribution = civicrm_api('Contribution', 'create', $attributes); if (!empty($newContribution['is_error']) && !empty($newContribution['error_message'])) { CRM_Core_Session::setStatus($newContribution['error_message'], ts("Error", array('domain' => 'de.systopia.donrec')), "error"); } // Exception handling for SEPA OOFF payments (org.project60.sepa extension) if (!empty($sepa_ooff_payment_id) && $attributes['payment_instrument_id'] == $sepa_ooff_payment_id) { CRM_Donrec_Form_Task_Rebook::fixOOFFMandate($contribution, $newContribution['id']); } // create rebook note $params = array('version' => 3, 'sequential' => 1, 'note' => ts('Rebooked from CiviCRM ID %1', array(1 => $contribution['contact_id'], 'domain' => 'de.systopia.donrec')), 'entity_table' => 'civicrm_contribution', 'entity_id' => $newContribution['id']); $result = civicrm_api('Note', 'create', $params); // move all notes from the old contribution $notes = civicrm_api('Note', 'get', array('entity_id' => $contributionId, 'entity_table' => 'civicrm_contribution', 'version' => 3)); if (!empty($notes['is_error'])) { CRM_Core_Error::debug_log_message("de.systopia.donrec: Error while reading notes: " . $notes['error_message']); } else { foreach ($notes['values'] as $note) { $dao = new CRM_Core_DAO_Note(); $dao->id = $note['id']; $dao->entity_id = $newContribution['id']; $dao->save(); } } $rebooked += 1; } } if ($rebooked == $contribution_count) { CRM_Core_Session::setStatus(ts('%1 contribution(s) successfully rebooked!', array(1 => $contribution_count, 'domain' => 'de.systopia.donrec')), ts('Successfully rebooked!'), 'success'); } else { CRM_Core_Error::debug_log_message("de.systopia.donrec: Only {$rebooked} of {$contribution_count} contributions rebooked.", array('domain' => 'de.systopia.donrec')); CRM_Core_Session::setStatus(ts('Please check your data and try again', array(1 => $contribution_count)), ts('Nothing rebooked!'), 'warning'); CRM_Utils_System::redirect($redirect_url); } }