diff --git a/src/webparts/requestPortal/forms/Referral/README.md b/src/webparts/requestPortal/forms/Referral/README.md index 57525ca..21d9c05 100644 --- a/src/webparts/requestPortal/forms/Referral/README.md +++ b/src/webparts/requestPortal/forms/Referral/README.md @@ -28,8 +28,14 @@ reloadKey матрицы включает `data.Referrer`. Рекомендацию согласуют по линии рекомендателя — кандидата в тенанте нет, резолвить условия по нему нечем. - **Автоподстановка при создании:** рекомендатель = текущий пользователь, его - должность из профиля (`SPS-JobTitle` через `approval.getJobTitle`), дата подачи = - сегодня. При выборе другого рекомендателя должность подтягивается заново. + должность и подразделение — из профиля SharePoint (`SPS-JobTitle`/`SPS-Department` + через `approval.getProfileFields`, как в «Обходном листе»), дата подачи = + сегодня. При выборе другого рекомендателя должность и подразделение + подтягиваются заново. **Подразделение — только для чтения** (в отличие от + должности не редактируется вручную: не участвует в условиях маршрута, поэтому + риска сломать согласование нет, и расхождение с профилем не нужно). + «Подразделение / Объект» вакансии (`VacancyDepartment`) — отдельное поле, + свободный текст: это подразделение, КУДА рекомендуют, а не рекомендателя. - **Условное поле:** «Откуда знаете» = «Другое» → появляется обязательное уточнение `AcquaintanceSourceOther`. При смене варианта уточнение очищается, и в список пишется `null` (см. `buildItem` в `submit.ts`). diff --git a/src/webparts/requestPortal/forms/Referral/ReferralForm.tsx b/src/webparts/requestPortal/forms/Referral/ReferralForm.tsx index 056278b..ff18641 100644 --- a/src/webparts/requestPortal/forms/Referral/ReferralForm.tsx +++ b/src/webparts/requestPortal/forms/Referral/ReferralForm.tsx @@ -94,8 +94,9 @@ const ReferralForm: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [editId, editListId]); - // Новая заявка: рекомендатель — сам подающий (подставляем его и должность из - // профиля), дата подачи — сегодня. + // Новая заявка: рекомендатель — сам подающий (подставляем его, должность и + // подразделение из профиля SharePoint — SPS-JobTitle/SPS-Department, как в + // «Обходном листе»), дата подачи — сегодня. useEffect(() => { if (editId) { return; @@ -108,10 +109,14 @@ const ReferralForm: React.FC = ({ SubmitDate: prev.SubmitDate || todayIso() })); approval - .getJobTitle(user.loginName) - .then((title) => { - if (alive && title) { - setData((prev) => ({ ...prev, ReferrerPosition: prev.ReferrerPosition || title })); + .getProfileFields(user.loginName) + .then((profile) => { + if (alive) { + setData((prev) => ({ + ...prev, + ReferrerPosition: prev.ReferrerPosition || profile.jobTitle, + ReferrerDepartment: prev.ReferrerDepartment || profile.department + })); } }) .catch(() => undefined); @@ -121,15 +126,27 @@ const ReferralForm: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, [editId]); - // Выбор другого рекомендателя подтягивает его должность. + // Выбор другого рекомендателя подтягивает его должность и подразделение из + // профиля. Подразделение поле только для чтения (см. ReferrerSection) — в + // отличие от должности его нельзя поправить вручную, если профиль не + // синхронизирован: колонка не участвует в условиях маршрута, риска сломать + // согласование нет. const handleReferrerChange = (login: string): void => { - setData((prev) => ({ ...prev, Referrer: login })); + // Подразделение — только для чтения, поэтому сбрасываем сразу (а не ждём + // ответа профиля): иначе до резолва в поле виден отдел ПРЕЖНЕГО рекомендателя. + setData((prev) => ({ ...prev, Referrer: login, ReferrerDepartment: '' })); if (!login) { return; } approval - .getJobTitle(login) - .then((title) => setData((prev) => ({ ...prev, ReferrerPosition: title || prev.ReferrerPosition }))) + .getProfileFields(login) + .then((profile) => + setData((prev) => ({ + ...prev, + ReferrerPosition: profile.jobTitle || prev.ReferrerPosition, + ReferrerDepartment: profile.department + })) + ) .catch(() => undefined); }; diff --git a/src/webparts/requestPortal/forms/Referral/sections/ReferrerSection.tsx b/src/webparts/requestPortal/forms/Referral/sections/ReferrerSection.tsx index 2cff31f..68bbfec 100644 --- a/src/webparts/requestPortal/forms/Referral/sections/ReferrerSection.tsx +++ b/src/webparts/requestPortal/forms/Referral/sections/ReferrerSection.tsx @@ -2,6 +2,12 @@ import * as React from 'react'; import { CollapseSection, FormField, TextInput, PhoneInput, PeopleField } from '../../../shared/ui'; import { ISectionProps, REFERRER_PLACEHOLDER } from '../model'; +// Подразделение подтягивается автоматически при выборе рекомендателя (см. +// ReferralForm.handleReferrerChange — SharePoint User Profile, SPS-Department) — +// свободный ввод здесь намеренно убран, чтобы не расходиться с профилем (как в +// «Обходном листе»). +const NOOP = (): void => undefined; + /** Секция 1: кто рекомендует — дата подачи, сам рекомендатель и его контакты. */ export const ReferrerSection: React.FC = ({ data, set, context, onReferrerChange }) => ( @@ -27,7 +33,9 @@ export const ReferrerSection: React.FC = ({ data, set, context, o set('ReferrerDepartment', v)} + onChange={NOOP} + readOnly + placeholder="Подставится автоматически по выбранному сотруднику" />