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 { StatutFamille } from "./StatutFamille"; export type Famille = Readonly<{ notionId: string; Titre: string; Statut: StatutFamille; Integration: Date | null; ContexteEntree: ContexteEntreeDC; Sortie: Date | null; // sorted by date asc Evenements: EvenementFamille[]; DerniereModification: Date; }>; export function periodOfResistance( family: Famille, atDate: Date = new Date(Date.now()) ): Period | null { if (family.Statut !== "Résistant.e" && family.Statut !== "Ex résistant·e·s") { 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 isIntegration(famille: Famille) { return ( famille.Statut === "Se questionne" || famille.Statut === "Déclaration validée - Attente éléments" || famille.Statut === "Rédaction Déclaration" || famille.Statut === "Désobéissance décidée" || famille.Statut === "À préciser" ); } 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); }