From 391ab662293e637b12ff306822f0a9fde0739d91 Mon Sep 17 00:00:00 2001 From: "gorbenko.pavel" Date: Wed, 9 Sep 2026 12:07:22 +0000 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D1=8F=D0=B5=D1=82=20=D0=BA=D1=80=D0=B0=D0=B9=D0=BD=D0=B8=D0=B9?= =?UTF-8?q?=20=D1=81=D1=80=D0=BE=D0=BA=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1?= =?UTF-8?q?=D0=BE=D1=82=D0=BA=D0=B8=20=D0=BE=D0=B1=D1=80=D0=B0=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20(AppealDueDate)=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Срок считается как 5 рабочих дней от даты отправки, выходные не учитываются; используется в форматировании представления списка обращений в SharePoint. Reviewed-on: http://git.tnsu.kz/gorbenko.pavel/hr-appeals/pulls/4 --- server/src/sharepoint.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/server/src/sharepoint.ts b/server/src/sharepoint.ts index 2bd255e..9dfce49 100644 --- a/server/src/sharepoint.ts +++ b/server/src/sharepoint.ts @@ -24,8 +24,26 @@ export interface IFeedbackSubmission { suggestion: string; } +// 5 рабочих дней от текущей даты, выходные (сб/вс) не считаются днём срока — +// используется как крайний срок обработки обращения (AppealDueDate). +function addBusinessDays(from: Date, days: number): Date { + const result = new Date(from); + let remaining = days; + + while (remaining > 0) { + result.setDate(result.getDate() + 1); + const dayOfWeek = result.getDay(); // 0 = воскресенье, 6 = суббота + if (dayOfWeek !== 0 && dayOfWeek !== 6) { + remaining -= 1; + } + } + + return result; +} + // Имена полей — internal name столбцов списка SharePoint (Company/Name/Position/ -// Type/IssueDescription/SuggestionText/WantsFeedback), не отображаемые названия. +// Type/IssueDescription/SuggestionText/WantsFeedback/AppealDueDate), не +// отображаемые названия. async function buildFields(data: IFeedbackSubmission): Promise> { const typeLabel = data.kind === 'other' ? data.kindOther : KIND_LABELS[data.kind]; const name = data.isAnonymous ? '' : data.fullName; @@ -38,7 +56,8 @@ async function buildFields(data: IFeedbackSubmission): Promise