- 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.
324 lines
13 KiB
PHP
324 lines
13 KiB
PHP
<?php
|
||
/*********************************************************************************
|
||
* Набор методов для работы с Контур.Толк через родное API
|
||
* All Rights Reserved.
|
||
* Contributor(s): Илья Руденко itsaturn@yandex.ru
|
||
********************************************************************************/
|
||
require_once 'include/utils/utils.php';
|
||
|
||
function CreateMeeting($roomName, $startdate, $starttime, $enddate, $endtime, $subject, $description) {
|
||
$output = 'YES';
|
||
// ХЗ почему, но с сегодняшнего дня контур стал сам добавлять 3 часа - поэтому нам надо уменьшить на 3 часа время начала и окочания
|
||
$starttime = date('H:i:s', strtotime($starttime) - 10800);
|
||
$endtime = date('H:i:s', strtotime($endtime) - 10800);
|
||
|
||
$start = $startdate.'T'.$starttime;
|
||
$end = $enddate.'T'.$endtime;
|
||
$params = array(
|
||
"start" => $start,
|
||
"end" => $end,
|
||
"subject" => $subject,
|
||
"description" => $description,
|
||
"roomName" => $roomName,
|
||
"allowAnonymous" => true,
|
||
"enableSip" => false,
|
||
"enableAutoRecording" => true
|
||
);
|
||
|
||
$account = 'kfv.advokat@gmail.com';
|
||
//$account = 'ilya@rudenko.expert';
|
||
$logstring = date('Y-m-d H:i:s', 'Подготовили массив для создания встречи: '.json_encode($params).PHP_EOL);
|
||
file_put_contents('logs/Kontur.log', $logstring, FILE_APPEND);
|
||
|
||
$curl = curl_init();
|
||
|
||
curl_setopt_array($curl, array(
|
||
CURLOPT_URL => 'https://clientright.ktalk.ru/api/emailCalendar/'.$account,
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
CURLOPT_ENCODING => '',
|
||
CURLOPT_MAXREDIRS => 10,
|
||
CURLOPT_TIMEOUT => 0,
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||
CURLOPT_CUSTOMREQUEST => 'POST',
|
||
CURLOPT_POSTFIELDS => json_encode($params),
|
||
CURLOPT_HTTPHEADER => array(
|
||
'x-auth-token: pV5b1OcpXk7WOqVYFLDQJkfqWsdv2HDE',
|
||
'Content-Type: application/json'
|
||
),
|
||
));
|
||
|
||
$output = curl_exec($curl);
|
||
|
||
if (curl_errno($curl)) {
|
||
$logstring = date('Y-m-d H:i:s').' Что-то пошло не так при создании встречи: '.curl_error($curl).PHP_EOL;
|
||
} else {
|
||
$logstring = date('Y-m-d H:i:s', 'Ответ от Контура при созданиии митинга: '.$output.PHP_EOL);
|
||
$output = 'YES';
|
||
}
|
||
file_put_contents('logs/Kontur.log', $logstring, FILE_APPEND);
|
||
|
||
curl_close($curl);
|
||
|
||
return $output;
|
||
}
|
||
|
||
function GetMeetingKey($roomName) {
|
||
$key = 'none';
|
||
|
||
$curl = curl_init();
|
||
|
||
curl_setopt_array($curl, array(
|
||
CURLOPT_URL => 'https://clientright.ktalk.ru/api/domain/recordings',
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
CURLOPT_ENCODING => '',
|
||
CURLOPT_MAXREDIRS => 10,
|
||
CURLOPT_TIMEOUT => 0,
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||
CURLOPT_CUSTOMREQUEST => 'GET',
|
||
CURLOPT_HTTPHEADER => array(
|
||
'x-auth-token: pV5b1OcpXk7WOqVYFLDQJkfqWsdv2HDE',
|
||
'Content-Type: application/json'
|
||
),
|
||
));
|
||
|
||
$output = curl_exec($curl);
|
||
$data = json_decode($output, true);
|
||
|
||
if (curl_errno($curl)) {
|
||
$logstring = date('Y-m-d H:i:s').' Что-то пошло не так при получении списка встреч: '.curl_error($curl).PHP_EOL;
|
||
} else {
|
||
$logstring = date('Y-m-d H:i:s', 'Ответ от Контура при получении списка встреч: '.$output.PHP_EOL);
|
||
foreach ($data['recordings'] as $recording) { // перебираем все записи
|
||
if ($recording['roomName'] == $roomName) { // если ключ соответствует нужному значению
|
||
$key = $recording['key']; // выводим значение ключа
|
||
break; // прерываем цикл, так как значение найдено
|
||
}
|
||
}
|
||
}
|
||
file_put_contents('logs/Kontur.log', $logstring, FILE_APPEND);
|
||
|
||
curl_close($curl);
|
||
|
||
return $key;
|
||
}
|
||
|
||
function GetTranscription($key) {
|
||
$result = array();
|
||
$curl = curl_init();
|
||
|
||
curl_setopt_array($curl, array(
|
||
CURLOPT_URL => 'https://clientright.ktalk.ru/api/recordings/'.$key.'/transcript',
|
||
CURLOPT_RETURNTRANSFER => true,
|
||
CURLOPT_ENCODING => '',
|
||
CURLOPT_MAXREDIRS => 10,
|
||
CURLOPT_TIMEOUT => 0,
|
||
CURLOPT_FOLLOWLOCATION => true,
|
||
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
|
||
CURLOPT_CUSTOMREQUEST => 'GET',
|
||
CURLOPT_HTTPHEADER => array(
|
||
'x-auth-token: pV5b1OcpXk7WOqVYFLDQJkfqWsdv2HDE'
|
||
),
|
||
));
|
||
|
||
$output = curl_exec($curl);
|
||
$data = json_decode($output, true);
|
||
|
||
if (curl_errno($curl)) {
|
||
$logstring = date('Y-m-d H:i:s').' Что-то пошло не так при получении транскрибации встреч: '.curl_error($curl).PHP_EOL;
|
||
} else {
|
||
$logstring = date('Y-m-d H:i:s', 'Ответ от Контура при получении транскрибации встречи: '.$output.PHP_EOL);
|
||
foreach ($data['tracks'] as $track) { // перебираем всех участников встречи
|
||
if ($track['speaker']['isAnonymous']) {
|
||
// Незарегистрированный пользователь
|
||
$name = $track['speaker']['anonymousName'];
|
||
} else {
|
||
// Зарегистрированный пользователь
|
||
$name = $track['speaker']['userInfo']['firstname'].' '.$track['speaker']['userInfo']['surname'];
|
||
}
|
||
foreach ($track['chunks'] as $chunk) { // перебираем всереплики участника
|
||
$text = $chunk['text'];
|
||
$time = $chunk['startTimeOffsetInMillis'];
|
||
$str = date('H:i:s', $time / 1000); // Получили время, причем почему-то на 3 часа больше
|
||
$str = strtotime($str) - 10800; // Перевели обратно в число и вычли 3 часа
|
||
$str = date('H:i:s', $str); // И конвертнули обратно в строку
|
||
$result[$time] = array('name' => $name, 'text' => $text, 'start' => $str);
|
||
}
|
||
}
|
||
ksort($result);
|
||
}
|
||
file_put_contents('logs/Kontur.log', $logstring, FILE_APPEND);
|
||
curl_close($curl);
|
||
|
||
return $result;
|
||
}
|
||
|
||
function NewMeeting($crmid) {
|
||
require_once 'include/Webservices/Utils.php';
|
||
require_once 'include/utils/Telegram.php';
|
||
require_once 'include/utils/WhatsApp.php';
|
||
include_once 'modules/Users/Users.php';
|
||
require_once 'include/Webservices/Create.php';
|
||
require_once 'includes/Loader.php';
|
||
vimport ('includes.runtime.Globals');
|
||
vimport ('includes.runtime.BaseModel');
|
||
vimport ('includes.runtime.LanguageHandler');
|
||
|
||
global $adb;
|
||
$user = Users::getActiveAdminUser(); // Получаем пользователя, под которым будем создавать записи
|
||
$ws_id = '33x'.$crmid;
|
||
$link = '';
|
||
|
||
$query = 'select p.projectname, cf.cf_1843 as startdate, cf.cf_1845 as starttime, p.linktoaccountscontacts as contactid, c.mobile, c.phone, c.firstname, e.smownerid as userid
|
||
from vtiger_project p
|
||
left join vtiger_projectcf cf on cf.projectid = p.projectid
|
||
left join vtiger_contactdetails c on c.contactid = p.linktoaccountscontacts
|
||
left join vtiger_crmentity e on e.crmid = p.projectid
|
||
where p.projectid = '.$crmid;
|
||
$result = $adb->pquery($query);
|
||
|
||
if ($adb->num_rows($result) == 0) {
|
||
$logstring = date('Y-m-d H:i:s').' - очень странно, но проекта с там ID нет...'.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
} else {
|
||
$name = $adb->query_result($result, 0, "projectname");
|
||
$startdate = $adb->query_result($result, 0, "startdate");
|
||
$starttime = $adb->query_result($result, 0, "starttime");
|
||
$contactid = $adb->query_result($result, 0, "contactid");
|
||
$tgid = $adb->query_result($result, 0, "phone");
|
||
$mobile = $adb->query_result($result, 0, "mobile");
|
||
$firstname = $adb->query_result($result, 0, "firstname");
|
||
$projectowner = $adb->query_result($result, 0, "userid");
|
||
|
||
if (empty($startdate) or empty($starttime)) {
|
||
$logstring = date('Y-m-d H:i:s').' - Найден проект: '.$name.'; но в нем не указана дата/время начала митинга'.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
} else {
|
||
$enddate = $startdate;
|
||
$endtime= date('H:i:s', strtotime($starttime) + 3600);
|
||
|
||
//$logstring = date('Y-m-d H:i:s').' - Найден проект: '.$name.'; время начала митинга: '.$startdate.' '.$starttime.'; время окончания: '.$enddate.' '.$endtime.PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$result = CreateMeeting($crmid, $startdate, $starttime, $enddate, $endtime, $name, 'Рабочая встреча');
|
||
if ($result == 'YES') {
|
||
//$logstring = date('Y-m-d H:i:s').' - Встреча успешно создана'.PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
$link = 'https://clientright.ktalk.ru/'.$crmid;
|
||
$query = 'update vtiger_projectcf set cf_1847 = "'.$link.'" where projectid = '.$crmid;
|
||
$result = $adb->pquery($query);
|
||
|
||
$message = $firstname.', добрый день. Мы запланировали видеовстречу '.date('d.m.Y', strtotime($startdate)).' в '.$starttime.', ссылку на подключение пришлем за 15 минут до начала';
|
||
|
||
if (!empty($tgid)) {
|
||
try {
|
||
$params = array (
|
||
'commentcontent' => $message,
|
||
'related_to' => $ws_id,
|
||
'channel' => 'Telegram',
|
||
'assigned_user_id' => $user
|
||
);
|
||
|
||
//$logstring = date('Y-m-d H:i:s').' - массив для телеги: '.json_encode($params).PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$comment = vtws_create('ModComments', $params, $user);
|
||
|
||
//$logstring = date('Y-m-d H:i:s').' - создание коммента: '.json_encode($comment).PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$commentid = substr($comment['id'], 3);
|
||
} catch (WebServiceException $ex) {
|
||
$output = $ex->getMessage();
|
||
$logstring = date('Y-m-d H:i:s').' - Коммент не создался. Ошибка: '.$output.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
}
|
||
|
||
if ($commentid > 0) {
|
||
$result = TelegramSendComment($commentid, $message);
|
||
//$logstring = date('Y-m-d H:i:s').' - Отправка уведомления в телегу: '.$result.PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
}
|
||
}
|
||
|
||
if (!empty($mobile)) {
|
||
try {
|
||
$params = array (
|
||
'commentcontent' => $message,
|
||
'related_to' => $ws_id,
|
||
'channel' => 'WhatsApp',
|
||
'assigned_user_id' => $user
|
||
);
|
||
|
||
//$logstring = date('Y-m-d H:i:s').' - массив для WhatsApp: '.json_encode($params).PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$comment = vtws_create('ModComments', $params, $user);
|
||
$commentid = substr($comment['id'], 3);
|
||
} catch (WebServiceException $ex) {
|
||
$output = $ex->getMessage();
|
||
$logstring = date('Y-m-d H:i:s').' - Коммент не создался. Ошибка: '.$output.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
}
|
||
|
||
if ($commentid > 0) {
|
||
$result = WhatsAppSendComment($commentid, $message);
|
||
//$logstring = date('Y-m-d H:i:s').' - Отправка уведомления в WhatsApp: '.$result.PHP_EOL;
|
||
//file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
}
|
||
}
|
||
|
||
// Создатим событие в Календаре
|
||
|
||
try {
|
||
$params = array (
|
||
'subject' => 'Видеовстреча по проекту '.$name,
|
||
'activitytype' => 'Видеовстреча',
|
||
'date_start' => $startdate,
|
||
'due_date' => $startdate,
|
||
'time_start' => $starttime,
|
||
'time_end' => $endtime,
|
||
'sendnotification' => 0,
|
||
'duration_hours' => 1,
|
||
'duration_minutes' => 0,
|
||
'notime' => 0,
|
||
'recurringtype' => '--None--',
|
||
'taskstatus' => 'Planned',
|
||
'assigned_user_id' => '19x'.$projectowner
|
||
);
|
||
|
||
$logstring = date('Y-m-d H:i:s').' - массив для Календаря: '.json_encode($params).PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$activity = vtws_create('Calendar', $params, $user);
|
||
|
||
$logstring = date('Y-m-d H:i:s').' - создание Календаря: '.json_encode($comment).PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
|
||
$activityid = substr($activity['id'], 2);
|
||
} catch (WebServiceException $ex) {
|
||
$output = $ex->getMessage();
|
||
$logstring = date('Y-m-d H:i:s').' - Событие не создалось. Ошибка: '.$output.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
$activityid = 0;
|
||
}
|
||
|
||
if ($activityid > 0) {
|
||
$query = 'insert into vtiger_cntactivityrel (contactid, activityid) values(?, ?)';
|
||
$result = $adb->pquery($query, array($contactid, $activityid));
|
||
}
|
||
|
||
|
||
} else {
|
||
$logstring = date('Y-m-d H:i:s').' - Что-то пошло не так. Ответ от Контура при создании встречи: '.$result.PHP_EOL;
|
||
file_put_contents('logs/CreateKonturMeeting.log', $logstring, FILE_APPEND);
|
||
}
|
||
}
|
||
}
|
||
|
||
return $link;
|
||
}
|
||
|
||
|
||
?>
|