From c5a6413b1dd2ca86305dfd0ef2483b223ab73295 Mon Sep 17 00:00:00 2001
From: Deepak Srivastava <deepak.srivastava@webaccess.co.in>
Date: Fri, 26 Apr 2013 15:53:06 +0530
Subject: [PATCH] CRM-12427 Fixes and patch

---
 CRM/Activity/BAO/Activity.php                 |  48 +++++++++++++-----
 CRM/Contact/Form/Task/SMSCommon.php           |  44 +++++++++-------
 CRM/Mailing/BAO/Job.php                       |   3 +-
 .../extensions/org.civicrm.sms.clickatell.zip | Bin 7471 -> 7486 bytes
 .../org_civicrm_sms_clickatell.php            |   5 +-
 tools/extensions/org.civicrm.sms.twilio.zip   | Bin 5934 -> 6013 bytes
 .../org_civicrm_sms_twilio.php                |  17 +++++--
 7 files changed, 77 insertions(+), 40 deletions(-)

diff --git a/CRM/Activity/BAO/Activity.php b/CRM/Activity/BAO/Activity.php
index 941e55c19e..d28b76373d 100644
--- a/CRM/Activity/BAO/Activity.php
+++ b/CRM/Activity/BAO/Activity.php
@@ -1499,7 +1499,8 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
     }
 
     $success = 0;
-    $escapeSmarty = $sent = FALSE;
+    $escapeSmarty = FALSE;
+    $errMsgs = array();
     foreach ($contactDetails as $values) {
       $contactId = $values['contact_id'];
 
@@ -1525,19 +1526,33 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
         $smsParams['To'] = '';
       }
 
-      if (self::sendSMSMessage(
-          $contactId,
-          $tokenText,
-          $tokenHtml,
-          $smsParams,
-          $activityID
-        )) {
-        // even a single successful delivery should set this falg to true
-        $sent = TRUE;
+      $sendResult = self::sendSMSMessage(
+        $contactId,
+        $tokenText,
+        $tokenHtml,
+        $smsParams,
+        $activityID
+      );
+
+      if (PEAR::isError($sendResult)) {
+        // Collect all of the PEAR_Error objects
+        $errMsgs[] = $sendResult;
+      } else {
         $success++;
       }
     }
 
+    // If at least one message was sent and no errors
+    // were generated then return a boolean value of TRUE.
+    // Otherwise, return FALSE (no messages sent) or
+    // and array of 1 or more PEAR_Error objects.
+    $sent = FALSE;
+    if ($success > 0 && count($errMsgs) == 0) {
+      $sent = TRUE;
+    } elseif (count($errMsgs) > 0) {
+      $sent = $errMsgs;
+    }
+
     return array($sent, $activity->id, $success);
   }
 
@@ -1548,7 +1563,7 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
    * @param int    $activityID        the activity ID that tracks the message
    * @param array  $smsParams         the params used for sending sms
    *
-   * @return boolean                  true if successfull else false.
+   * @return mixed                    true on success or PEAR_Error object
    * @access public
    * @static
    */
@@ -1579,7 +1594,11 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
     // make sure both phone are valid
     // and that the recipient wants to receive sms
     if (empty($toPhoneNumber) or $toDoNotSms) {
-      return FALSE;
+      return PEAR::raiseError(
+        'Recipient phone number is invalid or recipient does not want to receive SMS',
+        null,
+        PEAR_ERROR_RETURN
+      );
     }
 
     $message = $tokenHtml ? $tokenHtml : $tokenText;
