start tasks module

This commit is contained in:
root
2026-01-23 08:48:06 +03:00
parent 283b9132a0
commit 725c62a179
22 changed files with 2489 additions and 6 deletions
+135
View File
@@ -0,0 +1,135 @@
<?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; // По умолчанию не создаём задачу
}