Files
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

571 lines
22 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
include_once("pest.php");
/**
* Клиент для взаимодействия с Devino REST API
*
* Клиент может использоваться как набор статичных функций или как класс.
* Статиченые функции имеют суфикс _St. Необходимо сохранять ID сессии.
* При использовании класса, идентификатор сессии хранится внутри класса.
*
*/
class SMSClient {
//////////////////////////////// Статичные методы ////////////////////////////////
/**
* Базовый адрес для отправки запросов
* @const
*/
const m_baseURL = "https://integrationapi.net/rest";
/**
* Запрос ID сессии
*
* @access public
* @static
*
* @param string $login Имя пользователя
* @param string $password Пароль
*
* @return string Идентификатор сессии
* @throws SMSError_Exception
*/
public static function getSessionID_St( $login, $password ) {
$pest = new Pest(SMSClient::m_baseURL);
$sessionID = "";
try {
$sessionID = str_replace('"', '',
$pest->get('/User/SessionId?login='.$login.'&password='.$password)
);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $sessionID;
}
/**
* Запроса баланса
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
*
* @return double Баланс
* @throws SMSError_Exception
*/
public static function getBalance_St( $sessionID ) {
$pest = new Pest(SMSClient::m_baseURL);
$balance = 0;
try {
$balance = str_replace('"', '',
$pest->get('/User/Balance?sessionId='.$sessionID)
);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $balance;
}
/**
* Отправка SMS-сообщения
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param string $destinationAddress адрес назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp. Необязательный параметр.
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return array массив идентификаторов сообщений
* @throws SMSError_Exception
*/
public static function send_St( $sessionID, $sourceAddres, $destinationAddress, $data, $sendDate=null, $validity=0 ) {
$pest = new Pest(SMSClient::m_baseURL);
$result = array();
try {
$result = json_decode($pest->post('/Sms/Send',
SMSClient::createRequestParameters( $sessionID, $sourceAddres, $destinationAddress, $data, $sendDate, $validity )
),true);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
/**
* Отправка SMS-сообщения с учетом часового пояса получателя.
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param string $destinationAddress адрес назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения по местному времени получателя. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return array массив идентификаторов сообщений
* @throws SMSError_Exception
*/
public static function sendByTimeZone_St( $sessionID,$sourceAddres, $destinationAddress, $data, $sendDate, $validity=0 ) {
$pest = new Pest(SMSClient::m_baseURL);
$result = array();
try {
$result = json_decode($pest->post('/Sms/SendByTimeZone',
SMSClient::createRequestParameters( $sessionID, $sourceAddres, $destinationAddress, $data, $sendDate, $validity )
),true);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
/**
* Отправка SMS-сообщения нескольким адрессатам
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param array $destinationAddresses массив строк адресов назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp. Необязательный параметр.
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return array массив идентификаторов сообщений
* @throws SMSError_Exception
*/
public static function sendBulk_St( $sessionID,$sourceAddres, $destinationAddresses, $data, $sendDate=null, $validity=0 ) {
if (gettype($destinationAddresses) == "string") {
$destinationAddresses = array($destinationAddresses);
}
$pest = new Pest(SMSClient::m_baseURL);
$result = array();
try {
$result = json_decode($pest->post('/Sms/SendBulk',
SMSClient::createRequestParameters( $sessionID, $sourceAddres, $destinationAddresses, $data, $sendDate, $validity )
),true);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
/**
* Запрос статуса SMS-сообщения
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param string $messageID ID сообщения.
*
* @return array массив полей:
* State - статус сообщения. @see SMSClientSMSStatus
* TimeStampUtc - дата и время получения ответа
* StateDescription - описание статуса
* CreationDateUtc - дата создания
* SubmittedDateUtc - дата отправки
* ReportedDateUtc - дата доставки
* Price - цена за сообщение
* @throws SMSError_Exception
*/
public static function getSMSState_St( $sessionID, $messageID ) {
$pest = new Pest(SMSClient::m_baseURL);
$result = array(
'State' => SMSClientSMSStatus::SMS_STATUS_Unknown,
'TimeStampUtc' => time(),
'StateDescription' => '',
'CreationDateUtc' => null,
'SubmittedDateUtc' => null,
'ReportedDateUtc' => null,
'Price' => null);
try {
$result = json_decode($pest->get('/Sms/State?sessionId='.$sessionID.'&messageId='.$messageID),true);
$result['TimeStampUtc'] = substr(substr($result['TimeStampUtc'],6),0,-2) ;
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
/**
* Запрос входящих SMS-сообщений
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param mixed $minDateUTC начало периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param mixed $maxDateUTC конец периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
*
* @return array массив объектов с полями:
* string Data - текст сообщения
* string SourceAddress - адрес отправителя
* string DestinationAddress - адрес приема входящих сообщений
* string ID - идентификатор сообщения
* @throws SMSError_Exception
*/
public static function getInbox_St( $sessionID, $minDateUTC, $maxDateUTC ) {
$requestString = '/Sms/In?sessionId='.$sessionID;
if (gettype($minDateUTC) == "string") {
$requestString .= '&minDateUTC='.$minDateUTC;
} else if (gettype($minDateUTC) == "integer") {
$requestString .= '&minDateUTC='.date("Y-m-d",$minDateUTC).'T'.date("H:i:s",$minDateUTC);
}
if (gettype($maxDateUTC) == "string") {
$requestString .= '&maxDateUTC='.$maxDateUTC;
} else if (gettype($maxDateUTC) == "integer") {
$requestString .= '&maxDateUTC='.date("Y-m-d",$maxDateUTC).'T'.date("H:i:s",$maxDateUTC);
}
$pest = new Pest(SMSClient::m_baseURL);
$result = array(
'Data' => '',
'SourceAddress' => '',
'DestinationAddress' => '',
'ID' => null);
try {
$result = json_decode($pest->get($requestString),true);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
/**
* Запрос статистики по SMS-рассылкам
*
* @access public
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param mixed $startDate начало периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param mixed $stopDate конец периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
*
* @return array массив с информацией по статистике
* @throws SMSError_Exception
*/
public static function getStatistics_St( $sessionID, $startDate, $stopDate ) {
$requestString = '/Sms/Statistics?sessionId='.$sessionID;
if (gettype($startDate) == "string") {
$requestString .= '&startDateTime='.$startDate;
} else if (gettype($startDate) == "integer") {
$requestString .= '&startDateTime='.date("Y-m-d",$startDate).'T'.date("H:i:s",$startDate);
}
if (gettype($stopDate) == "string") {
$requestString .= '&endDateTime='.$stopDate;
} else if (gettype($stopDate) == "integer") {
$requestString .= '&endDateTime='.date("Y-m-d",$stopDate).'T'.date("H:i:s",$stopDate);
}
$pest = new Pest(SMSClient::m_baseURL);
$result = array();
try {
$result = json_decode($pest->get($requestString),true);
} catch( Exception $e ) {
$errorInfo = json_decode($e->getMessage());
unset($pest);
throw( new SMSError_Exception( $errorInfo->Desc, $errorInfo->Code));
}
unset($pest);
return $result;
}
//////////////////////////////// Методы для работы с классом ////////////////////////////////
/**
* Сохраненный идентификатор сессии
*
* @access protected
*/
protected $m_sessionID = "";
/**
* Сохраненный логин
*
* @access protected
*/
protected $m_login = "";
/**
* Сохраненный пароль
*
* @access protected
*/
protected $m_password = "";
/**
* Конструктор. В него передаются логин и пароль.
*
* @param string $login Логин
* @param string $password Пароль
*
*/
function __construct( $login, $password ) {
$this->m_login = $login;
$this->m_password = $password;
}
/**
* Запрос ID сессии.
*
* @access public
*
* @return string Идентификатор сессии
* @throws SMSError_Exception
*/
public function getSessionID() {
$this->m_sessionID = SMSClient::getSessionID_St( $this->m_login, $this->m_password );
return $this->m_sessionID;
}
/**
* Запроса баланса
*
* @access public
*
* @return double Баланс
* @throws SMSError_Exception
*/
public function getBalance() {
$balance = SMSClient::getBalance_St( $this->m_sessionID );
return $balance;
}
/**
* Отправка SMS-сообщения
*
* @access public
*
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param string $destinationAddress адрес назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp. Необязательный параметр.
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return
* @throws SMSError_Exception
*/
public function send( $sourceAddres, $destinationAddress, $data, $sendDate=null, $validity=0 ) {
$result = SMSClient::send_St( $this->m_sessionID, $sourceAddres, $destinationAddress, $data, $sendDate, $validity );
return $result;
}
/**
* Отправка SMS-сообщения с учетом часового пояса получателя.
*
* @access public
*
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param string $destinationAddress адрес назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения по местному времени получателя. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return
* @throws SMSError_Exception
*/
public function sendByTimeZone( $sourceAddres, $destinationAddress, $data, $sendDate, $validity=0 ) {
$result = SMSClient::sendByTimeZone_St( $this->m_sessionID, $sourceAddres, $destinationAddress, $data, $sendDate, $validity );
return $result;
}
/**
* Отправка SMS-сообщения с учетом часового пояса получателя.
*
* @access public
*
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param array $destinationAddresses массив строк адресов назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp. Необязательный параметр.
* @param integer $validity Время жизни сообщения в минутах. Необязательный параметр
*
* @return
* @throws SMSError_Exception
*/
public function sendBulk( $sourceAddres, $destinationAddresses, $data, $sendDate=null, $validity=0 ) {
$result = SMSClient::sendBulk_St( $this->m_sessionID, $sourceAddres, $destinationAddresses, $data, $sendDate, $validity );
return $result;
}
/**
* Запрос статуса SMS-сообщения
*
* @access public
*
* @param string $messageID ID сообщения.
*
* @return array массив полей:
* State - статус сообщения. @see SMSClientSMSStatus
* SMSClientSMSStatus - дата и время получения ответа
* StateDescription - описание статуса
* CreationDateUtc - дата создания
* SubmittedDateUtc - дата отправки
* ReportedDateUtc - дата доставки
* Price - цена за сообщение
* @throws SMSError_Exception
*/
public function getSMSState( $messageID ) {
$result = SMSClient::getSMSState_St( $this->m_sessionID, $messageID );
return $result;
}
/**
* Запрос входящих SMS-сообщений
*
* @access public
*
* @param mixed $minDateUTC начало периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param mixed $maxDateUTC конец периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
*
* @return array массив объектов с полями:
* string Data - текст сообщения
* string SourceAddress - адрес отправителя
* string DestinationAddress - адрес приема входящих сообщений
* string ID - идентификатор сообщения
* @throws SMSError_Exception
*/
public function getInbox( $minDateUTC, $maxDateUTC ) {
$result = SMSClient::getInbox_St( $this->m_sessionID, $minDateUTC, $maxDateUTC );
return $result;
}
/**
* Запрос статистики по SMS-рассылкам
*
* @access public
*
* @param mixed $startDate начало периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param mixed $stopDate конец периода выборки. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
*
* @return array массив с информацией по статистике
* @throws SMSError_Exception
*/
public function getStatistics( $startDate, $stopDate ) {
$result = SMSClient::getStatistics_St( $this->m_sessionID, $startDate, $stopDate );
return $result;
}
//////////////////////////////// Служебные методы ////////////////////////////////
/**
* Функция готовит строку запроса для методов отправки сообщения
*
* @access protected
* @static
*
* @param string $sessionID ID сессии. @see getSessionID_St
* @param string $sourceAddres отправитель. До 11 латинских символов или до 15 цифровых.
* @param mixed $destinationAddress адрес или массив адресов назначения. (Код страны+код сети+номер телефона, Пример: 79031234567
* @param string $data Текст сообщения
* @param mixed $sendDate дата отправки сообщения. Строка вида (YYYY-MM-DDTHH:MM:SS) или Timestamp
* @param integer $validity Время жизни сообщения в минутах
*
* @return array Массив с параметрами
*/
protected static function createRequestParameters( $sessionID, $sourceAddres, $destinationAddress, $data, $sendDate, $validity ) {
$parameters = array(
'sessionId' => $sessionID,
'sourceAddress' => $sourceAddres,
'data' => $data
);
if (gettype($destinationAddress) == "string") {
$parameters['destinationAddress'] = $destinationAddress;
} else if (gettype($destinationAddress) == "array") {
$parameters['destinationAddresses'] = $destinationAddress;//$destinationAddressesString;
}
if (gettype($sendDate) == "string") {
$parameters['sendDate'] = $sendDate;
} else if (gettype($sendDate) == "integer") {
$parameters['sendDate'] = date("Y-m-d",$sendDate).'T'.date("H:i:s",$sendDate);
}
if ((gettype($validity) == "integer") && ($validity != 0)) {
$parameters['validity'] = $validity;
}
return $parameters;
}
}
/**
* Список констант с кодами ошибок
*/
class SMSClientError {
const ERROR_OK = 0;
const ERROR_ArgumentCanNotBeNullOrEmpty = 1;
const ERROR_InvalidAgrument = 2;
const ERROR_InvalidSessionID = 3;
const ERROR_UnauthorizedAccess = 4;
const ERROR_NotEnoughCredits = 5;
const ERROR_InvalidOperation = 6;
const ERROR_Forbidden = 7;
const ERROR_GatewayError = 8;
const ERROR_InternalServerError = 9;
}
/**
* Список констант с кодами статусов SMS-сообщений
*/
class SMSClientSMSStatus {
const SMS_STATUS_Send = -1;
const SMS_STATUS_InQueue = -2;
const SMS_STATUS_Deleted = 47;
const SMS_STATUS_Stopped = -98;
const SMS_STATUS_Delivered = 0;
const SMS_STATUS_InvalidSourceAddress = 10;
const SMS_STATUS_InvalidDestinationAddress = 11;
const SMS_STATUS_UnallowedDestinationAddress = 41;
const SMS_STATUS_RejectedBySMSCenter = 42;
const SMS_STATUS_TimeOut = 46;
const SMS_STATUS_Rejected = 69;
const SMS_STATUS_Unknown = 99;
const SMS_STATUS_UnknownByTimeout = 255;
}
/**
* Генерируемое исключение при ошибке отправки SMS
*/
class SMSError_Exception extends Exception {}