feat: закрыть остаточные P1/P2 по профилю, когорте и ведомости

- профиль приведён к docs/09: variant/level, updatedBy/name, лимит попыток
- V14: NOT NULL и полная уникальность когорты, preflight legacy-групп
- возврат группы из архива и история членства на странице группы
- пагинация групп и плоского списка материалов
- пакетные сдачи ведомости одним запросом
- XLSX-preflight импорта и audit-тесты ростера
- LDD: 66 claims, 398 тестов, release PASS
This commit is contained in:
2026-10-29 20:51:27 +03:00
parent 7ef5c866a3
commit 82394cc688
48 changed files with 1196 additions and 156 deletions

View File

@@ -130,10 +130,24 @@ git pull
`deploy.sh up` **обязательно** делает backup перед обновлением. Если backup
завершился ошибкой, деплой прерывается. Миграции БД (Flyway) применяются
автоматически при старте сервисов: identity `V4–V13` (`V10` создаёт
автоматически при старте сервисов: identity `V4–V14` (`V10` создаёт
`identity.audit_events`, `V11` — `identity.refresh_tokens`, `V12` —
`absolute_expires_at`, `V13` — keyset-индексы аудита), academic `V6–V12`,
progress `V13`.
`absolute_expires_at`, `V13` — keyset-индексы аудита, `V14` — финальные
NOT NULL/unique ограничения когорты), academic `V6–V12`, progress `V13`.
Перед первым деплоем с legacy-данными проверьте, что у всех групп разобрана
когорта (V5 заполняет её из имени `ПОТОК-КУРСНОМЕРСТЕПЕНЬ`):
```bash
docker compose exec -T postgres psql -U lms -d lms -c "
SELECT id, name, stream, degree, course, number, enrollment_year
FROM identity.groups
WHERE stream IS NULL OR degree IS NULL OR course IS NULL
OR number IS NULL OR enrollment_year IS NULL;"
```
Если строки есть, заполните поля вручную; иначе `V14` намеренно остановит
миграцию с понятной ошибкой. Возврат из архива доступен на странице группы.
После обновления проверьте, что админ открывает `/admin/audit` и видит события
(например, после входа в профиль студента — `PROFILE_VIEW`); преподаватель и