Добавлена система уведомлений о приходе судебных писем

- Реализована функция createMailNotification() в simple_project_updater_v2.php
- Автоматическое создание уведомлений VDNotifierPro при поступлении документов
- Уведомления отправляются ответственному по проекту
- Исправлен формат ссылок (без index.php? для корректной работы в VDNotifierPro)
- Защита от дубликатов - обновление существующих непрочитанных уведомлений
- Добавлена документация MAIL_NOTIFICATION_SYSTEM.md
- Протестировано и работает корректно
This commit is contained in:
Fedor
2025-10-16 16:02:08 +03:00
parent ac7467f0b4
commit 0f7e8ba247
2 changed files with 211 additions and 1 deletions

141
MAIL_NOTIFICATION_SYSTEM.md Normal file
View File

@@ -0,0 +1,141 @@
# Система уведомлений о приходе писем
**Дата:** 16 октября 2025
**Статус:** ✅ Реализовано и протестировано
## Описание
Интегрирована система уведомлений в существующий процесс обработки судебных документов (`simple_project_updater_v2.php`). Теперь при поступлении письма от суда автоматически создается уведомление для ответственного по проекту.
## Как это работает
### 1. Процесс обработки письма
1. **Письмо поступает** → n8n обрабатывает → вызывает `simple_project_updater_v2.php`
2. **Система ищет проект** по ФИО истца, номеру дела, УИД
3. **Создается документ** в CRM с привязкой к проекту
4. **Загружается файл** в S3 хранилище
5. **🆕 Создается уведомление** для ответственного по проекту
### 2. Структура уведомления
```sql
INSERT INTO vtiger_vdnotifierpro (
userid, -- Ответственный по проекту
modulename, -- 'Documents'
crmid, -- ID документа
link, -- Ссылка на документ
title, -- "Письмо от [ФИО] - [тип документа]"
status -- 5 (непрочитанное)
)
```
### 3. Пример уведомления
- **Текст:** "Письмо от Агеев Дмитрий - ОПРЕДЕЛЕНИЕ суда"
- **Ссылка:** `module=Documents&view=Detail&record=123456` (без index.php?)
- **Получатель:** Ответственный по проекту (пользователь 8)
## Технические детали
### Функция `createMailNotification()`
```php
function createMailNotification($projectId, $documentId, $documentTitle, $plaintiffFio) {
// 1. Получаем ответственного по проекту
// 2. Формируем текст уведомления
// 3. Проверяем дубликаты
// 4. Создаем или обновляем уведомление
}
```
### Интеграция в основной процесс
```php
// После успешной привязки документа к проекту
if ($linkSuccess) {
// Создаем уведомление о приходе письма
$notificationId = createMailNotification($project_id, $documentNumericId, $document_title, $plaintiff_fio);
}
```
### Обработка дубликатов
- Если уведомление для документа уже существует → обновляется время
- Если уведомления нет → создается новое
- Статус `5` = непрочитанное уведомление
## Результаты тестирования
### ✅ Тест прошел успешно
```
=== Тест исправленной системы уведомлений ===
Тестовые данные:
- Проект ID: 390657 (Агеев ООО СКИЛБОКС)
- Документ ID: 395297 (реальный документ)
- Ответственный: пользователь 8
✅ Новое уведомление создано с ID: 6869
✅ Текст: "Письмо от Губанова Анна Евгеньевна - ОПРЕДЕЛЕНИЕ суда"
✅ Ссылка: "module=Documents&view=Detail&record=395297" (исправлено!)
```
### Проверка в CRM
1. **Войти в CRM** под пользователем 8 (Фёдор Коробков)
2. **Посмотреть панель уведомлений** (справа вверху)
3. **Увидеть уведомление:** "Письмо от Агеев Дмитрий - ОПРЕДЕЛЕНИЕ суда"
4. **Кликнуть на уведомление** → откроется документ
## Файлы
### Измененные файлы:
-`crm_extensions/simple_project_updater_v2.php` - добавлена функция уведомлений
### Новые файлы:
-`test_mail_notification.php` - тестовый скрипт
## Логирование
Все действия логируются в `crm_extensions/logs/project_update.log`:
```
2025-10-16 15:11:36 - INFO: Создаем уведомление для проекта 390657 о документе 123456
2025-10-16 15:11:36 - DEBUG: Ответственный по проекту: пользователь 8
2025-10-16 15:11:36 - SUCCESS: Создано новое уведомление ID: 6867 для пользователя 8
```
## Исправления
### 🔧 Проблема со ссылками (исправлено)
**Проблема:** Ссылки в уведомлениях не работали - показывали пустую страницу
**Причина:** VDNotifierPro автоматически убирает `index.php?` из ссылок
**Решение:** Изменили формат ссылки с `index.php?module=Documents&view=Detail&record=123456` на `module=Documents&view=Detail&record=123456`
## Преимущества
1. **Автоматизация** - уведомления создаются автоматически
2. **Интеграция** - использует существующую систему VDNotifierPro
3. **Умная логика** - показывает уведомления только ответственному по проекту
4. **Защита от дубликатов** - не создает множественные уведомления
5. **Прямая ссылка** - клик ведет сразу к документу
6. **Исправленные ссылки** - работают корректно в CRM
## Использование
Система работает автоматически при обработке писем через `simple_project_updater_v2.php`. Никаких дополнительных действий не требуется.
### Для тестирования:
```bash
php test_mail_notification.php
```
---
**Статус:** ✅ Готово к использованию
**Автор:** AI Assistant + Фёдор
**Дата:** 16 октября 2025

