/** * Generate the contribution array from the form, we fill in the contact details and determine any aggregation * around contact_id of contribution_recur_id * * @param string $groupBy * @param CRM_Contribute_Form_Task $form * @param array $returnProperties * @param bool $skipOnHold * @param bool $skipDeceased * @param array $messageToken * @param string $task * @param string $separator * * @return array */ public static function buildContributionArray($groupBy, $form, $returnProperties, $skipOnHold, $skipDeceased, $messageToken, $task, $separator) { $contributions = $contacts = $notSent = array(); $contributionIDs = $form->getVar('_contributionIds'); if ($form->_includesSoftCredits) { //@todo - comment on what is stored there $contributionIDs = $form->getVar('_contributionContactIds'); } foreach ($contributionIDs as $item => $contributionId) { // get contribution information $contribution = CRM_Utils_Token::getContributionTokenDetails(array('contribution_id' => $contributionId), $returnProperties, NULL, $messageToken, $task); $contribution = $contributions[$contributionId] = $contribution[$contributionId]; if ($form->_includesSoftCredits) { //@todo find out why this happens & add comments list($contactID) = explode('-', $item); $contactID = (int) $contactID; } else { $contactID = $contribution['contact_id']; } if (!isset($contacts[$contactID])) { list($contact) = CRM_Utils_Token::getTokenDetails(array('contact_id' => $contactID), $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, $task); $contacts[$contactID] = $contact[$contactID]; $contacts[$contactID]['contact_aggregate'] = 0; $contacts[$contactID]['combined'] = $contacts[$contactID]['contribution_ids'] = array(); } $contacts[$contactID]['contact_aggregate'] += $contribution['total_amount']; $groupByID = empty($contribution[$groupBy]) ? 0 : $contribution[$groupBy]; $contacts[$contactID]['contribution_ids'][$groupBy][$groupByID][$contributionId] = TRUE; if (!isset($contacts[$contactID]['combined'][$groupBy]) || !isset($contacts[$contactID]['combined'][$groupBy][$groupByID])) { $contacts[$contactID]['combined'][$groupBy][$groupByID] = $contribution; $contacts[$contactID]['aggregates'][$groupBy][$groupByID] = $contribution['total_amount']; } else { $contacts[$contactID]['combined'][$groupBy][$groupByID] = self::combineContributions($contacts[$contactID]['combined'][$groupBy][$groupByID], $contribution, $separator); $contacts[$contactID]['aggregates'][$groupBy][$groupByID] += $contribution['total_amount']; } } return array($contributions, $contacts); }
/** * Generate the contribution array from the form, we fill in the contact details and determine any aggregation * around contact_id of contribution_recur_id * * @param string $groupBy * @param array $contributionIDs * @param array $returnProperties * @param bool $skipOnHold * @param bool $skipDeceased * @param array $messageToken * @param string $task * @param string $separator * @param bool $isIncludeSoftCredits * * @return array */ public static function buildContributionArray($groupBy, $contributionIDs, $returnProperties, $skipOnHold, $skipDeceased, $messageToken, $task, $separator, $isIncludeSoftCredits) { $contributions = $contacts = $notSent = array(); foreach ($contributionIDs as $item => $contributionId) { // get contribution information $contribution = CRM_Utils_Token::getContributionTokenDetails(array('contribution_id' => $contributionId), $returnProperties, NULL, $messageToken, $task); $contribution = $contributions[$contributionId] = $contribution[$contributionId]; if ($isIncludeSoftCredits) { //@todo find out why this happens & add comments list($contactID) = explode('-', $item); $contactID = (int) $contactID; } else { $contactID = $contribution['contact_id']; } if (!isset($contacts[$contactID])) { $contacts[$contactID] = array(); $contacts[$contactID]['contact_aggregate'] = 0; $contacts[$contactID]['combined'] = $contacts[$contactID]['contribution_ids'] = array(); } $contacts[$contactID]['contact_aggregate'] += $contribution['total_amount']; $groupByID = empty($contribution[$groupBy]) ? 0 : $contribution[$groupBy]; $contacts[$contactID]['contribution_ids'][$groupBy][$groupByID][$contributionId] = TRUE; if (!isset($contacts[$contactID]['combined'][$groupBy]) || !isset($contacts[$contactID]['combined'][$groupBy][$groupByID])) { $contacts[$contactID]['combined'][$groupBy][$groupByID] = $contribution; $contacts[$contactID]['aggregates'][$groupBy][$groupByID] = $contribution['total_amount']; } else { $contacts[$contactID]['combined'][$groupBy][$groupByID] = self::combineContributions($contacts[$contactID]['combined'][$groupBy][$groupByID], $contribution, $separator); $contacts[$contactID]['aggregates'][$groupBy][$groupByID] += $contribution['total_amount']; } } // Assign the available contributions before calling tokens so hooks parsing smarty can access it. // Note that in core code you can only use smarty here if enable if for the whole site, incl // CiviMail, with a big performance impact. // Hooks allow more nuanced smarty usage here. CRM_Core_Smarty::singleton()->assign('contributions', $contributions); foreach ($contacts as $contactID => $contact) { $tokenResolvedContacts = CRM_Utils_Token::getTokenDetails(array('contact_id' => $contactID), $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, $task); $contacts[$contactID] = array_merge($tokenResolvedContacts[0][$contactID], $contact); } return array($contributions, $contacts); }
/** * process the form after the input has been submitted and validated * * @access public * * @return void */ static function postProcess(&$form) { list($formValues, $categories, $html_message, $messageToken, $returnProperties) = self::processMessageTemplate($form); // update dates ? $receipt_update = isset($formValues['receipt_update']) ? $formValues['receipt_update'] : FALSE; $thankyou_update = isset($formValues['thankyou_update']) ? $formValues['thankyou_update'] : FALSE; $nowDate = date('YmdHis'); $receipts = 0; $thanks = 0; $updateStatus = ''; // skip some contacts ? $skipOnHold = isset($form->skipOnHold) ? $form->skipOnHold : FALSE; $skipDeceased = isset($form->skipDeceased) ? $form->skipDeceased : TRUE; foreach ($form->getVar('_contributionIds') as $item => $contributionId) { // get contact information $contactId = civicrm_api("Contribution", "getvalue", array('version' => '3', 'id' => $contributionId, 'return' => 'contact_id')); $params = array('contact_id' => $contactId); list($contact) = CRM_Utils_Token::getTokenDetails($params, $returnProperties, $skipOnHold, $skipDeceased, NULL, $messageToken, 'CRM_Contribution_Form_Task_PDFLetterCommon'); if (civicrm_error($contact)) { $notSent[] = $contributionId; continue; } // get contribution information $params = array('contribution_id' => $contributionId); $contribution = CRM_Utils_Token::getContributionTokenDetails($params, $returnProperties, NULL, $messageToken, 'CRM_Contribution_Form_Task_PDFLetterCommon'); if (civicrm_error($contribution)) { $notSent[] = $contributionId; continue; } $tokenHtml = CRM_Utils_Token::replaceContactTokens($html_message, $contact[$contactId], TRUE, $messageToken); $tokenHtml = CRM_Utils_Token::replaceContributionTokens($tokenHtml, $contribution[$contributionId], TRUE, $messageToken); $tokenHtml = CRM_Utils_Token::replaceHookTokens($tokenHtml, $contact[$contactId], $categories, TRUE); if (defined('CIVICRM_MAIL_SMARTY') && CIVICRM_MAIL_SMARTY) { $smarty = CRM_Core_Smarty::singleton(); // also add the tokens to the template $smarty->assign_by_ref('contact', $contact); $tokenHtml = $smarty->fetch("string:{$tokenHtml}"); } $html[] = $tokenHtml; // update dates (do it for each contribution including grouped recurring contribution) if ($receipt_update) { $result = CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'receipt_date', $nowDate); // We can't use CRM_Core_Error::fatal here because the api error elevates the exception level. FIXME. dgg if ($result) { $receipts++; } } if ($thankyou_update) { $result = CRM_Core_DAO::setFieldValue('CRM_Contribute_DAO_Contribution', $contributionId, 'thankyou_date', $nowDate); // We can't use CRM_Core_Error::fatal here because the api error elevates the exception level. FIXME. dgg if ($result) { $thanks++; } } } self::createActivities($form, $html_message, $form->_contactIds); CRM_Utils_PDF_Utils::html2pdf($html, "CiviLetter.pdf", FALSE, $formValues); $form->postProcessHook(); if ($receipts) { $updateStatus = ts('Receipt date has been updated for %1 contributions.', array(1 => $receipts)); } if ($thanks) { $updateStatus .= ' ' . ts('Thank-you date has been updated for %1 contributions.', array(1 => $thanks)); } if ($updateStatus) { CRM_Core_Session::setStatus($updateStatus); } CRM_Utils_System::civiExit(1); }