From 79963e4035ea3fe7902508cbc7adda70b0dea081 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, 9 Oct 2026 13:00:55 +0500 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BE=D1=82=D0=BC=D0=B5=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=20=C2=AB=D0=A1=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=20=D0=A1=D0=91=C2=BB=20=D1=81=20=D0=BF=D1=80=D0=B8?= =?UTF-8?q?=D0=BC=D0=B5=D1=87=D0=B0=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=B2=20?= =?UTF-8?q?=D0=B7=D0=B0=D1=8F=D0=B2=D0=BA=D0=B5=20=D0=BD=D0=B0=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D1=91=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Инициатор при подаче отмечает, что кандидат согласован со службой безопасности; при отметке обязательно примечание СБ (без отметки поле скрыто и очищается). Поле информационное, на маршрут не влияет. Раздел «6. Служба безопасности» — перед вложениями, «Примечание для согласующих» стало разделом 7. Колонки HireSecurityApproved (Boolean), HireSecurityNote (Note). Co-Authored-By: Claude Opus 5.5 (1M context) --- .../RecruitingHire/RecruitingHireForm.tsx | 2 ++ .../RecruitingHire/RecruitingHireView.tsx | 2 ++ .../forms/RecruitingHire/load.ts | 4 ++- .../forms/RecruitingHire/model.ts | 7 ++++ .../forms/RecruitingHire/provisioning.json | 3 ++ .../RecruitingHire/sections/NoteSection.tsx | 4 +-- .../sections/SecuritySection.tsx | 34 +++++++++++++++++++ .../forms/RecruitingHire/validation.test.ts | 10 ++++++ .../forms/RecruitingHire/validation.ts | 9 ++++- 9 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 src/webparts/requestPortal/forms/RecruitingHire/sections/SecuritySection.tsx diff --git a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireForm.tsx b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireForm.tsx index 33267fc..3644ea4 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireForm.tsx +++ b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireForm.tsx @@ -73,6 +73,7 @@ import { PpeSection } from './sections/PpeSection'; import { ConditionsSection } from './sections/ConditionsSection'; import { AgencySection } from './sections/AgencySection'; import { NoteSection } from './sections/NoteSection'; +import { SecuritySection } from './sections/SecuritySection'; import { useStableCallback } from '../../shared/useStableCallback'; const RecruitingHireForm: React.FC = ({ @@ -409,6 +410,7 @@ const RecruitingHireForm: React.FC = ({ + diff --git a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx index fe7528b..98721ba 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx +++ b/src/webparts/requestPortal/forms/RecruitingHire/RecruitingHireView.tsx @@ -61,6 +61,7 @@ import { PpeSection } from './sections/PpeSection'; import { ConditionsSection } from './sections/ConditionsSection'; import { AgencySection } from './sections/AgencySection'; import { NoteSection } from './sections/NoteSection'; +import { SecuritySection } from './sections/SecuritySection'; import { ApproverNoteBanner } from '../../shared/approverNote'; import { useStableCallback } from '../../shared/useStableCallback'; @@ -416,6 +417,7 @@ const RecruitingHireView: React.FC = ({ context, itemI + diff --git a/src/webparts/requestPortal/forms/RecruitingHire/load.ts b/src/webparts/requestPortal/forms/RecruitingHire/load.ts index 9d757ca..ada91f8 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/load.ts +++ b/src/webparts/requestPortal/forms/RecruitingHire/load.ts @@ -25,7 +25,7 @@ const SCALAR_FIELDS: (keyof IFormData)[] = [ 'HireCandidateName', 'HireHireDate', 'Position', 'Department', 'SiteLocation', 'PpeHeight', 'PpeClothingSize', 'PpeShoeSize', 'ProbationPeriod', 'ProbationPeriodOther', 'SalaryProbation', 'SalaryAfterProbation', 'WorkSchedule', 'WorkScheduleOther', - 'AgencyName', 'AgencyTerms', 'HireApproverNote', + 'AgencyName', 'AgencyTerms', 'HireSecurityNote', 'HireApproverNote', 'SelectionRequestId', 'SelectionRequestListId', 'SelectionRequestCode' ]; @@ -62,6 +62,7 @@ export async function loadHireRequest(itemId: number, listId?: string): Promise< 'ProjectCode', 'RecruitingAgency', 'HireOnArrival', + 'HireSecurityApproved', 'HireApproverNoteImportant', APPROVER_CHANGES_FIELD, 'RequestStatus', @@ -79,6 +80,7 @@ export async function loadHireRequest(itemId: number, listId?: string): Promise< // Флаг агентства — булево поле (Yes/No), не строка. (data as unknown as Record).RecruitingAgency = !!item.RecruitingAgency; (data as unknown as Record).HireOnArrival = !!item.HireOnArrival; + data.HireSecurityApproved = !!item.HireSecurityApproved; data.HireApproverNoteImportant = !!item.HireApproverNoteImportant; SCALAR_FIELDS.forEach((key) => { diff --git a/src/webparts/requestPortal/forms/RecruitingHire/model.ts b/src/webparts/requestPortal/forms/RecruitingHire/model.ts index ad6c2e3..fba199c 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/model.ts +++ b/src/webparts/requestPortal/forms/RecruitingHire/model.ts @@ -79,6 +79,11 @@ export interface IFormData { RecruitingAgency: boolean; AgencyName: string; AgencyTerms: string; + // Служба безопасности: инициатор при подаче отмечает, что кандидат согласован + // с СБ; при отметке обязательно примечание (см. validation.ts). Информационное — + // на маршрут и решения не влияет. + HireSecurityApproved: boolean; + HireSecurityNote: string; // Примечание для согласующих (shared/approverNote): текст + «Важное». // Префикс Hire — чтобы internalName не совпал с одноимёнными колонками других форм. HireApproverNote: string; @@ -124,6 +129,8 @@ export const EMPTY_DATA: IFormData = { RecruitingAgency: false, AgencyName: '', AgencyTerms: '', + HireSecurityApproved: false, + HireSecurityNote: '', HireApproverNote: '', HireApproverNoteImportant: false }; diff --git a/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json b/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json index 502f527..a98a0b1 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json +++ b/src/webparts/requestPortal/forms/RecruitingHire/provisioning.json @@ -46,6 +46,9 @@ { "internalName": "AgencyName", "title": "Название компании (агентство)", "type": "Text" }, { "internalName": "AgencyTerms", "title": "Условия (агентство)", "type": "Note" }, + { "internalName": "HireSecurityApproved", "title": "Согласован СБ", "type": "Boolean" }, + { "internalName": "HireSecurityNote", "title": "Примечание СБ", "type": "Note" }, + { "internalName": "HireApproverNote", "title": "Примечание для согласующих", "type": "Note" }, { "internalName": "HireApproverNoteImportant", "title": "Примечание — важное", "type": "Boolean" } ] diff --git a/src/webparts/requestPortal/forms/RecruitingHire/sections/NoteSection.tsx b/src/webparts/requestPortal/forms/RecruitingHire/sections/NoteSection.tsx index 65797f6..1a860d0 100644 --- a/src/webparts/requestPortal/forms/RecruitingHire/sections/NoteSection.tsx +++ b/src/webparts/requestPortal/forms/RecruitingHire/sections/NoteSection.tsx @@ -8,10 +8,10 @@ const NOTE_FIELD_KEYS: IApproverNoteFieldKeys = { important: 'HireApproverNoteImportant' }; -/** 6. Примечание для согласующих — общий раздел shared/approverNote на полях приёма. */ +/** 7. Примечание для согласующих — общий раздел shared/approverNote на полях приёма. */ export const NoteSection: React.FC = ({ data, set }) => ( { set('HireApproverNote', note.text); diff --git a/src/webparts/requestPortal/forms/RecruitingHire/sections/SecuritySection.tsx b/src/webparts/requestPortal/forms/RecruitingHire/sections/SecuritySection.tsx new file mode 100644 index 0000000..4d7d4b5 --- /dev/null +++ b/src/webparts/requestPortal/forms/RecruitingHire/sections/SecuritySection.tsx @@ -0,0 +1,34 @@ +import * as React from 'react'; +import { CollapseSection, FormField, TextArea, Toggle } from '../../../shared/ui'; +import { ISectionProps } from '../model'; + +/** + * 6. Служба безопасности: инициатор отмечает, что кандидат согласован с СБ, и + * тогда обязательно пишет примечание (см. validation.ts). Поле информационное — + * на маршрут и решения согласующих не влияет. При снятии отметки примечание + * очищается, чтобы в заявку не ушёл текст скрытого поля (как в AgencySection). + */ +export const SecuritySection: React.FC = ({ data, set }) => { + const handleToggle = (value: boolean): void => { + set('HireSecurityApproved', value); + if (!value) set('HireSecurityNote', ''); + }; + + return ( + + + + + {data.HireSecurityApproved && ( + +