From 984eb65f5b4e86f8c545f9f32bdc7a48539e4c5e 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: Fri, 16 Oct 2026 15:59:32 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D0=BE=D0=BB=D0=B5=20=C2=AB=D0=92?= =?UTF-8?q?=D1=80=D0=B5=D0=BC=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B?= =?UTF-8?q?=C2=BB=20=D0=B2=20=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B5=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B8=D1=91=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Пункт 4.5 — тот же выбор, что 5.6 в заявке на подбор, с «Другое» и ручным вводом; подставляется из связанного подбора и обязателен для отправки. Колонка сайта WorkHours общая с подбором (тот же тип, заголовок и варианты), в список приёма её подключает провизионинг — до деплоя, иначе заявка не сохранится. «Сдельная оплата труда» сдвинута на 4.6. Co-Authored-By: Claude Opus 5.5 (1M context) --- .../forms/RecruitingHire/README.md | 2 ++ .../forms/RecruitingHire/load.ts | 1 + .../forms/RecruitingHire/model.ts | 22 ++++++++++++++++ .../forms/RecruitingHire/provisioning.json | 2 ++ .../sections/ConditionsSection.tsx | 25 +++++++++++++++++-- .../forms/RecruitingHire/selectionPrefill.ts | 2 ++ .../forms/RecruitingHire/validation.test.ts | 3 ++- .../forms/RecruitingHire/validation.ts | 3 ++- 8 files changed, 56 insertions(+), 4 deletions(-) diff --git a/src/webparts/requestPortal/forms/RecruitingHire/README.md b/src/webparts/requestPortal/forms/RecruitingHire/README.md index 93d96ff..53fcd82 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/README.md +++ b/src/webparts/requestPortal/forms/RecruitingHire/README.md @@ -17,6 +17,8 @@ (`CompanyPickerMulti`), хранится JSON-массивом `{Id,Name}` в Note-колонке `CompaniesJson`. - **График работы (WorkSchedule)** — выпадающий список (набор совпадает с «Заявкой на подбор»); при выборе «Другое» появляется ручной ввод `WorkScheduleOther`. +- **Время работы (WorkHours)** — так же, как график: набор и колонка сайта общие + с «Заявкой на подбор», оттуда подставляется; «Другое» → `WorkHoursOther`. - **Испытательный срок (ProbationPeriod)** — выпадающий список частых сроков. - **Рекрутинговое агентство (условный блок, последняя секция)** — `Toggle` `RecruitingAgency`; при включении показываются «Название компании» (`AgencyName`) diff --git a/src/webparts/requestPortal/forms/RecruitingHire/load.ts b/src/webparts/requestPortal/forms/RecruitingHire/load.ts index f6cc282..6941bef 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/load.ts +++ b/src/webparts/requestPortal/forms/RecruitingHire/load.ts @@ -25,6 +25,7 @@ const SCALAR_FIELDS: (keyof IFormData)[] = [ 'HireCandidateName', 'HireHireDate', 'Position', 'Department', 'SiteLocation', 'PpeHeight', 'PpeClothingSize', 'PpeShoeSize', 'ProbationPeriod', 'ProbationPeriodOther', 'SalaryProbation', 'SalaryAfterProbation', 'WorkSchedule', 'WorkScheduleOther', + 'WorkHours', 'WorkHoursOther', 'AgencyName', 'AgencyTerms', 'HireSecurityNote', 'HireApproverNote', 'SelectionRequestId', 'SelectionRequestListId', 'SelectionRequestCode' ]; diff --git a/src/webparts/requestPortal/forms/RecruitingHire/model.ts b/src/webparts/requestPortal/forms/RecruitingHire/model.ts index c901068..e409b5f 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/model.ts +++ b/src/webparts/requestPortal/forms/RecruitingHire/model.ts @@ -75,6 +75,12 @@ export interface IFormData { SalaryAfterProbation: string; WorkSchedule: string; WorkScheduleOther: string; + /** + * Время работы — та же колонка сайта WorkHours (Choice), что в заявке на подбор: + * оттуда и подставляется (см. selectionPrefill). + */ + WorkHours: string; + WorkHoursOther: string; /** * Сдельная оплата труда — информационная отметка, на обязательность окладов не * влияет. Та же колонка сайта PieceworkPay (Boolean), что в заявке на подбор: @@ -132,6 +138,8 @@ export const EMPTY_DATA: IFormData = { SalaryAfterProbation: '', WorkSchedule: '', WorkScheduleOther: '', + WorkHours: '', + WorkHoursOther: '', PieceworkPay: false, RecruitingAgency: false, AgencyName: '', @@ -201,5 +209,19 @@ export const WORK_SCHEDULE_OPTIONS: ISelectOption[] = [ { value: OTHER_VALUE, label: OTHER_VALUE } ]; +/** + * Варианты «Время работы» (24-часовой формат) — совпадают с набором в форме + * «Заявка на подбор» (WORK_HOURS_OPTIONS) и с choices колонки WorkHours: + * формы независимы, значения продублированы намеренно. + */ +export const WORK_HOURS_OPTIONS: ISelectOption[] = [ + { value: '08:00-17:00', label: '08:00-17:00' }, + { value: '09:00-18:00', label: '09:00-18:00' }, + { value: '07:00-19:00', label: '07:00-19:00' }, + { value: '08:00-20:00', label: '08:00-20:00' }, + { value: '09:00-21:00', label: '09:00-21:00' }, + { value: OTHER_VALUE, label: OTHER_VALUE } +]; + /** Плейсхолдер для полей-людей. */ export const PERSON_PLACEHOLDER = 'Начните вводить имя сотрудника…'; diff --git a/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json b/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json index 4c97646..d49ba14 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json +++ b/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json @@ -41,6 +41,8 @@ { "internalName": "SalaryAfterProbation", "title": "Оклад по завершении ИС", "type": "Number", "decimals": 2 }, { "internalName": "WorkSchedule", "title": "График работы", "type": "Text" }, { "internalName": "WorkScheduleOther", "title": "График работы (другое)", "type": "Text" }, + { "internalName": "WorkHours", "title": "Время работы", "type": "Choice", "choices": ["08:00-17:00", "09:00-18:00", "07:00-19:00", "08:00-20:00", "09:00-21:00", "Другое"] }, + { "internalName": "WorkHoursOther", "title": "Время работы (другое)", "type": "Text" }, { "internalName": "PieceworkPay", "title": "Сдельная оплата труда", "type": "Boolean" }, { "internalName": "RecruitingAgency", "title": "Рекрутинговое агентство", "type": "Boolean" }, diff --git a/src/webparts/requestPortal/forms/RecruitingHire/sections/ConditionsSection.tsx b/src/webparts/requestPortal/forms/RecruitingHire/sections/ConditionsSection.tsx index 134d6f4..e5459da 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/sections/ConditionsSection.tsx +++ b/src/webparts/requestPortal/forms/RecruitingHire/sections/ConditionsSection.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import { CollapseSection, FormField, TextInput, MoneyInput, Select, Toggle } from '../../../shared/ui'; -import { ISectionProps, OTHER_VALUE, WORK_SCHEDULE_OPTIONS, PROBATION_PERIOD_OPTIONS } from '../model'; +import { ISectionProps, OTHER_VALUE, WORK_SCHEDULE_OPTIONS, WORK_HOURS_OPTIONS, PROBATION_PERIOD_OPTIONS } from '../model'; interface IConditionsSectionProps extends ISectionProps { /** Начальник расчётной группы правит оклады даже в режиме просмотра (см. approverRights.ts). */ @@ -67,8 +67,29 @@ export const ConditionsSection: React.FC = ({ data, set /> )} + +