From 66481a20a5a12de5cd38b8921250257bae05ba4e Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Fri, 21 Aug 2026 17:04:11 +0500 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D1=82=D1=8F=D0=B3=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D0=B4=D1=80=D0=B0=D0=B7?= =?UTF-8?q?=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B5=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B5=D0=BD=D0=B4=D0=B0=D1=82=D0=B5=D0=BB=D1=8F=20?= =?UTF-8?q?=D0=B8=D0=B7=20=D0=BF=D1=80=D0=BE=D1=84=D0=B8=D0=BB=D1=8F=20Sha?= =?UTF-8?q?rePoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ReferrerDepartment теперь заполняется из SPS-Department при выборе рекомендателя (approval.getProfileFields — тот же метод, что уже использует «Обходной лист» для Department), а не вводится вручную. Поле стало read-only, как Department в Clearance. VacancyDepartment (подразделение вакансии, куда рекомендуют) не тронут — это отдельное поле, не связанное с профилем рекомендателя. Co-Authored-By: Claude Sonnet 5 --- .../requestPortal/forms/Referral/README.md | 10 ++++- .../forms/Referral/ReferralForm.tsx | 37 ++++++++++++++----- .../Referral/sections/ReferrerSection.tsx | 10 ++++- 3 files changed, 44 insertions(+), 13 deletions(-) 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="Подставится автоматически по выбранному сотруднику" />