start tasks module
This commit is contained in:
@@ -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; // По умолчанию не создаём задачу
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
// Tasks Module Routes
|
||||
|
||||
$routes->group('tasks', ['filter' => ['org', 'subscription:tasks'], 'namespace' => 'App\Modules\Tasks\Controllers'], static function ($routes) {
|
||||
|
||||
// Список задач (таблица)
|
||||
$routes->get('/', 'TasksController::index');
|
||||
$routes->get('table', 'TasksController::table');
|
||||
|
||||
// Канбан
|
||||
$routes->get('kanban', 'TasksController::kanban');
|
||||
|
||||
// Календарь
|
||||
$routes->get('calendar', 'TasksController::calendar');
|
||||
|
||||
// CRUD задач
|
||||
$routes->get('new', 'TasksController::create');
|
||||
$routes->get('create', 'TasksController::create');
|
||||
$routes->post('/', 'TasksController::store');
|
||||
$routes->get('(:num)', 'TasksController::show/$1');
|
||||
$routes->get('(:num)/edit', 'TasksController::edit/$1');
|
||||
$routes->post('(:num)', 'TasksController::update/$1');
|
||||
$routes->get('(:num)/delete', 'TasksController::destroy/$1');
|
||||
|
||||
// API endpoints
|
||||
$routes->post('move-column', 'TasksController::moveColumn');
|
||||
$routes->post('(:num)/complete', 'TasksController::complete/$1');
|
||||
$routes->post('(:num)/reopen', 'TasksController::reopen/$1');
|
||||
});
|
||||
|
||||
// API Routes для Tasks
|
||||
$routes->group('api/tasks', ['filter' => ['org', 'subscription:tasks'], 'namespace' => 'App\Modules\Tasks\Controllers'], static function ($routes) {
|
||||
$routes->get('columns', 'TaskApiController::getColumns');
|
||||
});
|
||||
Reference in New Issue
Block a user