Files
crm.clientright.ru/parsers/RegionalCourtParser.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

93 lines
4.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
require_once 'BaseCourtParser.php';
/**
* Парсер для региональных судов (*.sudrf.ru)
*/
class RegionalCourtParser extends BaseCourtParser {
public function canHandle($url) {
// Региональные суды имеют домены вида: example--region.sudrf.ru
return preg_match('/\.sudrf\.ru/', $url) && !preg_match('/mos-gorsud\.ru/', $url);
}
public function parse($url, $status) {
$this->log("Старт парсинга {$this->case_number} для статуса: $status (РЕГИОНАЛЬНЫЙ СУД)");
$this->log("Парсим данные из ссылки: $url");
// Загружаем HTML-контент страницы дела
$html = @file_get_contents($url);
if ($html === false) {
$this->log("Ошибка: не удалось загрузить страницу по ссылке: $url");
return null;
}
$this->log("Страница успешно загружена. Начинаем парсинг...");
// Парсим HTML с помощью DOMDocument и XPath
$dom = new DOMDocument();
// Важно: указываем кодировку UTF-8 для корректного парсинга
@$dom->loadHTML('<?xml encoding="UTF-8">' . $html);
$xpath = new DOMXPath($dom);
// Определяем div для парсинга
$div_id = ($status === 'представительство в суде 1й инстанции' ||
$status === 'выдача листа' ||
$status === 'исполнительное производство' ||
$status === 'заявление на лист') ? 'cont2' : 'cont3';
$rows = $xpath->query("//div[@id='$div_id']//tr");
$this->log("Найдено строк (tr) в div с id '$div_id': " . $rows->length);
// Массив для хранения последнего события
$last_event = null;
// Обрабатываем каждую строку таблицы
foreach ($rows as $row) {
$event_name = trim($xpath->query('./td[1]', $row)->item(0)->nodeValue ?? '');
$event_date = trim($xpath->query('./td[2]', $row)->item(0)->nodeValue ?? '');
$event_time = trim($xpath->query('./td[3]', $row)->item(0)->nodeValue ?? '');
$location = trim($xpath->query('./td[4]', $row)->item(0)->nodeValue ?? '');
$event_result = trim($xpath->query('./td[5]', $row)->item(0)->nodeValue ?? '');
$event_basis = trim($xpath->query('./td[6]', $row)->item(0)->nodeValue ?? '');
$note = trim($xpath->query('./td[7]', $row)->item(0)->nodeValue ?? '');
$publication_date = trim($xpath->query('./td[8]', $row)->item(0)->nodeValue ?? '');
// Логируем каждую строку
$this->log("Найдено событие: $event_name, Дата: $event_date, Время: $event_time, Место: $location, Результат: $event_result, Основание: $event_basis, Примечание: $note, Дата размещения: $publication_date");
// Пропускаем записи, если название события не указано или дата неверная
if (empty($event_name) || empty($event_date) || $event_date === '1970-01-01') {
$this->log("Пропущено событие: название или дата не указаны.");
continue;
}
// Форматируем даты
$formatted_date = date('Y-m-d', strtotime($event_date));
$formatted_publication_date = date('Y-m-d', strtotime($publication_date));
$eventData = [
'event_name' => $event_name,
'event_date' => $formatted_date,
'event_time' => $event_time,
'location' => $location,
'event_result' => $event_result,
'event_basis' => $event_basis,
'note' => $note,
'publication_date' => $formatted_publication_date,
];
// Сохраняем событие в БД
$this->saveEvent($eventData);
// Запоминаем последнее событие для ответа
$last_event = $eventData;
}
return $last_event;
}
}
?>