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('' . $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); // Создаём уведомление (если указан project_id) if ($this->project_id) { $notificationId = $this->createCourtEventNotification($this->project_id, $eventData); if ($notificationId) { $this->log("Создано уведомление ID: $notificationId для события: $event_name"); } } // Запоминаем последнее событие для ответа $last_event = $eventData; } return $last_event; } /** * Создаёт уведомление о новом событии суда */ 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; } } } ?>