From 88cacc60d695dafc6301b1967d1554767570d772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Arod?= Date: Mon, 16 Dec 2024 12:51:50 +0100 Subject: [PATCH] =?UTF-8?q?refactor:=20garde=20tous=20les=20evenements=20d?= =?UTF-8?q?ans=20des=20propri=C3=A9t=C3=A9s=20d=C3=A9di=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * garde tous les evenements dans des propriétés dédiés * cleanup process de préparation des donées --- src/data/Famille.ts | 11 +++- src/data/nettoyage/evt/ignorerEvenements.ts | 28 -------- .../supprimerLesEvenementsHorsResisstance.ts | 21 ------ .../evt/supprimerLesEvenementsSansDate.ts | 15 ----- .../familles/checkDataConsistency.ts | 64 ------------------- ...rFamilleExResistanteSansDateIntegration.ts | 9 ++- ...rFamilleExResistanteSansDateSortie copy.ts | 19 ++++++ ...rrigerFamilleExResistanteSansDateSortie.ts | 20 ------ ...corrigerFamilleResistanteAvecDateSortie.ts | 9 ++- ...gerFamilleResistanteSansDateIntegration.ts | 9 ++- .../familles/corrigerListeFamilles.ts | 28 -------- .../detecterLesContextesDEntreeIncoherents.ts | 23 +++++++ .../initialiserLesEvenementsDetailles.ts | 37 +++++++++++ .../familles/nettoyerDonneesFamilles.ts | 61 ------------------ .../nettoyage/familles/nettoyerFamilles.ts | 25 ++++++++ .../familles/preparerDonneesFamilles.ts | 29 +++++++++ src/index.ts | 2 +- .../fetchFamiliesWithEventsFromNotion.ts | 4 ++ src/statistiques/v1/computeELStatsAtDate.ts | 8 +-- ...omputeFamilleWithEventAfterDurationOfDC.ts | 2 +- .../v2/filterFamillesWithOneOfEvenements.ts | 2 +- .../v2/generales/computeStatsGenerales.ts | 7 +- .../v2/penales/computeSankeyData.ts | 2 +- .../v2/penales/computeStatsPenales.ts | 12 ++-- 24 files changed, 180 insertions(+), 267 deletions(-) delete mode 100644 src/data/nettoyage/evt/ignorerEvenements.ts delete mode 100644 src/data/nettoyage/evt/supprimerLesEvenementsHorsResisstance.ts delete mode 100644 src/data/nettoyage/evt/supprimerLesEvenementsSansDate.ts delete mode 100644 src/data/nettoyage/familles/checkDataConsistency.ts create mode 100644 src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie copy.ts delete mode 100644 src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie.ts delete mode 100644 src/data/nettoyage/familles/corrigerListeFamilles.ts create mode 100644 src/data/nettoyage/familles/detecterLesContextesDEntreeIncoherents.ts create mode 100644 src/data/nettoyage/familles/initialiserLesEvenementsDetailles.ts delete mode 100644 src/data/nettoyage/familles/nettoyerDonneesFamilles.ts create mode 100644 src/data/nettoyage/familles/nettoyerFamilles.ts create mode 100644 src/data/nettoyage/familles/preparerDonneesFamilles.ts diff --git a/src/data/Famille.ts b/src/data/Famille.ts index d24261d..b5533c8 100644 --- a/src/data/Famille.ts +++ b/src/data/Famille.ts @@ -22,8 +22,17 @@ export type Famille = Readonly<{ Penal: StatutPenal; Social: StatutSocial; Departement: string | null; - // sorted by date asc + // Tous Evenements triés par date asc + // Inclus aussi les evenements sans date Evenements: EvenementFamille[]; + + // Evenements durant la période EL triés par date asc + EvenementsEL: EvenementFamille[]; + + // Evenements hors période EL triés par date asc + EvenementsAvantEL: EvenementFamille[]; + EvenementsApresEL: EvenementFamille[]; + DerniereModification: Date; }>; diff --git a/src/data/nettoyage/evt/ignorerEvenements.ts b/src/data/nettoyage/evt/ignorerEvenements.ts deleted file mode 100644 index 1d2ddf3..0000000 --- a/src/data/nettoyage/evt/ignorerEvenements.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { EvenementFamille } from "../../EvenementFamille"; -import { Famille } from "../../Famille"; -import { - MessageDeNettoyage, - msgDonneeIgnoree, -} from "../fwk/MessageDeNettoyage"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; - -export function ignorerEvenements( - familles: Famille[], - conditionAIgnoree: (evt: EvenementFamille, f: Famille) => boolean, - messageIgnoreeFn: (evt: EvenementFamille, f: Famille) => string -): DonneesNettoyees { - let messages: MessageDeNettoyage[] = []; - const nettoyees = familles.map((f) => { - const nettoyees = f.Evenements.filter((e) => !conditionAIgnoree(e, f)); - const evtIgnorees = f.Evenements.filter((e) => conditionAIgnoree(e, f)); - messages = [ - ...messages, - ...evtIgnorees.map((e) => msgDonneeIgnoree(messageIgnoreeFn(e, f))), - ]; - return { ...f, Evenements: nettoyees }; - }); - return { - familles: nettoyees, - messages, - }; -} diff --git a/src/data/nettoyage/evt/supprimerLesEvenementsHorsResisstance.ts b/src/data/nettoyage/evt/supprimerLesEvenementsHorsResisstance.ts deleted file mode 100644 index e5feb09..0000000 --- a/src/data/nettoyage/evt/supprimerLesEvenementsHorsResisstance.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { EvenementFamille } from "../../EvenementFamille"; -import { Famille } from "../../Famille"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; -import { ignorerEvenements } from "./ignorerEvenements"; - -export function supprimerLesEvenementsHorsResisstance( - familles: Famille[] -): DonneesNettoyees { - return ignorerEvenements( - familles, - (e: EvenementFamille, f: Famille) => { - return ( - e.Date !== null && - ((f.Integration !== null && e.Date < f.Integration) || - (f.Sortie !== null && e.Date > f.Sortie)) - ); - }, - (e, f) => - `Evenement "${f.Titre} - ${e.Évènement}" [${e.notionId}] hors période de résistance il sera ignoré` - ); -} diff --git a/src/data/nettoyage/evt/supprimerLesEvenementsSansDate.ts b/src/data/nettoyage/evt/supprimerLesEvenementsSansDate.ts deleted file mode 100644 index 58c8e66..0000000 --- a/src/data/nettoyage/evt/supprimerLesEvenementsSansDate.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { EvenementFamille } from "../../EvenementFamille"; -import { Famille } from "../../Famille"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; -import { ignorerEvenements } from "./ignorerEvenements"; - -export function supprimerLesEvenementsSansDate( - familles: Famille[] -): DonneesNettoyees { - return ignorerEvenements( - familles, - (e: EvenementFamille) => e.Date === null, - (e, f) => - `Evenement "${f.Titre} - ${e.Évènement}" [${e.notionId}] n'as pas de Date il sera ignoré` - ); -} diff --git a/src/data/nettoyage/familles/checkDataConsistency.ts b/src/data/nettoyage/familles/checkDataConsistency.ts deleted file mode 100644 index 3e784dc..0000000 --- a/src/data/nettoyage/familles/checkDataConsistency.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Famille, isExResistant, isResistant } from "../../Famille"; -import { statutExResistant, statutResistant } from "../../StatutFamille"; - -export function checkDataConsistency(families: Famille[]): ConsistencyReport { - const reports = families.map((family) => { - return checkFamilyDataConsistency(family); - }); - return { - errors: reports.flatMap((r) => r.errors), - warnings: reports.flatMap((r) => r.warnings), - }; -} - -export type ConsistencyReport = { - warnings: ConsistencyIssue[]; - errors: ConsistencyIssue[]; -}; -export type ConsistencyIssue = { - issueType: string; - familyId: string; -}; -function checkFamilyDataConsistency(family: Famille): ConsistencyReport { - const consistencyErrors: ConsistencyIssue[] = []; - const consistencyWarnings: ConsistencyIssue[] = []; - - if (family.Statut === statutExResistant) { - if ( - family.Integration && - family.Sortie && - family.Integration > family.Sortie - ) { - consistencyErrors.push({ - familyId: family.Titre, - issueType: "Date Intégration > date Sortie ", - }); - } - } - if ( - (isResistant(family) || isExResistant(family)) && - family.Integration !== null - ) { - const miseEnDemeureBeforeInteg = - family.Evenements.find( - (e) => - e.Type === "Mise en demeure de scolarisation" && - (e.Date === null || e.Date < family.Integration!) - ) !== undefined; - if ( - miseEnDemeureBeforeInteg && - family.ContexteEntree !== "Après mise en demeure" && - family.ContexteEntree !== "Après poursuite procureur" - ) { - consistencyWarnings.push({ - familyId: family.Titre, - issueType: `Valeur de ContextEntree incorrecte: Le Context d'Entree est "${family.ContexteEntree}" alors que la date de mise en demeure avant date d'intégration`, - }); - } - } - - return { - errors: consistencyErrors, - warnings: consistencyWarnings, - }; -} diff --git a/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateIntegration.ts b/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateIntegration.ts index c75a754..7c120bc 100644 --- a/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateIntegration.ts +++ b/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateIntegration.ts @@ -1,16 +1,19 @@ import { Famille } from "../../Famille"; import { integrationAFinaliser, statutExResistant } from "../../StatutFamille"; -import { corrigerListeFamilles } from "./corrigerListeFamilles"; import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { nettoyerFamilles } from "./nettoyerFamilles"; +import { msgDonneeCorrigee } from "../fwk/MessageDeNettoyage"; export function corrigerFamilleExResistanteSansDateIntegration( familles: Famille[] ): DonneesNettoyees { - return corrigerListeFamilles( + return nettoyerFamilles( familles, (f) => f.Statut === statutExResistant && f.Integration === null, (f) => ({ ...f, Statut: integrationAFinaliser }), (f) => - `Famille ${f.Titre} - avec un statut Ex Résistant maos sans date d'intégration => Le statut est remplacé par "${integrationAFinaliser}" pour le calcul des statistics` + msgDonneeCorrigee( + `Famille ${f.Titre} - avec un statut Ex Résistant maos sans date d'intégration => Le statut est remplacé par "${integrationAFinaliser}" pour le calcul des statistics` + ) ); } diff --git a/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie copy.ts b/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie copy.ts new file mode 100644 index 0000000..b623cf3 --- /dev/null +++ b/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie copy.ts @@ -0,0 +1,19 @@ +import { Famille } from "../../Famille"; +import { statutExResistant, statutResistant } from "../../StatutFamille"; +import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { msgDonneeCorrigee } from "../fwk/MessageDeNettoyage"; +import { nettoyerFamilles } from "./nettoyerFamilles"; + +export function corrigerFamilleExResistanteSansDateSortie( + familles: Famille[] +): DonneesNettoyees { + return nettoyerFamilles( + familles, + (f) => f.Statut === statutExResistant && f.Sortie === null, + (f) => ({ ...f, Statut: statutResistant }), + (f) => + msgDonneeCorrigee( + `Famille ${f.Titre} - avec un statut Ex Résistant maos sans date de Sortie => Le statut est remplacé par "${statutResistant}" pour le calcul des statistics` + ) + ); +} diff --git a/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie.ts b/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie.ts deleted file mode 100644 index 629f74f..0000000 --- a/src/data/nettoyage/familles/corrigerFamilleExResistanteSansDateSortie.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Famille } from "../../Famille"; -import { - integrationAFinaliser, - statutExResistant, - statutResistant, -} from "../../StatutFamille"; -import { corrigerListeFamilles } from "./corrigerListeFamilles"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; - -export function corrigerFamilleExResistanteSansDateSortie( - familles: Famille[] -): DonneesNettoyees { - return corrigerListeFamilles( - familles, - (f) => f.Statut === statutExResistant && f.Sortie === null, - (f) => ({ ...f, Statut: statutResistant }), - (f) => - `Famille ${f.Titre} - avec un statut Ex Résistant maos sans date de Sortie => Le statut est remplacé par "${statutResistant}" pour le calcul des statistics` - ); -} diff --git a/src/data/nettoyage/familles/corrigerFamilleResistanteAvecDateSortie.ts b/src/data/nettoyage/familles/corrigerFamilleResistanteAvecDateSortie.ts index 0c09720..efea61c 100644 --- a/src/data/nettoyage/familles/corrigerFamilleResistanteAvecDateSortie.ts +++ b/src/data/nettoyage/familles/corrigerFamilleResistanteAvecDateSortie.ts @@ -1,16 +1,19 @@ import { Famille } from "../../Famille"; import { statutResistant } from "../../StatutFamille"; -import { corrigerListeFamilles } from "./corrigerListeFamilles"; import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { msgDonneeCorrigee } from "../fwk/MessageDeNettoyage"; +import { nettoyerFamilles } from "./nettoyerFamilles"; export function corrigerFamilleResistanteAvecDateSortie( familles: Famille[] ): DonneesNettoyees { - return corrigerListeFamilles( + return nettoyerFamilles( familles, (f) => f.Statut === statutResistant && f.Sortie !== null, (f) => ({ ...f, Sortie: null }), (f) => - `Famille ${f.Titre} - avec un statut Résistant mais avec une date de Sortie => La date de Sortie est mise a null pour le calcul des statistics` + msgDonneeCorrigee( + `Famille ${f.Titre} - avec un statut Résistant mais avec une date de Sortie => La date de Sortie est mise a null pour le calcul des statistics` + ) ); } diff --git a/src/data/nettoyage/familles/corrigerFamilleResistanteSansDateIntegration.ts b/src/data/nettoyage/familles/corrigerFamilleResistanteSansDateIntegration.ts index d99c7df..3ac6668 100644 --- a/src/data/nettoyage/familles/corrigerFamilleResistanteSansDateIntegration.ts +++ b/src/data/nettoyage/familles/corrigerFamilleResistanteSansDateIntegration.ts @@ -1,16 +1,19 @@ import { Famille } from "../../Famille"; import { integrationAFinaliser, statutResistant } from "../../StatutFamille"; -import { corrigerListeFamilles } from "./corrigerListeFamilles"; import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { msgDonneeCorrigee } from "../fwk/MessageDeNettoyage"; +import { nettoyerFamilles } from "./nettoyerFamilles"; export function corrigerFamilleResistanteSansDateIntegration( familles: Famille[] ): DonneesNettoyees { - return corrigerListeFamilles( + return nettoyerFamilles( familles, (f) => f.Statut === statutResistant && f.Integration === null, (f) => ({ ...f, Statut: integrationAFinaliser }), (f) => - `Famille ${f.Titre} - avec un statut Résistant maos sans date d'intégration => Le statut est remplacé par "${integrationAFinaliser}" pour le calcul des statistics` + msgDonneeCorrigee( + `Famille ${f.Titre} - avec un statut Résistant maos sans date d'intégration => Le statut est remplacé par "${integrationAFinaliser}" pour le calcul des statistics` + ) ); } diff --git a/src/data/nettoyage/familles/corrigerListeFamilles.ts b/src/data/nettoyage/familles/corrigerListeFamilles.ts deleted file mode 100644 index 7c0426b..0000000 --- a/src/data/nettoyage/familles/corrigerListeFamilles.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Famille } from "../../Famille"; -import { - MessageDeNettoyage, - msgDonneeCorrigee, -} from "../fwk/MessageDeNettoyage"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; - -export function corrigerListeFamilles( - familles: Famille[], - conditionACorriger: (f: Famille) => boolean, - fonctionDeCorrection: (f: Famille) => Famille, - messageDescriptifCorrection: (f: Famille) => string -): DonneesNettoyees { - const messages: MessageDeNettoyage[] = []; - const famillesNettoyees = familles.map((f) => { - if (conditionACorriger(f)) { - messages.push(msgDonneeCorrigee(messageDescriptifCorrection(f))); - return fonctionDeCorrection(f); - } else { - return f; - } - }); - - return { - familles: famillesNettoyees, - messages, - }; -} diff --git a/src/data/nettoyage/familles/detecterLesContextesDEntreeIncoherents.ts b/src/data/nettoyage/familles/detecterLesContextesDEntreeIncoherents.ts new file mode 100644 index 0000000..6a08d05 --- /dev/null +++ b/src/data/nettoyage/familles/detecterLesContextesDEntreeIncoherents.ts @@ -0,0 +1,23 @@ +import { Famille } from "../../Famille"; +import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { msgDonneeSuspecte } from "../fwk/MessageDeNettoyage"; +import { nettoyerFamilles } from "./nettoyerFamilles"; + +export function detecterLesContextesDEntreeIncoherents( + familles: Famille[] +): DonneesNettoyees { + return nettoyerFamilles( + familles, + (f) => + !!f.EvenementsAvantEL.find( + (e) => e.Type === "Mise en demeure de scolarisation" + ) && + f.ContexteEntree !== "Après mise en demeure" && + f.ContexteEntree !== "Après poursuite procureur", + (f) => f, + (f) => + msgDonneeSuspecte( + `${f.Titre} - ContextEntree incohérent: Mise en demeure avant date d'intégration alors que le Contexte d'Entree est "${f.ContexteEntree}" ` + ) + ); +} diff --git a/src/data/nettoyage/familles/initialiserLesEvenementsDetailles.ts b/src/data/nettoyage/familles/initialiserLesEvenementsDetailles.ts new file mode 100644 index 0000000..6dff215 --- /dev/null +++ b/src/data/nettoyage/familles/initialiserLesEvenementsDetailles.ts @@ -0,0 +1,37 @@ +import { Famille } from "../../Famille"; +import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; +import { MessageDeNettoyage } from "../fwk/MessageDeNettoyage"; + +export function initialiserLesEvenementsDetailles( + familles: Famille[] +): DonneesNettoyees { + const messages: MessageDeNettoyage[] = []; + const nettoyees = familles.map((f) => { + const EvenementsAvantEL = f.Evenements.filter( + (e) => e.Date !== null && f.Integration !== null && e.Date < f.Integration + ); + + const EvenementsEL = f.Evenements.filter( + (e) => + e.Date !== null && + f.Integration !== null && + e.Date >= f.Integration && + (f.Sortie === null || e.Date <= f.Sortie) + ); + + const EvenementsApresEL = f.Evenements.filter( + (e) => e.Date !== null && f.Sortie !== null && e.Date > f.Sortie + ); + + return { + ...f, + EvenementsAvantEL: EvenementsAvantEL, + EvenementsEL: EvenementsEL, + EvenementsApresEL: EvenementsApresEL, + }; + }); + return { + familles: nettoyees, + messages, + }; +} diff --git a/src/data/nettoyage/familles/nettoyerDonneesFamilles.ts b/src/data/nettoyage/familles/nettoyerDonneesFamilles.ts deleted file mode 100644 index af1b1d4..0000000 --- a/src/data/nettoyage/familles/nettoyerDonneesFamilles.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { Famille } from "../../Famille"; -import { appliquerLesFonctionsDeNettoyages } from "../fwk/appliquerLesFonctionsDeNettoyages"; -import { checkDataConsistency } from "./checkDataConsistency"; -import { corrigerFamilleResistanteSansDateIntegration } from "./corrigerFamilleResistanteSansDateIntegration"; -import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; -import { - MessageDeNettoyage, - msgDonneeBloquante, - msgDonneeSuspecte, -} from "../fwk/MessageDeNettoyage"; -import { supprimerLesFamillesVide } from "./supprimerLesFamillesVide"; -import { supprimerLesEvenementsHorsResisstance } from "../evt/supprimerLesEvenementsHorsResisstance"; -import { supprimerLesEvenementsSansDate } from "../evt/supprimerLesEvenementsSansDate"; -import { corrigerFamilleResistanteAvecDateSortie } from "./corrigerFamilleResistanteAvecDateSortie"; -import { corrigerFamilleExResistanteSansDateIntegration } from "./corrigerFamilleExResistanteSansDateIntegration"; -import { corrigerFamilleExResistanteSansDateSortie } from "./corrigerFamilleExResistanteSansDateSortie"; - -export function nettoyerDonneesFamilles( - donneesFamillesBrutes: Famille[] -): DonneesNettoyees { - const nettoyagePreConsistencyCheck = appliquerLesFonctionsDeNettoyages( - donneesFamillesBrutes, - [ - supprimerLesFamillesVide, - corrigerFamilleResistanteSansDateIntegration, - corrigerFamilleResistanteAvecDateSortie, - corrigerFamilleExResistanteSansDateIntegration, - corrigerFamilleExResistanteSansDateSortie, - ] - ); - - // TODO convert checkDataConsistency to filters - const consistencyReport = checkDataConsistency( - nettoyagePreConsistencyCheck.familles - ); - - // Adapte les message - const consistencyCheckErrorMessages: MessageDeNettoyage[] = - consistencyReport.errors.map((e) => - msgDonneeBloquante(`${e.familyId} - ${e.issueType}`) - ); - const consistencyCheckWarnings: MessageDeNettoyage[] = - consistencyReport.warnings.map((e) => - msgDonneeSuspecte(`${e.familyId} - ${e.issueType}`) - ); - - const nettoyagePostConsistencyCheck = appliquerLesFonctionsDeNettoyages( - nettoyagePreConsistencyCheck.familles, - [supprimerLesEvenementsSansDate, supprimerLesEvenementsHorsResisstance] - ); - - return { - familles: nettoyagePostConsistencyCheck.familles, - messages: [ - ...nettoyagePreConsistencyCheck.messages, - ...consistencyCheckErrorMessages, - ...consistencyCheckWarnings, - ...nettoyagePostConsistencyCheck.messages, - ], - }; -} diff --git a/src/data/nettoyage/familles/nettoyerFamilles.ts b/src/data/nettoyage/familles/nettoyerFamilles.ts new file mode 100644 index 0000000..511a86e --- /dev/null +++ b/src/data/nettoyage/familles/nettoyerFamilles.ts @@ -0,0 +1,25 @@ +import { Famille } from "../../Famille"; +import { MessageDeNettoyage } from "../fwk/MessageDeNettoyage"; +import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; + +export function nettoyerFamilles( + familles: Famille[], + conditionANettoyer: (f: Famille) => boolean, + fonctionDeNettoyage: (f: Famille) => Famille, + messageNettoyage: (f: Famille) => MessageDeNettoyage +): DonneesNettoyees { + const messages: MessageDeNettoyage[] = []; + const famillesNettoyees = familles.map((f) => { + if (conditionANettoyer(f)) { + messages.push(messageNettoyage(f)); + return fonctionDeNettoyage(f); + } else { + return f; + } + }); + + return { + familles: famillesNettoyees, + messages, + }; +} diff --git a/src/data/nettoyage/familles/preparerDonneesFamilles.ts b/src/data/nettoyage/familles/preparerDonneesFamilles.ts new file mode 100644 index 0000000..59fb83c --- /dev/null +++ b/src/data/nettoyage/familles/preparerDonneesFamilles.ts @@ -0,0 +1,29 @@ +import { Famille } from "../../Famille"; +import { appliquerLesFonctionsDeNettoyages } from "../fwk/appliquerLesFonctionsDeNettoyages"; +import { corrigerFamilleResistanteSansDateIntegration } from "./corrigerFamilleResistanteSansDateIntegration"; +import { DonneesNettoyees } from "../fwk/DonneesNettoyees"; + +import { supprimerLesFamillesVide } from "./supprimerLesFamillesVide"; +import { corrigerFamilleResistanteAvecDateSortie } from "./corrigerFamilleResistanteAvecDateSortie"; +import { corrigerFamilleExResistanteSansDateIntegration } from "./corrigerFamilleExResistanteSansDateIntegration"; +import { initialiserLesEvenementsDetailles } from "./initialiserLesEvenementsDetailles"; +import { corrigerFamilleExResistanteSansDateSortie } from "./corrigerFamilleExResistanteSansDateSortie copy"; +import { detecterLesContextesDEntreeIncoherents } from "./detecterLesContextesDEntreeIncoherents"; + +export function nettoyerDonneesFamilles( + donneesFamillesBrutes: Famille[] +): DonneesNettoyees { + const nettoyagePreConsistencyCheck = appliquerLesFonctionsDeNettoyages( + donneesFamillesBrutes, + [ + supprimerLesFamillesVide, + corrigerFamilleResistanteSansDateIntegration, + corrigerFamilleResistanteAvecDateSortie, + corrigerFamilleExResistanteSansDateIntegration, + corrigerFamilleExResistanteSansDateSortie, + initialiserLesEvenementsDetailles, + detecterLesContextesDEntreeIncoherents, + ] + ); + return nettoyagePreConsistencyCheck; +} diff --git a/src/index.ts b/src/index.ts index 8065215..35ba6ea 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,7 +17,7 @@ import { computeStatsGeneralesMensuelles } from "./statistiques/v2/generales/com import { mermaidDiagramStatsGeneralesMensuelles } from "./statistiques/v2/generales/mermaidDiagramStatsGeneralesMensuelles"; import { publishStatsGenerales } from "./notion/publish/v2/publishStatsGenerales"; import { typeEvenementsProcedurePenale } from "./data/TypeEvenementsPenal"; -import { nettoyerDonneesFamilles } from "./data/nettoyage/familles/nettoyerDonneesFamilles"; +import { nettoyerDonneesFamilles } from "./data/nettoyage/familles/preparerDonneesFamilles"; type ProcessOptions = { dryRun: boolean; diff --git a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts index f31b69d..0b067c6 100644 --- a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts +++ b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts @@ -104,6 +104,10 @@ function buildFamily( Integration: datePropertyToDate(pageProperties, "Intégration"), Sortie: datePropertyToDate(pageProperties, "Sortie"), Evenements: familyEvents.filter((fe) => fe.notionIdFamille === page.id), + // Ces trois propriétés seront peuplés après le data consistency check + EvenementsEL: [], + EvenementsAvantEL: [], + EvenementsApresEL: [], Departement: departement?.name || null, DerniereModification: datePropertyToDate( pageProperties, diff --git a/src/statistiques/v1/computeELStatsAtDate.ts b/src/statistiques/v1/computeELStatsAtDate.ts index ec46cf0..2d2abc3 100644 --- a/src/statistiques/v1/computeELStatsAtDate.ts +++ b/src/statistiques/v1/computeELStatsAtDate.ts @@ -1,7 +1,3 @@ -import { - isEvenementBefore, - isProcedureCivile, -} from "../../data/EvenementFamille"; import { Famille, isExResistant, isResistant } from "../../data/Famille"; import { percent } from "../../utils/math/percent"; import { ELStatsAtDate } from "./ELStats"; @@ -16,11 +12,11 @@ export function computeELStatsAtDate( ); const famillesAvecContrôleFiscal = familleResistantesOrEx.filter((f) => - f.Evenements.find((e) => e.Type === "Contrôle fiscal") + f.EvenementsEL.find((e) => e.Type === "Contrôle fiscal") ); const famillesAvecContrôleURSAFF = familleResistantesOrEx.filter((f) => - f.Evenements.find((e) => e.Type === "Contrôle URSSAF") + f.EvenementsEL.find((e) => e.Type === "Contrôle URSSAF") ); const elStats: ELStatsAtDate = { // Autre diff --git a/src/statistiques/v1/computeFamilleWithEventAfterDurationOfDC.ts b/src/statistiques/v1/computeFamilleWithEventAfterDurationOfDC.ts index 4799c80..7ce15b7 100644 --- a/src/statistiques/v1/computeFamilleWithEventAfterDurationOfDC.ts +++ b/src/statistiques/v1/computeFamilleWithEventAfterDurationOfDC.ts @@ -45,7 +45,7 @@ export const computeFamillesWithEventsConditionInEarlyPeriod = ( (f) => { const dcDate = dcStartDate(f)!; const dcPeriodEnd = addMonths(dcDate, months); - const eventsBeforeDate = f.Evenements.filter((e) => + const eventsBeforeDate = f.EvenementsEL.filter((e) => isEvenementBefore(e, dcPeriodEnd) ); return eventsPredicate(eventsBeforeDate); diff --git a/src/statistiques/v2/filterFamillesWithOneOfEvenements.ts b/src/statistiques/v2/filterFamillesWithOneOfEvenements.ts index 37ec9b1..f0aaa55 100644 --- a/src/statistiques/v2/filterFamillesWithOneOfEvenements.ts +++ b/src/statistiques/v2/filterFamillesWithOneOfEvenements.ts @@ -6,6 +6,6 @@ export function filterFamillesWithOneOfEvenements( evenementtPredicated: (evt: EvenementFamille) => boolean ): Famille[] { return familles.filter( - (f) => f.Evenements.find((e) => evenementtPredicated(e)) !== undefined + (f) => f.EvenementsEL.find((e) => evenementtPredicated(e)) !== undefined ); } diff --git a/src/statistiques/v2/generales/computeStatsGenerales.ts b/src/statistiques/v2/generales/computeStatsGenerales.ts index 2b74f4f..f195dd3 100644 --- a/src/statistiques/v2/generales/computeStatsGenerales.ts +++ b/src/statistiques/v2/generales/computeStatsGenerales.ts @@ -17,9 +17,9 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { const famillesResistantes = familles.filter((f) => isResistant(f)); const famillesSansEvenements = famillesResistantes.filter( - (f) => f.Evenements.length === 0 + (f) => f.EvenementsEL.length === 0 ); - + const dureesResistances = famillesResistantesOrEx.map( (f) => dureeResistanceInDays(f)! ); @@ -35,8 +35,7 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { ).length, dureeResistanceMedianne: median(dureesResistances), dureeResistanceMoyenne: average(dureesResistances), - nbFamillesResistantesActuellesSansEvenements: - famillesSansEvenements.length, + nbFamillesResistantesActuellesSansEvenements: famillesSansEvenements.length, nbFamillesParContexteDEntree: sortByKey( countBy(famillesResistantesOrEx, (f) => f.ContexteEntree) ), diff --git a/src/statistiques/v2/penales/computeSankeyData.ts b/src/statistiques/v2/penales/computeSankeyData.ts index b177e1e..d55d88f 100644 --- a/src/statistiques/v2/penales/computeSankeyData.ts +++ b/src/statistiques/v2/penales/computeSankeyData.ts @@ -6,7 +6,7 @@ export function computeSequencEvtPenalSankeyData(familles: Famille[]) { familles.forEach((f) => { // Compute all transitions, Events are already sorted - const nonNullEvents = f.Evenements.filter( + const nonNullEvents = f.EvenementsEL.filter( (evt) => evt.Type !== null && (evt.Type as string) !== "null" ); diff --git a/src/statistiques/v2/penales/computeStatsPenales.ts b/src/statistiques/v2/penales/computeStatsPenales.ts index 8d20a42..cd24a6c 100644 --- a/src/statistiques/v2/penales/computeStatsPenales.ts +++ b/src/statistiques/v2/penales/computeStatsPenales.ts @@ -36,7 +36,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales { const famillesAvecGendarmerieSansSuiteACeJour = famillesGendarmerie.filter( (f) => { - const evtsProcPenaleHorsGendarmerie = f.Evenements.filter( + const evtsProcPenaleHorsGendarmerie = f.EvenementsEL.filter( isProcedurePenaleHorsGendarmerie ); return evtsProcPenaleHorsGendarmerie.length === 0; @@ -50,7 +50,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales { const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] = famillesResistantesOuEx.map((f) => { - const evtTribunaux = f.Evenements.filter(isTribunalCorrectionnel); + const evtTribunaux = f.EvenementsEL.filter(isTribunalCorrectionnel); return { ...f, evtTribunal1: evtTribunaux.length > 0 ? evtTribunaux[0] : undefined, @@ -207,8 +207,8 @@ function computeTribunalCorrectionnel2( function computeIntervalGendarmerieProcureur(familles: Famille[]): number { const intervals = familles.flatMap((f) => { - const evtGendarmerie = f.Evenements.find((e) => isGendarmerie(e)); - const evtProcureur = f.Evenements.find((e) => isProcureur(e)); + const evtGendarmerie = f.EvenementsEL.find((e) => isGendarmerie(e)); + const evtProcureur = f.EvenementsEL.find((e) => isProcureur(e)); // consider only intervals for families with both events date if (!evtGendarmerie?.Date || !evtProcureur?.Date) { @@ -235,8 +235,8 @@ function computeIntervalProcureurTribunalCorrectionnel( familles: Famille[] ): number { const intervals = familles.flatMap((f) => { - const evtProcureur = f.Evenements.find((e) => isProcureur(e)); - const evtTribunal = f.Evenements.find( + const evtProcureur = f.EvenementsEL.find((e) => isProcureur(e)); + const evtTribunal = f.EvenementsEL.find( (e) => e.Type === "Tribunal correctionnel" );