Dev Specs

Epic E06 — Maintenance Reports [desktop → PDF]

Назначение эпика: Месячная отчётность по юниту — единый документ за Unit × Year × Month, авто-компилируемый из задач, инцидентов (issues) и пообластных (area) данных, накопленных за месяц. Coordinator/Operations проверяет и дополняет содержимое, переводит отчёт draft → completed и выгружает в PDF (обложка + разделы) для владельца/бухгалтерии. Участвует в use-cases: UC-4 (авто-компиляция месячного отчёта), UC-5 (PDF-выгрузка). Потребляет результаты UC-2 (Task execution) и UC-3 (Issues). Сущности (owns/touches): MaintenanceReport (owns), AreaReport (owns, строка пообластного раздела), ReportTaskLine / ReportIssueLine (owns — снимок-строки скомпилированных задач/инцидентов); touches Unit, UnitArea, Task (+TaskCost), Issue, Employee (assignment). Экраны: S35 (Reports list), S37 (Area Report tab — табличный), S23 (Tasks tab), S24 (Issues tab), S48 (Summary tab), S02 (детальный Area/Summary вид: condition/notes/photos + Reported Issues + Completed Task), S11 (Issue-detail карточка отчёта: Items/Costs/Solution/Vendor Cost), S26 (Cost-summary карточка: Costs/Charges/Handling Fee/Total + Project Duration/Warranty), S57 (PDF cover «betterplace / Maintenance Report / May 2026 / Villa Alaya»). Открытые findings: F-report-task-inclusion-rule (IMPORTANT, какие задачи включаются в отчёт + дефолт включения), F-handling-fee-calculation (IMPORTANT, handling fee авто % vs ручной ввод). Оба влияют на UC-4 и помечены ниже как требует решения заказчика. Также: F-placeholder-copy (лейблы-заглушки), F-units-scope-live-only.

Сведение дублей: в прототипе «Maintenance Report» нарезан на отдельные канвасы-вкладки (S23/S24/S37/S48) и detail-карточки (S02/S11/S26) — это один Report detail экран с вкладками Area Report · Tasks · Issues · Summary. Ниже отчёт описан как один экран с вкладками + drill-in карточки; дубли сведены, повторяющийся header (Unit · Year · Month · Completed at) описан один раз.

