2025-05-14 21:45:16 +02:00

64 lines
2.3 KiB
TypeScript

import { getMinutesFromTimeInString, getNumberOfWeekendDays } from '@seed/helpers/Utils.dates';
import { DateRangeComponent, SlotComponent } from '@seed/interfaces/components.dates';
import { DateTime } from 'luxon';
export interface StartToEndFormat {
bookingDate: string;
bookingStart: string;
bookingEnd: string;
bookingDurationInMinutes: number;
}
export interface SlotFormat {
bookingStart: string;
bookingEnd: string;
bookingHourStart: string;
bookingHourEnd: string;
bookingDurationInMinutes: number;
}
export const formatStartToEnd = (input: DateRangeComponent, options?: { zone: string }): StartToEndFormat => {
const zone = options?.zone || process.env.TIMEZONE || 'utc';
const bookingStart = DateTime.fromJSDate(input.startDate, { zone });
const bookingEnd = DateTime.fromJSDate(input.endDate, { zone });
const durationObject = bookingEnd.diff(bookingStart, 'minutes').toObject();
return {
bookingDate: bookingStart.toFormat('dd/MM/yyyy'),
bookingStart: bookingStart.toFormat('HH:mm'),
bookingEnd: bookingEnd.toFormat('HH:mm'),
bookingDurationInMinutes: durationObject.minutes || 0,
};
};
export const formatSlot = (input: SlotComponent, options?: { zone: string; removeWeekend?: boolean }): SlotFormat => {
const zone = options?.zone || process.env.TIMEZONE || 'utc';
const removeWeekend = options?.removeWeekend || false;
const { startDate, endDate, startTime, endTime } = input;
const bookingStart = DateTime.fromJSDate(startDate, { zone });
let bookingEnd = DateTime.fromJSDate(endDate, { zone });
const numberOfDay = bookingEnd.diff(bookingStart, 'days').toObject();
const startTimeInMin = getMinutesFromTimeInString(startTime);
const endTimeInMin = getMinutesFromTimeInString(endTime);
let daysToRemove = 0;
if (removeWeekend) {
daysToRemove = getNumberOfWeekendDays(bookingStart, bookingEnd);
}
const finalNumberOfDays = (numberOfDay.day || numberOfDay.days || 0) + 1 - daysToRemove;
bookingEnd = bookingEnd.minus({ second: 1 });
return {
bookingStart: bookingStart.toFormat('dd/MM/yyyy'),
bookingEnd: bookingEnd.toFormat('dd/MM/yyyy'),
bookingHourStart: startTime,
bookingHourEnd: endTime,
bookingDurationInMinutes: finalNumberOfDays * (endTimeInMin - startTimeInMin),
};
};