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), }; };