diff --git a/src/webparts/requestPortal/forms/ContractChange/README.md b/src/webparts/requestPortal/forms/ContractChange/README.md index 11de342..f4fc843 100644 --- a/src/webparts/requestPortal/forms/ContractChange/README.md +++ b/src/webparts/requestPortal/forms/ContractChange/README.md @@ -65,7 +65,8 @@ RequestTypeId» в `docs/forms.md`). Тип и маршрут в админке | Продление срока ТД | — | **пропущен** (2026-10-29): по ТЗ это автоматический запрос ОК за месяц до окончания срочного ТД (маршрут В), а не обычная заявка — решать отдельно | | Изменение режима / графика работы | `ScheduleChange` | по ролям строго по ТЗ. Общее: текущий график + текущее время работы (списки как в подборе/приёме, «Другое» → текст; `OptionWithOtherField`, наборы — `byType/workSchedule.ts`), дата начала, вложение «Новый график» (необязательно). **Работник:** неполный рабочий день (часов) / неполная рабочая неделя (дней) — одно или оба, текст заявления. **Работодатель:** новый режим (вахтовый / сменный / иной + описание), новые график и время работы, причина (специфика объекта / смещение сроков проекта — только из ТЗ), обоснование. Поля другой роли при сохранении очищаются | | Изменение трудовой функции (без смены должности) | `FunctionChange` | ровно по шаблону ТЗ: дата изменения, «В связи с» (свободный текст — списка причин в ТЗ нет), вложение **«Новая должностная инструкция»** — обязательно. Инициатор — только руководитель | -| Остальные 2 | — | ещё не разобраны с кадрами | +| Изменение условий труда по инициативе работодателя | `EmployerInitiative` | причина (из названия вида в ТЗ: экономические / технологические / изменения в организации / сокращение объёма работ + «Другое» со своим текстом); «Что меняется» — флажки а) график работы, б) должностной оклад (можно оба, при отправке — хотя бы один); а) текущий → новый график + дата; б) **один новый оклад + доля постоянной части в %** (по умолчанию 75 из ТЗ, 0–100, можно дробную), переменная доля = остаток до 100 %, суммы обеих частей в ₸ считаются сами (`salaryParts.ts`, превысить 100 % нельзя; в SP пишутся при сохранении) + дата; даты **не раньше +15 дней** (уведомление по ТЗ: блок в календаре + проверка при отправке); обоснование — **текстом ИЛИ документом**, одно из двух обязательно при отправке | +| Остальные 1 | — | ещё не разобран с кадрами | Обязательное по виду при отправке (инициатор, документы, принимающий руководитель, новая организация) — одна функция `byType/submitChecks.ts`; черновик сохраняется без них. diff --git a/src/webparts/requestPortal/forms/ContractChange/byType/Allowance/AllowanceSection.tsx b/src/webparts/requestPortal/forms/ContractChange/byType/Allowance/AllowanceSection.tsx index 8e4356f..c578024 100644 --- a/src/webparts/requestPortal/forms/ContractChange/byType/Allowance/AllowanceSection.tsx +++ b/src/webparts/requestPortal/forms/ContractChange/byType/Allowance/AllowanceSection.tsx @@ -1,8 +1,7 @@ import * as React from 'react'; -import { CollapseSection, FormField, MoneyInput, TextInput, TextArea, Select, Checkbox } from '../../../../shared/ui'; +import { FormGrid, FormField, MoneyInput, TextInput, TextArea, Select, Checkbox } from '../../../../shared/ui'; import { useFormReadOnly } from '@tnsu/ui-kit'; import { AttachmentSlotField } from '../../../../shared/attachments/AttachmentSlotField'; -import { CHANGE_TYPE_LABELS } from '../../changeTypes'; import { ISectionProps } from '../../model'; import { ALLOWANCE_REASONS, ATTESTATION_ATTACHMENT, requiresAttestation } from './options'; import { UnitSwitch } from './UnitSwitch'; @@ -15,13 +14,13 @@ import styles from './AllowanceSection.module.scss'; * (в т.ч. объём доп. работы при совмещении). Поля необязательные; вложение * «Результаты аттестации» — только при основании «г» и там обязательно (по ТЗ). * - * Поля — прямо в CollapseSection, без FormGrid (тело секции само сетка). + * Поля — в FormGrid без заголовка: вид уже выбран выше, заголовок его только дублировал. */ export const AllowanceSection: React.FC = ({ data, set, attachments }) => { const readOnly = useFormReadOnly(); return ( - + { + set('EmployerChangeReason', v); + if (v !== EMPLOYER_REASON_OTHER) set('EmployerChangeReasonOther', ''); + }} + options={EMPLOYER_CHANGE_REASONS} + placeholder="— выберите —" + /> + + {data.EmployerChangeReason === EMPLOYER_REASON_OTHER && ( + + set('EmployerChangeReasonOther', v)} + /> + + )} + + +
+ set('EmployerChangeSchedule', checked)} + label="График работы" + /> + set('EmployerChangeSalary', checked)} + label="Должностной оклад" + /> +
+
+ + {data.EmployerChangeSchedule && ( + <> + set('EmployerChangeCurrentSchedule', v)} + onOtherChange={(v) => set('EmployerChangeCurrentScheduleOther', v)} + /> + set('EmployerChangeNewSchedule', v)} + onOtherChange={(v) => set('EmployerChangeNewScheduleOther', v)} + /> + + set('EmployerChangeScheduleDate', v)} + min={minDate} + /> + {!readOnly &&
{EMPLOYER_CHANGE_NOTICE_HINT}
} +
+ + )} + + {data.EmployerChangeSalary && ( + <> + + set('EmployerChangeNewSalary', v)} + /> + + {/* Задаётся только доля постоянной части; переменная — остаток до 100 %, + суммы считаются из оклада (см. salaryParts.ts) — превысить 100 % нельзя. */} + + set('EmployerChangeFixedPercent', sanitizeFixedPercent(v))} + placeholder="например, 75" + /> + + + undefined} + readOnly + /> + + + undefined} + readOnly + /> + + + undefined} + readOnly + /> + + + set('EmployerChangeSalaryDate', v)} + min={minDate} + /> + {!readOnly &&
{EMPLOYER_CHANGE_NOTICE_HINT}
} +
+ + )} + + +