/** * Creates a SEPA mandate for the given type */ function createMandate($type) { // first create a contribution $payment_instrument_id = CRM_Core_OptionGroup::getValue('payment_instrument', $type, 'name'); $contribution_status_id = CRM_Core_OptionGroup::getValue('contribution_status', 'Pending', 'name'); $contribution_data = array('version' => 3, 'contact_id' => $_REQUEST['contact_id'], 'campaign_id' => $_REQUEST['campaign_id'], 'financial_type_id' => $_REQUEST['financial_type_id'], 'payment_instrument_id' => $payment_instrument_id, 'contribution_status_id' => $contribution_status_id, 'currency' => 'EUR'); if ($type == 'OOFF') { $initial_status = 'OOFF'; $entity_table = 'civicrm_contribution'; $contribution_data['total_amount'] = number_format($_REQUEST['total_amount'], 2, '.', ''); $contribution_data['receive_date'] = $_REQUEST['date']; $contribution_data['source'] = $_REQUEST['source']; $contribution = civicrm_api('Contribution', 'create', $contribution_data); } else { if ($type == 'RCUR') { $initial_status = 'FRST'; $entity_table = 'civicrm_contribution_recur'; $contribution_data['amount'] = number_format($_REQUEST['total_amount'], 2, '.', ''); $contribution_data['start_date'] = $_REQUEST['start_date']; $contribution_data['end_date'] = $_REQUEST['end_date']; $contribution_data['create_date'] = date('YmdHis'); $contribution_data['modified_date'] = date('YmdHis'); $contribution_data['frequency_unit'] = 'month'; $contribution_data['frequency_interval'] = $_REQUEST['interval']; $contribution_data['cycle_day'] = $_REQUEST['cycle_day']; $contribution_data['is_email_receipt'] = 0; $contribution = civicrm_api('ContributionRecur', 'create', $contribution_data); } } if (isset($contribution['is_error']) && $contribution['is_error']) { $this->processError(sprintf(ts("Couldn't create contribution for contact #%s"), $_REQUEST['contact_id']), ts("Couldn't create contribution"), $contribution['error_message'], $_REQUEST['contact_id']); return; } // create a note, if requested if ($_REQUEST['note']) { // add note $create_note = array('version' => 3, 'entity_table' => $entity_table, 'entity_id' => $contribution['id'], 'note' => $_REQUEST['note'], 'privacy' => 0); $create_note_result = civicrm_api('Note', 'create', $create_note); if (isset($create_note_result['is_error']) && $create_note_result['is_error']) { // don't consider this a fatal error... CRM_Core_Session::setStatus(sprintf(ts("Couldn't create note for contribution #%s"), $contribution['id']), ts('Error'), 'alert'); error_log("org.project60.sepa_dd: error creating note - " . $create_note_result['error_message']); } } // next, create mandate $mandate_data = array('version' => 3, 'debug' => 1, 'contact_id' => $_REQUEST['contact_id'], 'source' => $_REQUEST['source'], 'entity_table' => $entity_table, 'entity_id' => $contribution['id'], 'creation_date' => date('YmdHis'), 'validation_date' => date('YmdHis'), 'date' => date('YmdHis'), 'iban' => $_REQUEST['iban'], 'bic' => $_REQUEST['bic'], 'reference' => $_REQUEST['reference'], 'status' => $initial_status, 'type' => $type, 'creditor_id' => $_REQUEST['creditor_id'], 'is_enabled' => 1); // call the hook for mandate generation $mandate = civicrm_api('SepaMandate', 'create', $mandate_data); if (isset($mandate['is_error']) && $mandate['is_error']) { $this->processError(sprintf(ts("Couldn't create %s mandate for contact #%s"), $type, $_REQUEST['contact_id']), ts("Couldn't create mandate"), $mandate['error_message'], $_REQUEST['contact_id']); return; } // if we want to replace an old mandate: if (isset($_REQUEST['replace'])) { CRM_Sepa_BAO_SEPAMandate::terminateMandate($_REQUEST['replace'], $_REQUEST['replace_date'], $_REQUEST['replace_reason']); } // if we get here, everything went o.k. $reference = $mandate['values'][$mandate['id']]['reference']; $mandate_url = CRM_Utils_System::url('civicrm/sepa/xmandate', "mid={$mandate['id']}"); CRM_Core_Session::setStatus(ts("'%3' SEPA Mandate <a href=\"%2\">%1</a> created.", array(1 => $reference, 2 => $mandate_url, 3 => $type)), ts("Success"), 'info'); if (!$this->isPopup()) { $contact_url = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid={$contribution_data['contact_id']}&selectedChild=contribute"); CRM_Utils_System::redirect($contact_url); } }
function cancelMandate($mandate_id) { $cancel_reason = $_REQUEST['cancel_reason']; if ($cancel_reason) { CRM_Sepa_BAO_SEPAMandate::terminateMandate($mandate_id, date("Y-m-d"), $cancel_reason); } else { CRM_Core_Session::setStatus(sprintf(ts("You need to provide a cancel reason.")), ts('Error'), 'error'); } }
/** * Test CRM_Sepa_BAO_SEPAMandate::add() * * @author niko bochan */ public function testCreateUsingBAO() { // create a new contact $contactId = $this->individualCreate(); // create a recurring contribution $txmd5 = md5(date("YmdHis" . rand(1, 100))); $txref = "SDD-TEST-RCUR-" . $txmd5; $cparams = array('contact_id' => $contactId, 'frequency_interval' => '1', 'frequency_unit' => 'month', 'amount' => 123.42, 'contribution_status_id' => 1, 'start_date' => date("Ymd") . "000000", 'currency' => "EUR", 'trxn_id' => $txref); $contrib = $this->callAPISuccess("contribution_recur", "create", $cparams); $contrib = $contrib["values"][$contrib["id"]]; // mandate parameters array $params = array(); $params['status'] = "FRST"; $params['is_enabled'] = 1; $params['version'] = 3; $params['debug'] = 1; $params['contact_id'] = $contactId; $params['source'] = "TestSource"; $params['entity_table'] = "civicrm_contribution_recur"; $params['entity_id'] = $contrib; $params['creation_date'] = "20140722092142"; $params['validation_date'] = "20140722092142"; $params['date'] = "20140722092142"; $params['iban'] = "BE68844010370034"; $params['bic'] = "TESTTEST"; $params['type'] = "RCUR"; $params['creditor_id'] = $this->getCreditor(); $dao = CRM_Sepa_BAO_SEPAMandate::add($params); // close the mandate CRM_Sepa_BAO_SEPAMandate::terminateMandate($dao->id, date("Y-m-d"), "Test"); // get the mandate via API and test it against the parameters array $mdtest = $this->callAPISuccess("SepaMandate", "get", array("entity_id" => $dao->id)); $mdtest = $mdtest["values"][$mdtest["id"]]; foreach ($params as $key => $value) { $this->assertEquals($params[$key], $value); } }