2025-10-17 19:45:11 +03:00
|
|
|
|
<?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);
|
|
|
|
|
|
|
2025-10-17 19:53:05 +03:00
|
|
|
|
// Создаём уведомление (если указан project_id)
|
|
|
|
|
|
if ($this->project_id) {
|
|
|
|
|
|
$notificationId = $this->createCourtEventNotification($this->project_id, $eventData);
|
|
|
|
|
|
if ($notificationId) {
|
|
|
|
|
|
$this->log("Создано уведомление ID: $notificationId для события: $event_name");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-10-17 19:45:11 +03:00
|
|
|
|
// Запоминаем последнее событие для ответа
|
|
|
|
|
|
$last_event = $eventData;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return $last_event;
|
|
|
|
|
|
}
|
2025-10-17 19:53:05 +03:00
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* Создаёт уведомление о новом событии суда
|
|
|
|
|
|
*/
|
|
|
|
|
|
private function createCourtEventNotification($projectId, $eventData) {
|
|
|
|
|
|
try {
|
|
|
|
|
|
// Создаём отдельное соединение с основной БД CRM для уведомлений
|
|
|
|
|
|
$crmPdo = new PDO('mysql:host=localhost;dbname=ci20465_72new;charset=utf8mb4', 'ci20465_72new', 'EcY979Rn');
|
|
|
|
|
|
$crmPdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
|
|
|
|
|
|
|
|
|
|
|
// Получаем ответственного по проекту
|
|
|
|
|
|
$query = "SELECT e.smownerid, p.projectname FROM vtiger_crmentity e
|
|
|
|
|
|
JOIN vtiger_project p ON p.projectid = e.crmid
|
|
|
|
|
|
WHERE e.crmid = ? AND e.deleted = 0";
|
|
|
|
|
|
$stmt = $crmPdo->prepare($query);
|
|
|
|
|
|
$stmt->execute([$projectId]);
|
|
|
|
|
|
$result = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
|
|
|
|
|
|
|
|
if (!$result) {
|
|
|
|
|
|
$this->log("Проект $projectId не найден для уведомления");
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$userId = $result['smownerid'];
|
|
|
|
|
|
$projectName = $result['projectname'];
|
|
|
|
|
|
|
|
|
|
|
|
$this->log("Создаем уведомление для пользователя $userId о событии в проекте $projectName");
|
|
|
|
|
|
|
|
|
|
|
|
// Формируем текст уведомления
|
|
|
|
|
|
$eventName = $eventData['event_name'];
|
|
|
|
|
|
$eventDate = $eventData['event_date'];
|
|
|
|
|
|
$eventTime = $eventData['event_time'];
|
|
|
|
|
|
|
|
|
|
|
|
$timeStr = !empty($eventTime) ? " в $eventTime" : "";
|
|
|
|
|
|
$notificationTitle = "Событие суда: $eventName на $eventDate$timeStr";
|
|
|
|
|
|
|
|
|
|
|
|
// Формируем ссылку на проект
|
|
|
|
|
|
$projectLink = "module=Project&view=Detail&record=$projectId";
|
|
|
|
|
|
|
|
|
|
|
|
// Проверяем, нет ли уже уведомления для этого события (любого статуса)
|
|
|
|
|
|
// Используем точное совпадение названия события и даты
|
|
|
|
|
|
$checkQuery = "SELECT id, status FROM vtiger_vdnotifierpro
|
|
|
|
|
|
WHERE userid = ? AND crmid = ? AND title = ?
|
|
|
|
|
|
ORDER BY id DESC LIMIT 1";
|
|
|
|
|
|
$checkStmt = $crmPdo->prepare($checkQuery);
|
|
|
|
|
|
$checkStmt->execute([$userId, $projectId, $notificationTitle]);
|
|
|
|
|
|
$existing = $checkStmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
|
|
|
|
|
|
|
|
if ($existing) {
|
|
|
|
|
|
// Если уведомление уже есть - проверяем его статус
|
|
|
|
|
|
if ($existing['status'] == 5) {
|
|
|
|
|
|
// Уведомление непрочитанное - обновляем только время
|
|
|
|
|
|
$updateQuery = "UPDATE vtiger_vdnotifierpro SET modifiedtime = NOW() WHERE id = ?";
|
|
|
|
|
|
$updateStmt = $crmPdo->prepare($updateQuery);
|
|
|
|
|
|
$updateStmt->execute([$existing['id']]);
|
|
|
|
|
|
|
|
|
|
|
|
$this->log("Обновлено время непрочитанного уведомления ID: {$existing['id']}");
|
|
|
|
|
|
return $existing['id'];
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Уведомление прочитано - не создаём дубликат
|
|
|
|
|
|
$this->log("Уведомление ID: {$existing['id']} уже существует (статус: {$existing['status']}), дубликат не создан");
|
|
|
|
|
|
return $existing['id'];
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Создаем новое уведомление
|
|
|
|
|
|
$insertQuery = "INSERT INTO vtiger_vdnotifierpro (userid, modulename, crmid, modiuserid, link, title, action, modifiedtime, status) VALUES (?, 'Project', ?, 0, ?, ?, '', NOW(), 5)";
|
|
|
|
|
|
$insertStmt = $crmPdo->prepare($insertQuery);
|
|
|
|
|
|
$insertStmt->execute([$userId, $projectId, $projectLink, $notificationTitle]);
|
|
|
|
|
|
|
|
|
|
|
|
$notificationId = $crmPdo->lastInsertId();
|
|
|
|
|
|
$this->log("Создано новое уведомление ID: $notificationId для пользователя $userId");
|
|
|
|
|
|
|
|
|
|
|
|
return $notificationId;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
} catch (Exception $e) {
|
|
|
|
|
|
$this->log("Ошибка создания уведомления: " . $e->getMessage());
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2025-10-17 19:45:11 +03:00
|
|
|
|
}
|
|
|
|
|
|
?>
|
|
|
|
|
|
|