Напоминания:
- ProbationEndingReminderDto: ManagerEmail убран — это был унаследованный
ReceiverEmail под вторым именем.
- Ссылка для ProbationEnding больше не ведёт на саму заявку на приём (она уже
закрыта, решать по ней нечего) — берётся из новой настройки
RemindersOptions.ProbationReminderUrl и ведёт в раздел, где заводят новую
заявку. Подстановок в ней нет: адрес конкретной формы в портал не передать,
rptype без rpid/rpsource игнорируется (см. parseRoute в request-portal).
Заодно ушли BuildProbationUrl и ненужные больше параметры type/listId.
Стайлгайд (CLAUDE.md) — у enum первое значение None:
- ReminderFeed: None=0 трактуется как ApprovalOverdue, чтобы вызов без явного
выбора работал как раньше.
- EmploymentStatus: заодно инвертирован switch в ReminderService — раньше
«продолжить» было веткой по умолчанию, и новый None молча означал бы
«сотрудник работает». Теперь по умолчанию пропуск с предупреждением.
- ConditionsLogic: None — НЕвалидное значение, отвергается валидаторами шага
(в том числе новым PatchTemplateRouteStepRequestValidator, его не было вовсе).
Поэтому у ConditionsLogic в Create/Update-запросах убрано значение по
умолчанию: System.Text.Json в .NET 10 уважает дефолты параметров
конструктора, и пропущенное поле молча означало «И». Теперь пропущенное поле
даёт None и упирается в валидатор.
ЛОМАЮЩЕЕ ИЗМЕНЕНИЕ КОНТРАКТА: клиент, не присылающий conditionsLogic в
POST/PUT шага, получит 400 вместо прежнего молчаливого «И». Админка не
затронута — она это поле всегда отправляет.
- ReminderDto: базовый класс сузился до ReceiverEmail/ReceiverName/Url;
RequestTypeId/RequestTypeName/RequestId/Status/RequestUniqueCode остались
только в ApprovalOverdueReminderDto — ProbationEndingReminderDto они не
нужны. Дискриминатор полиморфной сериализации ($type) больше не дублируется
отдельным enum-полем Category.
- ApprovalOverdueReminderDto: старый Email сохранён рядом с унаследованным
ReceiverEmail (то же значение) — контракт можно переключать постепенно.
- ApprovalRow/RowSelect: добавлен Title согласующего (TansuSiteApprover/Title)
— заполняет ReceiverName для просроченных шагов, когда он есть в SharePoint.
- EmployeeDirectorySnapshot.NameByEmail: обратный поиск ФИО руководителя по
email — заполняет ReceiverName для напоминаний об испытательном сроке без
лишнего похода в api.tnsu.kz (данные уже загружены для EmailOf).
- GetProbationEndingAsync: испытательный срок не длиннее 6 месяцев, поэтому
читаем только текущую и последнюю архивную партицию (не весь архив) и
фильтруем строки по HireDate не старше 6 месяцев — экономим лишние запросы
к SharePoint без потери актуальных заявок.
Абстрактный базовый класс + два sealed-наследника вместо одного DTO с
опциональными полями под обе категории — так специфичные для каждого
вида напоминания поля не путаются с полями другого вида. Полиморфная
сериализация System.Text.Json ([JsonPolymorphic]/[JsonDerivedType])
нужна, иначе список IReadOnlyList<ReminderDto> сериализовался бы только
по общим полям базового класса.
Канву SharePoint мы и раньше разжимали (тот же :global хак + supportsFullBleed
в манифесте), но содержимое упиралось в max-width: 1080px у .content и
центрировалось — визуально это читалось как «не открывается на всю ширину».
Переношу раскладку портала (RequestPortal.module.scss):
- корень .approvalAdmin — width: 100%, padding: 0;
- .shell больше не карточка: без рамки, тени, скруглений и overflow: hidden
(последний ломает sticky), align-items: flex-start, min-height: 78vh;
- .side — заливка $navy-800 на колонке (align-self: stretch), сам Sidebar
внутри sticky на 100vh: градиент не плывёт от высоты соседа, и под рейлом
на длинных таблицах нет белого провала, если sticky не включился;
- .content — сняты max-width и margin: auto, остались только отступы;
- мобильный брейкпоинт обновлён под новую схему: десктопные правила рейла
снимаются явно, иначе sticky+100vh спорил бы с position: fixed, который
ui-kit ставит drawer'у, при равной специфичности.
Разметка AdminApp.tsx не менялась — структура уже совпадала с портальной.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
---------
Co-authored-by: gorbenko.pavel <gorbenko.pavel@tansu.kz>
Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/tnsu-approval-route/pulls/17
Правила из frontend/.gitignore перенесены в корневой .gitignore,
дублирующий файл удалён. README дополнен описанием SPFx frontend
(ApprovalAdmin), который ранее был ошибочно указан как отсутствующий.
4-слойная архитектура (Api/Application/Domain/Infrastructure) на .NET 10
с MediatR и EF Core + PostgreSQL, без бизнес-логики. Добавлены
docker-compose, .env.example и README для локального запуска.