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 && ( + +