fix: организация в заявке на рабочее место больше не предзаполняется

Подставлялась организация инициатора, а не нового сотрудника — её
приходилось исправлять. Теперь поле пустое и выбирается вручную,
обязательность сохранена.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Тимур Городецкий
2026-10-07 12:20:05 +05:00
parent 690a692c07
commit 50bb3e2307
2 changed files with 3 additions and 32 deletions
@@ -43,7 +43,6 @@ import {
IAttachmentInfo
} from '../../shared/attachments/attachments.service';
import { effectiveUserEmail } from '../../shared/impersonation';
import { getEmployeeOrganizations, employeeCompanies } from '../../shared/dictionary';
import { friendlyErrorMessage } from '../../shared/diagnostics';
import { IRequestFormProps } from '../../models/types';
import {
@@ -141,8 +140,7 @@ const WorkplaceSetupForm: React.FC<IRequestFormProps> = ({
loadHirePrefill(sourceId)
.then((prefilled) => {
if (alive) {
// Merge, а не replace: организация заявителя (ниже) резолвится отдельным
// эффектом и могла успеть записаться раньше — не затираем её.
// Merge, а не replace: пользователь мог успеть что-то ввести до ответа.
setData((prev) => ({ ...prev, ...prefilled }));
setSourceHire((prev) => (prev ? { ...prev, candidateName: prefilled.FullName } : prev));
}
@@ -163,33 +161,6 @@ const WorkplaceSetupForm: React.FC<IRequestFormProps> = ({
const approval = useMemo(() => workplaceApprovalService(editListId), [editListId]);
const userEmail = effectiveUserEmail(context);
// Организации заявителя (Employee/ByEmail) — форма не о самом заявителе, а о
// новом сотруднике (FullName — обычный текст, предзаполняется из «Заявки на
// прием», и его чаще всего ещё нет в системе кадров), поэтому организация
// тянется по ТЕКУЩЕМУ пользователю. Это только предложение: поле дальше
// редактируется вручную. На редактировании уже сохранённое значение не перезатираем.
useEffect(() => {
if (editId || !userEmail) {
return;
}
let alive = true;
getEmployeeOrganizations(context, userEmail)
.then((records) => {
if (alive) {
setData((prev) => ({
...prev,
Companies: prev.Companies.length > 0 ? prev.Companies : employeeCompanies(records)
}));
}
})
.catch(() => undefined);
return () => {
alive = false;
};
// context — единственный экземпляр WebPartContext на всё время жизни
// веб-части, так что перезапуска эффекта эта зависимость не добавляет.
}, [editId, userEmail, context]);
// pageUrl формы (requestType.id совпадает с ним по конвенции портала, см.
// data/requests.ts) → числовой RequestTypeId, нужный approval-route API.
const requestTypeIdState = useRequestTypeId(context, requestType.id);
@@ -41,8 +41,8 @@ export interface IFormData {
StartDate: string;
/**
* Организации заявителя — мультивыбор из справочника (CompanyPickerMulti).
* Предзаполняется из Employee/ByEmail по e-mail заявителя (не нового
* сотрудника — его ещё нет в системе кадров), дальше редактируется вручную.
* Не предзаполняется (решение Тимура 2026-10-07: организация инициатора
* подставлялась не та) — выбирается вручную.
* В SP хранится JSON-ом в колонке WorkplaceCompaniesJson (см. submit.ts).
*/
Companies: ICompany[];