gorbenko.pavel 240e5984b1
Tests / frontend-test (pull_request) Successful in 53s
Tests / backend-test (pull_request) Successful in 5m34s
feat(отчёт): строка на каждый приём + столбец «Ф.И.О. нанимаемого сотрудника»
На одну заявку на подбор приходится несколько заявок на приём («Разнорабочий,
4 вакансии» → 4 кандидата), и раньше они схлопывались в одну строку: ФИО не
было вовсе, а «Дата выхода» показывала только САМУЮ ПОЗДНЮЮ из четырёх. Кто
именно вышел и когда — из отчёта было не узнать.

Теперь вакансия занимает столько строк, сколько по ней приёмов. Построчные
колонки — «Дата выхода», новая «Ф.И.О. нанимаемого сотрудника» и «Вместо
сотрудника Ф.И.О.» (у каждого приёма своё «взамен кого»); все остальные общие
и объединяются по вертикали.

Модель: VacancyReportRow.Lines — именно СТРОКИ ЛИСТА, а не «приёмы». У вакансии
без приёмов строка всё равно одна (иначе она пропала бы из отчёта), с пустыми
ФИО и датой, но с «Вместо сотрудника» из причины открытия вакансии — прежнее
поведение сохранено. Реальное число приёмов осталось в ClosedCount.

Отклонённые приёмы теперь отбрасываются целиком, а не только из счётчика:
отдельная строка с ФИО отклонённого кандидата утверждала бы «вот кого приняли».

Объединение заводится только при lineCount > 1 — область 1×1 Excel считает
некорректной и портит файл. Значение общих колонок пишется ТОЛЬКО в первую
строку: у объединённой области Excel хранит его в верхней левой ячейке, а дубли
сломали бы SUM в итогах (посчитал бы вакансию по разу на каждый приём) — на это
есть отдельный тест.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-31 14:29:13 +05:00
2026-08-13 04:44:08 +00:00
2026-08-27 11:43:45 +00: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%