GetEmployeeByEmailAsync возвращает массив; новый HeadType.CompanyDirectors
Tests / frontend-test (pull_request) Successful in 46s
Tests / backend-test (pull_request) Successful in 1m28s

/Employee/ByEmail на портале обновился: сотрудник может числиться в
нескольких компаниях, теперь отдаётся массив записей (одна на компанию).
ITnsuPortalClient.GetEmployeeByEmailAsync возвращает IReadOnlyList вместо
одного объекта; вызывающие места используют первую запись (как и раньше
при одиночном ответе), кроме нового HeadType.CompanyDirectors — там нужны
все компании.

HeadType.CompanyDirectors резолвится в директора КАЖДОЙ компании
инициатора — по одной строке результата на компанию, все с одним и тем
же OrderNo шага (они и так один шаг, то есть параллельны по построению).
Директор ищется через GetEmployeeByPositionAsync(position, company) с
захардкоженной должностью «Директор» по умолчанию и явными исключениями
для компаний, где директора называют иначе (ТОО KazPromService — «Главный
механик», ТОО СТ Global — «Генеральный директор»).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
gorbenko.pavel
2026-08-25 10:52:28 +05:00
parent ca8de91742
commit 572749b4d7
9 changed files with 220 additions and 63 deletions
@@ -26,7 +26,11 @@ export enum HeadType {
// Резолвится по departmentId из запроса на resolve (см. ResolveTemplateRouteQuery),
// а не по цепочке подчинённости инициатора, как остальные типы, — поэтому на
// экране «Проверка маршрута» появляется отдельное поле выбора отдела.
DepartmentHead = 'DepartmentHead'
DepartmentHead = 'DepartmentHead',
// Единственное значение, которое резолвится в НЕСКОЛЬКО строк результата — по
// директору на каждую компанию инициатора (сотрудник может числиться в
// нескольких), все с одним и тем же orderNo (см. TemplateRouteService.ResolveStepAsync).
CompanyDirectors = 'CompanyDirectors'
}
export enum ComparisonOperator {
+2 -1
View File
@@ -32,7 +32,8 @@ export const headTypeLabels: Record<HeadType, string> = {
[HeadType.DirectionHead]: 'Руководитель направления',
[HeadType.DirectorTansu]: 'Директор Tansu',
[HeadType.ManagingDirectorTansu]: 'Управляющий директор Tansu',
[HeadType.DepartmentHead]: 'Руководитель указанного отдела'
[HeadType.DepartmentHead]: 'Руководитель указанного отдела',
[HeadType.CompanyDirectors]: 'Директора компаний инициатора'
};
export const comparisonOperatorLabels: Record<ComparisonOperator, string> = {