import * as moment from 'moment'; import { END_DAY, END_MONTH, END_YEAR } from '../../constants/age-can-valid-until'; import { Rule } from '../../interfaces/rule'; import { TicketDto } from '../../interfaces/ticket/ticket.dto'; import { UserAgeConfig } from '../../interfaces/user-age-config'; export class UserAge implements Rule { name = 'UserAge'; validate(ticket: TicketDto): boolean { const { passengers } = ticket; if (ticket?.lastValidValidation) { return true; } const ageCanValidUntil = ticket.ageCanValidUntil || END_DAY; let ageFrom = ticket?.ageFrom; let ageUntil = ticket?.ageUntil; if (!ageFrom && (!ageUntil || ageUntil === -1)) { return true; } if (!passengers || !Array.isArray(passengers)) { return false; } const birthdate = passengers[0]?.birthdate; if (!birthdate) { return false; } //set default ageFrom if (!ageFrom && ageFrom !== 0) { ageFrom = 0; } //set default ageUntil if (ageUntil < 1) { ageUntil = undefined; } else { /** * ageUntil l'age est inclue * donc pour les calcul on ajout 1an */ ageUntil++; } let valid = false; if (ageUntil) { const config: UserAgeConfig = { [END_DAY]: { untilDate: moment(birthdate).add(ageUntil, 'years').startOf('day'), inclusivity: '[)', }, [END_MONTH]: { untilDate: moment(birthdate).add(ageUntil, 'years').endOf('month'), inclusivity: '[]', }, [END_YEAR]: { untilDate: moment(birthdate).add(ageUntil, 'years').endOf('year'), inclusivity: '[]', }, }; valid = moment().isBetween( moment(birthdate).add(ageFrom, 'years').startOf('day'), config[ageCanValidUntil].untilDate, undefined, config[ageCanValidUntil].inclusivity, ); } if (ageFrom && !ageUntil && ageUntil !== 0) { valid = this._moreThanOrEqual(ageFrom, birthdate); } return valid; } private _moreThanOrEqual(ageFrom: number, birthdate: string): boolean { const moreThanAgeFrom = moment().isAfter( moment(birthdate).add(ageFrom, 'years').startOf('day'), ); const isEqual = moment(birthdate).add(ageFrom, 'years').startOf('day').format('YYYY-MM-DD') === moment().startOf('day').format('YYYY-MM-DD'); return isEqual || moreThanAgeFrom; } }