From 7e2ec9978a1d1572f637c90f62624520110d2c3d Mon Sep 17 00:00:00 2001 From: Edsel Date: Thu, 16 Feb 2017 15:50:41 +0530 Subject: [PATCH] CRM-8526 Added contribution tokens to list ---------------------------------------- * CRM-8526: Support [contribution.custom_nn] tokens in templates https://issues.civicrm.org/jira/browse/CRM-8526 CRM-8526 Added support for contribution tokens in find contributions search results --- CRM/Activity/BAO/Activity.php | 22 ++++++- CRM/Contact/Form/Task/EmailCommon.php | 8 ++- CRM/Contribute/BAO/Contribution.php | 41 +++++++++++++ CRM/Contribute/Form/Task/Email.php | 1 + .../CRM/Contribute/BAO/ContributionTest.php | 57 +++++++++++++++++++ 5 files changed, 127 insertions(+), 2 deletions(-) diff --git a/CRM/Activity/BAO/Activity.php b/CRM/Activity/BAO/Activity.php index d99a6c9ab9..df28122fb2 100644 --- a/CRM/Activity/BAO/Activity.php +++ b/CRM/Activity/BAO/Activity.php @@ -942,7 +942,8 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity { $cc = NULL, $bcc = NULL, $contactIds = NULL, - $additionalDetails = NULL + $additionalDetails = NULL, + $contributionIds = NULL ) { // get the contact details of logged in contact, which we set as from email if ($userID == NULL) { @@ -1049,11 +1050,30 @@ class CRM_Activity_BAO_Activity extends CRM_Activity_DAO_Activity { $escapeSmarty = TRUE; } + $contributionDetails = array(); + if (!empty($contributionIds)) { + $contributionDetails = CRM_Contribute_BAO_Contribution::replaceContributionTokens( + $contributionIds, + $subject, + $subjectToken, + $text, + $html, + $messageToken, + $escapeSmarty + ); + } + $sent = $notSent = array(); foreach ($contactDetails as $values) { $contactId = $values['contact_id']; $emailAddress = $values['email']; + if (!empty($contributionDetails)) { + $subject = $contributionDetails[$contactId]['subject']; + $text = $contributionDetails[$contactId]['text']; + $html = $contributionDetails[$contactId]['html']; + } + if (!empty($details) && is_array($details["{$contactId}"])) { // unset email from details since it always returns primary email address unset($details["{$contactId}"]['email']); diff --git a/CRM/Contact/Form/Task/EmailCommon.php b/CRM/Contact/Form/Task/EmailCommon.php index 240140f816..7f202d89d6 100644 --- a/CRM/Contact/Form/Task/EmailCommon.php +++ b/CRM/Contact/Form/Task/EmailCommon.php @@ -512,6 +512,11 @@ class CRM_Contact_Form_Task_EmailCommon { } } + $contributionIds = array(); + if ($form->getVar('_contributionIds')) { + $contributionIds = $form->getVar('_contributionIds'); + } + // send the mail list($sent, $activityId) = CRM_Activity_BAO_Activity::sendEmail( $formattedContactDetails, @@ -525,7 +530,8 @@ class CRM_Contact_Form_Task_EmailCommon { $cc, $bcc, array_keys($form->_toContactDetails), - $additionalDetails + $additionalDetails, + $contributionIds ); $followupStatus = ''; diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index 2f759741f0..4897308008 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -5529,4 +5529,45 @@ LEFT JOIN civicrm_contribution on (civicrm_contribution.contact_id = civicrm_co return TRUE; } + /** + * Function to replace contribution tokens. + * + * @param array $contributionIds + * + * @param string $subject + * + * @param array $subjectToken + * + * @param string $text + * + * @param string $html + * + * @param array $messageToken + * + * @param bool $escapeSmarty + * + * @return array + */ + public static function replaceContributionTokens( + $contributionIds, + $subject, + $subjectToken, + $text, + $html, + $messageToken, + $escapeSmarty + ) { + if (empty($contributionIds)) { + return array(); + } + $contributionDetails = array(); + foreach ($contributionIds as $id) { + $result = civicrm_api3('Contribution', 'get', array('id' => $id)); + $contributionDetails[$result['values'][$result['id']]['contact_id']]['subject'] = CRM_Utils_Token::replaceContributionTokens($subject, $result, FALSE, $subjectToken, FALSE, $escapeSmarty); + $contributionDetails[$result['values'][$result['id']]['contact_id']]['text'] = CRM_Utils_Token::replaceContributionTokens($text, $result, FALSE, $messageToken, FALSE, $escapeSmarty); + $contributionDetails[$result['values'][$result['id']]['contact_id']]['html'] = CRM_Utils_Token::replaceContributionTokens($html, $result, FALSE, $messageToken, FALSE, $escapeSmarty); + } + return $contributionDetails; + } + } diff --git a/CRM/Contribute/Form/Task/Email.php b/CRM/Contribute/Form/Task/Email.php index 17d899d76e..0156f14a41 100644 --- a/CRM/Contribute/Form/Task/Email.php +++ b/CRM/Contribute/Form/Task/Email.php @@ -90,6 +90,7 @@ class CRM_Contribute_Form_Task_Email extends CRM_Contribute_Form_Task { */ public function listTokens() { $tokens = CRM_Core_SelectValues::contactTokens(); + $tokens = array_merge(CRM_Core_SelectValues::contributionTokens(), $tokens); return $tokens; } diff --git a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php index cf43e04a5f..694a2c357a 100644 --- a/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php +++ b/tests/phpunit/CRM/Contribute/BAO/ContributionTest.php @@ -1195,4 +1195,61 @@ WHERE eft.entity_id = %1 AND ft.to_financial_account_id <> %2"; return array($contribution, $financialAccount); } + /** + * Test for replaceContributionTokens. + * This function tests whether the contribution tokens are replaced with values from contribution. + */ + public function testReplaceContributionTokens() { + $contactId1 = $this->individualCreate(); + $params = array( + 'contact_id' => $contactId1, + 'receive_date' => '20120511', + 'total_amount' => 100.00, + 'financial_type_id' => 1, + 'trxn_id' => 12345, + 'invoice_id' => 67890, + 'source' => 'SSF', + 'contribution_status_id' => 2, + ); + $contribution1 = $this->contributionCreate($params); + $contactId2 = $this->individualCreate(); + $params = array( + 'contact_id' => $contactId2, + 'receive_date' => '20150511', + 'total_amount' => 200.00, + 'financial_type_id' => 1, + 'trxn_id' => 6789, + 'invoice_id' => 12345, + 'source' => 'ABC', + 'contribution_status_id' => 1, + ); + $contribution2 = $this->contributionCreate($params); + $ids = array($contribution1, $contribution2); + + $subject = "This is a test for contribution ID: {contribution.contribution_id}"; + $text = "Contribution Amount: {contribution.total_amount}"; + $html = "

Contribution Source: {contribution.contribution_source}


+

Contribution Invoice ID: {contribution.invoice_id}


+

Contribution Receive Date: {contribution.receive_date}


"; + + $subjectToken = CRM_Utils_Token::getTokens($subject); + $messageToken = CRM_Utils_Token::getTokens($text); + $messageToken = array_merge($messageToken, CRM_Utils_Token::getTokens($html)); + + $contributionDetails = CRM_Contribute_BAO_Contribution::replaceContributionTokens( + $ids, + $subject, + $subjectToken, + $text, + $html, + $messageToken, + TRUE + ); + + $this->assertEquals("Contribution Amount: $ 100.00", $contributionDetails[$contactId1]['text'], "The text does not match"); + $this->assertEquals("

Contribution Source: ABC


+

Contribution Invoice ID: 12345


+

Contribution Receive Date: May 11th, 2015


", $contributionDetails[$contactId2]['html'], "The html does not match"); + } + } -- 2.25.1