statistiques/src/data/Famille.ts

86 lines
2.3 KiB
TypeScript
Raw Normal View History

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";
import { StatutSocial } from "./StatutSocial";
import { StatutPenal } from "./StatutPenal";
2024-09-06 13:33:16 +02:00
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;
2024-09-05 09:23:27 +02:00
// sorted by date asc
Evenements: EvenementFamille[];
DerniereModification: Date;
2024-09-06 13:33:16 +02:00
}>;
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 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);
}