Files
tnsu-approval-route/backend/Tnsu.ApprovalRoute.Infrastructure/TnsuPortal/TnsuPortalDtos.cs
T
gorbenko.pavel c60726759e
Tests / frontend-test (pull_request) Successful in 46s
Tests / backend-test (pull_request) Successful in 5m31s
Дедуп исполнителей резолва — по Guid сотрудника, не по email
Реальная причина бага с дублем в списке согласования: один и тот же
человек может иметь несколько email в справочнике api.tnsu.kz, поэтому
схлопывание по email его не ловило.

EmployeeDirectoryInfo дополнен полем Id (Guid сотрудника из /Employee/
ByEmail). ResolveStepAsync теперь параллельно с email несёт этот Id
(внутренний ResolvedStepRow, наружу не отдаётся), а CollapseByExecutorIdentity
и RemoveCompanyDirectorsDuplicatedByDirectorTansu дедуплицируют по
identity-ключу: Id, если он резолвился, иначе email как фолбэк (на случай,
если сотрудник по итоговому email не нашёлся в справочнике).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-26 11:30:17 +05:00

20 lines
1.5 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);