136 lines
6.9 KiB
PHP
136 lines
6.9 KiB
PHP
<?php
|
||
|
||
/**
|
||
* Tasks Module Events Bootstrap
|
||
*
|
||
* Регистрация обработчиков событий для модуля Tasks.
|
||
* Слушает события из CRM модуля для автоматизации создания задач.
|
||
*/
|
||
|
||
use CodeIgniter\Events\Events;
|
||
use App\Modules\Tasks\Services\TaskService;
|
||
|
||
// Выполняется после инициализации всех модулей
|
||
Events::on('post_system', function () {
|
||
|
||
/**
|
||
* Обработчик создания сделки
|
||
* Создаёт задачу "Проверить новую сделку" при создании сделки
|
||
*/
|
||
Events::on('deal.created', function (array $data) {
|
||
$taskService = service('taskService');
|
||
|
||
// Создаём задачу для ответственного менеджера
|
||
$taskService->createTask([
|
||
'title' => 'Проверить новую сделку: ' . ($data['deal']['name'] ?? 'Без названия'),
|
||
'description' => 'Автоматически созданная задача для проверки новой сделки #' . $data['deal_id'],
|
||
'board_id' => null, // Будет использоваться доска по умолчанию
|
||
'assigned_to' => $data['user_id'],
|
||
'due_date' => date('Y-m-d', strtotime('+1 day')), // Срок - завтра
|
||
'priority' => 'medium',
|
||
'metadata' => json_encode([
|
||
'source' => 'deal.created',
|
||
'deal_id' => $data['deal_id'],
|
||
'created_at' => date('Y-m-d H:i:s'),
|
||
]),
|
||
]);
|
||
});
|
||
|
||
/**
|
||
* Обработчик изменения этапа сделки
|
||
* Создаёт задачи в зависимости от перехода этапа
|
||
*/
|
||
Events::on('deal.stage_changed', function (array $data) {
|
||
$taskService = service('taskService');
|
||
|
||
$oldStageName = $data['old_stage']['name'] ?? 'Неизвестно';
|
||
$newStageName = $data['new_stage']['name'] ?? 'Неизвестно';
|
||
|
||
// Логика автоматического создания задач на основе перехода этапов
|
||
$taskConfig = getAutoTaskConfig($data['old_stage_id'], $data['new_stage_id'], $data['deal']);
|
||
|
||
if ($taskConfig) {
|
||
$taskService->createTask([
|
||
'title' => $taskConfig['title'],
|
||
'description' => $taskConfig['description'],
|
||
'board_id' => $taskConfig['board_id'] ?? null,
|
||
'assigned_to' => $taskConfig['assigned_to'] ?? $data['user_id'],
|
||
'due_date' => $taskConfig['due_date'] ?? null,
|
||
'priority' => $taskConfig['priority'] ?? 'medium',
|
||
'metadata' => json_encode([
|
||
'source' => 'deal.stage_changed',
|
||
'deal_id' => $data['deal_id'],
|
||
'old_stage_id' => $data['old_stage_id'],
|
||
'new_stage_id' => $data['new_stage_id'],
|
||
'transition' => $oldStageName . ' → ' . $newStageName,
|
||
'created_at' => date('Y-m-d H:i:s'),
|
||
]),
|
||
]);
|
||
}
|
||
});
|
||
|
||
/**
|
||
* Обработчик обновления сделки
|
||
* Может использоваться для уведомлений или отслеживания изменений
|
||
*/
|
||
Events::on('deal.updated', function (array $data) {
|
||
// Логирование изменений или дополнительные действия при необходимости
|
||
log_message('info', 'Deal updated: ' . $data['deal_id'] . ' by user: ' . $data['user_id']);
|
||
});
|
||
|
||
/**
|
||
* Обработчик удаления сделки
|
||
* Может использоваться для очистки связанных задач
|
||
*/
|
||
Events::on('deal.deleted', function (array $data) {
|
||
$taskService = service('taskService');
|
||
|
||
// Находим и удаляем или помечаем задачи связанные с удалённой сделкой
|
||
// В реальном приложении здесь была бы логика поиска и обработки связанных задач
|
||
log_message('info', 'Deal deleted: ' . $data['deal_id'] . '. Consider cleaning up related tasks.');
|
||
});
|
||
});
|
||
|
||
/**
|
||
* Конфигурация автоматического создания задач при переходе этапов
|
||
*
|
||
* @param int $oldStageId Предыдущий этап
|
||
* @param int $newStageId Новый этап
|
||
* @param array $dealData Данные сделки
|
||
* @return array|null Конфигурация задачи или null если не требуется создание
|
||
*/
|
||
function getAutoTaskConfig(int $oldStageId, int $newStageId, array $dealData): ?array
|
||
{
|
||
// Пример: Переход на этап "Закрыта успешно"
|
||
// Можно расширить конфигурацию на основе настроек организации
|
||
|
||
$taskConfigs = [
|
||
// ID этапов могут быть разными для каждой организации
|
||
// Здесь используются примеры
|
||
'won_stage' => [ // При победе
|
||
'title' => 'Подготовить документы для закрытой сделки',
|
||
'description' => 'Сделка "' . ($dealData['name'] ?? 'Без названия') . '" успешно закрыта. Необходимо подготовить закрывающие документы.',
|
||
'priority' => 'high',
|
||
'due_days' => 3,
|
||
],
|
||
'negotiation' => [ // Переговоры
|
||
'title' => 'Провести переговоры по сделке',
|
||
'description' => 'Сделка переведена на этап переговоров. Требуется связаться с клиентом.',
|
||
'priority' => 'medium',
|
||
'due_days' => 2,
|
||
],
|
||
'contract' => [ // Договор
|
||
'title' => 'Подготовить договор',
|
||
'description' => 'Сделка переведена на этап договора. Необходимо подготовить и отправить договор клиенту.',
|
||
'priority' => 'high',
|
||
'due_days' => 1,
|
||
],
|
||
];
|
||
|
||
// Определяем тип перехода и возвращаем соответствующую конфигурацию
|
||
// В реальном приложении эта логика должна быть более гибкой
|
||
// и основываться на конфигурации этапов в базе данных
|
||
|
||
return null; // По умолчанию не создаём задачу
|
||
}
|