Назначение эпика: Конструктор повторяющихся сервисов (Service) и шаблонов работ (TaskTemplate) + конфигуратор движка пересчёта (recalculation engine). Это «фабрика задач»: связка Service → Trigger → TaskTemplate материализуется движком в конкретные Task(Planned) по объектам. Ядро UC-1.
Участвует в use-cases: UC-1 (плановая генерация задач), косвенно UC-2/UC-3 (Tasks/исполнение получают сгенерированные задачи).
Сущности (owns/touches):
Service (+ Service.trigger), TaskTemplate (+ Section → Room|System → TemplateTask), recalc-конфиг (S46 — read-only-визуализация в прототипе).Task (создаёт service-tasks через движок); reads Unit (connected_properties + Department Defaults для назначения), Reservation (триггеры reservation/vacancy).
Экраны: S36 + S43 (Services & Templates list — две вкладки), S33 + S53 + S54 + S55 (New Service — Trigger-билдер, сведены в один экран с состояниями триггера), S01 (Task Template editor), S46 (recalculation rules).
Открытые findings: F-filter-hierarchy-assignee (модель назначения/Vendors — overview §3, влияет на то, кому движок назначает service-task). Тексты-заглушки в прототипе («Description Description…») — реальные лейблы уточнить у заказчика.Services (повторяющиеся сервисы) и Task Templates (шаблоны работ). Точка входа в создание/редактирование сервисов и шаблонов.Services / Task Templates, столбцы Services — объединение обоих вариантов.Services and Templates) → tab-bar (Services | Task Templates) → fast-filters + filters → data-table → + add (создать). Detail открывается отдельным экраном (New/Edit Service — S33; Template editor — S01).ID, Name, Department, Sub-Department, Task (имя связанного TaskTemplate), Trigger (тип: Time / Reservation / Vacancy), Created (дата), Status, Connected Properties. Примеры строк: AC Maintenance / Operations / Time, Daily Cleaning / Reservation, Daily Cleaning / Vacancy.ID, Name, Department, Sub-Department, Status. Примеры: Operations / AC Maintenance, Operations / Daily Cleaning.Services / Task Templates — переключение списка (toggle).fast filters / filters — фильтрация по department/status/trigger (filter; общий компонент из overview §4).+ add — создать новый Service (→ S33 пустой) или Template (→ S01 пустой), в зависимости от активной вкладки (button → create).Service (+ trigger, connected_properties count) и TaskTemplate. Service ссылается на TaskTemplate (Task-колонка = template name). Изменение Service/Template Status → триггер пересчёта движка (S46) по connected properties.Status (active/inactive) может быть инлайн — но в прототипе фиксируем как действие detail-экрана. 🟡 ниже.Services & Templates с вкладками Services · Task Templates.Status в строке списка — не подтверждён прототипом; основное место смены статуса — detail. Помечено как опциональное.No services yet / + add); длинное Connected Properties (показывать count + tooltip-список); сервис без связанного TaskTemplate (Status не может быть active — см. S33 валидация).On + Check In / Check Out / every 2 days of occupancy); S54 (id …485483255) = состояние Trigger = Vacancy (On + every 2 days of vacancy). Сведены в один экран с тремя состояниями Trigger.Services and Templates › New Service) → tab-bar (Services | Task Templates) → форма: блок Service-метаданных (Name / Department / Subdepartment / связанный Template / Connected Properties) + блок Trigger (выбор типа → контекстные поля правила) → footer-кнопки Save · Cancel · Save and Activate.Name, Department (напр. Operations), Subdepartment, связанный Task Template, Connected Properties (список units).Trigger, тумблер On):
Every [N] {day | week | month | quarter}; для week — on {день недели}; для month — on [Nd] last / first day; для quarter — on [Nd] of [1st] month. (дословно из S33).On + выбор Check In day / Check Out day / every Nth day of reservation (S53: «Check In Check Out every 2 days of occupancy»).On + every N days of vacancy (S54: «every 2 days of vacancy»).Name (input); Department, Subdepartment (dropdown); связанный Task Template (dropdown — список из вкладки Task Templates); Connected Properties (multi-select units).Time / Reservation / Vacancy (dropdown/segmented); On (toggle — включить триггер).Every [N] (input number); period (dropdown day/week/month/quarter); день недели / Nd / last/first day / of Nth month — контекстно по типу period (dropdown/input).Save (button → создать/сохранить Service в статусе draft/inactive, без запуска пересчёта).Save and Activate (button → сохранить + Status=active → триггерит recalculation по connected properties, см. S46).Cancel (button → назад к списку без сохранения).Save and Activate заблокирован).Service (+ Service.trigger {type, rule}). Читает TaskTemplate (выбор шаблона), Unit (connected_properties + Department Defaults — кому назначать сгенерированные задачи). Save and Activate → событие service active → recalculation engine (S46) генерирует Task(type=Schedule|Reservation, status=Planned) по каждому connected unit на горизонт 30 дней.Service (Name, dept, subdept, template_id, connected_properties[], trigger).Status: draft → active (Save and Activate) / active → inactive.Save = сохранить как inactive (без пересчёта), Save and Activate = сохранить + запустить движок. Разделение выведено из наличия двух кнопок; прототип не подписывает семантику явно.Sections → (Room | System) → Tasks. Описывает, ЧТО именно должно быть сделано при срабатывании сервиса — конкретные задачи с описанием, департаментом, категорией, баллом и требованием фото. Это «содержимое» задачи, которую материализует движок.Services and Templates) → tab-bar (Services | Task Templates) → панель свойств шаблона (Priority / Task Type / Department / Subdepartment / Due Date / Due Time / Auto Issues) → дерево Sections: каждая секция (General, Bedroom, Bathroom, …) содержит таблицу Tasks; внутри секции — группировка по room / system. Footer: Save · Cancel · Save and Activate.Priority (напр. Medium), Task Type (Non Blocking / Blocking), Department (Operations), Subdepartment (Operations), Due Date / Due Time (EOD / EOND / EOW / EOM, напр. 12:00), Auto Issues (On / Off).General, Bedroom, Bathroom, …), действие arrange (порядок). Кнопки + section, + room, + system.Task (напр. Clean Something), Description (Description Description… — заглушка), Department (Operations), Category (Cleanliness), Score, Photo Req (флаг требования фото). Per-task действия: edit, remove. Per-section: + add photo (Area Photo), + add task.Priority (dropdown); Task Type Blocking/Non Blocking (toggle/dropdown); Department/Subdepartment (dropdown); Due Date (dropdown/date); Due Time EOD/EOND/EOW/EOM (dropdown); Auto Issues On/Off (toggle).+ section (button → добавить секцию); arrange (drag-reorder секций); + room / + system (button → добавить группу внутри секции — комната или инженерная система).edit (inline-редактор полей task), remove (удалить task).+ add task (button → новая строка task в секции); + add photo / Area Photo (button → требование фото зоны).Save / Save and Activate / Cancel (как в S33).+ section); секция свёрнута/развёрнута; task в режиме edit; Auto Issues On (при невыполнении генерится Issue) vs Off.TaskTemplate (+ Section {auto_issues, priority, due_time} → Room|System → TemplateTask {name, description, department, category, score, photo_required}). Читается из S33 (Service ссылается на template). При генерации задачи движком: TemplateTask → TaskRequirement исполняемой Task (area → tasks + reference + photo + comment, см. data model). Auto Issues=On → при failed task движок/исполнение создаёт связанный Issue.TaskTemplate, Section, Room/System, TemplateTask; reorder секций (arrange); transition Status (draft → active через Save and Activate).Section → Room | System: секция группирует задачи по комнате (Bedroom/Bathroom) ИЛИ по инженерной системе (Fire Safety/Pool/CCTV — из InfraItem.system). Выведено из кнопок + room / + system + data model. Обоснование: связывает шаблон с UnitArea и InfraItem объекта при материализации.Due Time коды: EOD = End of Day, EOND = End of Next Day, EOW = End of Week, EOM = End of Month. Расшифровка додумана (прототип даёт только аббревиатуры) — задаёт due_at сгенерированной задачи относительно даты её плановой даты.Category (Cleanliness, …) и Score — оценочная рубрика задачи (вероятно для maintenance-отчёта/качества). Прототип не объясняет шкалу Score — уточнить.Photo Req=On, но в исполнении фото не приложено → задачу нельзя Finish (контракт с E04); очень длинный Description (заглушки) — truncate + tooltip.Service + Template + Trigger превращаются в Task(Planned). В прототипе — read-only визуализация правил; исполняемая логика — фаза реализации (cron 00:01 + event-driven, ARQ/Celery-стиль).Schedule ahead: 30 days; Rule: Every day at 00:01 for next day + 30.1 time per day; every day; on a day of a week every week (e.g. monday, tuesday, friday); every nth day of a month; every last day of a month; every n months on a week day.every nth day of vacancy.check in day / check out day / every nth day of reservation.service added to property; service removed from property; service set active / not active; new reservation; reservation edit; reservation deletion.recalculation starts with tomorrow; edits only to service tasks; delete before creating service tasks; locked are not edited.controls: —). Read-only визуализация. 🟡 ниже про потенциальный редактируемый Schedule ahead / cron time.Триггер пересчёта (одно из: service add/remove, service active/inactive,
reservation new/edit/delete) ИЛИ cron 00:01
│
▼
Для каждого затронутого Unit (Service.connected_properties):
1. Определить горизонт: [tomorrow .. tomorrow+30].
2. УДАЛИТЬ существующие service-tasks этого Service в горизонте,
КРОМЕ locked=true (delete before creating; locked are not edited).
3. По Service.trigger развернуть occurrences в горизонте:
Time → по периоду (day/week/Nd month/last day/N months on weekday);
Reservation → из Reservation объекта (check-in / check-out / every Nth day);
Vacancy → дни простоя между бронями (every Nth day of vacancy).
4. Для КАЖDOГО occurrence × КАЖDOГО (Room|System) шаблона:
материализовать Task(status=Planned, type=Schedule|Reservation,
unit, area, service_id, template_id, due_at = occurrence + Due Time код,
priority/department из шаблона/секции,
assignment = Unit.AssignmentDefault[department]).
TemplateTask-строки → TaskRequirement задачи (area→tasks+reference+photo+comment).
5. Затрагивает ТОЛЬКО service-tasks (type Schedule/Reservation); Direct/Issue-задачи не трогает.
Читает: Service(+trigger, connected_properties, template_id), TaskTemplate(Sections/Rooms/Systems/TemplateTasks), Unit(areas, AssignmentDefault), Reservation(check-in/out для reservation/vacancy-окон). Пишет: Task(+TaskRequirement).Task(status=Planned) в горизонте по затронутым units; никогда не трогает locked=true и не-service задачи.locked-задача — Task.locked=true (in-progress/назначенная/started). Движок её не удаляет и не правит. Связь с Task data model подтверждена; смысл «почему locked» додуман: защита уже начатой/назначенной работы от перезаписи пересчётом.Unit.AssignmentDefault[department] (S39 Department Defaults) — выведено из data-flow overview §5 «assign by Department Defaults». В S46 явно не указано.Due Time шаблона (EOD/EOND/EOW/EOM) применяется к дате occurrence для расчёта due_at. Связка S01↔S46 додумана.Schedule ahead/cron-time — в прототипе read-only; в реализации может стать настройкой. Не расширяем прототип.locked между двумя прогонами → второй прогон её сохраняет; горизонт сдвигается ежедневно (вчерашний «tomorrow+30» хвост достраивается на +1 день).S36/S43 (list)
│ tab=Services → + add / row click
├────────────────────────────────► S33/S53/S54/S55 (New/Edit Service: Trigger builder)
│ │ выбор Task Template (dropdown)
│ ▼ ссылается на
│ tab=Task Templates → + add / row click
└────────────────────────────────► S01 (Task Template editor: Sections→Rooms/Systems→Tasks)
S33 «Save and Activate» (Service active) ──событие──► S46 (recalculation engine)
Reservation new/edit/delete ──событие──► S46
cron 00:01 ──tick────► S46
│ delete+create
▼
Task(Planned) ──► E03 Tasks / E04 mobile execution
Ответы со встречи Akira × Sergey (реестр
00-client-questions.md). Перекрывают соответствующие 🟡-допущения ниже.
Trigger-типы сервиса (Time/Reservation/Vacancy) НЕ меняются — это про генерацию задач, отдельно от occupancy-статуса юнита.issues-req-and-not-req): ввести два типа темплейта — обычный Task и Inspection.
Score и не порождает issues.Score; ответ «нет» → автоматически создаёт Issue (существующий Auto Issues=On). Та же исполняемая сущность Task (общие листы), но отдельный тип темплейта с другой настройкой — чтобы не путать оператора (качественные пресеты).Priority: Medium) — РЕШЕНО: шкала Low / Standard / High / Emergency, дефолт Standard. Medium/Normal → Standard. Единый enum с E03/E05.due_at); НЕ привязаны жёстко к датам брони даже для reservation-триггеров (бронь задаёт occurrence, дальше у задачи свои даты/дедлайн).Save vs Save and Activate. Save = сохранить inactive/draft без пересчёта; Save and Activate = active + запустить движок. Выведено из пары кнопок, прототип семантику не подписывает.locked. Явно сформулированы как инвариант движка (delete-before-create в окне; locked неприкосновенны). В прототипе подразумевается строкой «delete before creating / locked are not edited».Due Time (EOD/EOND/EOW/EOM) и Task Type (Blocking/Non Blocking → блокирует ли невыполнение зависимые/отчёт). Прототип даёт аббревиатуры без легенды — расшифровка помечена для подтверждения заказчиком.