bp/app/Modules/Tasks/Config/Events.php

136 lines
6.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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; // По умолчанию не создаём задачу
}