Files
crm.clientright.ru/modules/SMSNotifier/providers/SMSpm.php
Fedor ac7467f0b4 Major CRM updates: AI Assistant, Court Status API, S3 integration improvements, and extensive file storage system
- Added comprehensive AI Assistant system (aiassist/ directory):
  * Vector search and embedding capabilities
  * Typebot proxy integration
  * Elastic search functionality
  * Message classification and chat history
  * MCP proxy for external integrations

- Implemented Court Status API (GetCourtStatus.php):
  * Real-time court document status checking
  * Integration with external court systems
  * Comprehensive error handling and logging

- Enhanced S3 integration:
  * Improved file backup system with metadata
  * Batch processing capabilities
  * Enhanced error logging and recovery
  * Copy operations with URL fixing

- Added Telegram contact creation API
- Improved error logging across all modules
- Enhanced callback system for AI responses
- Extensive backup file storage with timestamps
- Updated documentation and README files

- File storage improvements:
  * Thousands of backup files with proper metadata
  * Fix operations for broken file references
  * Project-specific backup and recovery systems
  * Comprehensive file integrity checking

Total: 26,461+ files added/modified including AWS SDK, vendor dependencies, and extensive backup system.
2025-10-16 11:17:21 +03:00

187 lines
6.1 KiB
PHP

