feat: маршрут отпуска и отпуска без содержания учитывает организацию сотрудника
Кадровый сотрудник и исполнитель в этих маршрутах зависят от компании сотрудника (Ольга Кудрящова и Айнур — Тансу/КПС/CT, Мольдир Хамит — остальные), но формы не передавали организацию в расчёт маршрута, и условные шаги в админке не срабатывали. Теперь названия компаний из поля «Организация» (Employee/ByEmail) уходят как Organization через пробел — и в согласование, и в исполнителей; маршрут пересчитывается, когда организация подгрузится. Общий хелпер — shared/dictionary/organizationRouteFields. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
import { organizationRouteFieldValues } from './organizationRouteFields';
|
||||
|
||||
describe('organizationRouteFieldValues', () => {
|
||||
it('одна организация — её название', () => {
|
||||
expect(organizationRouteFieldValues('ТОО TANSU Construction — Инженер — ИТ департамент')).toEqual([
|
||||
{ fieldName: 'Organization', value: 'ТОО TANSU Construction' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('строки без подразделения (формат отпуска без содержания)', () => {
|
||||
expect(organizationRouteFieldValues('ТОО АСТЕЛ-К — Экономист')).toEqual([
|
||||
{ fieldName: 'Organization', value: 'ТОО АСТЕЛ-К' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('несколько организаций — все названия через пробел, без повторов', () => {
|
||||
const organization = [
|
||||
'ТОО АСТЕЛ-К — Экономист',
|
||||
'ТОО TANSU Construction — Инженер — ИТ департамент',
|
||||
'ТОО АСТЕЛ-К — Аналитик',
|
||||
].join('\n');
|
||||
expect(organizationRouteFieldValues(organization)).toEqual([
|
||||
{ fieldName: 'Organization', value: 'ТОО TANSU Construction ТОО АСТЕЛ-К' },
|
||||
]);
|
||||
});
|
||||
|
||||
it('организация ещё не загружена — условий нет', () => {
|
||||
expect(organizationRouteFieldValues('')).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,24 @@
|
||||
// Напрямую из модулей, а не из баррелей: баррели тянут @microsoft/sp-http,
|
||||
// который не грузится в Jest (см. features/myRequests/filtersStorage.ts).
|
||||
import type { IResolveFieldValue } from '../approval/models/IApprovalRouteApi';
|
||||
import { parseOrganizationLine } from './organizationLines';
|
||||
|
||||
/**
|
||||
* Значения для условных шагов маршрута (fieldValues при resolve) по
|
||||
* организации сотрудника — для форм, где кадровый сотрудник и исполнитель
|
||||
* зависят от компании (заявка на отпуск, отпуск без содержания). Условия в
|
||||
* админке approval-route: «Organization содержит TANSU …».
|
||||
*
|
||||
* Названия компаний — из поля «Организация» (строки «Компания — должность[ —
|
||||
* подразделение]», источник Employee/ByEmail), одной строкой через пробел:
|
||||
* бэкенд принимает только строку (массив → 400), а «содержит» ищет подстроку.
|
||||
* Сотрудник в нескольких компаниях попадает под условия каждой — так и задумано.
|
||||
*/
|
||||
export function organizationRouteFieldValues(organization: string): IResolveFieldValue[] {
|
||||
const companies = organization
|
||||
.split('\n')
|
||||
.map((line) => parseOrganizationLine(line).company)
|
||||
.filter((name) => !!name);
|
||||
const names = companies.filter((name, i) => companies.indexOf(name) === i).sort().join(' ');
|
||||
return names ? [{ fieldName: 'Organization', value: names }] : [];
|
||||
}
|
||||
Reference in New Issue
Block a user