Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs
T
gorbenko.pavel 6433299c62 Выгрузка маршрутов: сборка таблицы перенесена на бэкенд, добавлены организация, комментарий и деление на согласующих/исполнителей
Бэкенд сам читает маршруты, шаги и справочники портала (сотрудники с должностями,
компании, отделы), фронт шлёт только id типов заявок и скачивает файл.
Колонки: №, Роль, Исполнитель, Организация, Условие, Комментарий.
Согласующие и исполнители — отдельными таблицами. Условие по CompaniesJson
показывается как «организация». Директор Tansu и Управляющий директор Tansu
выводятся с ФИО. Комментарий «назначает согласующего/исполнителя» — при галочке
переназначения.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 10:24:18 +05:00

40 lines
2.7 KiB
C#

using Tnsu.ApprovalRoute.Domain.Enums;
namespace Tnsu.ApprovalRoute.Infrastructure.TnsuPortal;
/// <param name="Id">
/// Guid сотрудника в справочнике api.tnsu.kz — один и тот же человек может иметь
/// несколько записей (см. массив в /Employee/ByEmail) и даже несколько разных
/// email, но Id у него один. Используется как надёжный ключ дедупликации
/// исполнителей при резолве маршрута (см. TemplateRouteService) — email для
/// этого не годится: один человек может фигурировать под разными адресами.
/// Nullable, потому что старые вызовы могли не запросить это поле явно (сейчас
/// всегда приходит) — на этот случай дедуп по Id тихо откатывается на email.
/// </param>
public sealed record EmployeeDirectoryInfo(Guid CompanyId, Guid? DepartmentId, string Company, string? Position, Guid? Id = null);
public sealed record ProjectExecutorInfo(ProjectRole ProjectRole, string Email);
/// <summary>Найден ли сотрудник вообще — отдельно от того, заполнен ли у него email в портале (это разные проблемы).</summary>
public sealed record EmployeeLookupResult(bool Found, string? Email, string? Fio);
/// <summary>
/// Запись из /Employee/FullBase — весь справочник сотрудников, но БЕЗ email (в
/// отличие от /Employee/All). Нужна только ради DismissalDate: единственное место,
/// где отдаётся дата увольнения.
/// </summary>
public sealed record EmployeeFullBaseInfo(Guid? Id, string Fio, string Company, DateTimeOffset? DismissalDate);
/// <summary>
/// Запись из /Employee/All — весь справочник сотрудников с email, но БЕЗ даты
/// увольнения (в отличие от /Employee/FullBase). Связать одну базу с другой можно
/// по <paramref name="Id"/> — он один и тот же в обоих ответах.
/// </summary>
public sealed record EmployeeContactInfo(Guid? Id, string Fio, string? Email, string Company, string? Position = null);
/// <summary>Компания из справочника /Dictionary/Companies.</summary>
public sealed record CompanyInfo(Guid Id, string Name);
/// <summary>Отдел из справочника /Dictionary/Departments.</summary>
public sealed record DepartmentInfo(Guid Id, string Name);