mirror of
https://framagit.org/enfance-libre/statistiques
synced 2025-12-07 07:23:44 +00:00
feat: ajoute Pourcentage d'Entrees Après Mises en Demeure
This commit is contained in:
parent
54fcebebf0
commit
e1acd45eb7
8 changed files with 56 additions and 3 deletions
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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
|
||||
),
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
),
|
||||
],
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -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 = {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue