В ходе реализации задачи по управлению командировками возникла необходимость оповещать пользователя на форме создания элемента приложения о попадании дат командировки на выходные или праздничные дни. Настроил рабочий календарь, добавил исключения на 22 и 23 года, согласно приказу Минтруда. Далее нужно как то достать эту информацию на форму. Для этого была написана функция, которая принимает даты начала и конца события из соответствующих полей формы и возвращает сортированный массив дат выходных дней и дней исключений (праздничных) в формате TDate, в противном случае возвращает пустой массив.
Допускаю, что можно решить эту задачу гораздо эффективнее, но я пока только учусь, так что просьба не швыряться тапками. Публикую это здесь, т.к. хочу "оживить" форум хотя бы до уровня "стаковерфлоу"), ну и вдруг кому пригодится.
Так же если подскажете более простое/лёгкое/элегантное решение пошлю вам лучи добра и плюсов в карму.
Код:
async function myWeekendsHolidays(stDate: TDate, enDate: TDate): Promise<TDate[]> {
const timeStart = new TTime(0, 0, 0, 0);
var myHolidays: TDate[]
myHolidays = [];
let fromDate = stDate.asDatetime(timeStart); // переводим в формат TDateTime
let toDate = enDate.asDatetime(timeStart);
// получение праздничных дней:
const specialDays = await System.productionSchedule.getSpecialDays(fromDate, toDate).then(e=> e.filter(e=> e.holiday==true)); // выбираем все дни-исключения попадающие в заданный период
if (specialDays !== undefined) {
for (let elem of specialDays){ перебираем полученный массив и добавляем его в ответ функции
myHolidays.push(elem.date);
}
}
//Поиск выходных дней через день недели в соответствующем формате
let myWE: string='56';
let currentD = fromDate;
while(currentD.asDate() <= toDate.asDate()){ // перебираем все даты заданного периода
if (myWE.includes(currentD.format('e'))){ // если суббота (5ый день) или воскресенье (6ой)
// fromDate.format('d') d: - номер дня недели, где воскресенье 0, 'e' - номер дня недели, где понедельник 0
myHolidays.push(currentD.getDate()); // добавляем его в массив ответов
}
currentD = currentD.addDate(0,0,1).getDate().asDatetime(timeStart);
}
return myHolidays.sort((a,b) => a.asDatetime(timeStart).unix() - b.asDatetime(timeStart).unix()); // возвращаем сортированный массив