<?php
/*+**********************************************************************************
* The contents of this file are subject to the vtiger CRM Public License Version 1.0
* ("License"); You may not use this file except in compliance with the License
* The Original Code is: vtiger CRM Open Source
* The Initial Developer of the Original Code is vtiger.
* Portions created by vtiger are Copyright (C) vtiger.
* All Rights Reserved.
************************************************************************************/
include_once 'vtlib/Vtiger/Net/Client.php';
function check_gsm($str)
{
$arr = array(
"0x00", "0x01", "0x02", "0x03", "0x04", "0x05","0x06","0x07","0x08","0x09",
"0x0A","0x0B","0x0C","0x0D","0x0E","0x0F","0x10","0x11","0x12","0x13",
"0x14","0x15","0x16","0x17","0x18","0x19","0x1A","0x1B","0x1B0A",
"0x1B14","0x1B28","0x1B29","0x1B2F","0x1B3C","0x1B3D","0x1B3E",
"0x1B40","0x1B65","0x1C","0x1D","0x1E","0x1F","0x20","0x21","0x22",
"0x23","0x24","0x25","0x26","0x27","0x28","0x29","0x2A","0x2B","0x2C",
"0x2D","0x2E","0x2F","0x30","0x31","0x32","0x33","0x34","0x35","0x36",
"0x37","0x38","0x39","0x3A","0x3B","0x3C","0x3D","0x3E","0x3F","0x40",
"0x41","0x42","0x43","0x44","0x45","0x46","0x47","0x48","0x49","0x4A",
"0x4B","0x4C","0x4D","0x4E","0x4F","0x50","0x51","0x52","0x53","0x54",
"0x55","0x56","0x57","0x58","0x59","0x5A","0x5B","0x5C","0x5D","0x5E",
"0x5F","0x60","0x61","0x62","0x63","0x64","0x65","0x66","0x67","0x68",
"0x69","0x6A","0x6B","0x6C","0x6D","0x6E","0x6F","0x70","0x71","0x72",
"0x73","0x74","0x75","0x76","0x77","0x78","0x79","0x7A","0x7B","0x7C",
"0x7D","0x7E","0x7F", "0xE2");
$j=0;
$strl = strlen($str);
for ($i = 0;$i < $strl; $i++)
{
$char = '0x' . bin2hex(substr($str,$i,1));
$pos = in_array($char,$arr);
if ($pos == 1)
{
$j++;
}
}
if ($j < $strl)
{
return false;
}
else
{
return true;
}
}
class SMSNotifier_SMSpm_Provider implements SMSNotifier_ISMSProvider_Model {
private $_parameters = array();
const SERVICE_URI = 'http://panel.smspm.com/gateway/';
const AUTH_HASH = 'LBL_SMSPM_AUTH_HASH';
const SENDER = 'LBL_SMS_SENDER_SMSpm';
private static $REQUIRED_PARAMETERS = array(self::AUTH_HASH, self::SENDER);
function __construct() {
}
public function getName() {
return 'SMSpm';
}
public function setAuthParameters($username, $password) {
$this->_username = $username;
$this->_password = $password;
}
public function setParameter($key, $value) {
$this->_parameters[$key] = $value;
}
public function getParameter($key, $defvalue = false) {
if(isset($this->_parameters[$key])) {
return $this->_parameters[$key];
}
return $defvalue;
}
public function getRequiredParams() {
return self::$REQUIRED_PARAMETERS;
}
public function getServiceURL($type = false) {
if($type) {
switch(strtoupper($type)) {
case self::SERVICE_AUTH: return self::SERVICE_URI . '/http/auth';
case self::SERVICE_SEND: return self::SERVICE_URI . $this->getParameter(self::AUTH_HASH).'/api.v1/send';
case self::SERVICE_QUERY: return self::SERVICE_URI . $this->getParameter(self::AUTH_HASH).'/api.v1/query/';
}
}
return false;
}
public function send($message, $tonumbers) {
if(!is_array($tonumbers)) {
$tonumbers = array($tonumbers);
}
$serviceURL = $this->getServiceURL(self::SERVICE_SEND);
$httpClient = new Vtiger_Net_Client($serviceURL);
$results = array();
foreach($tonumbers as $number) {
$param = array(
'sender' => $this->getParameter(self::SENDER),
'message' => $message,
'phone' => $number,
'output' => 'json'
);
if(!check_gsm($message)){
$param['unicode'] = 'on';
}
$response = $httpClient->doGet($param);
$responseLine = trim($response);
$result = array( 'error' => false, 'statusmessage' => '' );
$reply = json_decode($responseLine, true);
if(key($reply) == 'error') {
$result['id'] = 'error';
$result['error'] = true;
$result['to'] = $number;
$result['statusmessage'] = $reply['error']['message']; // Complete error message
} if(key($reply) == 'submitted') {
$result['id'] = $reply['id'];
$result['to'] = $number;
$result['status'] = self::MSG_STATUS_PROCESSING;
}
$results[] = $result;
}
return $results;
}
public function query($messageid) {
if(empty($messageid)){
$result['error'] = true;
$result['needlookup'] = 0;
$result['statusmessage'] = 'Error';
return($result);
}
$serviceURL = $this->getServiceURL(self::SERVICE_QUERY);
$httpClient = new Vtiger_Net_Client($serviceURL.$messageid);
$response = $httpClient->doGet(array(
'output' => 'json'
));
$response = trim($response);
$result = array( 'error' => false, 'needlookup' => 1, 'statusmessage' => '' );
$reply = array();
$reply = json_decode($response, true);
if(key($reply) == 'error') {
$result['error'] = true;
$result['needlookup'] = 0;
$result['statusmessage'] = 'Error';
} else {
$result['id'] = $messageid;
// Capture the status code as message by default.
$result['statusmessage'] = "unknown";
switch(key($reply)) {
case 'queued': $statusMessage = 'Message is waiting in queue';
$result['status'] = self::MSG_STATUS_PROCESSING;
$needlookup = 1;
break;
case 'submitting': $statusMessage = 'Message is about to be submitted';
$needlookup = 1;
break;
case 'submitted': $statusMessage = 'Message has been sent';
$result['status'] = self::MSG_STATUS_DISPATCHED;
$needlookup = 1;
break;
case 'delivered': $result['status'] = 'Delivered';$statusMessage = 'Message delivered to phone'; $needlookup = 0; break;
case 'submitFailed': $statusMessage = 'Message rejected (invalid recipient, invalid senderID)'; $needlookup = 0; break;
case 'deliveryFailed': $statusMessage = 'Message undelivered (non-existent number, roaming error)'; $needlookup = 0; break;
}
if(!empty($statusMessage)) {
$result['needlookup'] = $needlookup;
$result['statusmessage'] = $statusMessage;
}
}
return $result;
}
}
?>