Шаблоны проектов и копирование проекта
Типовое мероприятие создаётся в один клик: этапы, задачи с чек-листами и связями, вехи, команда, смета (ТЗ «Шаблоны, этапы и Гант…», раздел 5). Сроки в шаблоне — не даты, а смещения от дат мероприятия: «за 10 дней до начала», «в день монтажа», «через 2 дня после окончания».
Реализовано: этап 3 — миграция
0189(project_templates,project_origins), модульinternal/modules/projecttemplates, выгрузка и загрузка плана в модуле задач (tasks/plan_io.go), снимок сметы (estimates/snapshot.go), крючокProjectTemplateHookвPOST /projects.
Содержимое шаблона
Один JSON-документ project_templates.content:
| Часть | Что хранится |
|---|---|
stages[] | Ключ, название, цвет |
tasks[] | Ключ, родитель (подзадачи одного уровня), этап, название, описание, роль исполнителя (коды projectroles, пусто — менеджер) или конкретный исполнитель (копия), план часов, внутренняя, обязательность учёта времени, start / due = {anchor, offset}, чек-лист |
dependencies[] | Связи «после окончания» между ключами задач с запасом в днях |
milestones[] | Название, этап, дата {anchor, offset} |
team[] | Роль и человек по умолчанию (может не быть) |
estimate | Снимок сметы: наценка, скидки, разделы и строки (все строки — ручные, без привязок к старому проекту); налоги берёт новый проект от своего продавца |
workdays_only | Смещения в рабочих днях по календарю компании; дата на выходном — ближайший рабочий день раньше |
Якоря: event_start (начало мероприятия), event_end (окончание), mount (монтаж), project_created. Нет даты якоря — запасной: монтаж и окончание считаются от начала мероприятия, его нет — от сегодня; предпросмотр показывает такие якоря в missing_anchors.
Проверки содержимого (project_templates_invalid_content с пояснением): уникальные ключи, ссылки на существующие этапы и задачи, подзадачи одного уровня, связи без круга, известные роли и якоря, смещение не больше двух лет, не больше 500 задач.
Создание проекта по шаблону
POST /project-templates/:id/preview— задачи на рассчитанных датах с исполнителями, вехи, команда, итог сметы,moved_count(сроки в прошлом переносятся на сегодня),by_role_count/to_manager_count.POST /projectsсtemplate_id: проект создаётся как обычно, затемApplyTemplate— команда (люди по умолчанию, неактивные пропускаются), план одной транзакцией модуля задач (исполнитель задачи — участник команды с её ролью, иначе менеджер проекта), черновик сметы, запись происхождения. Ошибка любой части — проект удаляется (projects.Service.DiscardNew), пользователь получает ошибку.- Чат проекта создаётся после наполнения — в нём сразу вся команда.
Стартовая задача менеджеру ставится как обычно; стартовая задача исходного проекта в шаблон и копию не попадает.
«Сохранить как шаблон» и копия
POST /projects/:id/save-as-template {name, anchor, parts}— даты задач и вех превращаются в смещения от якоря проекта, исполнители — в роли по их роли в команде (исполнитель-менеджер — роль «менеджер»), люди команды становятся людьми по умолчанию. Отменённые задачи не берутся.POST /projects/:id/copy {name, company_id, start_planned, end_planned, mount_date, description, parts}— снимок проекта с людьми вместо ролей, сдвинутый вместе с началом мероприятия, применяется к новому проекту в статусе «Запланирован». Не копируются файлы, деньги, логистика, командировки, часы и чат.GET /projects/:id/origin— «Создан по шаблону «…»» или «Копия проекта «…»».
Права
| Действие | Кто |
|---|---|
| Видеть шаблоны, предпросмотр, создать проект по шаблону | Кто может создавать проекты |
| Создавать, править, удалять шаблоны, «Сохранить как шаблон» | Capability project_templates_manage: администратор, правка карточки любого проекта (владелец, операционный и технический директор), руководитель отдела или дивизиона |
| Копировать проект | Кто видит проект и может создавать проекты |
Удалить можно шаблон, по которому ничего не создано; иначе только выключить (is_active=false) — выключенный не предлагается при создании.