@@ -1588,8 +1607,9 @@ LEFT JOIN   civicrm_case_activity ON ( civicrm_case_activity.activity_id = tbl.a
     $smsParams['parent_activity_id'] = $activityID;
 
     $providerObj = CRM_SMS_Provider::singleton(array('provider_id' => $smsParams['provider_id']));
-    if (!$providerObj->send($recipient, $smsParams, $message, NULL)) {
-      return FALSE;
+    $sendResult = $providerObj->send($recipient, $smsParams, $message, NULL);
+    if (PEAR::isError($sendResult)) {
+      return $sendResult;
     }
 
     // add activity target record for every sms that is send
diff --git a/CRM/Contact/Form/Task/SMSCommon.php b/CRM/Contact/Form/Task/SMSCommon.php
index 79cbfd1aea..611e52a33b 100644
--- a/CRM/Contact/Form/Task/SMSCommon.php
+++ b/CRM/Contact/Form/Task/SMSCommon.php
@@ -402,29 +402,39 @@ class CRM_Contact_Form_Task_SMSCommon {
       $contactIds
     );
 
-    if ($sent) {
+    if ($countSuccess > 0) {
       CRM_Core_Session::setStatus(ts('One message was sent successfully.', array('plural' => '%count messages were sent successfully.', 'count' => $countSuccess)), ts('Message Sent', array('plural' => 'Messages Sent', 'count' => $countSuccess)), 'success');
     }
 
-    //Display the name and number of contacts for those sms is not sent.
-    $smsNotSent = array_diff_assoc($allContactIds, $contactIds);
-
-    if (!empty($smsNotSent)) {
-      $not_sent = array();
-      foreach ($smsNotSent as $index => $contactId) {
-        $displayName    = $form->_allContactDetails[$contactId]['display_name'];
-        $phone          = $form->_allContactDetails[$contactId]['phone'];
-        $contactViewUrl = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid=$contactId");
-        $not_sent[] = "<a href='$contactViewUrl' title='$phone'>$displayName</a>";
+    if (is_array($sent)) {
+      // At least one PEAR_Error object was generated.
+      // Display the error messages to the user.
+      $status = '<ul>';
+      foreach ($sent as $errMsg) {
+        $status .= '<li>' . $errMsg . '</li>';
       }
-      $status = '(' . ts('because no phone number on file or communication preferences specify DO NOT SMS or Contact is deceased');
-      if (CRM_Utils_System::getClassName($form) == 'CRM_Activity_Form_Task_SMS') {
-        $status .= ' ' . ts("or the contact is not part of the activity '%1'", array(1 => self::RECIEVED_SMS_ACTIVITY_SUBJECT));
+      $status .= '</ul>';
+      CRM_Core_Session::setStatus($status, ts('One Message Not Sent', array('count' => count($sent), 'plural' => '%count Messages Not Sent')), 'info');
+    } else {
+      //Display the name and number of contacts for those sms is not sent.
+      $smsNotSent = array_diff_assoc($allContactIds, $contactIds);
+
+      if (!empty($smsNotSent)) {
+        $not_sent = array();
+        foreach ($smsNotSent as $index => $contactId) {
+          $displayName    = $form->_allContactDetails[$contactId]['display_name'];
+          $phone          = $form->_allContactDetails[$contactId]['phone'];
+          $contactViewUrl = CRM_Utils_System::url('civicrm/contact/view', "reset=1&cid=$contactId");
+          $not_sent[] = "<a href='$contactViewUrl' title='$phone'>$displayName</a>";
+        }
+        $status = '(' . ts('because no phone number on file or communication preferences specify DO NOT SMS or Contact is deceased');
+        if (CRM_Utils_System::getClassName($form) == 'CRM_Activity_Form_Task_SMS') {
+          $status .= ' ' . ts("or the contact is not part of the activity '%1'", array(1 => self::RECIEVED_SMS_ACTIVITY_SUBJECT));
+        }
+        $status .= ')<ul><li>' . implode('</li><li>', $not_sent) . '</li></ul>';
+        CRM_Core_Session::setStatus($status, ts('One Message Not Sent', array('count' => count($smsNotSent), 'plural' => '%count Messages Not Sent')), 'info');
       }
-      $status .= ')<ul><li>' . implode('</li><li>', $not_sent) . '</li></ul>';
-      CRM_Core_Session::setStatus($status, ts('One Message Not Sent', array('count' => count($smsNotSent), 'plural' => '%count Messages Not Sent')), 'info');
     }
-
   }
 }
 
diff --git a/CRM/Mailing/BAO/Job.php b/CRM/Mailing/BAO/Job.php
index 8c81602584..46fa34c5bc 100644
--- a/CRM/Mailing/BAO/Job.php
+++ b/CRM/Mailing/BAO/Job.php
@@ -653,7 +653,8 @@ VALUES (%1, %2, %3, %4, %5, %6, %7)
         CRM_Core_Error::setCallback();
       }
 
-      if (is_a($result, 'PEAR_Error')) {
+      // FIXME: for now we skipping bounce handling for sms
+      if (is_a($result, 'PEAR_Error') && !$mailing->sms_provider_id) {
         // CRM-9191
         $message = $result->getMessage();
         if (strpos($message,
diff --git a/tools/extensions/org.civicrm.sms.clickatell.zip b/tools/extensions/org.civicrm.sms.clickatell.zip
index 9730f743290abc4e3d58b287c5368068331877c7..b20af57445635e8a650ff2540c3b19dbfb26499c 100644
GIT binary patch
delta 3943
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
Bp2PqE

delta 3959
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
NI%YP!eTIJ?{tp<`dRPDe

diff --git a/tools/extensions/org.civicrm.sms.clickatell/org_civicrm_sms_clickatell.php b/tools/extensions/org.civicrm.sms.clickatell/org_civicrm_sms_clickatell.php
index 03a8cea3b2..9330d372e5 100644
--- a/tools/extensions/org.civicrm.sms.clickatell/org_civicrm_sms_clickatell.php
+++ b/tools/extensions/org.civicrm.sms.clickatell/org_civicrm_sms_clickatell.php
@@ -285,9 +285,8 @@ class org_civicrm_sms_clickatell extends CRM_SMS_Provider {
       }
       else {
         // TODO: Should add a failed activity instead.
-      	
-        CRM_Core_Error::debug_log_message($response['data']  . " - for phone: {$postDataArray['to']}");
-        return;
+        CRM_Core_Error::debug_log_message($response['data'] . " - for phone: {$postDataArray['to']}");
+        return PEAR::raiseError($response['data'], null, PEAR_ERROR_RETURN);
       }
     }
   }
diff --git a/tools/extensions/org.civicrm.sms.twilio.zip b/tools/extensions/org.civicrm.sms.twilio.zip
index 7c581aec36fb50207f2af6ad0cb13b7fe8f6dcc5..49a3e6df78ec823b4105fe7ad13a0e582b0872bc 100644
GIT binary patch
delta 2590
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
A`v3p{

delta 2485
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

diff --git a/tools/extensions/org.civicrm.sms.twilio/org_civicrm_sms_twilio.php b/tools/extensions/org.civicrm.sms.twilio/org_civicrm_sms_twilio.php
index a4eedc97db..07fb7fde5e 100644
--- a/tools/extensions/org.civicrm.sms.twilio/org_civicrm_sms_twilio.php
+++ b/tools/extensions/org.civicrm.sms.twilio/org_civicrm_sms_twilio.php
@@ -145,7 +145,7 @@ class org_civicrm_sms_twilio extends CRM_SMS_Provider {
    *
    * @param array the message with a to/from/text
    *
-   * @return mixed true on sucess or PEAR_Error object
+   * @return mixed true on success or PEAR_Error object
    * @access public
    */
   function send($recipients, $header, $message, $jobID = NULL) {
@@ -171,7 +171,14 @@ class org_civicrm_sms_twilio extends CRM_SMS_Provider {
         return $sid;
       }
       else {
-        return PEAR::raiseError($response['data']);
+        $errMsg = $send->RestException->Message
+          . ' For more information, see '
+          . $send->RestException->MoreInfo;
+        return PEAR::raiseError(
+          $errMsg,
+          null,
+          PEAR_ERROR_RETURN
+        );
       }
     }
   }
@@ -209,10 +216,10 @@ class org_civicrm_sms_twilio extends CRM_SMS_Provider {
     $response['http_code'] = curl_getinfo($this->_ch, CURLINFO_HTTP_CODE);
     
     if (empty($response['http_code'])) {
-      return PEAR::raiseError('No HTTP Status Code was returned.');
+      return PEAR::raiseError('No HTTP Status Code was returned.', null, PEAR_ERROR_RETURN);
     }
     elseif ($response['http_code'] === 0) {
-      return PEAR::raiseError('Cannot connect to the Twilio API Server.');
+      return PEAR::raiseError('Cannot connect to the Twilio API Server.', null, PEAR_ERROR_RETURN);
     }
 
     $response['data'] = $status;
@@ -220,4 +227,4 @@ class org_civicrm_sms_twilio extends CRM_SMS_Provider {
     
     return ($response);
   }
-}
\ No newline at end of file
+}
-- 
GitLab