✅ Статус реализации (прототип, desktop) — 2026-06-21: эпик E06 desktop ЗАВЕРШЁН. WP-1 (PR #11): S35 list + Report detail (4 вкладки-таблицы Area/Tasks/Issues/Summary). WP-2 (PR #13): drill-in S02/S11/S26 + S57 PDF cover. Все мутации inert 🟡 (нет бэкенда). Дизайн-решение S02 area↔линии: связь области с её Reported Issues / Completed Task реализована через поля AreaReport.reportedIssueIds / completedTaskIds (refs на ReportIssueLine / ReportTaskLine того же reportId) — без новой сущности связи. Отгруженные fallback'и открытых вопросов: Handling Fee = ручной mock (Вариант B §223); Total = Total Costs + Charges + Handling Fee (§154 предположение) — поверхность S26 помечена «Pending client decision», правка inert. Ждут заказчика/бэкенда: реальная UC-4 авто-компиляция, UC-5 серверный PDF-рендер, include/exclude toggle (F-report-task-inclusion-rule), формула handling fee (F-handling-fee-calculation).


S35 — Reports List [desktop]

  • Назначение: список месячных отчётов по юнитам — точка входа в эпик.
  • Источник (Miro): «Maintenance Report» id=3458764672362689135.
  • Layout: header модуля + fast filters/filters (как в общих data-таблицах) → data-table → строка открывает Report detail.
  • Данные на экране (колонки): ID, Unit (напр. Alaya), Year (2026), Month (1), Status, Completed (дата завершения, 22/05/2026), Assignment (ответственный, Sarah Martinez), Report (действие — открыть/PDF).
  • Контролы и действия:
    • filter (input_text + dropdown) → фильтр по Unit / Year / Month / Status (filter).
    • row click → открыть Report detail на вкладке Area Report (button).
    • Report в строке → открыть отчёт (для completed — скачать PDF) (button).
    • 🟡 + New report — создать отчёт за период вручную (button) → см. «Дозумано».
  • Состояния/вкладки: filtered; empty (нет отчётов за период); статус-чип в колонке Status: draft (amber) / completed (electric-green).
  • Связи (data-flow): читает MaintenanceReport (по юнитам в scope роли). Открытие → Report detail. Создаётся записью либо авто-компиляцией (UC-4), либо + New report.
  • Мутации: нет (read-only список); навигация.
  • Права: Coordinator/Operations (свои department-scoped юниты), Accounting (read), Owner Services (read).
  • 🟡 [не было додумано]: + New report и явный статус-чип — на канвасе колонка Status есть, но без значений; добавлено для управляемости (ручной триггер компиляции, см. UC-4). Минимально.
  • Edge cases: период без задач/инцидентов → отчёт пустой, но создаётся (header + пустые разделы); длинное имя юнита — truncate; нет прав на юнит — строка не видна (object-level default-deny).

Report detail — общий каркас (вкладки) [desktop]

Один экран с шапкой и 4 вкладками. Шапка одинакова на всех вкладках.

  • Header (общий, S23/S24/S37/S48/S11/S26): Unit = Villa Alaya, Year = 2026, Month = 1, Completed at = 6 May, 2026. На карточке проекта (S26) дополнительно Project Duration (5 weeks) и Warranty (5 weeks).
  • Вкладки: Area Report (S37/S02) · Tasks (S23) · Issues (S24/S11) · Summary (S48/S02/S26).
  • Финализация: Save / Cancel (на detail-карточках S11), общий переход draft → completed (кнопка Complete report 🟡) и Export PDF 🟡.

S37 — Report › Area Report (tab) [desktop]

  • Назначение: пообластной чек состояния юнита за месяц — таблица по комнатам.
  • Источник (Miro): «Copy of Copy of Maintenance Report» id=3458764672521453864.
  • Layout: header (общий) + tab-bar Area Report · Tasks · Issues · Summary + индикатор auto (раздел сформирован авто-компиляцией) + data-table по комнатам.
  • Данные на экране (колонки): ID (1), Room (Bathroom, Entrance, Living Room), Status, Notes (свободный текст), Photo (превью/иконка).
  • Контролы и действия:
    • row click → открыть детальный Area-вид (S02) (button).
    • auto бейдж → признак авто-компиляции раздела (read).
  • Состояния/вкладки: активная вкладка Area Report; empty (нет area-данных за месяц); строка без фото — плейсхолдер.
  • Связи (data-flow): читает AreaReport (по UnitArea), наполняется из area-photos/notes задач исполнения (UC-2, экран S25/S02 mobile-execution) за период. Открывает S02.
  • Мутации: в draft — редактирование Status/Notes строки (update AreaReport); в completed — read-only.
  • Права: Coordinator/Operations edit; Accounting/Owner Services read.
  • 🟡 [не было додумано]: ничего сверх лейблов; auto присутствует на канвасе дословно.
  • Edge cases: комната без задач за месяц → строка с пустыми Status/Notes/Photo; очень длинные Notes — clamp + раскрытие в S02.

S02 — Report › Area / Summary detail view [desktop]

  • Назначение: развёрнутый вид одной области (или Summary-блока) отчёта: состояние + заметки + фото + связанные инциденты и завершённые задачи.
  • Источник (Miro): «Screen 3» id=3458764672541523283.
  • Layout: заголовок Summary (большой текстовый блок) → блок Area Report с под-секциями по комнатам (Bathroom, Living Room), каждая: Condition:, Notes:, Photos: → таблица Reported Issues → таблица Completed Task.
  • Данные на экране:
    • Per-area: Condition: (статус), Notes: (длинный текст), Photos: (галерея).
    • Reported Issues (колонки): Issue (Broken AC), Description (text), Reported at (22/05/2026), Issue Department (Operations), Related Task (AC Maintenance), Task Status, Issue Report, Task Report.
    • Completed Task (колонки): Task Name / Task (Broken AC), Completed at (22/05/2026), Task Department (Operations), Task Type (Direct / Issue / Schedule), Task Report.
  • Контролы и действия:
    • Issue Report / Task Report ссылка → открыть Issue-detail (S11) / Task-report.
    • в draft: редактирование Condition / Notes, добавление Photos (button/input).
  • Состояния/вкладки: это drill-in detail; режимы edit (draft) / read (completed).
  • Связи (data-flow): читает AreaReport + связанные Issue и завершённые Task (status = Finished) этой области за период. Task Type (Direct/Issue/Schedule) — из самой задачи.
  • Мутации: update AreaReport.condition/notes/photos (draft only).
  • Права: Coordinator/Operations edit; прочие read.
  • 🟡 [не было додумано]: ничего; набор полей дословно с канваса. (Лейблы-заглушки Text text text… — placeholder, F-placeholder-copy.)
  • Edge cases: область без issues и без completed tasks → обе таблицы empty; фото отсутствуют → плейсхолдер галереи.

S23 — Report › Tasks (tab) [desktop]

  • Назначение: таблица всех задач, включённых в отчёт за месяц.
  • Источник (Miro): «Copy of Maintenance Report» id=3458764672365443179.
  • Layout: header (общий) + tab-bar + data-table задач.
  • Данные на экране (колонки): ID (1), Task Name / Task (AC Maintenance, Check Wifi, Plumbing Repair), Status (Planned), Task Type (Direct / Issue), Finished (дата), Department (Operations), Report Status, Report (ссылка на task-report).
  • Контролы и действия:
    • filter (input_text + dropdown) → фильтр строк (filter).
    • row → открыть task-report / связанную задачу (button).
    • в draft: include/exclude задачи из отчёта (toggle) 🟡 — см. UC-4 / F-report-task-inclusion-rule.
  • Состояния/вкладки: активная Tasks; filtered; empty (нет задач за период).
  • Связи (data-flow): читает снимок ReportTaskLine (скомпилирован из Task за Unit×Month, см. UC-4). Task Type/Department/Finished — из задачи.
  • Мутации: в draft — переключение включения строки (если правило включения = ручное/смешанное, F-report-task-inclusion-rule).
  • Права: Coordinator/Operations edit; Accounting/Owner Services read.
  • 🟡 [не было додумано]: include/exclude toggle — прямое следствие открытого вопроса о наборе задач (F-report-task-inclusion-rule). Реализуется ТОЛЬКО если заказчик выберет вариант с ручным контролем включения.
  • Edge cases: задача без отчёта исполнения → Report Status пуст; статус Planned (не завершена) — см. правило включения.

S24 — Report › Issues (tab) [desktop]

  • Назначение: таблица инцидентов (issues) юнита за месяц с привязкой к задачам.
  • Источник (Miro): «Copy of Copy of Maintenance Report» id=3458764672539781421.
  • Layout: header (общий) + tab-bar + data-table инцидентов.
  • Данные на экране (колонки): ID (1), Issue (AC Maintenance), Description, Reported at (22/05/2026), Department (Operations), Associated Task (AC Maintenance), Task Status, Task Report, Report Status.
  • Контролы и действия:
    • filter (input_text + dropdown) → фильтр (filter).
    • row → открыть Issue-detail карточку (S11) (button).
    • Task Report → открыть отчёт связанной задачи (button).
  • Состояния/вкладки: активная Issues; filtered; empty (нет инцидентов).
  • Связи (data-flow): читает снимок ReportIssueLine (скомпилирован из Issue за Unit×Month, UC-4). Associated Task/Task Status — из Issue → Task (E05).
  • Мутации: в draft — include/exclude (toggle) 🟡 (зависит от F-report-task-inclusion-rule для issue-linked задач).
  • Права: Coordinator/Operations edit; прочие read.
  • 🟡 [не было додумано]: ничего сверх лейблов (toggle — как в S23).
  • Edge cases: issue без связанной задачи → Associated Task/Task Status пусты; длинное Description — clamp.

S11 — Report › Issue detail (Items / Costs / Solution / Vendor Cost) [desktop]

  • Назначение: развёрнутая карточка одного инцидента в отчёте — что чинили, стоимость, решение, расходы по вендорам.
  • Источник (Miro): «Copy of Copy of Maintenance Report» id=3458764672550469657.
  • Layout: header (общий) → блок Items (таблица) → блок Costs / Solution / Cost / Vendor Cost (Photos) → нижние Total + Save / Cancel.
  • Данные на экране:
    • Items (колонки): ID (1,2,3), Name (AC Maintenance, Direct, Plumbing Repair), Problem (Maintenance Issue), Report, стоимость (200,000.00 IDR), Solution (Check Wifi).
    • Vendor-блок (колонки): Name (New Sink), Type (Item / Installation / Labor), Vendor, Cost (100,000.00 IDR).
    • Total (200,000.00 IDR).
  • Контролы и действия:
    • Save (button) → сохранить правки карточки (draft).
    • Cancel (button) → отменить.
    • в draft: редактирование solution / costs / vendor cost (input).
  • Состояния/вкладки: edit (draft) / read (completed).
  • Связи (data-flow): читает Issue + связанные Task + TaskCost (items/labor) + vendor-расходы. Total агрегирует costs строки.
  • Мутации: update solution/costs/vendor cost; пересчёт Total (сумма строк).
  • Права: Coordinator/Operations + Accounting (financial fields) edit; прочие read.
  • 🟡 [не было додумано]: ничего; поля дословно.
  • Edge cases: нет vendor-расходов → блок empty; Total при пустых costs = 0.00 IDR.

S26 — Report › Cost Summary (Costs / Charges / Handling Fee / Total) [desktop]

  • Назначение: финансовая сводка отчёта (или проектной части): суммарные расходы, наценки, handling fee и итог; плюс Project Duration / Warranty.
  • Источник (Miro): «Copy of Copy of Copy of Maintenance Report» id=3458764672552988107.
  • Layout: header (общий) + Project Duration (5 weeks) + Warranty (5 weeks) → блок Items (две группы Cost Item 1 / Cost Item 2, каждая: Cost Item 100,000.00 IDR + Cost Labor 100,000.00 IDR) → итоговый блок: Total Costs, Charges, Handling Fee, Total.
  • Данные на экране:
    • Items: Cost Item (Cost Item 1 = 200,000.00 IDR; разбивка Cost Item 100,000.00 IDR + Cost Labor 100,000.00 IDR), Cost Item 2 аналогично.
    • Итоги: Total Costs (100,000.00 IDR), Charges (200,000.00 IDR), Handling Fee (200,000.00 IDR), Total (100,000.00 IDR).
  • Контролы и действия:
    • 2× button (предположительно Save / Cancel или Export) — на канвасе без подписи.
    • в draft: правка Charges, Handling Fee (если ручной режим — F-handling-fee-calculation) (input).
  • Состояния/вкладки: edit (draft) / read (completed).
  • Связи (data-flow): агрегирует TaskCost всех включённых задач/инцидентов отчёта → Total Costs. Handling Fee — см. UC-4 / F-handling-fee-calculation. Total = Total Costs + Charges + Handling Fee (формула предполагаемая, требует решения заказчика).
  • Мутации: пересчёт итогов при изменении состава costs / charges / handling fee.
  • Права: Accounting + Coordinator/Operations edit financial; Owner Services read.
  • 🟡 [не было додумано]: формула Total явно на канвасе не определена (placeholder-значения противоречивы: Total Costs < компонентов). Принято: Total = Total Costs + Charges + Handling Fee; помечено как требует подтверждения (вместе с F-handling-fee-calculation). Не вводим доп. строки сверх канваса.
  • Edge cases: Handling Fee = 0 при отсутствии правила; Charges пустые; placeholder-суммы заменяются реальной агрегацией.

S48 — Report › Summary (tab) [desktop]

  • Назначение: сводная вкладка отчёта — текстовое резюме месяца.
  • Источник (Miro): «Copy of Copy of Copy of Maintenance Report» id=3458764672540483301.
  • Layout: header (общий) + tab-bar + крупный текстовый блок Summary (1 button).
  • Данные на экране: заголовок Summary + свободный текст (детально раскрывается в S02-варианте Summary).
  • Контролы и действия:
    • 1× button — Edit / Generate summary 🟡 (на канвасе без подписи).
    • в draft: редактирование summary-текста (input).
  • Состояния/вкладки: активная Summary; edit / read.
  • Связи (data-flow): читает MaintenanceReport.summary (опц. авто-черновик из агрегатов, UC-4). Развёрнутый вид — S02.
  • Мутации: update MaintenanceReport.summary (draft only).
  • Права: Coordinator/Operations edit; прочие read.
  • 🟡 [не было додумано]: «Generate summary» — опциональная авто-генерация черновика резюме из агрегатов (issues count / total costs). Помечено опциональным; базово — ручной текст.
  • Edge cases: пустой summary в draft — допустимо; при completed без summary — раздел в PDF пропускается.

S57 — PDF Cover [desktop → PDF]

  • Назначение: обложка экспортируемого PDF-документа отчёта.
  • Источник (Miro): «Screen 2» id=3458764672541130293.
  • Layout: центрированная обложка: бренд betterplace → заголовок Maintenance Report → период May 2026 → объект Villa Alaya. Без контролов (рендер-артефакт, не интерактивный экран).
  • Данные на экране: betterplace (лого/wordmark), Maintenance Report (тип документа), May 2026 (Month Year отчёта), Villa Alaya (Unit).
  • Контролы и действия: нет (страница PDF).
  • Состояния/вкладки: единственное.
  • Связи (data-flow): значения подставляются из MaintenanceReport (Unit, Month, Year). За обложкой следуют разделы PDF: Area Report → Tasks → Issues → Cost Summary → Summary (порядок вкладок).
  • Мутации: нет (генерация документа).
  • Права: доступ к PDF = доступ к отчёту (Operations/Accounting/Owner Services).
  • 🟡 [не было додумано]: порядок разделов PDF задан по порядку вкладок отчёта; на канвасе явно только обложка. Аналог обложки для проектов — S58 (Repair and Project Proposal), относится к E07.
  • Edge cases: период без данных → PDF = обложка + пустые разделы; имя юнита — в прототипе Villa Alaya (полное) vs Alaya в списке S35 → используем полное имя на обложке.

Use-case UC-4 — Авто-компиляция месячного отчёта

Триггер: конец месяца (плановая компиляция) либо ручной + New report (S35) для пары Unit × Year × Month.

Шаги (концептуально, логика — фаза реализации):

  1. Создать MaintenanceReport(unit, year, month, status=draft) (идемпотентно — один отчёт на период; повторный запуск пересобирает draft, не трогает completed).
  2. Area Report (S37): собрать AreaReport по UnitArea — condition/notes/photos из задач исполнения за период (UC-2). Раздел помечается auto.
  3. Tasks (S23): собрать задачи юнита за месяц в ReportTaskLineпо правилу включения (F-report-task-inclusion-rule, см. ниже).
  4. Issues (S24): собрать Issue юнита за месяц + связанные задачи в ReportIssueLine.
  5. Cost Summary (S26): агрегировать TaskCost включённых задач/инцидентов → Total Costs; добавить Charges; вычислить Handling Fee (F-handling-fee-calculation, см. ниже); посчитать Total.
  6. Summary (S48): пустой текст (или авто-черновик — опционально).
  7. Coordinator проверяет/правит вкладки → Complete report (draft → completed) → отчёт замораживается (read-only), доступен Export PDF.

Снимок vs живые данные: строки отчёта (ReportTaskLine/ReportIssueLine/AreaReport) — снимок на момент компиляции (а после completed — заморожены), чтобы PDF был воспроизводим и не «плыл» при последующих изменениях задач. (🟡 решение: снимок, не live-join; обоснование — отчёт = документ за закрытый период.)

⚠️ Открытый вопрос 1 — какие задачи включаются (F-report-task-inclusion-rule) — требует решения заказчика

Sticky-note (×2): «only approved or approved and finished? tasks can be included?» + «what should be by default — tasks included or excluded». Два аспекта:

  • Критерий включения — два варианта:
    • Вариант A — только approved + finished: в отчёт попадают лишь подтверждённые и завершённые за месяц задачи. Чище для владельца/счёта; Planned-задачи (видны на S23 как Planned) исключаются.
    • Вариант B — все задачи периода (включая Planned/approved-но-не-finished): полнее операционно; требует колонки Status для различения и, вероятно, исключения незавершённых из Cost Summary.
  • Дефолт включения строки — два варианта:
    • Вариант 1 — included by default: все подходящие строки включены, Coordinator вручную исключает лишнее (toggle на S23/S24).
    • Вариант 2 — excluded by default: строки приходят выключенными, Coordinator вручную включает.

Комбинация (критерий × дефолт) определяется заказчиком. До решения прототип показывает все строки периода с колонкой Status и include/exclude toggle (наиболее общий случай, покрывает любой исход). Не реализовывать фиксированное правило до подтверждения.

⚠️ Открытый вопрос 2 — авторасчёт handling fee (F-handling-fee-calculation) — требует решения заказчика

Sticky-note: «handling fee automatical». Два варианта (затрагивает Total на S26 и Proposal S04 в E07 — формула должна быть единой):

  • Вариант A — авто, % от costs: Handling Fee = rate% × Total Costs (rate — настройка, напр. на уровне Unit/глобально). Поле read-only, пересчитывается при изменении costs.
  • Вариант B — ручной ввод: Handling Fee вводится оператором (Accounting), не зависит от costs.
  • (Возможен гибрид: авто-предложение % с правом ручного override.)

Базовая формула итога (тоже на подтверждение): Total = Total Costs + Charges + Handling Fee. До решения — поле редактируемое (Вариант B) как безопасный дефолт, формула Total помечена комментарием. Не зашивать % до подтверждения ставки и базы расчёта.


Use-case UC-5 — PDF-выгрузка

  • Доступна для completed-отчёта (для draft — превью 🟡, опционально).
  • Структура документа: Cover (S57)Area ReportTasksIssuesCost Summary (S26)Summary. Порядок = порядок вкладок.
  • Источник значений обложки — MaintenanceReport (Unit, Month, Year, бренд betterplace).
  • Финансовые суммы в PDF — из замороженного снимка (UC-4), формат 200,000.00 IDR, даты DD/MM/YYYY.
  • Пустые разделы (нет данных) пропускаются либо рендерятся как «No data».
  • 🟡 [не было додумано]: формат вывода — серверный рендер HTML→PDF (фаза реализации). На уровне спецификации фиксируем только состав и порядок страниц.

Cross-screen relations (внутри эпика)

S35 (Reports list)
  │ row click → Report detail (tab=Area Report)
  ▼
Report detail [header: Unit·Year·Month·Completed at]
  ├─ tab Area Report (S37) ──row──► Area detail (S02: condition/notes/photos + Reported Issues + Completed Task)
  ├─ tab Tasks (S23) ───────row──► task-report
  ├─ tab Issues (S24) ──────row──► Issue detail (S11: Items/Costs/Solution/Vendor Cost)
  └─ tab Summary (S48) ─────────► Summary detail (S02 Summary) + Cost Summary (S26)
        │ Complete report (draft → completed)
        ▼
   Export PDF: Cover (S57) → Area → Tasks → Issues → Cost Summary (S26) → Summary

Данные приходят из: UC-2 (Task execution → area photos/notes, TaskCost), UC-3/E05 (Issues + связанные задачи). Уходят: PDF-документ (владелец/бухгалтерия). Compile = UC-4.

Решения заказчика (2026-06-22)

Ответы со встречи Akira × Sergey (реестр 00-client-questions.md). Перекрывают соответствующие 🟡-допущения ниже.

  • K-2 · «Reports» → «Maintenance Reports»; деньги — НЕ здесь: раздел переименовать в Maintenance Reports (Projects — отдельная вкладка, E07). По заказчику, Maintenance Report про деньги НЕ говорит: договор управления активом разрешает мелкий ремонт в пределах лимита (~1–2 млн IDR) без счёта/согласования; отчёт = факт сделанных работ + возникшие проблемы, не финансовый документ.
    • Следствие для S26 Cost Summary (Charges/Handling Fee/Total): это Projects-концепт (E07), не Maintenance Report. Открытый вопрос 2 (F-handling-fee-calculation) в этом эпике СНЯТ → переезжает в E07 (handling fee = ручной + пресеты, charges = группа). S26 в текущем виде — кандидат на удаление/перенос из E06 при вёрстке (Tier C, вместе с E07 costs). Issue-level repair costs (S11) заказчик удалять НЕ просил — не трогаем без отдельного подтверждения.
  • Q-01 · report-task-inclusion-rule — РЕШЕНО (resolves UC-4 открытый вопрос 1):
    • В отчёт автоматически постятся все завершённые задачи по этой вилле за год+месяц (критерий = finished за период), со статусом «не включено» по умолчанию (дефолт = excluded).
    • Оператор перед отправкой кликабельно включает нужные (нужна кнопка «включить все»). Только включённые попадают в итоговую секцию completed task reporter.
    • То же для Issues (S24): все зарепорченные за месяц/год по вилле, included/not-included — кликабельно.
    • Дельта к вёрстке (S23/S24): дефолт included → excluded; include-toggle становится интерактивным (клик в отчёте) + кнопка «включить все». Комбинация «критерий × дефолт» = (finished-за-период × excluded-by-default). → Tier B U5.

Дозумано на уровне эпика 🟡

  • Сведение дублей в один Report detail с вкладками — канвасы S23/S24/S37/S48 имеют идентичный header и tab-bar; это состояния одного экрана, не 4 экрана. Отклонение от «по канвасу на экран» — осознанное (минимизация дублей, как требует overview §8 и template).
  • Статус-чип draft/completed и переход Complete report — колонка Status (S35) на канвасе без значений; жизненный цикл достроен (draft = редактируемый, completed = замороженный + PDF). Минимально необходимо для UC-4/UC-5.
  • + New report (ручной триггер компиляции) — на канвасе нет кнопки создания; добавлено для управляемости (наряду с плановой компиляцией).
  • Снимок-строки (ReportTaskLine/ReportIssueLine) — введены как сущности, чтобы отчёт был воспроизводимым документом за закрытый период (а не live-join). Обоснование выше (UC-4).
  • include/exclude toggle на Tasks/Issues — прямое следствие F-report-task-inclusion-rule; включается ТОЛЬКО при варианте с ручным контролем. До решения заказчика — нейтральный fallback.
  • Формула Total и режим Handling Fee — на канвасе значения-placeholder противоречивы; зафиксированы предположения + помечены требует решения заказчика (F-handling-fee-calculation). Единая формула должна совпасть с Proposal (E07, S04).
  • Порядок страниц PDF — задан по порядку вкладок; на канвасе явно только обложка (S57).