CRM-20238 - Create hook for inbound SMS
authorEffy Elden <git@effy.is>
Fri, 10 Mar 2017 09:53:00 +0000 (20:53 +1100)
committerSeamus Lee <seamuslee001@gmail.com>
Mon, 15 May 2017 00:49:37 +0000 (10:49 +1000)
CRM/SMS/Provider.php
CRM/Utils/Hook.php

index 9d914dce0d9cfcbcbb9f8041b77d1f9afbd15536..68c6e25080094ba9f65ee3eab404e5fcc734bab8 100644 (file)
@@ -203,9 +203,17 @@ INNER JOIN civicrm_mailing_job mj ON mj.mailing_id = m.id AND mj.id = %1";
    * @throws CRM_Core_Exception
    */
   public function processInbound($from, $body, $to = NULL, $trackID = NULL) {
-    $formatFrom = $this->formatPhone($this->stripPhone($from), $like, "like");
-    $escapedFrom = CRM_Utils_Type::escape($formatFrom, 'String');
-    $fromContactID = CRM_Core_DAO::singleValueQuery('SELECT contact_id FROM civicrm_phone JOIN civicrm_contact ON civicrm_contact.id = civicrm_phone.contact_id WHERE !civicrm_contact.is_deleted AND phone LIKE "%' . $escapedFrom . '"');
+    $fromContactID = NULL;
+    $toContactID = NULL;
+    // call hook_civicrm_inboundSMS
+    CRM_Utils_Hook::inboundSMS($from, $fromContactID, $to, $toContactID, $body, $trackID);
+
+    if (!$fromContactID) {
+      // find sender by phone number if $fromContactID not set by hook
+      $formatFrom = $this->formatPhone($this->stripPhone($from), $like, "like");
+      $escapedFrom = CRM_Utils_Type::escape($formatFrom, 'String');
+      $fromContactID = CRM_Core_DAO::singleValueQuery('SELECT contact_id FROM civicrm_phone JOIN civicrm_contact ON civicrm_contact.id = civicrm_phone.contact_id WHERE !civicrm_contact.is_deleted AND phone LIKE "%' . $escapedFrom . '"');
+    }
 
     if (!$fromContactID) {
       // unknown mobile sender -- create new contact
@@ -236,12 +244,15 @@ INNER JOIN civicrm_mailing_job mj ON mj.mailing_id = m.id AND mj.id = %1";
       $fromContactID = $fromContact->id;
     }
 
-    if ($to) {
-      $to = CRM_Utils_Type::escape($to, 'String');
-      $toContactID = CRM_Core_DAO::singleValueQuery('SELECT contact_id FROM civicrm_phone JOIN civicrm_contact ON civicrm_contact.id = civicrm_phone.contact_id WHERE !civicrm_contact.is_deleted AND phone LIKE "%' . $to . '"');
-    }
-    else {
-      $toContactID = $fromContactID;
+    if (!($toContactID)) {
+      // find recipient if $toContactID not set by hook
+      if ($to) {
+        $to = CRM_Utils_Type::escape($to, 'String');
+        $toContactID = CRM_Core_DAO::singleValueQuery('SELECT contact_id FROM civicrm_phone JOIN civicrm_contact ON civicrm_contact.id = civicrm_phone.contact_id WHERE !civicrm_contact.is_deleted AND phone LIKE "%' . $to . '"');
+      }
+      else {
+        $toContactID = $fromContactID;
+      }
     }
 
     if ($fromContactID) {
index 602028a3788e7425d9e565e89e1fd38241d0e078..e6e130f6a88c155926c6f705a3223a14ed1c467e 100644 (file)
@@ -2299,4 +2299,27 @@ abstract class CRM_Utils_Hook {
     );
   }
 
+  /**
+   * This hook is called before an inbound SMS is processed.
+   *
+   * @param string $from
+   *   The phone number the message is from, as set by SMS provider
+   * @param int $fromContactID
+   *   Set to override default matching
+   * @param string $to
+   *   The optional phone number the message is to, as set by SMS provider
+   * @param int $toContactID
+   *   Set to override default matching
+   * @param string $body
+   *   The body text of the message
+   * @param string $trackID
+   *   The tracking ID of the message
+   *
+   * @return mixed
+   */
+  public static function inboundSMS(&$from, &$fromContactID = NULL, &$to, &$toContactID = NULL, &$body, &$trackID) {
+    return self::singleton()
+      ->invoke(6, $from, $fromContactID, $to, $toContactID, $body, $trackID, 'civicrm_inboundSMS');
+  }
+
 }