chore: add Coolify deployment scaffolding (Dockerfiles, prod compose, git hygiene)

- apps/api/Dockerfile: build NestJS, run prisma migrate deploy on start
- apps/web/Dockerfile + nginx.conf: build Vite, serve static, proxy /api -> api
- docker-compose.coolify.yml: full prod stack (postgres, redis, minio, keycloak, api, web)
- .dockerignore / .gitignore / .gitattributes

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Danil Suhomlinov
2026-06-08 17:42:45 +03:00
commit 33800292aa
186 changed files with 30437 additions and 0 deletions
+464
View File
@@ -0,0 +1,464 @@
# Control Medical — Сценарии UI-тестирования
> Проверяем только то, что видит и делает пользователь в браузере.
> Открыть: `http://localhost:5173`
> Логин: страница входа → выбрать пользователя и роль → «Autentifică-te»
---
## Роли для тестирования
| Роль | Что можно делать |
|------|-----------------|
| **HR Admin** | Всё |
| **HR Specialist** | Создавать профили и checkup, удалять документы |
| **Medic Familie** | Видеть inbox, записывать вердикт |
| **Manager** | Только просматривать |
| **Employee** | Только просматривать своё |
---
## 1. Carduri de risc
### TC-01 — Создание карты риска
**Роль:** HR Admin
**Шаги:**
1. Меню слева → «Carduri de risc»
2. Нажать «+ Adaugă card de risc»
3. Ввести название, добавить хотя бы 1 фактор риска
4. Нажать «Salvează»
**Ожидаем:** Карта появляется в таблице, виден бейдж с количеством факторов
---
### TC-02 — Редактирование карты
**Роль:** HR Admin
**Шаги:**
1. В таблице карт нажать иконку карандаша
2. Изменить название или добавить новый фактор
3. Сохранить
**Ожидаем:** В таблице отображается обновлённое название/количество факторов
---
### TC-03 — Удаление карты
**Роль:** HR Admin
**Шаги:**
1. Создать тестовую карту (не привязанную к сотрудникам)
2. Нажать иконку корзины
3. Подтвердить удаление
**Ожидаем:** Карта исчезает из таблицы
---
### TC-04 — HR Specialist не видит кнопки удаления и создания
**Роль:** HR Specialist
**Шаги:**
1. Открыть «Carduri de risc»
**Ожидаем:** Кнопка «+ Adaugă» и иконки удаления отсутствуют
---
### TC-05 — Карта со всеми категориями факторов
**Роль:** HR Admin
**Шаги:**
1. Создать карту, добавив факторы в каждую из 5 категорий: chimici, fizici, biologici, ergonomici, psihosociali
2. Сохранить и открыть карту
**Ожидаем:** Все 5 категорий с факторами отображаются в деталях карты
---
## 2. Profil medical сотрудника
### TC-06 — Назначение медицинского профиля
**Роль:** HR Admin
**Шаги:**
1. Меню → «Angajați» → открыть любого сотрудника
2. Вкладка «Medical» → кнопка «Editează»
3. Выбрать карту риска, ввести CORM-код и специальность
4. Сохранить
**Ожидаем:** В профиле отображается карта риска как кликабельная ссылка, CORM-специальность заполнена, «ULTIMUL CONTROL» пуст
---
### TC-07 — Включение флага «Expus radiații»
**Роль:** HR Admin
**Шаги:**
1. Открыть медицинский профиль сотрудника → «Editează»
2. Включить тогл «Expus radiații ionizante»
3. Ввести дозу externă и internă
4. Сохранить
**Ожидаем:** Поле «EXPUS RADIAȚII: Da» отображается в профиле; значение dozaTotal = externă + internă
---
### TC-08 — Смена карты риска
**Роль:** HR Admin
**Шаги:**
1. У сотрудника уже есть профиль с картой риска
2. «Editează» → выбрать другую карту → сохранить
**Ожидаем:** Новая карта отображается в профиле; история checkup не потерялась
---
### TC-09 — Просмотр профиля как Employee
**Роль:** Employee
**Шаги:**
1. Войти как employee → открыть свой профиль → вкладка «Medical»
**Ожидаем:** Данные видны, но кнопок «Editează» и удаления нет
---
## 3. Страница Control medical
### TC-10 — Статистические карточки отображаются корректно
**Роль:** HR Admin
**Шаги:**
1. Убедиться, что есть хотя бы 1 сотрудник с медицинским профилем
2. Открыть «Control medical»
**Ожидаем:** Карточки «TOTAL ANGAJAȚI», «CONTROL EXPIRAT», «EXPIRĂ ÎN 30 ZILE», «EXPUȘI RADIAȚII» показывают числа (не пустые и не нулевые если данные есть)
---
### TC-11 — Сотрудник без профиля не виден
**Роль:** HR Admin
**Шаги:**
1. Создать нового сотрудника, не добавляя ему медицинский профиль
2. Открыть «Control medical»
**Ожидаем:** Новый сотрудник в таблице отсутствует
---
### TC-12 — Статус NICIODATĂ у нового сотрудника с профилем
**Роль:** HR Admin
**Шаги:**
1. Назначить медицинский профиль новому сотруднику
2. Открыть «Control medical»
**Ожидаем:** Сотрудник виден в таблице, красный бейдж «NICIODATĂ», колонка «ULTIMUL CONTROL» показывает «—»
---
### TC-13 — Выбор строки кликом
**Роль:** HR Admin
**Шаги:**
1. На странице «Control medical» кликнуть на строку сотрудника
**Ожидаем:** Строка подсвечивается зелёным, чекбокс заполнен, счётчик кнопки «Generează documente» стал (1)
---
### TC-14 — Снятие выбора повторным кликом
**Роль:** HR Admin
**Шаги:**
1. Кликнуть строку (выбрать) → кликнуть снова (снять выбор)
**Ожидаем:** Подсветка пропала, счётчик вернулся к (0), кнопка стала неактивной
---
### TC-15 — Выбор всех через хедер-чекбокс
**Роль:** HR Admin
**Шаги:**
1. Кликнуть чекбокс в шапке таблицы
**Ожидаем:** Все строки выделены, счётчик = количество строк в таблице
---
### TC-16 — Фильтр по карте риска
**Роль:** HR Admin
**Шаги:**
1. В дропдауне «Toate» выбрать конкретную карту риска
**Ожидаем:** В таблице остаются только сотрудники с этой картой; счётчик кнопки сбрасывается в (0)
---
### TC-17 — Кнопка заблокирована при 0 выбранных
**Роль:** HR Admin
**Шаги:**
1. Открыть «Control medical», ничего не выбирать
**Ожидаем:** Кнопка «Generează documente (0)» серая и некликабельная
---
## 4. Генерация документов (Bulk)
### TC-18 — Открытие модала генерации
**Роль:** HR Admin
**Шаги:**
1. Выбрать сотрудника → нажать «Generează documente (1)»
**Ожидаем:** Открывается модал «Inițiere control medical» с:
- Текстом «1 angajați selectați»
- Дропдауном «Tipul controlului medical» (по умолчанию «Periodic»)
- Полем «Data planificată» (заполнено сегодняшней датой)
- Блоком с описанием документов, которые будут созданы
- Кнопками «Anulează» и «Generează documente»
---
### TC-19 — Генерация без флага радиации
**Роль:** HR Admin (сотрудник без `expusRadiatiiIonizante`)
**Шаги:**
1. Выбрать сотрудника → «Generează documente» → тип «Periodic» → дата сегодня → «Generează documente»
2. Подождать ~2 секунды
**Ожидаем:** Модал результата с:
- Заголовком «✓ Documente generate cu succes»
- 3 документа: ANEXA_3_FISA_SOLICITARE.DOCX, ANEXA_4_FISA_EVALUARE.DOCX, ANEXA_6_[ИМЯ].DOCX
- Anexa_4B **отсутствует**
- Toast «Documente generate» в углу экрана
---
### TC-20 — Генерация с флагом радиации
**Роль:** HR Admin (сотрудник с включённым `expusRadiatiiIonizante`)
**Шаги:**
1. Выбрать сотрудника с флагом радиации → «Generează documente» → подтвердить
**Ожидаем:** В результате **4 документа**: Anexa_3, Anexa_4, **Anexa_4B**, Anexa_6
---
### TC-21 — Тип checkup меняется в модале
**Роль:** HR Admin
**Шаги:**
1. Открыть модал генерации → сменить тип с «Periodic» на «La angajare»
**Ожидаем:** Выбор сохраняется, генерация проходит с типом «La angajare»
---
### TC-22 — Отмена генерации
**Роль:** HR Admin
**Шаги:**
1. Выбрать сотрудника → открыть модал → нажать «Anulează»
**Ожидаем:** Модал закрывается, ничего не создаётся, сотрудник остаётся выбранным
---
### TC-23 — Checkup появляется в истории сотрудника
**Роль:** HR Admin
**Шаги:**
1. Сгенерировать документы → закрыть результат
2. Меню «Angajați» → открыть сотрудника → вкладка «Medical»
**Ожидаем:** В «Istoricul controlului medical» новая строка: тип «PERIODIC», дата планирования, вердикт «IN AȘTEPTARE», 3 кликабельных документа
---
### TC-24 — Счётчик радиации на странице
**Роль:** HR Admin
**Шаги:**
1. Включить `expusRadiatiiIonizante` у одного сотрудника → открыть «Control medical»
**Ожидаем:** Карточка «EXPUȘI RADIAȚII» показывает 1 (или увеличивается на 1)
---
## 5. Inbox medic de familie
### TC-25 — Pending checkup виден в inbox
**Роль:** Medic Familie
**Шаги:**
1. Войти как Medic Familie
2. Меню → «Inbox medic»
**Ожидаем:** Таблица с pending checkup (verdict = null): колонки IDNP, ANGAJAT, TIP CONTROL, DATA PLANIFICATĂ, CARD DE RISC, кнопка «Completează»
---
### TC-26 — Метка «Întârziat» на просроченных
**Роль:** Medic Familie
**Шаги:**
1. Создать checkup с датой планирования в прошлом (или просто проверить текущие)
2. Открыть «Inbox medic»
**Ожидаем:** Рядом с датой оранжевая метка «Întârziat»
---
### TC-27 — Запись вердикта «Apt»
**Роль:** Medic Familie
**Шаги:**
1. Нажать «Completează» у checkup
2. Выбрать вердикт «Apt», дата заполнена автоматически
3. Нажать «Înregistrează verdict»
**Ожидаем:**
- Toast «Verdictul a fost înregistrat»
- Строка исчезает из inbox
- Список сокращается на 1
---
### TC-28 — Все варианты вердикта доступны
**Роль:** Medic Familie
**Шаги:**
1. Нажать «Completează» → открыть дропдаун «Verdict»
**Ожидаем:** 5 вариантов: Apt, Apt (perioadă adaptare), Apt condiționat, Inapt temporar, Inapt
---
### TC-29 — Нельзя отправить без вердикта
**Роль:** Medic Familie
**Шаги:**
1. Открыть «Completează» → НЕ выбирать вердикт → нажать «Înregistrează verdict»
**Ожидаем:** Кнопка не отправляет форму или отображается ошибка валидации (поле обязательное)
---
### TC-30 — Рекомендации (необязательное поле)
**Роль:** Medic Familie
**Шаги:**
1. «Completează» → вердикт «Apt conditionat» → заполнить «Recomandări» текстом → отправить
2. Открыть вкладку «Medical» сотрудника
**Ожидаем:** В колонке «RECOMANDĂRI» отображается введённый текст
---
### TC-31 — HR Admin не может записать вердикт
**Роль:** HR Admin
**Шаги:**
1. Войти как HR Admin → открыть «Inbox medic»
2. Нажать «Completează» → выбрать вердикт → отправить
**Ожидаем:** Toast с ошибкой «Forbidden resource», checkup остаётся в inbox
---
### TC-32 — После вердикта ULTIMUL CONTROL обновился
**Роль:** Medic Familie → затем HR Admin
**Шаги:**
1. Записать вердикт для periodic checkup
2. Войти как HR Admin → «Angajați» → сотрудник → вкладка «Medical»
**Ожидаем:** Поле «ULTIMUL CONTROL» = дата вердикта
---
### TC-33 — После вердикта добавился Anexa 6 Final
**Роль:** После записи вердикта
**Шаги:**
1. Записать вердикт → открыть вкладку «Medical» сотрудника → найти завершённый checkup
**Ожидаем:** В документах checkup появился новый файл «Anexa_6_Final_...» (4-й документ вместо 3-х)
---
## 6. Документы — скачивание и удаление
### TC-34 — Скачивание документа
**Роль:** HR Admin / HR Specialist
**Шаги:**
1. Вкладка «Medical» сотрудника → нажать «↓ Anexa_3_...» у любого checkup
**Ожидаем:** Открывается новая вкладка браузера, файл загружается (DOCX, не пустой)
---
### TC-35 — Удаление одного документа
**Роль:** HR Admin
**Шаги:**
1. В строке checkup нажать маленькую иконку корзины рядом с конкретным документом
2. Подтвердить (если есть подтверждение)
**Ожидаем:** Этот документ исчезает из списка, остальные документы строки остаются
---
### TC-36 — Удаление всех документов checkup («Toate»)
**Роль:** HR Admin
**Шаги:**
1. В строке checkup нажать кнопку «Toate» (удалить все)
2. Подтвердить
**Ожидаем:** Все документы строки исчезают, колонка «DOCUMENTE» пустая
---
### TC-37 — HR Specialist может удалять документы
**Роль:** HR Specialist
**Шаги:**
1. Открыть вкладку «Medical» сотрудника → удалить один документ
**Ожидаем:** Удаление проходит успешно, документ исчезает
---
### TC-38 — Medic Familie не видит кнопки удаления документов
**Роль:** Medic Familie
**Шаги:**
1. Войти как Medic Familie → открыть «Angajați» → вкладка «Medical»
**Ожидаем:** Иконки удаления документов недоступны / не отображаются
---
## 7. Удаление checkup
### TC-39 — Удаление checkup целиком
**Роль:** HR Admin
**Шаги:**
1. Вкладка «Medical» сотрудника → в строке checkup нажать большую красную корзину (удалить checkup)
2. Подтвердить
**Ожидаем:** Строка полностью исчезает из «Istoricul controlului medical»
---
### TC-40 — HR Specialist не видит кнопку удаления checkup
**Роль:** HR Specialist
**Шаги:**
1. Открыть вкладку «Medical» любого сотрудника
**Ожидаем:** Иконка удаления checkup (крайняя справа) недоступна или скрыта
---
## 8. Полный happy path (сквозной тест)
### TC-41 — Полный цикл от создания карты до вердикта
**Шаги:**
| # | Роль | Действие | Ожидаем |
|---|------|----------|---------|
| 1 | HR Admin | Carduri de risc → создать карту «Тест» с 2 факторами | Карта в таблице |
| 2 | HR Admin | Angajați → сотрудник → Medical → Editează → выбрать «Тест» → сохранить | Карта в профиле, ULTIMUL CONTROL пуст |
| 3 | HR Admin | Control medical → строка сотрудника → выбрать | Бейдж «NICIODATĂ», кнопка (1) |
| 4 | HR Admin | Generează documente → Periodic → сегодня → подтвердить | 3 документа в результате |
| 5 | HR Admin | Angajați → Medical → история | 1 строка IN AȘTEPTARE с 3 документами |
| 6 | Medic Familie | Inbox medic → Completează → Apt → Înregistrează | Toast успех, строка ушла из inbox |
| 7 | HR Admin | Angajați → Medical | ULTIMUL CONTROL = сегодня, вердикт APT, 4 документа |
| 8 | HR Admin | Control medical | Сотрудник получил статус «OK» (или пропал из таблицы) |
---
## 9. Статусы checkup в истории — визуальная проверка
| Состояние | Что видит пользователь в колонке VERDICT |
|-----------|------------------------------------------|
| Только создан, нет вердикта | Серый бейдж «IN AȘTEPTARE» |
| Вердикт «Apt» | Зелёный бейдж «APT» |
| Вердикт «Apt (perioadă adaptare)» | Бейдж «APT ADAPTARE» |
| Вердикт «Apt condiționat» | Бейдж «APT COND.» |
| Вердикт «Inapt temporar» | Оранжевый бейдж «INAPT TEMP.» |
| Вердикт «Inapt» | Красный бейдж «INAPT» |