From 72e330e659b9cb3f382d2b5dbc13ea196089a2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A2=D0=B8=D0=BC=D1=83=D1=80=20=D0=93=D0=BE=D1=80=D0=BE?= =?UTF-8?q?=D0=B4=D0=B5=D1=86=D0=BA=D0=B8=D0=B9?= Date: Wed, 28 Oct 2026 16:48:09 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D0=BE=D0=BB=D1=8F=20=D0=B2=D0=B8?= =?UTF-8?q?=D0=B4=D0=B0=20=C2=AB=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D0=B4=D1=80=D1=83=D0=B3=D1=83=D1=8E=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BB=D0=B6=D0=BD=D0=BE=D1=81=D1=82=D1=8C=C2=BB=20=D0=B2?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D0=B8=20?= =?UTF-8?q?=D1=83=D1=81=D0=BB=D0=BE=D0=B2=D0=B8=D0=B9=20=D0=A2=D0=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Третий разобранный вид: новая должность из справочника с ручным вводом, дата перевода, причина (карьерный рост / вакантная должность / новый объект, перераспределение функций / иное) и обоснование. Должностная инструкция по ТЗ прикладывается всегда — обязательный слот вложений. Работника и работодателя не различаем: причины видны всем. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../forms/ContractChange/README.md | 3 +- .../byType/ChangeTypeSections.tsx | 4 +- .../PositionTransferSection.tsx | 68 +++++++++++++++++++ .../byType/PositionTransfer/options.ts | 17 +++++ .../ContractChange/byType/attachmentSlots.ts | 4 ++ .../forms/ContractChange/load.ts | 12 +++- .../forms/ContractChange/model.ts | 17 ++++- .../forms/ContractChange/provisioning.json | 12 +++- .../forms/ContractChange/submit.ts | 21 +++++- 9 files changed, 151 insertions(+), 7 deletions(-) create mode 100644 src/webparts/requestPortal/forms/ContractChange/byType/PositionTransfer/PositionTransferSection.tsx create mode 100644 src/webparts/requestPortal/forms/ContractChange/byType/PositionTransfer/options.ts diff --git a/src/webparts/requestPortal/forms/ContractChange/README.md b/src/webparts/requestPortal/forms/ContractChange/README.md index 8a1e35a..20308a9 100644 --- a/src/webparts/requestPortal/forms/ContractChange/README.md +++ b/src/webparts/requestPortal/forms/ContractChange/README.md @@ -59,7 +59,8 @@ RequestTypeId» в `docs/forms.md`). Тип и маршрут в админке | --- | --- | --- | | Повышение должностного оклада | `SalaryIncrease` | текущий оклад, новый оклад (`MoneyInput`, Number), дата изменения, причина (испытательный срок / расширение функционала / иное), обоснование — при «иное» это и есть текст причины | | Установление надбавки / доплаты | `Allowance` | основание (а–д: надбавка или доплата видно из пункта), дата начала, дата окончания или «бессрочно» (флажок прячет и очищает дату), размер + переключатель «% / ₸» (`UnitSwitch`, по умолчанию %), обоснование — в т.ч. объём доп. работы при совмещении и текст «иное». Письменное согласие работника на совмещение оформляет кадровик после согласования — не в форме. Вложение **«Результаты аттестации»** — только при основании «г», обязательно | -| Остальные 8 | — | ещё не разобраны с кадрами | +| Перевод на другую должность (постоянный) | `PositionTransfer` | новая должность (`PositionPicker`: справочник `Dictionary/Positions` + ручной ввод), дата перевода, причина (карьерный рост / вакантная должность / новый объект, перераспределение функций / иное), обоснование. Работника и работодателя не различаем — причины видны всем, работник пишет текст заявления в обоснование. Вложение **«Должностная инструкция»** — всегда, обязательно | +| Остальные 7 | — | ещё не разобраны с кадрами | **Вложения по колонке ТЗ «Что приложить»** (решение 2026-10-28): фиксированные подписанные слоты по виду (подпись — что за документ); обязательны там, где ТЗ diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx index e105da9..5185752 100644 --- a/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx +++ b/src/webparts/requestPortal/forms/ContractChange/byType/ChangeTypeSections.tsx @@ -3,6 +3,7 @@ import { ChangeType } from '../changeTypes'; import { ISectionProps } from '../model'; import { SalaryIncreaseSection } from './SalaryIncrease/SalaryIncreaseSection'; import { AllowanceSection } from './Allowance/AllowanceSection'; +import { PositionTransferSection } from './PositionTransfer/PositionTransferSection'; /** * Вид изменения → секция с его полями. Partial: поля видов добавляются по мере @@ -11,7 +12,8 @@ import { AllowanceSection } from './Allowance/AllowanceSection'; */ const SECTION_BY_TYPE: Partial>> = { 'salary-increase': SalaryIncreaseSection, - allowance: AllowanceSection + allowance: AllowanceSection, + 'position-transfer': PositionTransferSection }; /** Секции всех выбранных видов, в порядке выбора (сейчас вид один — см. MAX_CHANGE_TYPES). */ diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/PositionTransfer/PositionTransferSection.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/PositionTransfer/PositionTransferSection.tsx new file mode 100644 index 0000000..412b597 --- /dev/null +++ b/src/webparts/requestPortal/forms/ContractChange/byType/PositionTransfer/PositionTransferSection.tsx @@ -0,0 +1,68 @@ +import * as React from 'react'; +import { CollapseSection, FormField, TextInput, TextArea, Select } from '../../../../shared/ui'; +import { useFormReadOnly } from '@tnsu/ui-kit'; +import { PositionPicker } from '../../../../shared/dictionary'; +import { AttachmentSlotField } from '../../../../shared/attachments/AttachmentSlotField'; +import { CHANGE_TYPE_LABELS } from '../../changeTypes'; +import { ISectionProps } from '../../model'; +import { POSITION_TRANSFER_REASONS, JOB_DESCRIPTION_ATTACHMENT } from './options'; + +/** + * Поля вида «Перевод на другую должность (постоянный)». Состав согласован с + * Тимуром по ТЗ кадров: новая должность (справочник с ручным вводом), дата, + * причина (а–г), обоснование и обязательная должностная инструкция. Текущая + * должность уже видна в «Организации» — отдельного «было» нет. + * + * Поля — прямо в CollapseSection, без FormGrid (тело секции само сетка). + */ +export const PositionTransferSection: React.FC = ({ data, set, context, attachments }) => { + const readOnly = useFormReadOnly(); + + return ( + + + set('PositionTransferNewPosition', v)} + placeholder="Начните вводить название должности…" + /> + + + set('PositionTransferDate', v)} + /> + + +