feat(portal): export workforce index evidence

This commit is contained in:
igor04091968
2026-06-03 15:40:27 +03:00
parent 468496f83a
commit d155aed779
5 changed files with 388 additions and 1 deletions
+23 -1
View File
@@ -68,14 +68,30 @@ JSON отчета содержит объяснение расчета:
- активная роль;
- доступные роли;
- формула `index = weighted_seconds / planned_seconds × 100`;
- плановое время;
- фактическое app time;
- взвешенное время;
- matched rule по каждому приложению из top breakdown.
- audit-блок policy: какие приложения попали под `default_weight`;
- drill-down по сотрудникам: формула, active/plan seconds, индекс и причина.
В портале это раскрывается в экране `Почему такой индекс?`: собственник видит
роль, итоговый weighted KPI, план/app/weighted time и top-12 приложений с весом
и вкладом каждого приложения.
и вкладом каждого приложения. Та же секция добавляется в Markdown export
оперативного отчета, чтобы расчет можно было приложить к письму, PDF или
коммерческому отчету без ручного пересказа GUI.
PDF-экспорт выполняется штатной печатью браузера из вкладки `Отчеты`
(`Печать / PDF`). Печатный CSS скрывает навигацию и оставляет отчетные секции,
включая `Почему такой индекс?`, audit `default_weight` и drill-down по
сотрудникам.
Ограничение текущего contract: per-user индекс объясняется по персональному
`active_seconds / planned_seconds`; per-user app-weight breakdown пока не
доступен в worktime payload. Поэтому веса приложений и аудит `default_weight`
являются portfolio-level объяснением, а не персональной раскладкой приложений.
Это честнее, чем выводить ложную детализацию.
Для быстрой загрузки вкладки руководителя explainability-блок доступен отдельным
легким endpoint:
@@ -85,6 +101,12 @@ JSON отчета содержит объяснение расчета:
Полный `/api/reports` продолжает включать тот же `workforce_policy`, но вкладка
`Руководитель` не обязана грузить весь отчет ради одного KPI.
Минимальный JSON contract этого endpoint закреплен unit-тестом
`workforce_policy_explain_is_lightweight_payload`: портал не должен потерять
`formula`, `app_details[].matched_rule`, `app_details[].weight`,
`policy_audit`, `employee_details[].formula` и `employee_details[].reason`, а
легкий endpoint не должен случайно начать отдавать тяжелые поля полного отчета.
После изменения runtime-файла нужно перезапустить портал:
```bash