import * as dayjs from 'dayjs'; import { Dayjs } from 'dayjs'; import { TicketTypeEnum } from '../enums/ticket-type.enum'; import { TicketDatesOutput } from '../interfaces/ticket/ticket.dates.output'; import { TicketDto } from '../interfaces/ticket/ticket.dto'; import { VanillaDurationCalculationService } from '../services/vanilla-duration-calculation.service'; /** * @deprecated * Use as backward compatibility */ export function getTicketType(dateFrom?: Date, dateUntil?: Date): TicketTypeEnum { return dateFrom && dateUntil ? TicketTypeEnum.CALENDAR : TicketTypeEnum.ROLLING; } export function getDurationAsSecondBetweenForDateRange(dateFrom: Date, dateUntil: Date): number { return dayjs(dateUntil).diff(dateFrom, 'second'); } // -- Switch export function getTicketDatesByType( ticketDto: TicketDto, computedTicketType: TicketTypeEnum, // -> Used as backward compatibility validationDate: Date, ) { switch (computedTicketType) { case TicketTypeEnum.CALENDAR: return handleCalendarTicketType(ticketDto); case TicketTypeEnum.ROLLING: return handleRollingTicketType(ticketDto, validationDate); case TicketTypeEnum.DYNAMIC_CALENDAR: return handleDynamicCalendarType(ticketDto, validationDate); } } // -- Non exported functions function handleCalendarTicketType(ticketDto: TicketDto): TicketDatesOutput { return { dateFrom: ticketDto.validityDateFrom, dateUntil: ticketDto.validityDateUntil, }; } function handleDynamicCalendarType( ticketDto: TicketDto, validationDateFrom: Date, ): TicketDatesOutput { const vanillaDurationCalculationService: VanillaDurationCalculationService = new VanillaDurationCalculationService(); // -- const dateFrom = vanillaDurationCalculationService.findBeginningOfPeriod( dayjs(validationDateFrom), ticketDto.ticketDurationUnit, ); const dateUntil: Dayjs = vanillaDurationCalculationService.addDurationBoundedByValidity( dateFrom, ticketDto.ticketDurationUnit, ticketDto.ticketDurationValue, ticketDto.validityDateUntil, ); return { dateFrom: dateFrom.toDate(), dateUntil: dateUntil.toDate(), }; } function handleRollingTicketType(ticketDto: TicketDto, dateFrom: Date): TicketDatesOutput { const vanillaDurationCalculationService: VanillaDurationCalculationService = new VanillaDurationCalculationService(); // -- const fromattedDateFrom: Dayjs = dayjs(dateFrom); const dateUntil: Dayjs = vanillaDurationCalculationService.addDurationBoundedByValidity( fromattedDateFrom, ticketDto.ticketDurationUnit, ticketDto.ticketDurationValue, ticketDto.validityDateUntil, ); return { dateFrom: fromattedDateFrom.toDate(), dateUntil: dateUntil.toDate(), }; }