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; Sortie: Date | null;
// sorted by date asc // sorted by date asc
Evenements: EvenementFamille[]; Evenements: EvenementFamille[];
DerniereModification: Date;
}>; }>;
export function periodOfResistance( export function periodOfResistance(
@ -42,6 +43,16 @@ export function isResistant(
return por !== null && isPeriodContaining(por, 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( export function isExResistant(
family: Famille, family: Famille,
date: Date = new Date(Date.now()) date: Date = new Date(Date.now())

View File

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

View File

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

View File

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

View File

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