CRM-8526 Added contribution tokens to list
authorEdsel <edsel.lopez@jmaconsulting.biz>
Thu, 16 Feb 2017 10:20:41 +0000 (15:50 +0530)
committerdeb.monish <monish.deb@jmaconsulting.biz>
Tue, 11 Apr 2017 15:21:32 +0000 (20:51 +0530)
----------------------------------------
* 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
CRM/Contact/Form/Task/EmailCommon.php
CRM/Contribute/BAO/Contribution.php
CRM/Contribute/Form/Task/Email.php
tests/phpunit/CRM/Contribute/BAO/ContributionTest.php

index d99a6c9ab9fb82b895c75ca11e38d096ba6456d6..df28122fb22b66e14c2bd358a60b5932ec01701c 100644 (file)
@@ -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']);
index 240140f816d0972742506418ac671ae8a087ffa7..7f202d89d6e5cb869c22b0577b64cbec5d37fd83 100644 (file)
@@ -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 = '';
index 2f759741f0097843678ab85171fe60f472b53eef..4897308008d3e223a36eca58c61742373a3d457d 100644 (file)
@@ -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;
+  }
+
 }
index 17d899d76e44f8dd889e5c65c5eadba0bed59b25..0156f14a410b7f731bd59109f1875a78a14afc8f 100644 (file)
@@ -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;
   }
 
index cf43e04a5f32ee5aeba0651f5365268ff5f7240e..694a2c357a31295fa44846f3197dcbdb1581f983 100644 (file)
@@ -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 = "<p>Contribution Source: {contribution.contribution_source}</p></br>
+      <p>Contribution Invoice ID: {contribution.invoice_id}</p></br>
+      <p>Contribution Receive Date: {contribution.receive_date}</p></br>";
+
+    $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("<p>Contribution Source: ABC</p></br>
+      <p>Contribution Invoice ID: 12345</p></br>
+      <p>Contribution Receive Date: May 11th, 2015</p></br>", $contributionDetails[$contactId2]['html'], "The html does not match");
+  }
+
 }