Считает рабочие дни. Не учитывает праздники. Отсчет от 12:00:00:00 - проверить правильно ли считает, если старт в пятницу, а окончание в понедельник.
Код:
async function calculateDuration(): Promise<void> {
const dayInMs = 1000 * 60 * 60 * 24
const startTime = new TTime(12, 0, 0, 0)
const endTime = new TTime(12, 0, 0, 0)
if(Context.data.startDate
&& Context.data.endDate
&& Context.data.startDate.before(Context.data.endDate)) {
//получаем количество дней
Context.data.trip_duration = Math.round(Math.abs(Context.data.endDate.asDatetime(endTime).asDate().getTime() -
Context.data.startDate.asDatetime(startTime).asDate().getTime()) / dayInMs);
//получаем даты
let beginDate = Context.data.startDate.asDatetime(startTime).asDate();
let overDate = Context.data.endDate.asDatetime(endTime).asDate();
//получаем копии дат
let s = new Date(+beginDate);
let e = new Date(+overDate);
//устанавливаем отсчет дат с полудня
s.setHours(12, 0, 0, 0);
e.setHours(12, 0, 0, 0);
let totalDays = Math.round((e.getTime() - s.getTime()) / dayInMs);
let weeks = totalDays / 7 | 0;
let d = weeks * 5;
if (totalDays % 7) {
s.setDate(s.getDate() + weeks * 7);
while (s < e) {
s.setDate(s.getDate() + 1);
if (s.getDay() != 0 && s.getDay() != 6) {
++d;
}
}
}
if(beginDate.getDay() === 5) {
d = d + 1;
}
Context.data.trip_duration = d;
//если дата раньше текущей, то ноль
const nowDate = new TDate();
if(Context.data.startDate.before(nowDate)) {
Context.data.trip_duration = 0;
}
//умножаем на суточные в день
Context.data.sum_allowance = Context.fields.sum_allowance.create(Context.data.trip_duration * 2000)
}
}