<?php
/*
+--------------------------------------------------------------------+
- | CiviCRM version 4.7 |
+ | CiviCRM version 5 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2017 |
+ | Copyright CiviCRM LLC (c) 2004-2018 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
/**
*
* @package CRM
- * @copyright CiviCRM LLC (c) 2004-2017
+ * @copyright CiviCRM LLC (c) 2004-2018
*/
abstract class CRM_SMS_Provider {
if (!isset(self::$_singleton[$cacheKey]) || $force) {
$ext = CRM_Extension_System::singleton()->getMapper();
if ($ext->isExtensionKey($providerName)) {
- $paymentClass = $ext->keyToClass($providerName);
- require_once "{$paymentClass}.php";
+ $providerClass = $ext->keyToClass($providerName);
+ require_once "{$providerClass}.php";
}
else {
- CRM_Core_Error::fatal("Could not locate extension for {$providerName}.");
+ // If we are running unit tests we simulate an SMS provider with the name "CiviTestSMSProvider"
+ if ($providerName !== 'CiviTestSMSProvider') {
+ CRM_Core_Error::fatal("Could not locate extension for {$providerName}.");
+ }
+ $providerClass = 'CiviTestSMSProvider';
}
- self::$_singleton[$cacheKey] = $paymentClass::singleton($providerParams, $force);
+ self::$_singleton[$cacheKey] = $providerClass::singleton($providerParams, $force);
}
return self::$_singleton[$cacheKey];
}
return FALSE;
}
- $activityTypeID = CRM_Core_OptionGroup::getValue('activity_type', 'SMS delivery', 'name');
// note: lets not pass status here, assuming status will be updated by callback
$activityParams = array(
'source_contact_id' => $sourceContactID,
'target_contact_id' => $headers['contact_id'],
- 'activity_type_id' => $activityTypeID,
+ 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'SMS delivery'),
'activity_date_time' => date('YmdHis'),
'details' => $message,
'result' => $apiMsgID,
FALSE, $default, $location
);
if ($abort && $value === NULL) {
- CRM_Core_Error::debug_log_message("Could not find an entry for $name in $location");
+ Civi::log()->warning("Could not find an entry for $name in $location");
echo "Failure: Missing Parameter<p>";
exit();
}
* @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 . '"');
+ $message = new CRM_SMS_Message();
+ $message->from = $from;
+ $message->to = $to;
+ $message->body = $body;
+ $message->trackID = $trackID;
+ // call hook_civicrm_inboundSMS
+ CRM_Utils_Hook::inboundSMS($message);
+
+ if (!$message->fromContactID) {
+ // find sender by phone number if $fromContactID not set by hook
+ $formatFrom = '%' . $this->formatPhone($this->stripPhone($message->from), $like, "like");
+ $message->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 %1", array(
+ 1 => array($formatFrom, 'String')));
+ }
- if (!$fromContactID) {
+ if (!$message->fromContactID) {
// unknown mobile sender -- create new contact
// use fake @mobile.sms email address for new contact since civi
// requires email or name for all contacts
$phoneTypes = CRM_Core_PseudoConstant::get('CRM_Core_DAO_Phone', 'phone_type_id');
$phoneloc = array_search('Home', $locationTypes);
$phonetype = array_search('Mobile', $phoneTypes);
- $stripFrom = $this->stripPhone($from);
+ $stripFrom = $this->stripPhone($message->from);
$contactparams = array(
'contact_type' => 'Individual',
'email' => array(
),
);
$fromContact = CRM_Contact_BAO_Contact::create($contactparams, FALSE, TRUE, FALSE);
- $fromContactID = $fromContact->id;
+ $message->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 (!$message->toContactID) {
+ // find recipient if $toContactID not set by hook
+ if ($message->to) {
+ $message->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 %1", array(
+ 1 => array('%' . $message->to, 'String')));
+ }
+ else {
+ $message->toContactID = $message->fromContactID;
+ }
}
- if ($fromContactID) {
- $actStatusIDs = array_flip(CRM_Core_OptionGroup::values('activity_status'));
- $activityTypeID = CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Inbound SMS');
-
+ if ($message->fromContactID) {
// note: lets not pass status here, assuming status will be updated by callback
$activityParams = array(
- 'source_contact_id' => $toContactID,
- 'target_contact_id' => $fromContactID,
- 'activity_type_id' => $activityTypeID,
+ 'source_contact_id' => $message->toContactID,
+ 'target_contact_id' => $message->fromContactID,
+ 'activity_type_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_type_id', 'Inbound SMS'),
'activity_date_time' => date('YmdHis'),
- 'status_id' => $actStatusIDs['Completed'],
- 'details' => $body,
- 'phone_number' => $from,
+ 'status_id' => CRM_Core_PseudoConstant::getKey('CRM_Activity_BAO_Activity', 'activity_status_id', 'Completed'),
+ 'details' => $message->body,
+ 'phone_number' => $message->from,
);
- if ($trackID) {
- $trackID = CRM_Utils_Type::escape($trackID, 'String');
- $activityParams['result'] = $trackID;
+ if ($message->trackID) {
+ $activityParams['result'] = CRM_Utils_Type::escape($message->trackID, 'String');
}
$result = CRM_Activity_BAO_Activity::create($activityParams);
- CRM_Core_Error::debug_log_message("Inbound SMS recorded for cid={$fromContactID}.");
+ Civi::log()->info("Inbound SMS recorded for cid={$message->fromContactID}.");
return $result;
}
}