function run()
 {
     if (!isset($_REQUEST['mid'])) {
         die(ts("This page needs a mandate id ('mid') parameter."));
     } else {
         $mandate_id = (int) $_REQUEST['mid'];
     }
     if (isset($_REQUEST['action'])) {
         if ($_REQUEST['action'] == 'delete') {
             $this->deleteMandate($mandate_id);
             $this->assign('deleted_mandate', $mandate_id);
             parent::run();
             return;
         } else {
             if ($_REQUEST['action'] == 'end') {
                 $this->endMandate($mandate_id);
             } else {
                 if ($_REQUEST['action'] == 'cancel') {
                     $this->cancelMandate($mandate_id);
                 } else {
                     if ($_REQUEST['action'] == 'adjustamount') {
                         $this->adjustAmount($mandate_id);
                     } else {
                         CRM_Core_Session::setStatus(sprintf(ts("Unkown action '%s'. Ignored."), $_REQUEST['action']), ts('Error'), 'error');
                     }
                 }
             }
         }
     }
     // first, load the mandate
     $mandate = civicrm_api("SepaMandate", "getsingle", array('id' => $mandate_id, 'version' => 3));
     if (isset($mandate['is_error']) && $mandate['is_error']) {
         CRM_Core_Session::setStatus(sprintf(ts("Cannot read mandate [%s]. Error was: '%s'"), $mandate_id, $mandate['error_message']), ts('Error'), 'error');
         die(sprintf(ts("Cannot find mandate [%s]."), $mandate_id));
     }
     // load the contribution
     $contribution_id = $mandate['entity_id'];
     $contribution_type = $mandate['entity_table'] == 'civicrm_contribution' ? 'Contribution' : 'ContributionRecur';
     $contribution = civicrm_api($contribution_type, "getsingle", array('id' => $contribution_id, 'version' => 3));
     if (isset($contribution['is_error']) && $contribution['is_error']) {
         CRM_Core_Session::setStatus(sprintf(ts("Cannot read contribution [%s]. Error was: '%s'"), $contribution_id, $contribution['error_message']), ts('Error'), 'error');
     }
     // load the mandate's contact
     $contact1 = civicrm_api("Contact", "getsingle", array('id' => $mandate['contact_id'], 'version' => 3));
     if (isset($contact1['is_error']) && $contact1['is_error']) {
         CRM_Core_Session::setStatus(sprintf(ts("Cannot read contact [%s]. Error was: '%s'"), $contact1, $contact1['error_message']), ts('Error'), 'error');
     }
     // load the contribtion's contact
     if ($mandate['contact_id'] == $contribution['contact_id']) {
         $contact2 = $contact1;
     } else {
         $contact2 = civicrm_api("Contact", "getsingle", array('id' => $contribution['contact_id'], 'version' => 3));
         if (isset($contact2['is_error']) && $contact2['is_error']) {
             CRM_Core_Session::setStatus(sprintf(ts("Cannot read contact [%s]. Error was: '%s'"), $contact2, $contact2['error_message']), ts('Error'), 'error');
         }
     }
     // load the creditor
     if (!empty($mandate['creditor_id'])) {
         $creditor = civicrm_api("SepaCreditor", "getsingle", array('id' => $mandate['creditor_id'], 'version' => 3));
         if (!empty($creditor['is_error'])) {
             CRM_Core_Session::setStatus(sprintf(ts("Cannot read creditor [%s]. Error was: '%s'"), $mandate['creditor_id'], $creditor['error_message']), ts('Error'), 'error');
         } else {
             $mandate['creditor_name'] = $creditor['name'];
         }
     }
     // load the campaign
     if (isset($contribution['contribution_campaign_id']) && $contribution['contribution_campaign_id']) {
         $campaign_id = $contribution['contribution_campaign_id'];
     } elseif (isset($contribution['campaign_id']) && $contribution['campaign_id']) {
         $campaign_id = $contribution['campaign_id'];
     }
     if (isset($campaign_id)) {
         $campaign = civicrm_api("Campaign", "getsingle", array('id' => $campaign_id, 'version' => 3));
         if (isset($campaign['is_error'])) {
             CRM_Core_Session::setStatus(sprintf(ts("Cannot read contact [%s]. Error was: '%s'"), $campaign, $campaign['error_message']), ts('Error'), 'error');
         } else {
             $contribution['campaign'] = $campaign['title'];
         }
     } else {
         $contribution['campaign'] = '';
     }
     // prepare the data
     $financial_types = CRM_Contribute_PseudoConstant::financialType();
     $contact1['link'] = CRM_Utils_System::url('civicrm/contact/view', "&reset=1&cid=" . $contact1['id']);
     $contact2['link'] = CRM_Utils_System::url('civicrm/contact/view', "&reset=1&cid=" . $contact2['id']);
     $contribution['financial_type'] = $financial_types[$contribution['financial_type_id']];
     if (isset($contribution['amount']) && $contribution['amount']) {
         // this is a recurring contribution
         $contribution['link'] = CRM_Utils_System::url('civicrm/contact/view/contributionrecur', "&reset=1&id=" . $contribution['id'] . "&cid=" . $contact2['id']);
         $contribution['currency'] = $contribution['currency'];
         $contribution['cycle'] = CRM_Utils_SepaOptionGroupTools::getFrequencyText($contribution['frequency_interval'], $contribution['frequency_unit'], true);
         if (isset($contribution['end_date']) && $contribution['end_date']) {
             $contribution['default_end_date'] = date('Y-m-d', strtotime($contribution['end_date']));
         } else {
             $contribution['default_end_date'] = date('Y-m-d');
         }
     } else {
         // this is a simple contribution
         $contribution['link'] = CRM_Utils_System::url('civicrm/contact/view/contribution', "reset=1&action=view&id=" . $contribution['id'] . "&cid=" . $contact2['id']);
         $contribution['amount'] = $contribution['total_amount'];
         $contribution['currency'] = $contribution['currency'];
     }
     // load eligeble templates
     // first: the dafault template
     $template_entry = civicrm_api('OptionValue', 'getsingle', array('version' => 3, 'option_group_name' => 'msg_tpl_workflow_contribution', 'name' => 'sepa_mandate_pdf'));
     $tpl_ids = array();
     $query = "SELECT `id`, `msg_title`, `msg_subject`\n              FROM   `civicrm_msg_template`\n              WHERE  `is_active` = 1\n              AND (  (`workflow_id` = '{$template_entry['id']}')\n                  OR (`msg_title` LIKE 'SEPA%' AND `workflow_id` IS NULL) );";
     $result = CRM_Core_DAO::executeQuery($query);
     while ($result->fetch()) {
         $tpl_ids[] = array($result->id, $result->msg_title);
     }
     $this->assign('sepa', $mandate);
     $this->assign('contribution', $contribution);
     $this->assign('contact1', $contact1);
     $this->assign('contact2', $contact2);
     $this->assign('can_delete', CRM_Core_Permission::check('administer CiviCRM'));
     $this->assign('can_modify', CRM_Sepa_Logic_Settings::getSetting('allow_mandate_modification'));
     $this->assign('sepa_templates', $tpl_ids);
     parent::run();
 }
 /**
  * generate the HTML text, and assign all the required variables (tokens)
  * this is a precondition for PDF generation as well as emails
  */
 function generateHTML($mandate, $template_id)
 {
     // init API wrapper object
     if (!isset($this->api)) {
         $this->api = new civicrm_api3();
     }
     $api = $this->api;
     // LOAD INFORMATION and set tokens (smarty variables)
     // fix mandate. @X+: Why?
     if (is_array($mandate)) {
         $mandate = json_decode(json_encode($mandate), FALSE);
     }
     $this->mandate = $mandate;
     $this->assign("sepa", (array) $mandate);
     $this->assign("mandate", (array) $mandate);
     // load the associated contribution
     switch ($mandate->entity_table) {
         case "civicrm_contribution_recur":
             $api->ContributionRecur->getsingle(array("id" => $mandate->entity_id));
             $recur = $api->result;
             $this->assign("recur", (array) $recur);
             $this->assign("contactId", $recur->contact_id);
             $this->addContactTokens($recur->contact_id, 'contact');
             // first_conttribution
             if (!empty($mandate->first_contribution_id)) {
                 $api->Contribution->getsingle(array("id" => $mandate->first_contribution_id));
                 $this->assign("first_contribution", (array) $api->result);
             }
             // some more extra information:
             $recur_extra = array();
             $recur_extra['frequency_text'] = CRM_Utils_SepaOptionGroupTools::getFrequencyText($recur->frequency_interval, $recur->frequency_unit, false);
             $recur_extra['frequency_text_l10n'] = CRM_Utils_SepaOptionGroupTools::getFrequencyText($recur->frequency_interval, $recur->frequency_unit, true);
             $recur_extra['yearly_amount'] = $recur->amount;
             if ($recur->frequency_unit == 'month') {
                 $recur_extra['yearly_amount'] = $recur_extra['yearly_amount'] * (12 / $recur->frequency_interval);
             } elseif ($recur->frequency_unit == 'year') {
                 $recur_extra['yearly_amount'] = $recur_extra['yearly_amount'] / $recur->frequency_interval;
             } else {
                 // we don't support other units
                 unset($recur_extra['yearly_amount']);
             }
             $this->assign("recur_extra", (array) $recur_extra);
             break;
         case "civicrm_contribution":
             $api->Contribution->getsingle(array("id" => $mandate->entity_id));
             $contribution = $api->result;
             $this->assign("contribution", (array) $contribution);
             $this->assign("contactId", $contribution->contact_id);
             $this->addContactTokens($contribution->contact_id, 'contact');
             break;
         default:
             return CRM_Core_Error::fatal("We don't know how to handle mandates for " . $mandate->entity_table);
     }
     // add creditor information
     $api->SepaCreditor->getsingle(array('id' => $mandate->creditor_id));
     $creditor = $api->result;
     $this->assign("mandate_creditor", $creditor);
     // add payment processor information
     if (!empty($recur->payment_processor_id)) {
         $payment_processor_id = $recur->payment_processor_id;
     }
     if (!empty($contribution->payment_processor_id)) {
         $payment_processor_id = $contribution->payment_processor_id;
     }
     if (!empty($payment_processor_id)) {
         $api->PaymentProcessor->getsingle(array('id' => $payment_processor_id));
         if (isset($api->{$result})) {
             $this->assign("payment_processor", $api->{$result});
             // LEGACY: set 'creditor' to the following (@X+: why?)
             $this->assign("creditor", $api->{$result}->user_name);
         }
     }
     // set some more basic information
     $this->addContactTokens($mandate->contact_id, 'mandate_contact');
     $this->addContactTokens($creditor->creditor_id, 'creditor_contact');
     $this->addContactTokens(CRM_Core_Session::singleton()->get('userID'), 'user');
     // Load the template and run SMARTY
     $msg = $this->getMessage($template_id);
     CRM_Utils_System::setTitle($msg["msg_title"] . " " . $mandate->reference);
     $this->html = $this->getTemplate()->fetch("string:" . $msg["msg_html"]);
 }