Добавлена система уведомлений о приходе судебных писем
- Реализована функция 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 запросы
|
||||
function linkDocumentToProject($projectId, $documentId) {
|
||||
global $mysqli;
|
||||
@@ -419,6 +479,14 @@ try {
|
||||
|
||||
if ($linkSuccess) {
|
||||
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 {
|
||||
log_message('ERROR', "Ошибка привязки документа к проекту");
|
||||
}
|
||||
@@ -435,7 +503,8 @@ try {
|
||||
'document_id' => $documentNumericId,
|
||||
'document_ws_id' => $documentWsId,
|
||||
's3_url' => $s3_url,
|
||||
'message' => 'Документ успешно создан через CRM API и добавлен к проекту'
|
||||
'notification_id' => $notificationId ?? null,
|
||||
'message' => 'Документ успешно создан через CRM API и добавлен к проекту' . ($notificationId ? ' с уведомлением' : '')
|
||||
];
|
||||
|
||||
log_message('SUCCESS', "Обработка завершена успешно: " . json_encode($result, JSON_UNESCAPED_UNICODE));
|
||||
|
||||
Reference in New Issue
Block a user