Я хочу показать пример, как с помощью рабочего календаря проверить, является ли конкретная дата рабочим днём.
В примере, я получаю настройки рабочего календаря, формирую индексы выходных дней в неделе, а затем проверяю дату на специальные дни (укороченные, праздничные). Если дата приходится на выходной, беру следующий день и повторяю проверку до тех пор, пока не найду рабочий день. В результате возвращаю новую дату - рабочий день по календарю.
Код:
async function getWorkDay(date: TDatetime): Promise<TDatetime> {
//получаем настройки производственного календаря
const general_settings = await System.productionSchedule.getGeneralSettings()
//получаем выходные дни недели нашей компании, формируем из объекта массив, для получения индексов дней
const weekends = general_settings.weekends as any
const weekends_arr = Object.keys(weekends).map(key => ({ day: key, weekend: weekends[key] }));
//воскресенье 1ый день недели, а не понедельник
const rotated_arr = [weekends_arr.pop()!, ...weekends_arr]
//индексы выходных дней
const weekends_index = rotated_arr.reduce((acc: number[], el, i) => {
if (el.weekend) acc.push(i);
return acc;
}, []).join()
let curr_date = date
let this_work_day = false
//проверяем дату, рабочий ли это день
while (!this_work_day) {
//получаем спец.дни по календарю
const info_about_curr_date = await System.productionSchedule.getSpecialDays(curr_date, curr_date)
//если это не спец.день с признаком выходной и индекс дня не равен выходному дню компании, день рабочий
if ((!info_about_curr_date.length || !info_about_curr_date[0].holiday) && !weekends_index.includes(curr_date.format('e'))) {
this_work_day = true
} else {
curr_date = curr_date.addDate(0, 0, 1)
}
}
return curr_date
}
Еще больше полезной информации в ТГ канале WhatDaELMA365