feat: fiche integration activité récente

wip-related-pages
Sébastien Arod 2024-09-07 15:45:52 +02:00
parent d82268779b
commit a5b2eeca75
5 changed files with 53 additions and 19 deletions

View File

@ -15,6 +15,7 @@ export type Famille = Readonly<{
Sortie: Date | null;
// sorted by date asc
Evenements: EvenementFamille[];
DerniereModification: Date;
}>;
export function periodOfResistance(
@ -42,6 +43,16 @@ export function isResistant(
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())

View File

@ -100,6 +100,10 @@ function buildFamily(
Integration: datePropertyToDate(pageProperties, "Intégration"),
Sortie: datePropertyToDate(pageProperties, "Sortie"),
Evenements: familyEvents.filter((fe) => fe.notionIdFamille === page.id),
DerniereModification: datePropertyToDate(
pageProperties,
"Dernière modification"
)!,
};
return family;
}

View File

@ -6,13 +6,19 @@ export function datePropertyToDate(
propName: string
): Date | null {
const propValue = extractPagePropertyValue(pageProperties, propName);
if (propValue.type !== "date") {
throw new Error(
`Property ${propName} was expected to have type "date" but got "${propValue.type}".`
);
}
if (propValue.type === "date") {
if (propValue.date === null) {
return null;
}
return new Date(Date.parse(propValue.date.start));
} else if (propValue.type === "last_edited_time") {
if (propValue.last_edited_time === null) {
return null;
}
return new Date(Date.parse(propValue.last_edited_time));
} else {
throw new Error(
`Property ${propName} was expected to have type "date" or "last_edited_time" but got "${propValue.type}".`
);
}
}

View File

@ -3,34 +3,34 @@ import { StatsType } from "../StatsDesc";
export const statsGeneralesDesc = {
label: "Stats Générales",
stats: {
nbFamillesActuellementResistantes: {
label: "Nb Familles actuellement Résistantes",
nbFamillesResistantesActuelles: {
label: "Nb Familles Résistantes actuelles",
},
nbFamillesResistantesDepuisLeDebut: {
label: "Nb Familles Résistantes depuis le début du mouvement",
nbFamillesResistantesActuellesOuPassees: {
label: "Nb Familles Résistantes actuelles ou passées",
},
dureeResistanceMoyenne: {
label: "Duree de résistantes moyenne",
label: "Durée moyenne de résistance",
unit: " jours",
},
dureeResistanceMedianne: {
label: "Duree de résistantes médiane",
label: "Durée médiane de résistance",
unit: " jours",
},
contexteEntree: {
label: "Context d'entrée des familles",
label: "Contexte d'entrée des familles",
stats: {
pasDeDemandePleinDroit: {
label: "Nb Familles Pas de demande (Plein droit)",
label: "Pas de demande (Plein droit)",
},
pasDeDemande: {
label: "Nb Familles Pas de demande",
label: "Pas de demande",
},
apresRefus: {
label: "Nb Familles Après refus - NbFamilles",
label: "Après refus",
},
apresMiseEnDemeure: {
label: "Nb Familles Après mise en demeure",
label: "Après mise en demeure",
},
apresPoursuiteProcureur: {
@ -38,6 +38,9 @@ export const statsGeneralesDesc = {
},
},
},
nbFicheIntegrationActiviteRecente: {
label: "Nb fiche d'intégration avec une activité < 30j",
},
},
} as const;

View File

@ -1,7 +1,9 @@
import { differenceInDays } from "date-fns";
import {
dureeResistanceInDays,
Famille,
isExResistant,
isIntegration,
isResistant,
} from "../../../data/Famille";
import { average } from "../../../utils/math/average";
@ -15,12 +17,18 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales {
const dureesResistances = famillesResistantesOrEx.map(
(f) => dureeResistanceInDays(f)!
);
const now = new Date();
const fichesIntegrationRecementModifiees = familles.filter(
(f) =>
isIntegration(f) && differenceInDays(now, f.DerniereModification) <= 30
);
const statsGenerales: StatsGenerales = {
nbFamillesActuellementResistantes: familles.filter((f) => isResistant(f))
nbFamillesResistantesActuelles: familles.filter((f) => isResistant(f))
.length,
nbFamillesResistantesDepuisLeDebut: famillesResistantesOrEx.length,
nbFamillesResistantesActuellesOuPassees: famillesResistantesOrEx.length,
dureeResistanceMedianne: median(dureesResistances),
dureeResistanceMoyenne: average(dureesResistances),
contexteEntree: {
pasDeDemandePleinDroit: famillesResistantesOrEx.filter(
(f) => f.ContexteEntree === "Pas de demande (Plein droit)"
@ -38,6 +46,8 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales {
(f) => f.ContexteEntree === "Après poursuite procureur"
).length,
},
nbFicheIntegrationActiviteRecente:
fichesIntegrationRecementModifiees.length,
};
return statsGenerales;
}