feat: форма «Объяснительная по СКУД»
Tests / frontend-test (push) Successful in 1m17s

Сотрудник пишет объяснительную за дни без отметок СКУД, выбирая их кликом
в календаре «Мой СКУД» (перенесён из portal-main-page: те же цвета и
правила, проходы Hikvision текущего пользователя, праздники из
«Производственного календаря»). Текст записки собирается автоматически,
в просмотре печатается бланк объяснительной.

- выбираются прошедшие дни < 8 ч, с одной записью или без отметок и
  сегодня без отметок; только текущий и прошлый месяц;
- дни сохраняются снимком (JSON), т.к. согласующий чужой СКУД не видит;
- защита от повторов: дни из уже поданных объяснительных помечены ✓ и
  не выбираются, перед отправкой список перечитывается;
- маршрут в две фазы: согласование + исполнение (кадры);
- дата подачи ставится автоматически.

Плитка пока только для тестировщиков (comingSoon): списки SP
провизионированы, тип и маршрут заведены, осталась проверка e2e.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-09-29 17:27:46 +05:00
parent 1dda76caae
commit 7e9848e83d
42 changed files with 2696 additions and 0 deletions
@@ -74,6 +74,21 @@ export function getNotifyOnlyTo(): string {
*/
export const DICTIONARY_API_BASE_URL = 'https://api.tnsu.kz';
/**
* Проходы СКУД (Hikvision) текущего пользователя — тот же gateway и AAD-app,
* что у справочников. Сотрудника API определяет по токену, e-mail не передаём.
* Используется формой «Объяснительная по СКУД» (forms/SkudExplanation).
*/
export const SKUD_EVENTS_PATH = '/Hikvision/Events/CurrentUser';
/**
* Производственный календарь (праздничные выходные) — SP-список на корневом
* сайте, где живёт главная страница портала (portal-main-page читает его же).
* Недоступен — календарь СКУД просто не красит праздники.
*/
export const HOLIDAYS_SITE_URL = 'https://tnsukz.sharepoint.com';
export const HOLIDAYS_LIST_TITLE = 'Производственный Календарь';
/**
* Power Automate: поток оповещения согласующего/исполнителя.
* Триггер «When an HTTP request is received» защищён Entra («любой пользователь