VEU.WathBody/1-docs/4-modules/m10-phone-ui/api_specs/04-history-programs.md

73 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Спецификация 04: экраны «История» и «Программы», сервис ProgramView
Источники: Ф-5 (история), Ф-11.3 (отчёт план/факт), Ф-10 (просмотр),
m09 `PlanMatch`/DAO. Единицы 5–6 + сервис 11.
## 1. ProgramView (чистая функция над body активной версии)
Вход: `body` (JSON-строка), `dayOfWeekIso` (1=понедельник …
7=воскресенье, m09 PlanMatch). Выход:
```
SessionView(day: String, focus: String?,
items: List<ItemView>)
ItemView(exerciseName: String, planSets: List<SetPlan>)
SetPlan(weightKg: Double, reps: Int)
```
Правила: первая сессия дня недели из `weeks[].sessions[]` (та же
семантика, что `PlanMatch.planFor` — m09); порядок недель — по
номеру, упражнения — как в JSON; подходы упражнения — все из
`sets[]`; битый/пустой body или нет сессии дня — пустой список
(экран — «план на сегодня не задан»); дни недели — ISO-имена
(`monday…sunday`). Отдельно `allWeeks(body)` для экрана «Программы»
(полная структура недель без привязки к дню).
## 2. «История» (Ф-5)
`HistoryViewModel`: `history` (Flow: finished/cancelled по
убыванию started_at — m09 DAO). Список: дата/время, длительность
(endedAt − startedAt; незавершённая — «—»), число подходов, веха
вида (normal/return/deload/test). Карточка тренировки (по выбору):
- шапка: дата, длительность, статус (завершена/отменена), вид;
- список подходов: упражнение, вес × повторы, источник («правка»
в v1; «голос/часы» — словарь m09 `source`), метка «по плану»/
«отклонение», RPE, боль в колене (если есть);
- отчёт план/факт (Ф-11.3, локально): доля подходов `in_plan` =
inPlan / all (процент + текст «из N подходов по плану»); средний
пульс — если записан (v1 обычно «—», .fit-факты — сервер);
- всё из LocalDb, без сети (Ф-5.3).
## 3. «Программы» (Ф-10, просмотр)
`ProgramsViewModel`: `activeProgram` (Flow, m09 DAO), список локально
известных версий (`program_version` таблица: номер, статус, автор,
дата). Экран:
- сводка активной: номер версии, статус active, автор, дата;
- «План на сегодня» — `ProgramView.sessionFor(activeBody, today)`:
упражнения с планом вес × повторы (тот же блок, что на тренировке);
нет сессии — «сегодня по плану отдыха»;
- полная структура — `allWeeks`: неделя № → сессии (день, фокус) →
упражнения → план подходов; сворачиваемые карточки недель;
- 🛡 только чтение: активация/применение rules-draft — консоль
владельца (решение гейта 1.3 m10; Ф-12.3 телефонный путь —
кандидат v2);
- нет активной версии — заглушка «Программа не назначена —
обратитесь к владельцу» + кнопка «Обновить» (GET programs/active,
m09 ApiClient → запись в LocalDb + schedule sync).
Словарь групп (общий для экранов): push «жим», pull «тяга»,
legs «ноги», core «кор», cardio «кардио».
## 4. Тесты (unit, pure JVM)
| # | Проверка | Ожидание |
|---|---|---|
| 1 | `sessionFor` — среда, две сессии в дне | первая сессия, подходы по порядку |
| 2 | `sessionFor` — день без сессий / пустой body / битый JSON | пустой список, исключений нет |
| 3 | `sessionFor` согласован с `PlanMatch.planFor` | упражнение/вес/повторы первой сессии совпадают |
| 4 | `allWeeks` — порядок недель/упражнений | как в JSON |
| 5 | План/факт карточки: 2 in_plan из 5 | 40 %, текст «из 5 подходов по плану 2» |