gorbenko.pavel 31a0a8e9e3 Напоминания: убрать дубль ManagerEmail, ссылка из настроек; None первым во всех enum
Напоминания:
- 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 вместо прежнего молчаливого «И». Админка не
затронута — она это поле всегда отправляет.
2026-08-27 15:53:31 +05:00
2026-08-13 04:44:08 +00:00
2026-08-27 15:23:45 +05:00
2026-08-13 04:44:08 +00:00
2026-08-13 04:44:08 +00:00

Tnsu.ApprovalRoute

Сервис маршрутов согласования: типы заявок (RequestType) и шаблонные маршруты согласования (TemplateRoute → TemplateRouteStep) с разрешением подходящего маршрута под конкретные параметры (проект, тип заявки, сумма и т.д.).

Архитектура повторяет tnsu-inventory: 4 слоя (Api / Application / Domain / Infrastructure), MediatR-стиль сервисов, EF Core + PostgreSQL.

Стек

Компонент Технология
Backend .NET 10, ASP.NET Core (MVC controllers), EF Core
БД PostgreSQL
Авторизация Entra ID (JWT Bearer) либо dev-схема (X-Dev-User-Email) при отсутствии конфигурации Entra
API-документация Scalar (/scalar) на основе OpenAPI
Интеграция api.tnsu.kz (портал 1С)
Frontend SPFx-веб-парт (React + FluentUI) — админка маршрутов согласования на портале SharePoint

Структура

backend/
  Directory.Build.props       # общие настройки таргета (net10.0, nullable, etc.)
  Directory.Packages.props    # централизованные версии пакетов
  Tnsu.ApprovalRoute.sln
  Tnsu.ApprovalRoute.Domain/          # сущности и enum'ы домена
  Tnsu.ApprovalRoute.Application/     # сервисы, DTO, валидаторы
  Tnsu.ApprovalRoute.Infrastructure/  # EF Core DbContext, миграции, клиент tnsu-portal
  Tnsu.ApprovalRoute.Api/             # ASP.NET Core Controllers, Program.cs, авторизация
  tests/
    Tnsu.ApprovalRoute.IntegrationTests/
frontend/
  src/webparts/approvalAdmin/  # SPFx веб-парт «ApprovalAdmin» (React, FluentUI)
docker-compose.yml

Frontend (SPFx)

Админка маршрутов согласования встраивается веб-частью SPFx на портал SharePoint (аналогично tnsu-inventory).

cd frontend
npm install
npm run start        # heft start — локальный SharePoint Workbench
npm run build         # heft test + package-solution --production

Свойства веб-части: apiBaseUrl, useDevAuth, devUserEmail, aadResourceId, portalBaseUrl.

API

Метод Путь Описание
CRUD /api/request-types Типы заявок
CRUD /api/template-routes Шаблонные маршруты согласования
GET /api/template-routes/resolve Подбор подходящего маршрута по параметрам
CRUD /api/template-routes/{routeId}/steps Шаги шаблонного маршрута
GET /health Health-check

Запуск локально

cd backend
dotnet run --project Tnsu.ApprovalRoute.Api

Требуется PostgreSQL (строка подключения — ConnectionStrings:Postgres в appsettings.json).

Авторизация:

  • Entra ID — задать Entra:TenantId и Entra:Audience в конфигурации
  • Без Entra — используется dev-схема, текущий пользователь передаётся заголовком X-Dev-User-Email

После запуска документация API доступна на /scalar.

Запуск через Docker Compose

cp .env.example .env
docker compose up --build

Поднимает postgres и api.

Сервис URL
API http://localhost:8082
API health http://localhost:8082/health
Postgres localhost:5435

Тесты

cd backend
dotnet test
S
Description
No description provided
Readme 5.7 MiB
Languages
C# 57.2%
TypeScript 38.1%
SCSS 3.3%
PowerShell 1.2%