Добавлена система уведомлений о приходе судебных писем
- Реализована функция createMailNotification() в simple_project_updater_v2.php - Автоматическое создание уведомлений VDNotifierPro при поступлении документов - Уведомления отправляются ответственному по проекту - Исправлен формат ссылок (без index.php? для корректной работы в VDNotifierPro) - Защита от дубликатов - обновление существующих непрочитанных уведомлений - Добавлена документация MAIL_NOTIFICATION_SYSTEM.md - Протестировано и работает корректно
This commit is contained in:
141
MAIL_NOTIFICATION_SYSTEM.md
Normal file
141
MAIL_NOTIFICATION_SYSTEM.md
Normal 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
|
||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user