View File

@@ -93,6 +93,66 @@ function createDocumentViaAPI($documentData) {
]; ];
} }
// Функция для создания уведомления о приходе письма
function createMailNotification($projectId, $documentId, $documentTitle, $plaintiffFio) {
global $mysqli;
log_message('INFO', "Создаем уведомление для проекта $projectId о документе $documentId");
// Получаем ответственного по проекту
$query = "SELECT e.smownerid FROM vtiger_crmentity e WHERE e.crmid = ? AND e.deleted = 0";
$stmt = $mysqli->prepare($query);
$stmt->bind_param('i', $projectId);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows === 0) {
log_message('WARNING', "Проект $projectId не найден или удален");
return false;
}
$row = $result->fetch_assoc();
$userId = $row['smownerid'];
log_message('DEBUG', "Ответственный по проекту: пользователь $userId");
// Формируем текст уведомления
$notificationTitle = "Письмо от $plaintiffFio - $documentTitle";
// Формируем ссылку на документ (VDNotifierPro убирает index.php? из ссылки)
$documentLink = "module=Documents&view=Detail&record=$documentId";
// Проверяем, нет ли уже непрочитанного уведомления для этого документа
$checkQuery = "SELECT id FROM vtiger_vdnotifierpro WHERE userid = ? AND crmid = ? AND status = 5";
$checkStmt = $mysqli->prepare($checkQuery);
$checkStmt->bind_param('ii', $userId, $documentId);
$checkStmt->execute();
$checkResult = $checkStmt->get_result();
if ($checkResult->num_rows > 0) {
// Обновляем время существующего уведомления
$existingId = $checkResult->fetch_assoc()['id'];
$updateQuery = "UPDATE vtiger_vdnotifierpro SET modifiedtime = NOW() WHERE id = ?";
$updateStmt = $mysqli->prepare($updateQuery);
$updateStmt->bind_param('i', $existingId);
$updateStmt->execute();
log_message('INFO', "Обновлено существующее уведомление ID: $existingId");
return $existingId;
} else {
// Создаем новое уведомление
$insertQuery = "INSERT INTO vtiger_vdnotifierpro (userid, modulename, crmid, modiuserid, link, title, action, modifiedtime, status) VALUES (?, 'Documents', ?, 0, ?, ?, '', NOW(), 5)";
$insertStmt = $mysqli->prepare($insertQuery);
$insertStmt->bind_param('iiss', $userId, $documentId, $documentLink, $notificationTitle);
$insertStmt->execute();
$notificationId = $mysqli->insert_id;
log_message('SUCCESS', "Создано новое уведомление ID: $notificationId для пользователя $userId");
return $notificationId;
}
}
// Функция для привязки документа к проекту через прямые SQL запросы // Функция для привязки документа к проекту через прямые SQL запросы
function linkDocumentToProject($projectId, $documentId) { function linkDocumentToProject($projectId, $documentId) {
global $mysqli; global $mysqli;
@@ -419,6 +479,14 @@ try {
if ($linkSuccess) { if ($linkSuccess) {
log_message('SUCCESS', "Документ успешно привязан к проекту"); log_message('SUCCESS', "Документ успешно привязан к проекту");
// Создаем уведомление о приходе письма
$notificationId = createMailNotification($project_id, (int)$documentNumericId, $document_title, $plaintiff_fio);
if ($notificationId) {
log_message('SUCCESS', "Уведомление создано с ID: $notificationId");
} else {
log_message('WARNING', "Не удалось создать уведомление");
}
} else { } else {
log_message('ERROR', "Ошибка привязки документа к проекту"); log_message('ERROR', "Ошибка привязки документа к проекту");
} }
@@ -435,7 +503,8 @@ try {
'document_id' => $documentNumericId, 'document_id' => $documentNumericId,
'document_ws_id' => $documentWsId, 'document_ws_id' => $documentWsId,
's3_url' => $s3_url, 's3_url' => $s3_url,
'message' => 'Документ успешно создан через CRM API и добавлен к проекту' 'notification_id' => $notificationId ?? null,
'message' => 'Документ успешно создан через CRM API и добавлен к проекту' . ($notificationId ? ' с уведомлением' : '')
]; ];
log_message('SUCCESS', "Обработка завершена успешно: " . json_encode($result, JSON_UNESCAPED_UNICODE)); log_message('SUCCESS', "Обработка завершена успешно: " . json_encode($result, JSON_UNESCAPED_UNICODE));