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