Files
crm.clientright.ru/ParseAndCreateEvent.php
Fedor 3db9d06c86 feat: Интеграция уведомлений для событий судов
- Добавлена поддержка project_id в parscourt.php для создания уведомлений
- Создана система парсеров судов (BaseCourtParser, MoscowCourtParser, RegionalCourtParser)
- Интегрирован Browserless для парсинга московских судов (mos-sud.ru, mos-gorsud.ru)
- Добавлены уведомления VDNotifierPro при обнаружении новых событий судов
- Создан ParseAndCreateEvent.php для интеграции с CRM workflow
- Создан CreateCourtEvent_v2.php для прямого создания событий в календаре CRM
- Поддержка проверки дубликатов событий (можно отключить для тестирования)
- Автоматическое определение типа суда и выбор подходящего парсера

Функции:
- Парсинг региональных судов (*.sudrf.ru) через HTML
- Парсинг московских судов через Browserless API
- Создание событий в CRM календаре с привязкой к проектам
- Уведомления ответственных пользователей о новых событиях
- Сохранение событий в таблицу subject для истории
2025-10-17 19:45:11 +03:00

225 lines
9.6 KiB
PHP
Raw 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
/**
* Обёртка для парсинга ответа от parscourt.php и создания события
*
* Принимает те же параметры что и parscourt.php
* Вызывает parscourt.php, получает JSON с last_event
* И создаёт событие через CreateCourtEvent.php
*
* Этот скрипт можно дёргать из workflow вместо parscourt.php
*/
// Устанавливаем рабочую директорию
chdir(__DIR__);
// Логирование
function log_wrapper($level, $message) {
$log_file = 'logs/parse_and_create_event.log';
$timestamp = date('Y-m-d H:i:s');
$log_entry = "{$timestamp} - {$level}: {$message}\n";
file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX);
}
try {
log_wrapper('INFO', '=== НАЧАЛО ОБРАБОТКИ ===');
// Получаем параметры (из POST, GET или argv)
$params = array_merge($_GET, $_POST);
// Если параметров нет, пробуем argv (для вызова через CLI)
if (empty($params) && !empty($argv)) {
for ($i = 1; $i < count($argv); $i++) {
if (strpos($argv[$i], '=') !== false) {
list($key, $value) = explode('=', $argv[$i], 2);
$params[$key] = $value;
}
}
}
log_wrapper('DEBUG', "Параметры: " . json_encode($params, JSON_UNESCAPED_UNICODE));
// Проверяем обязательные параметры
if (empty($params['project_id'])) {
throw new Exception('Параметр project_id обязателен');
}
$projectId = $params['project_id'];
// Формируем параметры для parscourt.php
$parscourtParams = [
'project_id' => $projectId,
'status' => $params['status'] ?? '',
'link1' => $params['link1'] ?? '',
'link2' => $params['link2'] ?? '',
'link3' => $params['link3'] ?? '',
'case_number' => $params['case_number'] ?? '02-15800/2025', // Дефолтный номер дела для тестирования
'uid' => $params['uid'] ?? '',
'use_new_parser' => $params['use_new_parser'] ?? 'true',
'skip_duplicate_check' => $params['skip_duplicate_check'] ?? 'false'
];
log_wrapper('INFO', "Вызываем parscourt.php для проекта $projectId");
// Формируем URL для вызова parscourt.php
$domain = $_SERVER['HTTP_HOST'] ?? 'crm.clientright.ru';
$protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'https'; // Всегда https для production
$parscourtUrl = $protocol . '://' . $domain . '/parscourt.php?' . http_build_query($parscourtParams);
log_wrapper('DEBUG', "URL: $parscourtUrl");
// Вызываем через cURL с POST (parscourt.php принимает POST параметры)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $protocol . '://' . $domain . '/parscourt.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($parscourtParams));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$output = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
throw new Exception("Ошибка вызова parscourt.php: HTTP $httpCode");
}
log_wrapper('DEBUG', "Ответ от parscourt.php: $output");
// Парсим JSON ответ
$parscourtResponse = json_decode($output, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new Exception('Ошибка декодирования JSON от parscourt.php: ' . json_last_error_msg());
}
log_wrapper('DEBUG', "Распарсенный ответ: " . json_encode($parscourtResponse, JSON_UNESCAPED_UNICODE));
// Проверяем наличие last_event и что он не пустой
if (empty($parscourtResponse['last_event']) ||
!isset($parscourtResponse['last_event']['Наименование']) ||
empty($parscourtResponse['last_event']['Наименование'])) {
log_wrapper('WARNING', 'Нет данных о событиях (last_event пустой или без названия)');
$response = [
'success' => true,
'message' => 'Парсинг выполнен, но нет новых событий',
'event_created' => false
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(0);
}
$lastEvent = $parscourtResponse['last_event'];
// Извлекаем данные события (пробуем оба варианта ключей)
$eventName = $lastEvent['Наименование'] ?? $lastEvent['name'] ?? 'Судебное заседание';
$eventDate = $lastEvent['Дата'] ?? $lastEvent['date'] ?? '';
$eventTime = $lastEvent['Время'] ?? $lastEvent['time'] ?? '';
$location = $lastEvent['Место'] ?? $lastEvent['location'] ?? '';
$result = $lastEvent['Результат'] ?? $lastEvent['result'] ?? '';
$basis = $lastEvent['Основание'] ?? $lastEvent['basis'] ?? '';
$note = $lastEvent['Примечание'] ?? $lastEvent['note'] ?? '';
$publicationDate = $lastEvent['Дата размещения'] ?? $lastEvent['publication_date'] ?? '';
log_wrapper('DEBUG', "Извлеченные данные: eventName='$eventName', eventDate='$eventDate', eventTime='$eventTime'");
log_wrapper('INFO', "Событие извлечено: $eventName ($eventDate $eventTime)");
// Проверяем что дата не пустая
if (empty($eventDate)) {
log_wrapper('WARNING', 'Дата события пустая, пропускаем создание');
$response = [
'success' => true,
'message' => 'Событие не создано: дата отсутствует',
'event_created' => false
];
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(0);
}
// Формируем данные для CreateCourtEvent.php
log_wrapper('DEBUG', "Перед формированием данных: eventName='$eventName', result='$result'");
$eventData = [
'project_id' => $projectId,
'event_name' => $eventName,
'event_date' => $eventDate,
'event_time' => $eventTime,
'location' => $location,
'result' => $result,
'basis' => $basis,
'note' => $note,
'publication_date' => $publicationDate
];
log_wrapper('INFO', "Создаём событие через CreateCourtEvent_v2.php");
log_wrapper('DEBUG', "Данные события: " . json_encode($eventData, JSON_UNESCAPED_UNICODE));
// Вызываем CreateCourtEvent_v2.php через CLI
$createEventCommand = 'php ' . __DIR__ . '/CreateCourtEvent_v2.php';
$eventDataJson = json_encode($eventData, JSON_UNESCAPED_UNICODE);
// Передаём данные через временный файл
$tempFile = tempnam(sys_get_temp_dir(), 'event_data_');
file_put_contents($tempFile, $eventDataJson);
$createEventOutput = shell_exec('cat ' . escapeshellarg($tempFile) . ' | ' . $createEventCommand . ' 2>&1');
// Удаляем временный файл
unlink($tempFile);
log_wrapper('DEBUG', "Ответ от CreateCourtEvent_v2.php: $createEventOutput");
// Фильтруем PHP Notice из ответа
$cleanOutput = preg_replace('/^PHP Notice:.*$/m', '', $createEventOutput);
$createEventResponse = json_decode($cleanOutput, true);
if (json_last_error() !== JSON_ERROR_NONE || empty($createEventResponse['success'])) {
throw new Exception('Ошибка создания события: ' . ($createEventResponse['error'] ?? 'Неизвестная ошибка'));
}
log_wrapper('SUCCESS', "Событие создано: " . $createEventResponse['event_id']);
// Формируем финальный ответ
$response = [
'success' => true,
'message' => 'Парсинг выполнен и событие создано',
'event_created' => true,
'event_id' => $createEventResponse['event_id'],
'event_name' => $eventName,
'event_date' => $eventDate,
'event_time' => $eventTime,
'project_id' => $projectId
];
log_wrapper('SUCCESS', '=== ОБРАБОТКА ЗАВЕРШЕНА УСПЕШНО ===');
header('Content-Type: application/json; charset=utf-8');
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(0);
} catch (Exception $e) {
$error_message = $e->getMessage();
log_wrapper('ERROR', "Ошибка: $error_message");
log_wrapper('ERROR', "Стек: " . $e->getTraceAsString());
$response = [
'success' => false,
'error' => $error_message,
'timestamp' => date('Y-m-d H:i:s')
];
header('Content-Type: application/json; charset=utf-8');
http_response_code(500);
echo json_encode($response, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
exit(1);
}
?>