From 52da4d3fbfe1df3191140add3bab33842a3ecb45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Arod?= Date: Thu, 3 Apr 2025 16:06:10 +0200 Subject: [PATCH] fix: ajout support de la relaxe dans les stats + support 3eme tribunal --- src/data/StatutPenal.ts | 1 + src/data/TypeEvenementsPenal.ts | 1 + src/statistiques/v2/penales/StatsPenales.ts | 43 +++--- .../v2/penales/computeStatsPenales.ts | 124 +++++++++++------- 4 files changed, 102 insertions(+), 67 deletions(-) diff --git a/src/data/StatutPenal.ts b/src/data/StatutPenal.ts index 538f58c..d7c7c81 100644 --- a/src/data/StatutPenal.ts +++ b/src/data/StatutPenal.ts @@ -12,5 +12,6 @@ export const optionsStatutPenal = [ "Enquête en cours", "Poursuivi à tort", "Tribunal de police", + "Relaxe TC", ] as const; export type StatutPenal = (typeof optionsStatutPenal)[number]; diff --git a/src/data/TypeEvenementsPenal.ts b/src/data/TypeEvenementsPenal.ts index b9b129c..87ebc7d 100644 --- a/src/data/TypeEvenementsPenal.ts +++ b/src/data/TypeEvenementsPenal.ts @@ -26,6 +26,7 @@ export const typesEvenementsPenal = [ "Appel du 2ème jugement", // placeholder "Tribunal de police judiciaire", "Administrateur AD'HOC", + "Relaxe Tribunal correctionnel", ] as const; export function isEvtTypeProcedurePenale(evtType: TypeEvenement): boolean { diff --git a/src/statistiques/v2/penales/StatsPenales.ts b/src/statistiques/v2/penales/StatsPenales.ts index 911c3eb..27c67e1 100644 --- a/src/statistiques/v2/penales/StatsPenales.ts +++ b/src/statistiques/v2/penales/StatsPenales.ts @@ -1,5 +1,20 @@ import { StatsType } from "../desc/StatsDesc"; +export const statsTribunalDesc = { + nbFamillesConvoquees: { + label: "Nb familles convoquées mais pas encore passées", + }, + nbFamillesPassees: { + label: "Nb familles passées au tribunal", + }, + nbFamillesAppelDuJugement: { + label: "Nb familles ayant fait appel du jugement", + }, + nbFamillesRelaxees: { + label: "Nb familles relaxées", + }, +} as const; + export const statsPenalesDesc = { label: "Stats Pénales", stats: { @@ -70,31 +85,15 @@ export const statsPenalesDesc = { tribunalCorrectionnel1: { label: "Tribunal Correctionnel 1er passage", - stats: { - nbFamillesConvoquees: { - label: "Nb familles convoquées mais pas encore passées", - }, - nbFamillesPassees: { - label: "Nb familles passées au tribunal", - }, - nbFamilleAppelDuJugement: { - label: "Nb familles ayant fait appel du jugement", - }, - }, + stats: statsTribunalDesc, }, tribunalCorrectionnel2: { label: "Tribunal Correctionnel 2eme passage", - stats: { - nbFamillesConvoquees: { - label: "Nb familles convoquées mais pas encore passées", - }, - nbFamillesPassees: { - label: "Nb familles passées au tribunal", - }, - nbFamilleAppelDuJugement: { - label: "Nb familles ayant fait appel du jugement", - }, - }, + stats: statsTribunalDesc, + }, + tribunalCorrectionnel3: { + label: "Tribunal Correctionnel 3eme passage", + stats: statsTribunalDesc, }, nbFamilleAvecStageParentalité: { diff --git a/src/statistiques/v2/penales/computeStatsPenales.ts b/src/statistiques/v2/penales/computeStatsPenales.ts index fad06a2..b96d577 100644 --- a/src/statistiques/v2/penales/computeStatsPenales.ts +++ b/src/statistiques/v2/penales/computeStatsPenales.ts @@ -15,10 +15,17 @@ import { filterFamillesWithOneOfEvenements } from "../filterFamillesWithOneOfEve import { filterFamillesWithOneOfEvenementsOfType } from "../filterFamillesWithOneOfEvenementsOfType"; import { StatsPenales } from "./StatsPenales"; import { nbFamillesAvecPagesLiees } from "./nbFamillesAvecPagesLiees"; +import { info } from "console"; type FamilleAvecInfoTribunaux = Famille & { - evtTribunal1?: EvenementFamille; - evtTribunal2?: EvenementFamille; + infoTribunaux: InfoTribunalCorrectionnel[]; +}; + +type InfoTribunalCorrectionnel = { + evtTribunal: EvenementFamille; + evtRelaxe?: EvenementFamille; + evtAdminAdhoc?: EvenementFamille; + evtAppel?: EvenementFamille; }; export function computeStatsPenales(familles: Famille[]): StatsPenales { @@ -51,11 +58,10 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales { const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] = famillesResistantesOuEx.map((f) => { - const evtTribunaux = f.EvenementsEL.filter(isTribunalCorrectionnel); + const infoTribunaux = buildInfoTribunaux(f); return { ...f, - evtTribunal1: evtTribunaux.length > 0 ? evtTribunaux[0] : undefined, - evtTribunal2: evtTribunaux.length > 1 ? evtTribunaux[1] : undefined, + infoTribunaux: infoTribunaux, }; }); @@ -96,11 +102,17 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales { ) ), }, - tribunalCorrectionnel1: computeTribunalCorrectionnel1( - famillesAvecInfoTribunaux + tribunalCorrectionnel1: computeTribunalCorrectionnel( + famillesAvecInfoTribunaux, + 0 ), - tribunalCorrectionnel2: computeTribunalCorrectionnel2( - famillesAvecInfoTribunaux + tribunalCorrectionnel2: computeTribunalCorrectionnel( + famillesAvecInfoTribunaux, + 1 + ), + tribunalCorrectionnel3: computeTribunalCorrectionnel( + famillesAvecInfoTribunaux, + 2 ), nbFamilleAvecRequisitionJudiciaire: nbFamillesAvecPagesLiees( @@ -176,51 +188,41 @@ function computeCompositionPenales( }; } -function computeTribunalCorrectionnel1( - famillesResistantesOuEx: FamilleAvecInfoTribunaux[] +function computeTribunalCorrectionnel( + famillesResistantesOuEx: FamilleAvecInfoTribunaux[], + indexTribunal: number ): StatsPenales["tribunalCorrectionnel1"] { const now = new Date(); const famillesPassees = famillesResistantesOuEx.filter( - (f) => f.evtTribunal1 && isEvenementBefore(f.evtTribunal1, now) + (f) => + f.infoTribunaux.length > indexTribunal && + isEvenementBefore(f.infoTribunaux[indexTribunal].evtTribunal, now) ); - const famillesProgrammees = famillesResistantesOuEx.filter( - (f) => f.evtTribunal1 && !isEvenementBefore(f.evtTribunal1, now) + const famillesConvoquees = famillesResistantesOuEx.filter( + (f) => + f.infoTribunaux.length > indexTribunal && + !isEvenementBefore(f.infoTribunaux[indexTribunal].evtTribunal, now) + ); + + const famillesRelaxees = famillesPassees.filter( + (f) => + f.infoTribunaux.length > indexTribunal && + f.infoTribunaux[indexTribunal].evtRelaxe + ); + + const famillesAppelDuJugement = famillesPassees.filter( + (f) => + f.infoTribunaux.length > indexTribunal && + f.infoTribunaux[indexTribunal].evtAppel ); return { nbFamillesPassees: nbFamillesAvecPagesLiees(famillesPassees), - nbFamillesConvoquees: nbFamillesAvecPagesLiees(famillesProgrammees), - - nbFamilleAppelDuJugement: nbFamillesAvecPagesLiees( - filterFamillesWithOneOfEvenementsOfType( - famillesResistantesOuEx, - "Appel du 1er jugement" - ) - ), - }; -} - -function computeTribunalCorrectionnel2( - famillesResistantesOuEx: FamilleAvecInfoTribunaux[] -): StatsPenales["tribunalCorrectionnel2"] { - const now = new Date(); - const famillesPassees = famillesResistantesOuEx.filter( - (f) => f.evtTribunal2 && isEvenementBefore(f.evtTribunal2, now) - ); - - const famillesProgrammees = famillesResistantesOuEx.filter( - (f) => f.evtTribunal2 && !isEvenementBefore(f.evtTribunal2, now) - ); - - return { - nbFamillesPassees: nbFamillesAvecPagesLiees(famillesPassees), - nbFamillesConvoquees: nbFamillesAvecPagesLiees(famillesProgrammees), - nbFamilleAppelDuJugement: nbFamillesAvecPagesLiees( - filterFamillesWithOneOfEvenementsOfType( - famillesResistantesOuEx, - "Appel du 2ème jugement" - ) + nbFamillesConvoquees: nbFamillesAvecPagesLiees(famillesConvoquees), + nbFamillesRelaxees: nbFamillesAvecPagesLiees(famillesRelaxees), + nbFamillesAppelDuJugement: nbFamillesAvecPagesLiees( + famillesAppelDuJugement ), }; } @@ -284,3 +286,35 @@ function computeIntervalProcureurTribunalCorrectionnel( function isTribunalCorrectionnel(e: EvenementFamille): boolean { return e.Type === "Tribunal correctionnel"; } + +function buildInfoTribunaux(f: Famille): InfoTribunalCorrectionnel[] { + const evtTribunaux = f.EvenementsEL.filter(isTribunalCorrectionnel); + + return evtTribunaux.map((evtTribunal, index) => { + const nextEvtTrib = + index + 1 < evtTribunaux.length ? evtTribunaux[index + 1] : null; + + const eventsBetweenTribAndNextTrib = f.EvenementsEL.filter( + (e) => + evtTribunal.Date != null && + e.Date != null && + e.Date >= evtTribunal.Date && + (nextEvtTrib?.Date == null || e.Date < nextEvtTrib.Date) + ); + + return { + evtTribunal: evtTribunal, + evtAdminAdhoc: eventsBetweenTribAndNextTrib.find( + (e) => e.Type === "Administrateur AD'HOC" + ), + evtAppel: f.Evenements.find( + (e) => + (index === 0 && e.Type === "Appel du 1er jugement") || + (index === 1 && e.Type == "Appel du 2ème jugement") + ), + evtRelaxe: eventsBetweenTribAndNextTrib.find( + (e) => e.Type === "Relaxe Tribunal correctionnel" + ), + }; + }); +}