statistiques/src/data/Famille.ts
2025-06-15 09:12:47 +02:00

109 lines
2.9 KiB
TypeScript

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[];
// Tous Evenements triés par date asc
// Inclus aussi les evenements sans date
EvenementsDates: 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);
}