import { differenceInDays } from "date-fns"; import { Period } from "../period/Period"; import { arePeriodsOverlaping } from "../period/arePeriodsOverlaping"; import { isPeriodContaining } from "../period/isPeriodContaining"; import { ContexteEntreeDC } from "./ContexteEntreeDC"; import { EvenementFamille } from "./EvenementFamille"; import { statutExResistant, StatutFamille, statutResistant, } from "./StatutFamille"; import { StatutSocial } from "./StatutSocial"; import { StatutPenal } from "./StatutPenal"; import { Mission } from "./Mission"; import { Contact } from "./Contact"; export type Famille = Readonly<{ notionId: string; Titre: string; Statut: StatutFamille; Integration: Date | null; ContexteEntree: ContexteEntreeDC; Sortie: Date | null; Penal: StatutPenal; Social: StatutSocial; Departement: string | null; // Tous Evenements triés par date asc // Inclus aussi les evenements sans date Evenements: EvenementFamille[]; // Evenements durant la période EL triés par date asc EvenementsEL: EvenementFamille[]; // Evenements hors période EL triés par date asc EvenementsAvantEL: EvenementFamille[]; EvenementsApresEL: EvenementFamille[]; DerniereModification: Date; Missions: Mission[]; Contacts: Contact[]; }>; export function periodOfResistance( family: Famille, atDate: Date = new Date(Date.now()) ): Period | null { if ( family.Statut !== statutResistant && family.Statut !== statutExResistant ) { return null; } if (!family.Integration || family.Integration > atDate) { return null; } return { start: family.Integration, end: family.Sortie !== null && family.Sortie < atDate ? family.Sortie : atDate, }; } export function isResistant( family: Famille, date: Date = new Date(Date.now()) ): boolean { const por = periodOfResistance(family, date); return por !== null && isPeriodContaining(por, date); } export function isExResistant( family: Famille, date: Date = new Date(Date.now()) ): boolean { const por = periodOfResistance(family, date); return por !== null && por.end < date; } export function isResistantOverPeriod( family: Famille, period: Period ): boolean { const familyPeriodResistant: Period | null = periodOfResistance(family); return ( familyPeriodResistant !== null && arePeriodsOverlaping(familyPeriodResistant, period) ); } /** * * @param family * @param atDate * @returns the duration of resistance in days or null if family was not yet in resistances at this date */ export function dureeResistanceInDays( family: Famille, atDate: Date = new Date(Date.now()) ): number | null { const period = periodOfResistance(family, atDate); if (period == null) { return null; } return differenceInDays(period.end, period.start); }