diff --git a/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx b/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx index 553438d..4785acd 100644 --- a/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx +++ b/src/webparts/requestPortal/forms/ContractChange/ContractChangeForm.tsx @@ -36,17 +36,11 @@ import { dataListTitle, dataListTitleForListId } from '../../shared/listTitles'; -import { - FORM_ID, - IFormData, - EMPTY_DATA, - SetField, - REQUIRED_FIELDS_MESSAGE, - routeEmail -} from './model'; +import { FORM_ID, IFormData, EMPTY_DATA, SetField, REQUIRED_FIELDS_MESSAGE, routeEmail } from './model'; import { saveContractChangeRequest, contractChangeApprovalService } from './submit'; import { loadContractChangeRequest } from './load'; import { useContractEmployee } from './useContractEmployee'; +import { useInitiatorAutofill } from './useInitiatorAutofill'; import { RequestSection } from './sections/RequestSection'; import { ChangeTypeSections } from './byType/ChangeTypeSections'; import { prepareFilesFor } from './byType/attachmentSlots'; @@ -116,10 +110,11 @@ const ContractChangeForm: React.FC = ({ const employeeControl = useContractEmployee(context, applicantEmail, !editId, data.Employee, (record) => set('Employee', record) ); + // Пропсы шапки: сотрудник + инициатор, который следует за сотрудником, пока его не выбрали руками. + const headerProps = useInitiatorAutofill(!!editId, data, set, applicantEmail, employeeControl); // Маршрут — по сотруднику, без учётной записи — по заявителю (см. routeEmail); при // переводе в другое подразделение принимающий руководитель — первым шагом. - const isDepartmentTransfer = data.ChangeTypes.includes('department-transfer'); const { matrix, executors } = useContractRoute({ context, approval, @@ -128,7 +123,8 @@ const ContractChangeForm: React.FC = ({ editId, requestStatus, readOnly, - receivingHeadEmail: !readOnly && isDepartmentTransfer ? data.DepartmentTransferReceivingHead : '' + receivingHeadEmail: + !readOnly && data.ChangeTypes.includes('department-transfer') ? data.DepartmentTransferReceivingHead : '' }); const isValid = !!data.Employee && data.ChangeTypes.length > 0; @@ -257,7 +253,7 @@ const ContractChangeForm: React.FC = ({ {submit.error && {submit.error}} - + diff --git a/src/webparts/requestPortal/forms/ContractChange/README.md b/src/webparts/requestPortal/forms/ContractChange/README.md index 631ac92..4ffb7b6 100644 --- a/src/webparts/requestPortal/forms/ContractChange/README.md +++ b/src/webparts/requestPortal/forms/ContractChange/README.md @@ -64,8 +64,20 @@ RequestTypeId» в `docs/forms.md`). Тип и маршрут в админке | Изменение места работы (другая местность) | `WorkplaceChange` | место работы «было → стало» парой **организация + проект**: текущая организация — из «Организации» сотрудника (только чтение, отдельно не хранится — это `EmployeeCompany`), текущий проект (`ProjectPicker`); новая организация (`Dictionary/Companies`, **обязательна при отправке**, не подставляется) и новый проект; адрес нового места, дата, причина (новый объект / переезд подразделения или работодателя / иное), условия переезда и компенсации; переключатель **«Вахта»** → «График работы» (тот же набор, что в подборе и приёме, «Другое» → ручной ввод; без вахты график очищается); обоснование | | Остальные 5 | — | ещё не разобраны с кадрами | -Обязательное по виду при отправке (документы, принимающий руководитель, новая -организация) — одна функция `byType/submitChecks.ts`; черновик сохраняется без них. +Обязательное по виду при отправке (инициатор, документы, принимающий руководитель, +новая организация) — одна функция `byType/submitChecks.ts`; черновик сохраняется без них. + +**Инициатор (работник / работодатель)** — решение 2026-10-29: разделяем строго по +ТЗ, чтобы у кадров не было вопросов. Поле `ChangeInitiator` в шапке — только у +видов, которые по ТЗ может начать и работник (3, 4, 5, 7; `hasInitiatorChoice`). +По умолчанию при выборе вида: подаёт на себя — «Работник», за другого — +«Работодатель» (`defaultInitiatorRole`), под полем подсказка об этом; можно +поменять. Пока инициатора не выбирали руками, он следует за сотрудником: сменили +сотрудника — пересчитался (`useInitiatorAutofill`); после ручного выбора и у +открытого черновика — не трогается. От роли (`byType/InitiatorReasonFields`): работник — только «Текст +заявления» (по ТЗ «От работника: заявление (текст)»), работодатель — причина из +списка + «Обоснование». Текст пишется в ту же колонку `*Justification`; причина у +работника при сохранении очищается. Остальные поля вида — у обеих ролей. **Принимающий руководитель — временное решение (2026-10-29).** По ТЗ (лист «Маршрут»: А шаг 2, Б шаг 3 параллельно с непосредственным руководителем) его diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/DepartmentTransfer/DepartmentTransferSection.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/DepartmentTransfer/DepartmentTransferSection.tsx index 01f624e..504880d 100644 --- a/src/webparts/requestPortal/forms/ContractChange/byType/DepartmentTransfer/DepartmentTransferSection.tsx +++ b/src/webparts/requestPortal/forms/ContractChange/byType/DepartmentTransfer/DepartmentTransferSection.tsx @@ -1,5 +1,6 @@ import * as React from 'react'; -import { CollapseSection, FormField, TextInput, TextArea, Select, PeopleField } from '../../../../shared/ui'; +import { CollapseSection, FormField, TextInput, PeopleField } from '../../../../shared/ui'; +import { InitiatorReasonFields } from '../InitiatorReasonFields'; import { DepartmentPicker } from '../../../../shared/dictionary'; import { CHANGE_TYPE_LABELS } from '../../changeTypes'; import { ISectionProps } from '../../model'; @@ -44,21 +45,19 @@ export const DepartmentTransferSection: React.FC = ({ data, set, placeholder="Начните вводить Ф.И.О. руководителя, который принимает работника…" /> - -