2025-09-26 10:43:05 +03:00
< ? php
/*********************************************************************************
* Н а б о р методов для работы с ej . sudrf . ru через сервис debex . ru
* All Rights Reserved .
* Contributor ( s ) : Илья Руденко itsaturn @ yandex . ru
********************************************************************************/
require_once 'include/utils/utils.php' ;
require_once 'include/Webservices/Revise.php' ;
require_once 'modules/Users/Users.php' ;
require_once 'includes/Loader.php' ;
require_once 'vendor/autoload.php' ;
use GuzzleHttp\Client ;
use GuzzleHttp\Psr7\MultipartStream ;
use GuzzleHttp\Exception\RequestException ;
vimport ( 'includes.runtime.Globals' );
vimport ( 'includes.runtime.BaseModel' );
vimport ( 'includes.runtime.LanguageHandler' );
function Send2Court ( $projectid , $processType , $version ) {
if ( $processType == '201.01' ) {
file_put_contents ( 'logs/send2court.log' , PHP_EOL . date ( 'Y-m-d H:i:s' ) . ' - Запущена процедура отправки искового по Проекту ' . $projectid . ' в режиме ' . $version . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , PHP_EOL . date ( 'Y-m-d H:i:s' ) . ' - Запущена процедура отправки заявления на выдачу исполнительного листа по Проекту ' . $projectid . ' в режиме ' . $version . PHP_EOL , FILE_APPEND );
}
global $adb ;
$query = ' select u . index_notice , u . addr_notice , u . id as userid , a . accountid , a . accountname , a . inn , a . kpp , la . bill_code , la . bill_city , la . bill_street , ra . ship_code , ra . ship_city , ra . ship_street , a . phone , a . email1 , pcf . cf_1511 as price , ca . mailingstreet , acf . cf_1951 as ogrn , u . email1 as usermail , pcf . cf_2274 as acc1 , pcf . cf_2276 as acc2 , pcf . cf_2292 as jurisdiction , pcf . cf_2294 as agrplace , oa . bill_street as offaddress , p . linktoaccountscontacts as contactid , pcf . cf_1507 as casenumber
from vtiger_project p
left join vtiger_projectcf pcf on pcf . projectid = p . projectid
left join vtiger_contactdetails cd on cd . contactid = p . linktoaccountscontacts
left join vtiger_contactaddress ca on ca . contactaddressid = p . linktoaccountscontacts
left join vtiger_account a on a . accountid = pcf . cf_1994
left join vtiger_accountscf acf on acf . accountid = pcf . cf_1994
left join vtiger_accountbillads la on la . accountaddressid = pcf . cf_1994
left join vtiger_accountshipads ra on ra . accountaddressid = pcf . cf_1994
left join vtiger_accountbillads oa on oa . accountaddressid = pcf . cf_2274
left join vtiger_crmentity e on e . crmid = p . projectid
left join vtiger_users u on u . id = e . smownerid
where e . deleted = 0 and p . projectid = ' . $projectid ;
$result = $adb -> pquery ( $query );
if ( $adb -> num_rows ( $result ) == 0 ) {
$output = 'Проект не найден' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Проект с id ' . $projectid . ' не найден' . PHP_EOL , FILE_APPEND );
} else {
$accountid = $adb -> query_result ( $result , 0 , 'accountid' );
$acc1 = $adb -> query_result ( $result , 0 , 'acc1' );
$acc2 = $adb -> query_result ( $result , 0 , 'acc2' );
$userid = $adb -> query_result ( $result , 0 , 'userid' );
$authdoc = getAuthDoc ( $accountid , $userid ); // Поднимаем доверку на представителя Заявителя (он же ответственный по Проекту)
if ( $authdoc [ 'result' ] == 'NO' ) {
$output = 'У Ответственного по Проекту ' . $projectid . ' в Контрагенте ' . $accountid . ' нет доверенности от Заявителя' ;
AddComment ( $projectid , $output , 'comment' );
} else {
$price = $adb -> query_result ( $result , 0 , 'price' );
$contactid = $adb -> query_result ( $result , 0 , 'contactid' );
$jurisdiction = $adb -> query_result ( $result , 0 , 'jurisdiction' ); // Подсудность
if ( $jurisdiction == 'По месту исполнения договора' ) {
$address = $adb -> query_result ( $result , 0 , 'agrplace' );
} else {
if ( $jurisdiction == 'По месту нахождения ответчика' ) {
$address = $adb -> query_result ( $result , 0 , 'offaddress' );
} else {
$address = $adb -> query_result ( $result , 0 , 'mailingstreet' );
}
}
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Будем подаваться ' . $jurisdiction . '. Эту здесь: ' . $address . PHP_EOL , FILE_APPEND );
$court = getCourt ( $contactid , $address , $price ); // Ищем суд по адресу и сумме цены иска
if ( $court [ 'result' ] <> 'YES' ) {
$output = array ( 'status' => 'ERROR' , 'message' => $court [ 'result' ]);
AddComment ( $projectid , $court [ 'result' ], 'comment' );
} else {
$claim = getClaim ( $projectid , $processType );
if ( $claim [ 'result' ] == 'NO' ) {
if ( $processType == '201.01' ) {
$output = 'В Проекте ' . $projectid . 'отсутствует Исковое заявление' ;
} else {
$output = 'В Проекте ' . $projectid . 'отсутствует заявление на выдачу исполнительного листа' ;
}
AddComment ( $projectid , $output , 'comment' );
} else {
$multipart = []; // Этот массив будем отдавать в вызове
// Доверенность
2025-10-16 11:17:21 +03:00
$authFilename = $authdoc [ 'filename' ];
if ( empty ( $authFilename ) || filter_var ( $authFilename , FILTER_VALIDATE_URL )) {
$authFilename = $authdoc [ 'description' ] . '.pdf' ;
}
2025-09-26 10:43:05 +03:00
$multipart [] = [
'name' => 'files' ,
'contents' => fopen ( $authdoc [ 'filepath' ], 'r' ),
'path' => $authdoc [ 'filepath' ],
2025-10-16 11:17:21 +03:00
'filename' => $authFilename
2025-09-26 10:43:05 +03:00
];
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - добавили в массив файл "' . $authFilename . '"' . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
// Исковое
2025-10-16 11:17:21 +03:00
$claimFilename = $claim [ 'filename' ];
if ( empty ( $claimFilename ) || filter_var ( $claimFilename , FILTER_VALIDATE_URL )) {
$claimFilename = $claim [ 'description' ] . '.pdf' ;
}
2025-09-26 10:43:05 +03:00
$multipart [] = [
'name' => 'files' ,
'contents' => fopen ( $claim [ 'filepath' ], 'r' ),
'path' => $claim [ 'filepath' ],
2025-10-16 11:17:21 +03:00
'filename' => $claimFilename
2025-09-26 10:43:05 +03:00
];
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - добавили в массив файл "' . $claimFilename . '"' . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
$data = []; // А тут мы соберем огромный массив, который потом превратится в json для fillData
$data [ 'appealType' ] = 2 ; // Подает Представитель
2025-10-24 19:59:28 +03:00
// Декодируем HTML entities для всех текстовых полей
2025-09-26 10:43:05 +03:00
$data [ 'mySelfAdditionalData' ][ 'courtNoticesAddressIndex' ] = $adb -> query_result ( $result , 0 , 'index_notice' );
2025-10-24 19:59:28 +03:00
$data [ 'mySelfAdditionalData' ][ 'courtNoticesAddress' ] = html_entity_decode ( $adb -> query_result ( $result , 0 , 'addr_notice' ), ENT_QUOTES | ENT_HTML5 , 'UTF-8' );
2025-09-26 10:43:05 +03:00
$data [ 'mySelfAdditionalData' ][ 'email' ] = $adb -> query_result ( $result , 0 , 'usermail' );
$data [ 'mySelfAdditionalData' ][ 'authorizationDocument' ][ 'fileIndex' ] = 0 ;
$data [ 'mySelfAdditionalData' ][ 'authorizationDocument' ][ 'description' ] = $authdoc [ 'description' ];
$data [ 'mySelfAdditionalData' ][ 'authorizationDocument' ][ 'pagesCount' ] = $authdoc [ 'pages' ];
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'dataType' ] = 'entity' ;
2025-10-24 19:59:28 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'name' ] = html_entity_decode ( htmlspecialchars_decode ( $adb -> query_result ( $result , 0 , 'accountname' )), ENT_QUOTES | ENT_HTML5 , 'UTF-8' );
2025-09-26 10:43:05 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'international' ] = false ;
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'inn' ] = $adb -> query_result ( $result , 0 , 'inn' );
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'kpp' ] = $adb -> query_result ( $result , 0 , 'kpp' );
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'ogrnip' ] = $adb -> query_result ( $result , 0 , 'ogrn' );
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'proceduralStatus' ] = '50710010' ;
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'legalIndex' ] = $adb -> query_result ( $result , 0 , 'bill_code' );
2025-10-24 19:59:28 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'legalAddress' ] = html_entity_decode ( $adb -> query_result ( $result , 0 , 'bill_city' ) . ', ' . $adb -> query_result ( $result , 0 , 'bill_street' ), ENT_QUOTES | ENT_HTML5 , 'UTF-8' );
2025-09-26 10:43:05 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'isLegalAdressEqualToActualResidenceAddress' ] = false ;
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'actualResidenceIndex' ] = $adb -> query_result ( $result , 0 , 'ship_code' );
2025-10-24 19:59:28 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'actualResidenceAddress' ] = html_entity_decode ( $adb -> query_result ( $result , 0 , 'ship_city' ) . ', ' . $adb -> query_result ( $result , 0 , 'ship_street' ), ENT_QUOTES | ENT_HTML5 , 'UTF-8' );
2025-09-26 10:43:05 +03:00
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'email' ] = $adb -> query_result ( $result , 0 , 'email1' );
$data [ 'additionalForRepresentativeApplicants' ][ 0 ][ 'entity' ][ 'phoneNumber' ] = $adb -> query_result ( $result , 0 , 'phone' );
$data [ 'court' ][ 'region' ] = $court [ 'region' ];
$data [ 'court' ][ 'judicialAuthority' ] = $court [ 'code' ];
$data [ 'appealDocument' ][ 'fileIndex' ] = 1 ;
$data [ 'appealDocument' ][ 'description' ] = $claim [ 'description' ];
$data [ 'appealDocument' ][ 'pagesCount' ] = $claim [ 'pages' ];
if ( $processType == '201.01' ) {
// Если отправляем исковое, то подтягиваем все прочие Документы из Проекта
$otherDocs = getOtherDocs ( $projectid , $accountid , $acc1 , $acc2 );
2025-10-16 11:17:21 +03:00
if ( count ( $otherDocs ) > 0 ) {
$fileIndexInMultipart = 2 ; // Начинаем с 2 (0 - доверенность, 1 - исковое)
for ( $i = 0 ; $i < count ( $otherDocs ); $i ++ ) {
$newdoc = array ();
$newdoc [ 'fileIndex' ] = $fileIndexInMultipart ;
$newdoc [ 'description' ] = $otherDocs [ $i ][ 'description' ];
$newdoc [ 'pagesCount' ] = $otherDocs [ $i ][ 'pages' ];
// Проверяем является ли файл S3 файлом
if ( $otherDocs [ $i ][ 'filelocationtype' ] == 'E' && ! empty ( $otherDocs [ $i ][ 's3_bucket' ]) && ! empty ( $otherDocs [ $i ][ 's3_key' ])) {
// Файл в S3 - скачиваем во временную папку
$s3Url = $otherDocs [ $i ][ 'filepath' ];
$tempFilename = 'other_doc_' . $i . '_' . time () . '.pdf' ;
$tempPath = getTempFileFromS3 ( $s3Url , $tempFilename );
if ( $tempPath !== false ) {
$otherDocs [ $i ][ 'filepath' ] = $tempPath ;
$otherDocs [ $i ][ 'is_temp_file' ] = true ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - S3 файл скачан во временную папку: ' . $tempPath . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - ошибка скачивания S3 файла: ' . $s3Url . PHP_EOL , FILE_APPEND );
continue ; // Пропускаем этот файл
}
}
// Добавляем в JSON только если файл будет в multipart
$data [ 'additionalAppealDocuments' ][] = $newdoc ;
$fileIndexInMultipart ++ ;
// Проверяем и исправляем filename если нужно
$filename = $otherDocs [ $i ][ 'filename' ];
if ( empty ( $filename ) || filter_var ( $filename , FILTER_VALIDATE_URL )) {
// Если filename пустой или это URL, используем title + .pdf
$filename = $otherDocs [ $i ][ 'description' ] . '.pdf' ;
}
$multipart [] = [
'name' => 'files' ,
'contents' => fopen ( $otherDocs [ $i ][ 'filepath' ], 'r' ),
'filename' => $filename
];
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - добавили в массив файл "' . $filename . '" (путь: ' . $otherDocs [ $i ][ 'filepath' ] . ')' . PHP_EOL , FILE_APPEND );
}
2025-09-26 10:43:05 +03:00
}
} else {
if ( $processType == '217.01' ) {
$data [ 'caseNumber' ] = $adb -> query_result ( $result , 0 , 'casenumber' );;
}
}
$data [ 'tax' ][ 'type' ] = '1' ;
$data [ 'processType' ] = $processType ;
$multipart [] = [
'name' => 'certificate' ,
'contents' => fopen ( 'storage/cert.pfx' , 'r' ),
'filename' => 'cert.pfx'
];
$multipart [] = [
'name' => 'fillData' ,
'contents' => json_encode ( $data )
];
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - fillData JSON: ' . json_encode ( $data ) . PHP_EOL , FILE_APPEND );
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - additionalAppealDocuments count: ' . count ( $data [ 'additionalAppealDocuments' ]) . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
$cookies = GetCookies ( $version );
if ( $cookies != 'Н е удалось получить куки' ) {
// Формируем заголовок запроса
// yft,fkjdj1 - это старый пин-код
$headers = [
'x-api-key' => GetKey ( $version ),
'hidden-authorization-cookies' => htmlspecialchars_decode ( $cookies ),
'hidden-certificate-pin' => '3365' ,
'custom' => 'Zx123456'
];
$url = GetUrl ( $version );
//$url = 'https://webhook.nodul.ru/765/dev/eea1b30c-14db-4499-9fc2-4d13e394bae6';
//$url = 'https://eoj0ndhyykckfh.m.pipedream.net';
//$url = 'https://webhook.nodul.ru/13/dev/test-some-error';
// Отправляем запрос с повторами
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - отправляем multipart с ' . count ( $multipart ) . ' файлами' . PHP_EOL , FILE_APPEND );
foreach ( $multipart as $idx => $part ) {
$filename = isset ( $part [ 'filename' ]) ? $part [ 'filename' ] : 'Н Е Т ' ;
$hasContents = isset ( $part [ 'contents' ]) ? 'ДА' : 'Н Е Т ' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - файл ' . $idx . ': name=' . $part [ 'name' ] . ', filename=' . $filename . ', contents=' . $hasContents . PHP_EOL , FILE_APPEND );
}
2025-09-26 10:43:05 +03:00
$output = SendRequest ( $url , $multipart , $headers , 1 );
//file_put_contents('logs/send2court.log', date('Y-m-d H:i:s').' - вернулись в основной скрипт после отправки запроса'.PHP_EOL, FILE_APPEND);
if ( $version == 'Prod' and $output [ 'status' ] == 'OK' ) {
// Сохраним в Проекте входящий номер, если он есть
$number = $output [ 'message' ];
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - еще раз взяли номер в основном скрипте: ' . $number . PHP_EOL , FILE_APPEND );
if ( ! empty ( $number ) and ! is_null ( $number )) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - убедились, что он не пустой' . PHP_EOL , FILE_APPEND );
if ( $processType == '201.01' ) {
$url = 'https://crm.clientright.ru/shorturl.php?id=65eeaa0f425672.54413377&workflow_id=31&record_id=' . $projectid . '®=' . $number ;
} else {
$url = 'https://crm.clientright.ru/shorturl.php?id=66508afc2008a4.30213815&workflow_id=80&record_id=' . $projectid . '®=' . $number ;
}
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_POST , 0 );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HEADER , 0 );
$out = curl_exec ( $ch );
curl_close ( $ch );
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - получили ответ от WD: ' . $out . PHP_EOL , FILE_APPEND );
//$query = 'update vtiger_projectcf set cf_2204 = "'.$number.'" where projectid = '.$projectid;
//$result = $adb->pquery($query);
//file_put_contents('logs/send2court.log', date('Y-m-d H:i:s').' - сохранили в Проект р е г .номер входящего: '.$number.PHP_EOL, FILE_APPEND);
}
}
//$output = json_encode($multipart);
}
}
}
}
}
2025-10-16 11:17:21 +03:00
// Очищаем временные файлы после отправки
if ( isset ( $authdoc ) && isset ( $claim ) && isset ( $otherDocs )) {
$tempFiles = [];
if ( isset ( $authdoc [ 'is_temp_file' ]) && $authdoc [ 'is_temp_file' ]) {
$tempFiles [] = $authdoc ;
}
if ( isset ( $claim [ 'is_temp_file' ]) && $claim [ 'is_temp_file' ]) {
$tempFiles [] = $claim ;
}
foreach ( $otherDocs as $doc ) {
if ( isset ( $doc [ 'is_temp_file' ]) && $doc [ 'is_temp_file' ]) {
$tempFiles [] = $doc ;
}
}
cleanupTempFiles ( $tempFiles );
}
2025-09-26 10:43:05 +03:00
if ( is_array ( $output )) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - отдаем ответ в первичный вызывающий скрипт : ' . json_encode ( $output ) . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - отдаем ответ в первичный вызывающий скрипт : ' . $output . PHP_EOL , FILE_APPEND );
}
return $output ;
}
2025-10-16 11:17:21 +03:00
/**
* Очищает временные файлы после отправки
*/
function cleanupTempFiles ( $files ) {
foreach ( $files as $file ) {
if ( isset ( $file [ 'is_temp_file' ]) && $file [ 'is_temp_file' ] === true && file_exists ( $file [ 'filepath' ])) {
unlink ( $file [ 'filepath' ]);
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - удален временный файл: ' . $file [ 'filepath' ] . PHP_EOL , FILE_APPEND );
}
}
}
/**
* Получает временный файл из S3 для использования в multipart запросе
*/
function getTempFileFromS3 ( $s3Url , $tempFilename ) {
try {
// Оригинальный URL для логирования
$originalUrl = $s3Url ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - скачиваем файл из S3 (исходный URL): ' . $originalUrl . PHP_EOL , FILE_APPEND );
2025-10-24 19:59:28 +03:00
// 🔧 УЛУЧШЕННАЯ ОБРАБОТКА URL
// ВАЖНО: Сначала экранируем # чтобы parse_url не воспринял е г о как fragment
$s3Url = str_replace ( '#' , '___HASH___' , $s3Url );
2025-10-16 11:17:21 +03:00
2025-10-24 19:59:28 +03:00
// Разбираем URL на части
$urlParts = parse_url ( $s3Url );
if ( $urlParts === false || ! isset ( $urlParts [ 'scheme' ]) || ! isset ( $urlParts [ 'host' ])) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - некорректный URL S3' . PHP_EOL , FILE_APPEND );
return false ;
}
// Правильно кодируем путь к файлу
// Разбиваем путь на сегменты и кодируем каждый отдельно
$path = isset ( $urlParts [ 'path' ]) ? $urlParts [ 'path' ] : '' ;
$pathSegments = explode ( '/' , $path );
$encodedSegments = array_map ( function ( $segment ) {
// Возвращаем # обратно перед кодированием
$segment = str_replace ( '___HASH___' , '#' , $segment );
// rawurlencode кодирует все спецсимволы, включая #, пробелы, кириллицу и т.д.
return rawurlencode ( $segment );
}, $pathSegments );
$encodedPath = implode ( '/' , $encodedSegments );
// Собираем URL обратно
$s3Url = $urlParts [ 'scheme' ] . '://' . $urlParts [ 'host' ] . $encodedPath ;
2025-10-16 11:17:21 +03:00
// Если URL был изменен, логируем исправленную версию
if ( $s3Url !== $originalUrl ) {
2025-10-24 19:59:28 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - URL правильно закодирован: ' . $s3Url . PHP_EOL , FILE_APPEND );
2025-10-16 11:17:21 +03:00
}
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $s3Url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_TIMEOUT , 30 );
curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , true );
2025-10-24 19:59:28 +03:00
curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , true );
curl_setopt ( $ch , CURLOPT_SSL_VERIFYHOST , 2 );
2025-10-16 11:17:21 +03:00
$fileContent = curl_exec ( $ch );
$httpCode = curl_getinfo ( $ch , CURLINFO_HTTP_CODE );
2025-10-24 19:59:28 +03:00
$curlError = curl_error ( $ch );
2025-10-16 11:17:21 +03:00
curl_close ( $ch );
2025-10-24 19:59:28 +03:00
if ( $httpCode === 200 && $fileContent !== false && ! empty ( $fileContent )) {
2025-10-16 11:17:21 +03:00
$tempPath = sys_get_temp_dir () . '/' . $tempFilename ;
file_put_contents ( $tempPath , $fileContent );
2025-10-24 19:59:28 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - файл сохранен во временную папку: ' . $tempPath . ' (размер: ' . strlen ( $fileContent ) . ' байт)' . PHP_EOL , FILE_APPEND );
2025-10-16 11:17:21 +03:00
return $tempPath ;
} else {
2025-10-24 19:59:28 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - ошибка скачивания файла из S3, HTTP код: ' . $httpCode . ', CURL error: ' . $curlError . PHP_EOL , FILE_APPEND );
2025-10-16 11:17:21 +03:00
return false ;
}
} catch ( Exception $e ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - исключение при скачивании из S3: ' . $e -> getMessage () . PHP_EOL , FILE_APPEND );
return false ;
}
}
2025-09-26 10:43:05 +03:00
function getAuthDoc ( $accountid , $userid ) {
global $adb ;
$output = [];
2025-10-16 11:17:21 +03:00
// Сначала пытаемся найти локальный файл (оригинальная логика)
2025-09-26 10:43:05 +03:00
$query = ' select
n . title , ncf . cf_1953 as pages ,
case when a . storedname is not null
then concat ( a . `path` , a . attachmentsid , " _ " , a . storedname )
else concat ( a . `path` , a . attachmentsid , " _ " , a . name )
end as filepath ,
case when a . storedname is not null
then concat ( a . attachmentsid , " _ " , a . storedname )
else concat ( a . attachmentsid , " _ " , a . name )
end as filename ,
2025-10-16 11:17:21 +03:00
a . `type` , n . filename as s3_filename , n . s3_bucket , n . s3_key , n . filelocationtype
2025-09-26 10:43:05 +03:00
from vtiger_senotesrel r
left join vtiger_notes n on n . notesid = r . notesid
left join vtiger_crmentity e on e . crmid = r . notesid
left join vtiger_notescf ncf on ncf . notesid = r . notesid
left join vtiger_seattachmentsrel r2 on r2 . crmid = r . notesid
left join vtiger_attachments a on a . attachmentsid = r2 . attachmentsid
where e . smownerid = ? and r . crmid = ? and e . deleted = 0 and n . filename like " %по дтве р жда ющий_по лно мо чия% " ' ;
$result = $adb -> pquery ( $query , array ( $userid , $accountid ));
if ( $adb -> num_rows ( $result ) == 0 ) {
$output [ 'result' ] = 'NO' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - доверенность с подстрокой "по дтве р жда ющий_по лно мо чия" в Контрагенте ' . $accountid . ' не найдена' . PHP_EOL , FILE_APPEND );
} else {
$output [ 'result' ] = 'YES' ;
$output [ 'description' ] = $adb -> query_result ( $result , 0 , 'title' );
if ( ! is_numeric ( substr ( $output [ 'description' ], 0 , 1 ))) {
2025-10-16 11:17:21 +03:00
$output [ 'description' ] = '0_' . $output [ 'description' ];
2025-09-26 10:43:05 +03:00
}
$output [ 'description' ] = str_replace ( ' ' , '_' , $output [ 'description' ]);
2025-10-16 11:17:21 +03:00
// Проверяем тип размещения файла
$filelocationtype = $adb -> query_result ( $result , 0 , 'filelocationtype' );
$s3_filename = $adb -> query_result ( $result , 0 , 's3_filename' );
$s3_bucket = $adb -> query_result ( $result , 0 , 's3_bucket' );
$s3_key = $adb -> query_result ( $result , 0 , 's3_key' );
if ( $filelocationtype == 'E' && ! empty ( $s3_bucket ) && ! empty ( $s3_key )) {
// Файл в S3 - скачиваем во временную папку
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - доверенность найдена в S3, bucket: ' . $s3_bucket . ', key: ' . $s3_key . PHP_EOL , FILE_APPEND );
$s3Url = $s3_filename ; // filename содержит полный S3 URL
$tempFilename = 'auth_doc_' . time () . '.pdf' ;
$tempPath = getTempFileFromS3 ( $s3Url , $tempFilename );
if ( $tempPath ) {
$output [ 'filepath' ] = $tempPath ;
$output [ 'is_temp_file' ] = true ; // Флаг для последующей очистки
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - S3 файл доверенности успешно скачан во временную папку' . PHP_EOL , FILE_APPEND );
} else {
$output [ 'result' ] = 'NO' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - не удалось скачать доверенность из S3' . PHP_EOL , FILE_APPEND );
return $output ;
}
} else {
// Локальный файл (оригинальная логика)
$output [ 'filepath' ] = $adb -> query_result ( $result , 0 , 'filepath' );
$output [ 'is_temp_file' ] = false ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - доверенность найдена как локальный файл' . PHP_EOL , FILE_APPEND );
}
2025-09-26 10:43:05 +03:00
$output [ 'filename' ] = $adb -> query_result ( $result , 0 , 'title' ) . '.pdf' ;
if ( ! is_numeric ( substr ( $output [ 'filename' ], 0 , 1 ))) {
2025-10-16 11:17:21 +03:00
$output [ 'filename' ] = '0_' . $output [ 'filename' ];
2025-09-26 10:43:05 +03:00
}
$output [ 'filename' ] = str_replace ( ' ' , '_' , $output [ 'filename' ]);
$output [ 'type' ] = $adb -> query_result ( $result , 0 , 'type' );
$output [ 'pages' ] = $adb -> query_result ( $result , 0 , 'pages' );
if ( empty ( $output [ 'pages' ]) or $output [ 'pages' ] == 0 ) {
$output [ 'pages' ] = getPDFPageCount ( $output [ 'filepath' ]);
}
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Нашли доверенность в Контрагенте ' . $accountid . PHP_EOL , FILE_APPEND );
}
return $output ;
}
function getClaim ( $projectid , $processType ) {
global $adb ;
$output = [];
$query = ' select
n . title , ncf . cf_1953 as pages ,
case when a . storedname is not null
then concat ( a . `path` , a . attachmentsid , " _ " , a . storedname )
else concat ( a . `path` , a . attachmentsid , " _ " , a . name )
end as filepath ,
case when a . storedname is not null
then concat ( a . attachmentsid , " _ " , a . storedname )
else concat ( a . attachmentsid , " _ " , a . name )
end as filename ,
2025-10-16 11:17:21 +03:00
a . `type` , n . filename as s3_filename , n . s3_bucket , n . s3_key , n . filelocationtype
2025-09-26 10:43:05 +03:00
from vtiger_senotesrel r
left join vtiger_notes n on n . notesid = r . notesid
left join vtiger_crmentity e on e . crmid = r . notesid
left join vtiger_notescf ncf on ncf . notesid = r . notesid
left join vtiger_seattachmentsrel r2 on r2 . crmid = r . notesid
left join vtiger_attachments a on a . attachmentsid = r2 . attachmentsid
2025-10-16 11:17:21 +03:00
where r . crmid = ? and e . deleted = 0 and ' ;
2025-09-26 10:43:05 +03:00
if ( $processType == '201.01' ) {
2025-10-16 11:17:21 +03:00
// Ищем исковые заявления по нескольким критериям
$query .= '(n.filename like "%Ис ко во е _за явле ние %" OR n.title like "%Ис ко во е _за явле ние %" OR n.title like "%исковое%" OR n.filename like "%исковое%")' ;
2025-09-26 10:43:05 +03:00
} else {
2025-10-16 11:17:21 +03:00
$query .= 'n.filename like "%7777777%"' ; // Так у нас кодируется признак заявления на выдачу исполнительного листа
2025-09-26 10:43:05 +03:00
}
$result = $adb -> pquery ( $query , array ( $projectid ));
if ( $adb -> num_rows ( $result ) == 0 ) {
$output [ 'result' ] = 'NO' ;
2025-10-16 11:17:21 +03:00
if ( $processType == '201.01' ) {
2025-09-26 10:43:05 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Исковое заявление с подстрокой "Ис ко во е _за явле ние " в Проекте ' . $projectid . ' не найдено' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Заявление на выдачу исполнительного листа с подстрокой "7777777" в Проекте ' . $projectid . ' не найдено' . PHP_EOL , FILE_APPEND );
}
} else {
$output [ 'result' ] = 'YES' ;
$output [ 'description' ] = $adb -> query_result ( $result , 0 , 'title' );
if ( ! is_numeric ( substr ( $output [ 'description' ], 0 , 1 ))) {
$output [ 'description' ] = '0_' . $output [ 'description' ];
}
$output [ 'description' ] = str_replace ( ' ' , '_' , $output [ 'description' ]);
2025-10-16 11:17:21 +03:00
// Проверяем тип размещения файла
$filelocationtype = $adb -> query_result ( $result , 0 , 'filelocationtype' );
$s3_filename = $adb -> query_result ( $result , 0 , 's3_filename' );
$s3_bucket = $adb -> query_result ( $result , 0 , 's3_bucket' );
$s3_key = $adb -> query_result ( $result , 0 , 's3_key' );
if ( $filelocationtype == 'E' && ! empty ( $s3_bucket ) && ! empty ( $s3_key )) {
// Файл в S3 - скачиваем во временную папку
if ( $processType == '201.01' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - исковое заявление найдено в S3, bucket: ' . $s3_bucket . ', key: ' . $s3_key . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - заявление на выдачу исполнительного листа найдено в S3, bucket: ' . $s3_bucket . ', key: ' . $s3_key . PHP_EOL , FILE_APPEND );
}
$s3Url = $s3_filename ; // filename содержит полный S3 URL
$tempFilename = 'claim_doc_' . time () . '.pdf' ;
$tempPath = getTempFileFromS3 ( $s3Url , $tempFilename );
if ( $tempPath ) {
$output [ 'filepath' ] = $tempPath ;
$output [ 'is_temp_file' ] = true ; // Флаг для последующей очистки
if ( $processType == '201.01' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - S3 файл искового заявления успешно скачан во временную папку' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - S3 файл заявления на выдачу исполнительного листа успешно скачан во временную папку' . PHP_EOL , FILE_APPEND );
}
} else {
$output [ 'result' ] = 'NO' ;
if ( $processType == '201.01' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - не удалось скачать исковое заявление из S3' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - не удалось скачать заявление на выдачу исполнительного листа из S3' . PHP_EOL , FILE_APPEND );
}
return $output ;
}
} else {
// Локальный файл (оригинальная логика)
$output [ 'filepath' ] = $adb -> query_result ( $result , 0 , 'filepath' );
$output [ 'is_temp_file' ] = false ;
if ( $processType == '201.01' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - исковое заявление найдено как локальный файл' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - заявление на выдачу исполнительного листа найдено как локальный файл' . PHP_EOL , FILE_APPEND );
}
}
2025-09-26 10:43:05 +03:00
$output [ 'filename' ] = $adb -> query_result ( $result , 0 , 'title' ) . '.pdf' ;
if ( ! is_numeric ( substr ( $output [ 'filename' ], 0 , 1 ))) {
$output [ 'filename' ] = '0_' . $output [ 'filename' ];
}
$output [ 'filename' ] = str_replace ( ' ' , '_' , $output [ 'filename' ]);
$output [ 'type' ] = $adb -> query_result ( $result , 0 , 'type' );
$output [ 'pages' ] = $adb -> query_result ( $result , 0 , 'pages' );
if ( empty ( $output [ 'pages' ]) or $output [ 'pages' ] == 0 ) {
$output [ 'pages' ] = getPDFPageCount ( $output [ 'filepath' ]);
}
2025-10-16 11:17:21 +03:00
if ( $processType == '201.01' ) {
2025-09-26 10:43:05 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Нашли исковое заявление в Проекте ' . $projectid . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Нашли заявление на выдачу исполнительного листа в Проекте ' . $projectid . PHP_EOL , FILE_APPEND );
}
}
return $output ;
}
function getOtherDocs ( $projectid , $accountid , $acc1 , $acc2 ) {
global $adb ;
$output = [];
//$i = 0;
// Сначала вытащим доки из Проекта, но только те, которые лежат в папке "Суд"
$query = ' select
n . title , ncf . cf_1953 as pages ,
2025-10-16 11:17:21 +03:00
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then concat ( " https://s3.twcstorage.ru/ " , n . s3_bucket , " / " , n . s3_key )
else case when a . storedname is not null
2025-09-26 10:43:05 +03:00
then concat ( a . `path` , a . attachmentsid , " _ " , a . storedname )
else concat ( a . `path` , a . attachmentsid , " _ " , a . name )
2025-10-16 11:17:21 +03:00
end
2025-09-26 10:43:05 +03:00
end as filepath ,
2025-10-16 11:17:21 +03:00
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then concat ( n . title , " .pdf " )
else case when a . storedname is not null
2025-09-26 10:43:05 +03:00
then concat ( a . attachmentsid , " _ " , a . storedname )
else concat ( a . attachmentsid , " _ " , a . name )
2025-10-16 11:17:21 +03:00
end
2025-09-26 10:43:05 +03:00
end as filename ,
2025-10-16 11:17:21 +03:00
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then " application/pdf "
else a . `type`
end as filetype ,
n . filelocationtype , n . s3_bucket , n . s3_key
2025-09-26 10:43:05 +03:00
from vtiger_senotesrel r
left join vtiger_notes n on n . notesid = r . notesid
left join vtiger_crmentity e on e . crmid = r . notesid
left join vtiger_notescf ncf on ncf . notesid = r . notesid
left join vtiger_seattachmentsrel r2 on r2 . crmid = r . notesid
left join vtiger_attachments a on a . attachmentsid = r2 . attachmentsid
2025-10-16 11:17:21 +03:00
where r . crmid = ? and e . deleted = 0 and n . filename not like " %Ис ко во е _за явле ние % " and n . folderid = 3
and (
( n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null )
or ( a . `type` = " application/pdf " or a . `type` = " application/octet-stream " )
) ' ;
2025-09-26 10:43:05 +03:00
$result = $adb -> pquery ( $query , array ( $projectid ));
if ( $adb -> num_rows ( $result ) > 0 ) {
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - найдено документов в проекте ' . $projectid . ': ' . $adb -> num_rows ( $result ) . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
for ( $i = 0 ; $i < $adb -> num_rows ( $result ); $i ++ ) {
$output [ $i ][ 'description' ] = $adb -> query_result ( $result , $i , 'title' );
if ( ! is_numeric ( substr ( $output [ $i ][ 'description' ], 0 , 1 ))) {
$output [ $i ][ 'description' ] = $i . '_' . $output [ $i ][ 'description' ];
}
$output [ $i ][ 'description' ] = str_replace ( ' ' , '_' , $output [ $i ][ 'description' ]);
$output [ $i ][ 'filepath' ] = $adb -> query_result ( $result , $i , 'filepath' );
2025-10-16 11:17:21 +03:00
$output [ $i ][ 'filename' ] = $adb -> query_result ( $result , $i , 'filename' );
2025-09-26 10:43:05 +03:00
if ( ! is_numeric ( substr ( $output [ $i ][ 'filename' ], 0 , 1 ))) {
$output [ $i ][ 'filename' ] = $i . '_' . $output [ $i ][ 'filename' ];
}
$output [ $i ][ 'filename' ] = str_replace ( ' ' , '_' , $output [ $i ][ 'filename' ]);
2025-10-16 11:17:21 +03:00
$output [ $i ][ 'type' ] = $adb -> query_result ( $result , $i , 'filetype' );
2025-09-26 10:43:05 +03:00
$output [ $i ][ 'pages' ] = $adb -> query_result ( $result , $i , 'pages' );
2025-10-16 11:17:21 +03:00
$output [ $i ][ 'filelocationtype' ] = $adb -> query_result ( $result , $i , 'filelocationtype' );
$output [ $i ][ 's3_bucket' ] = $adb -> query_result ( $result , $i , 's3_bucket' );
$output [ $i ][ 's3_key' ] = $adb -> query_result ( $result , $i , 's3_key' );
2025-09-26 10:43:05 +03:00
if ( empty ( $output [ $i ][ 'pages' ]) or $output [ $i ][ 'pages' ] == 0 ) {
$output [ $i ][ 'pages' ] = getPDFPageCount ( $output [ $i ][ 'filepath' ]);
}
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - файл из проекта: ' . $output [ $i ][ 'filename' ] . ' (location: ' . $output [ $i ][ 'filelocationtype' ] . ')' . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
//echo $i.' - '.$output[$i]['filename'].'<br>';
}
}
// А теперь из Контрагентов (трех), но только те, которые лежат в папке "Суд"
2025-10-16 11:17:21 +03:00
$query = ' select
n . title , ncf . cf_1953 as pages ,
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then concat ( " https://s3.twcstorage.ru/ " , n . s3_bucket , " / " , n . s3_key )
else case when a . storedname is not null
then concat ( a . `path` , a . attachmentsid , " _ " , a . storedname )
else concat ( a . `path` , a . attachmentsid , " _ " , a . name )
end
end as filepath ,
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then concat ( n . title , " .pdf " )
else case when a . storedname is not null
then concat ( a . attachmentsid , " _ " , a . storedname )
else concat ( a . attachmentsid , " _ " , a . name )
end
end as filename ,
case when n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null
then " application/pdf "
else a . `type`
end as filetype ,
n . filelocationtype , n . s3_bucket , n . s3_key
2025-09-26 10:43:05 +03:00
from vtiger_senotesrel r
left join vtiger_notes n on n . notesid = r . notesid
left join vtiger_crmentity e on e . crmid = r . notesid
left join vtiger_notescf ncf on ncf . notesid = r . notesid
left join vtiger_seattachmentsrel r2 on r2 . crmid = r . notesid
left join vtiger_attachments a on a . attachmentsid = r2 . attachmentsid
2025-10-16 11:17:21 +03:00
where r . crmid in ( ? , ? , ? ) and e . deleted = 0 and n . folderid = 3
and (
( n . filelocationtype = " E " and n . s3_bucket is not null and n . s3_key is not null )
or ( a . `type` = " application/pdf " or a . `type` = " application/octet-stream " )
) ' ;
2025-09-26 10:43:05 +03:00
$result = $adb -> pquery ( $query , array ( $accountid , $acc1 , $acc2 ));
if ( $adb -> num_rows ( $result ) > 0 ) {
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - найдено документов в контрагентах (' . $accountid . ', ' . $acc1 . ', ' . $acc2 . '): ' . $adb -> num_rows ( $result ) . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
for ( $j = 0 ; $j < $adb -> num_rows ( $result ); $j ++ ) {
$output [ $i ][ 'description' ] = $adb -> query_result ( $result , $j , 'title' );
if ( ! is_numeric ( substr ( $output [ $i ][ 'description' ], 0 , 1 ))) {
$output [ $i ][ 'description' ] = $i . '_' . $output [ $i ][ 'description' ];
}
$output [ $i ][ 'description' ] = str_replace ( ' ' , '_' , $output [ $i ][ 'description' ]);
$output [ $i ][ 'filepath' ] = $adb -> query_result ( $result , $j , 'filepath' );
2025-10-16 11:17:21 +03:00
$output [ $i ][ 'filename' ] = $adb -> query_result ( $result , $j , 'filename' );
$output [ $i ][ 'type' ] = $adb -> query_result ( $result , $j , 'filetype' );
$output [ $i ][ 'pages' ] = $adb -> query_result ( $result , $j , 'pages' );
$output [ $i ][ 'filelocationtype' ] = $adb -> query_result ( $result , $j , 'filelocationtype' );
$output [ $i ][ 's3_bucket' ] = $adb -> query_result ( $result , $j , 's3_bucket' );
$output [ $i ][ 's3_key' ] = $adb -> query_result ( $result , $j , 's3_key' );
2025-09-26 10:43:05 +03:00
if ( ! is_numeric ( substr ( $output [ $i ][ 'filename' ], 0 , 1 ))) {
$output [ $i ][ 'filename' ] = $i . '_' . $output [ $i ][ 'filename' ];
}
$output [ $i ][ 'filename' ] = str_replace ( ' ' , '_' , $output [ $i ][ 'filename' ]);
2025-10-16 11:17:21 +03:00
2025-09-26 10:43:05 +03:00
if ( empty ( $output [ $i ][ 'pages' ]) or $output [ $i ][ 'pages' ] == 0 ) {
$output [ $i ][ 'pages' ] = getPDFPageCount ( $output [ $i ][ 'filepath' ]);
}
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - файл из контрагента: ' . $output [ $i ][ 'filename' ] . ' (location: ' . $output [ $i ][ 'filelocationtype' ] . ')' . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
$i ++ ;
}
}
return $output ;
}
function getCourt ( $contactid , $address , $price ) {
$output = [];
$output [ 'result' ] = 'YES' ;
if ( empty ( $address ) and ( empty ( $contactid ) or $contactid < 1 )) {
$output [ 'result' ] = 'Н е указаны исходные данные' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - не указан адрес для поиска суда' . PHP_EOL , FILE_APPEND );
} else {
if ( empty ( $address ) and $contactid > 0 ) {
$query = ' select a . mailingstreet
from vtiger_contactaddress a
left join vtiger_crmentity e on e . crmid = a . contactaddressid
where e . deleted = 0 and a . contactaddressid = ' . $contactid ;
$result = $adb -> pquery ( $query );
if ( $adb -> num_rows ( $result ) == 0 ) {
$output [ 'result' ] = 'Контакт не найден' ;
} else {
$address = $adb -> query_result ( $result , 0 , 'mailingstreet' );
}
}
2025-10-24 19:59:28 +03:00
// Декодируем HTML entities в адресе (—, и т.д.)
$address = html_entity_decode ( $address , ENT_QUOTES | ENT_HTML5 , 'UTF-8' );
2025-09-26 10:43:05 +03:00
}
if ( $output [ 'result' ] == 'YES' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - начинаем поиск суда для адреса ' . $address . PHP_EOL , FILE_APPEND );
$host = " https://api.xn----7sbarabva2auedgdkhac2adbeqt1tna3e.xn--p1ai/api " ; // адрес сервера api
$token = " y4kNd3Li2NDxyOgaG37ZDuGTWg5CfF2A2dERwbFUjas " ; // указать полученный токен
// запрос по адресу
$url = $host . " ?token= " . $token . " &address= " . urlencode ( $address );
// запрос по координатам
//$coords = "49.099524 55.794340"; // координаты точки, разделитель - пробел
//$url = $host . "?token=" . $token . "&coords=" . urlencode($coords);
$curl = curl_init ();
curl_setopt ( $curl , CURLOPT_URL , $url );
curl_setopt ( $curl , CURLOPT_RETURNTRANSFER , true );
$response = curl_exec ( $curl );
curl_close ( $curl );
$court = json_decode ( $response , true );
if ( $price > 100000 ) {
// Если цена иска - от 100 тысяч, то нам будем нужен федеральный суд
$need = 'court_fs' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - сумма иска более 100к - нужен федеральный суд' . PHP_EOL , FILE_APPEND );
} else {
// А если меньше, то мировой
$need = 'court_ms' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - сумма иска менее 100к - нужен мировой суд' . PHP_EOL , FILE_APPEND );
}
if ( isset ( $court [ 'request' ][ $need ])) {
$output [ 'code' ] = $court [ 'request' ][ $need ][ 'code' ];
$output [ 'region' ] = substr ( $output [ 'code' ], 0 , 2 ); // Первые две цифры кода суда - это регион
$output [ 'name' ] = $court [ 'request' ][ $need ][ 'title' ];
$output [ 'site' ] = $court [ 'request' ][ $need ][ 'site' ];
$output [ 'phone' ] = $court [ 'request' ][ $need ][ 'tel' ];
$output [ 'email' ] = $court [ 'request' ][ $need ][ 'email' ];
$output [ 'address' ] = $court [ 'request' ][ $need ][ 'address' ];
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - и он найден в бесплатной версии API. Код суда: ' . $output [ 'code' ] . PHP_EOL , FILE_APPEND );
} else {
// В бесплатной версии поиска подсудности нужного суда не нашлось - придется лезть в платный сервис
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - но в бесплатной версии API е г о нет - полезем в платную' . PHP_EOL , FILE_APPEND );
$apikey = GetKey ( 'Prod' );
$curl = curl_init ();
curl_setopt_array ( $curl , array (
CURLOPT_URL => 'https://api-yc.explorer.debex.ru/production/jurisdiction' ,
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 => ' {
" address " : " '.addslashes( $address ).' " ,
" get_fssp_geo " : 1
} ' ,
CURLOPT_HTTPHEADER => array (
'x-api-key: ' . $apikey ,
'Content-Type: application/json'
),
));
$response = curl_exec ( $curl );
curl_close ( $curl );
$court = json_decode ( $response , true );
if ( $price > 100000 ) {
// Если цена иска - от 100 тысяч, то нам будем нужен федеральный суд
$need = 'higher_court' ;
} else {
// А если меньше, то мировой
$need = 'court' ;
}
if ( isset ( $court [ 'result' ][ $need ])) {
$output [ 'code' ] = $court [ 'result' ][ $need ][ 'code' ];
$output [ 'region' ] = substr ( $output [ 'code' ], 0 , 2 ); // Первые две цифры кода суда - это регион
$output [ 'name' ] = $court [ 'result' ][ $need ][ 'court_name' ];
$output [ 'site' ] = $court [ 'result' ][ $need ][ 'website' ];
$output [ 'phone' ] = $court [ 'result' ][ $need ][ 'phone_normalized' ][ 0 ][ 'phone' ];
$output [ 'email' ] = $court [ 'result' ][ $need ][ 'email' ];
$output [ 'address' ] = $court [ 'result' ][ $need ][ 'address' ];
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - а тут мы е г о и нашли: ' . $output [ 'code' ] . PHP_EOL , FILE_APPEND );
} else {
// Нужный суд не нашелся ни в платном, ни в бесплатном сервисе - не можем продолжать
$output [ 'result' ] = 'Суд для адреса ' . $address . ' не найден' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - но е г о и в платном API тоже нет' . PHP_EOL , FILE_APPEND );
}
}
}
return $output ;
}
function GetCookies ( $version ) {
//$version = 'Dev';
if ( $version == 'Dev' ) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - поднимаем тестовые куки для версии Dev' . PHP_EOL , FILE_APPEND );
$curl = curl_init ();
$apiKey = GetKey ( 'Dev' );
curl_setopt_array ( $curl , array (
CURLOPT_URL => 'https://api-yc.explorer.debex.ru/dev/sudrf-auth' ,
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_HTTPHEADER => array (
'x-api-key: ' . $apiKey
),
));
$response = curl_exec ( $curl );
curl_close ( $curl );
} else {
$response = 'No' ;
if ( file_exists ( 'cookies.txt' )) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Найден файл с о старыми куками' . PHP_EOL , FILE_APPEND );
$created = filemtime ( 'cookies.txt' ); // Дата создания файла (получения и сохранения cookies)
$now = time ();
$diff = $now - $created ;
if ( $diff < 10800 ) {
// Если старый файл создан более 3 часов назад
$response = file_get_contents ( 'cookies.txt' );
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - создан менее 3 часов назад - берем куки из него' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - создан более 3 часов назад - будем получать новые' . PHP_EOL , FILE_APPEND );
}
}
if ( $response == 'No' ) {
// Будем получать новые
$url = " https://api-yc.explorer.debex.ru/production/sudrf-auth-chatbot " ;
$ch = curl_init ( $url );
curl_setopt ( $ch , CURLOPT_HTTPHEADER , [
'x-api-key: ' . GetKey ( 'Prod' ),
'hidden-bot-phone-number: +79262306381'
]);
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_POST , true );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , []);
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - отправляем запрос с С М С -подтверждением' . PHP_EOL , FILE_APPEND );
$response = curl_exec ( $ch );
curl_close ( $ch );
// И сохраним их на будущее
if ( strpos ( $response , " error " ) !== false ) {
$response = 'Н е удалось получить куки' ;
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - в ответ получили ошибку. Куков нет.' . PHP_EOL , FILE_APPEND );
} else {
file_put_contents ( 'cookies.txt' , $response );
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - ответ получен, новые куки сохранены в файле cookies.txt' . PHP_EOL , FILE_APPEND );
}
}
}
return $response ;
}
function GetUrl ( $version ) {
/*
if ( $version == 'Dev' ) {
$url = 'https://explorer-proxy.debex.ru/api/dev/sudrf' ;
} elseif ( $version == 'Stage' ) {
$url = 'https://explorer-proxy.debex.ru/api/stage/sudrf' ;
} elseif ( $version == 'Prod' ) {
$url = 'https://explorer-proxy.debex.ru/api/production/sudrf' ;
}
*/
if ( $version == 'Dev' ) {
$url = 'https://explorer-proxy.debex.ru/api/v3/dev/sudrf' ;
} elseif ( $version == 'Stage' ) {
$url = 'https://explorer-proxy.debex.ru/api/v3/stage/sudrf' ;
} elseif ( $version == 'Prod' ) {
$url = 'https://explorer-proxy.debex.ru/api/v3/production/sudrf' ;
}
return $url ;
}
function GetKey ( $version ) {
if ( $version == 'Dev' ) {
$key = 'sandboxklientpravdjknkjsdndsd8y789!' ;
} else {
$key = 'productionklientpravkjnkjnhkhj87y!' ;
}
return $key ;
}
function SendRequest ( $url , $multipart , $headers , $count ) {
if ( $count < 6 ) {
$client = new Client ();
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - непосредственно отправляем запрос. Попытка №' . $count . PHP_EOL , FILE_APPEND );
try {
$response = $client -> request ( 'POST' , $url , [
'headers' => $headers ,
'multipart' => $multipart
]);
$statusCode = $response -> getStatusCode ();
if ( $statusCode >= 200 && $statusCode < 300 ) {
// Успешный ответ
//$output = $response->getBody()->getContents();
$output = $response -> getBody ();
} else {
// Ошибка
$output = " Ошибка HTTP: " . $statusCode . " - " . $response -> getReasonPhrase ();
}
// Выводим ответ
//$output = $response->getBody();
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - получили ответ на запрос: ' . $output . PHP_EOL , FILE_APPEND );
// Вытаскиваем номер входящего
$arrResponse = json_decode ( $output , true );
$number = $arrResponse [ 'data' ][ 'appealNumber' ];
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - вытащили р е г .номер: ' . $number . PHP_EOL , FILE_APPEND );
$output = array ( 'status' => 'OK' , 'message' => $number );
2025-10-16 11:17:21 +03:00
} catch ( Exception $ex ) {
// Обрабатываем исключение, например, выводим сообщение о б ошибке
$output = $ex -> getMessage ();
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - получили ошибку при выполнении запроса: ' . $output . PHP_EOL , FILE_APPEND );
// 🔍 УЛУЧШЕНИЕ: Извлекаем тело ответа для детальной диагностики
if ( $ex instanceof \GuzzleHttp\Exception\RequestException && $ex -> hasResponse ()) {
$response = $ex -> getResponse ();
$statusCode = $response -> getStatusCode ();
$responseBody = ( string ) $response -> getBody ();
2025-09-26 10:43:05 +03:00
2025-10-16 11:17:21 +03:00
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - HTTP статус код: ' . $statusCode . PHP_EOL , FILE_APPEND );
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Тело ответа от сервера: ' . $responseBody . PHP_EOL , FILE_APPEND );
// Если это JSON, попробуем распарсить для читаемости
$jsonData = json_decode ( $responseBody , true );
if ( json_last_error () === JSON_ERROR_NONE && ! empty ( $jsonData )) {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Детали ошибки (JSON): ' . print_r ( $jsonData , true ) . PHP_EOL , FILE_APPEND );
2025-09-26 10:43:05 +03:00
}
2025-10-16 11:17:21 +03:00
} else {
file_put_contents ( 'logs/send2court.log' , date ( 'Y-m-d H:i:s' ) . ' - Тело ответа недоступно (возможно, проблема с соединением)' . PHP_EOL , FILE_APPEND );
}
$RetryFlag = false ; // Флаг перезапуска
$retry = array ( " 500 " , " 403 " , " 417 " ); // Массив ошибок, при которых будем пробовать еще раз
foreach ( $retry as $errorcode ) {
if ( strpos ( $output , $errorcode ) !== false ) {
// В строке с ответом с ошибкой есть код, при котором будем пробовать еще раз
$RetryFlag = true ;
break ;
}
}
2025-09-26 10:43:05 +03:00
if ( $RetryFlag ) {
2025-10-16 11:17:21 +03:00
// Отключены повторы - сразу возвращаем ошибку
$output = array ( 'status' => 'ERROR' , 'message' => 'Ошибка при отправке запроса' );
2025-09-26 10:43:05 +03:00
} else {
$output = array ( 'status' => 'ERROR' , 'message' => 'Похоже на ошибку в составе данных - перезапускать не будем' );
}
}
} else {
2025-10-16 11:17:21 +03:00
$output = array ( 'status' => 'ERROR' , 'message' => 'Отправка не удалась' );
2025-09-26 10:43:05 +03:00
}
return $output ;
}
?>