From e1acd45eb74d6245dd3f5ad962370c1989ade175 Mon Sep 17 00:00:00 2001 From: "sebastien.arod@gmail.com" Date: Tue, 4 Jun 2024 09:29:33 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20ajoute=20Pourcentage=20d'Entrees=20Apr?= =?UTF-8?q?=C3=A8s=20Mises=20en=20Demeure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/Famille.ts | 8 ++++++ .../fetchFamiliesWithEventsFromNotion.ts | 5 ++++ src/notion/publish/publishPeriodStats.ts | 4 +++ src/notion/publish/publishStatsActuelles.ts | 5 ++++ src/notion/publish/statNames.ts | 2 ++ src/statistiques/ELStats.ts | 2 ++ src/statistiques/computeELPeriodStats.ts | 25 ++++++++++++++++--- src/statistiques/computeStatsActuelles.ts | 8 ++++++ 8 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/data/Famille.ts b/src/data/Famille.ts index f4d3adc..4cbb9c7 100644 --- a/src/data/Famille.ts +++ b/src/data/Famille.ts @@ -8,6 +8,7 @@ export type Famille = { Titre: string; Statut: StatutFamille; Integration: Date | null; + ContexteEntree: ContexteEntreeDC; Sortie: Date | null; Evenements: EvenementFamille[]; }; @@ -21,6 +22,13 @@ export type EvenementFamille = { "Enfants concernés": string; }; +export type ContexteEntreeDC = + | "Pas de demande (Plein droit)" + | "Pas de demande" + | "Après refus" + | "Après mise en demeure" + | "Après poursuite procureur"; + export type TypeEvenement = | "Mise en demeure de scolarisation" | "Composition pénale refusée" diff --git a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts index 27c8dc2..f577623 100644 --- a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts +++ b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts @@ -1,6 +1,7 @@ import { Client, isFullPage } from "@notionhq/client"; import { PageObjectResponse } from "@notionhq/client/build/src/api-endpoints"; import { + ContexteEntreeDC, EvenementFamille, Famille, StatutFamille, @@ -70,6 +71,10 @@ function buildFamily( notionId: page.id, Titre: titlePropertyToText(pageProperties, ""), Statut: statusPropertyToText(pageProperties, "Statut") as StatutFamille, + ContexteEntree: selectPropertyToText( + pageProperties, + "Contexte d’entrée DC" + ) as ContexteEntreeDC, Integration: datePropertyToDate(pageProperties, "Intégration"), Sortie: datePropertyToDate(pageProperties, "Sortie"), Evenements: familyEvents.filter((fe) => fe.notionIdFamille === page.id), diff --git a/src/notion/publish/publishPeriodStats.ts b/src/notion/publish/publishPeriodStats.ts index 14f30db..8c5d41a 100644 --- a/src/notion/publish/publishPeriodStats.ts +++ b/src/notion/publish/publishPeriodStats.ts @@ -10,6 +10,7 @@ import { statNameDureeResistanceMoyenne, statsNameNbFamillesMisesEnDemeure, statsNameNbFamillesResistantes, + statsNamePourcentageEntreeApresMisesEnDemeure, } from "./statNames"; export async function publishPeriodStats( @@ -102,6 +103,9 @@ function buildRowPropertiesForUpsert( [statsNameNbFamillesMisesEnDemeure]: valueWithEvolProp( stat.nbFamillesMisesEnDemeure ), + [statsNamePourcentageEntreeApresMisesEnDemeure]: valueWithEvolProp( + stat.pourcentageEntreeApresMiseEnDemeure + ), }; } diff --git a/src/notion/publish/publishStatsActuelles.ts b/src/notion/publish/publishStatsActuelles.ts index 755e467..825f517 100644 --- a/src/notion/publish/publishStatsActuelles.ts +++ b/src/notion/publish/publishStatsActuelles.ts @@ -11,6 +11,7 @@ import { statsNameNbFamillesMisesEnDemeure, statsNameNbFamillesResistantes, statsNameNbFamillesResistantesOuEx, + statsNamePourcentageEntreeApresMisesEnDemeure, statsNamePourcentageFamilleMisesEnDemeure, } from "./statNames"; @@ -73,6 +74,10 @@ export async function publishStatsActuelles( statsNamePourcentageFamilleMisesEnDemeure, statsActuelles.pourcentageFamillesMisesEnDemeure ), + currentStatBlock( + statsNamePourcentageEntreeApresMisesEnDemeure, + statsActuelles.pourcentageEntreeApresMiseEnDemeure + ), ], }); } diff --git a/src/notion/publish/statNames.ts b/src/notion/publish/statNames.ts index 0dfdf6a..758aaf9 100644 --- a/src/notion/publish/statNames.ts +++ b/src/notion/publish/statNames.ts @@ -6,3 +6,5 @@ export const statsNameNbFamillesResistantesOuEx = export const statsNameNbFamillesMisesEnDemeure = "Nb Familles Mises en Demeure"; export const statsNamePourcentageFamilleMisesEnDemeure = "Pourcentage de Familles Mises en Demeure"; +export const statsNamePourcentageEntreeApresMisesEnDemeure = + "Pourcentage d'Entrees Après Mises en Demeure"; diff --git a/src/statistiques/ELStats.ts b/src/statistiques/ELStats.ts index 8fc1e12..fb51346 100644 --- a/src/statistiques/ELStats.ts +++ b/src/statistiques/ELStats.ts @@ -13,6 +13,7 @@ export type ELStatsActuelles = { dureeResistanceMediane: number; nbFamillesMiseEnDemeure: number; pourcentageFamillesMisesEnDemeure: number; + pourcentageEntreeApresMiseEnDemeure: number; }; export type ELPeriodStats = { @@ -21,6 +22,7 @@ export type ELPeriodStats = { dureeResistanceMoyenne: ValueWithEvol; dureeResistanceMediane: ValueWithEvol; nbFamillesMisesEnDemeure: ValueWithEvol; + pourcentageEntreeApresMiseEnDemeure: ValueWithEvol; }; export type ValueWithEvol = { diff --git a/src/statistiques/computeELPeriodStats.ts b/src/statistiques/computeELPeriodStats.ts index 699a4ef..142342e 100644 --- a/src/statistiques/computeELPeriodStats.ts +++ b/src/statistiques/computeELPeriodStats.ts @@ -2,6 +2,7 @@ import { Famille, dureeResistanceInDays, isResistantOverPeriod, + periodOfResistance, } from "../data/Famille"; import { IdentifiedPeriod } from "../period/IdentifiedPeriod"; import { isPeriodContaining } from "../period/isPeriodContaining"; @@ -16,18 +17,19 @@ export function computeELPeriodStats( const periodStats: ELPeriodStats[] = []; let previousELPeriodStats: ELPeriodStats | null = null; for (const period of periods) { + const periodEndOrNow = + period.end.getTime() > Date.now() ? new Date(Date.now()) : period.end; + const nbFamilleResistantes = familles.filter((famille) => isResistantOverPeriod(famille, period) ).length; - const periodEndOrNow = - period.end.getTime() > Date.now() ? new Date(Date.now()) : period.end; - const dureesResistances = familles .map((famille) => dureeResistanceInDays(famille, periodEndOrNow)) .filter(notNull); const dureeResistanceMediane = Math.round(median(dureesResistances)); const dureeResistanceMoyenne = Math.round(average(dureesResistances)); + const nbFamillesMiseEnDemeure = familles.filter((famille) => famille.Evenements.find( (e) => @@ -36,6 +38,19 @@ export function computeELPeriodStats( isPeriodContaining(period, e.Date) ) ).length; + const famillesEntreesOverPeriod = familles.filter((f) => { + const por = periodOfResistance(f); + return por != null && isPeriodContaining(period, por.start); + }); + const entreeApresMiseEnDemeure = famillesEntreesOverPeriod.filter( + (f) => + f.ContexteEntree === "Après mise en demeure" || + f.ContexteEntree === "Après poursuite procureur" + ); + const pourcentageEntreeApresMiseEnDemeure = + (100 * entreeApresMiseEnDemeure.length) / + famillesEntreesOverPeriod.length; + const stats: ELPeriodStats = { periodId: period.id, nbFamilleResistantes: valueWithEvol( @@ -54,6 +69,10 @@ export function computeELPeriodStats( nbFamillesMiseEnDemeure, previousELPeriodStats?.nbFamillesMisesEnDemeure.value ), + pourcentageEntreeApresMiseEnDemeure: valueWithEvol( + pourcentageEntreeApresMiseEnDemeure, + previousELPeriodStats?.pourcentageEntreeApresMiseEnDemeure.value + ), }; periodStats.push(stats); previousELPeriodStats = stats; diff --git a/src/statistiques/computeStatsActuelles.ts b/src/statistiques/computeStatsActuelles.ts index 6c9e7c8..ab9d495 100644 --- a/src/statistiques/computeStatsActuelles.ts +++ b/src/statistiques/computeStatsActuelles.ts @@ -24,6 +24,12 @@ export function computeStatsActuelles(familles: Famille[]): ELStatsActuelles { f.Evenements.find((e) => e.Type === "Mise en demeure de scolarisation") ); + const entreeApresMiseEnDemeure = resistantsOrEx.filter( + (f) => + f.ContexteEntree === "Après mise en demeure" || + f.ContexteEntree === "Après poursuite procureur" + ); + const actuelles: ELStatsActuelles = { nbFamilleResistantes: resistantsCount, nbFamilleResistantesOrEx: resistantsOrEx.length, @@ -32,6 +38,8 @@ export function computeStatsActuelles(familles: Famille[]): ELStatsActuelles { nbFamillesMiseEnDemeure: familleAvecMiseEnDemeure.length, pourcentageFamillesMisesEnDemeure: (100 * familleAvecMiseEnDemeure.length) / resistantsOrEx.length, + pourcentageEntreeApresMiseEnDemeure: + (100 * entreeApresMiseEnDemeure.length) / resistantsOrEx.length, }; return actuelles; }