Files
crm.clientright.ru/include/utils/Kontur.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

324 lines
13 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
/*********************************************************************************
* Набор методов для работы с Контур.Толк через родное 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;
}
?>