// Справочники api.tnsu.kz (компании, отделы, проекты) в виде, удобном для UI. // Приведение из «сырых» PascalCase-ответов портала — в services/portalDictionary.ts. /* eslint-disable @rushstack/no-new-null -- поля 1:1 зеркалят nullable JSON-контракт портала api.tnsu.kz */ export interface Company { id: string; name: string; } export interface Department { id: string; name: string; companyId: string; company: string; } // Важно: идентификатор проекта — поле "oid". Именно оно принимается // портальным /Project/{oid:guid} и передаётся в ResolveTemplateRouteQuery.projectId. // Числовое "id" и legacy "id1c" — другие идентификаторы, для резолва не подходят. export interface Project { oid: string; name: string; code: string | null; status: string | null; } // api.tnsu.kz/Employee/All. Ключ для полей executorEmail/userEmail на нашем // бэкенде — email, но вводить его руками неудобно, поэтому в UI ищем по ФИО. export interface Employee { fio: string; email: string; /** Должность из 1С (AD) — '' если не заполнена в источнике. Используется как * подсказка при выборе сотрудника (см. ManageRequestsApproverModal), не для * отображения в списке (сам справочник должностей не показывает). */ position: string; /** * Первая компания сотрудника из справочника ('' если не пришла) — для * отображения в пикере/списках, где на человека нужна ровно одна строка. */ company: string; /** * ВСЕ компании, где числится сотрудник — совместители и штат общих служб * (бухгалтерия, HR) на несколько юрлиц не редкость: в api.tnsu.kz это * отдельная строка на каждую компанию, а не одна с списком. Проверять * принадлежность к конкретной компании (маршрут ограничен ею) нужно по * этому полю, а не по company — иначе сотрудник, у которого в справочнике * первой оказалась ДРУГАЯ его компания, ошибочно выглядел бы отсутствующим. */ companies: string[]; }