73 lines
4.7 KiB
Markdown
73 lines
4.7 KiB
Markdown
# Спецификация 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» |
|