fix: ajout support de la relaxe dans les stats + support 3eme tribunal

This commit is contained in:
Sébastien Arod 2025-04-03 16:06:10 +02:00
parent 3d3c71c716
commit 52da4d3fbf
4 changed files with 102 additions and 67 deletions

View file

@ -12,5 +12,6 @@ export const optionsStatutPenal = [
"Enquête en cours", "Enquête en cours",
"Poursuivi à tort", "Poursuivi à tort",
"Tribunal de police", "Tribunal de police",
"Relaxe TC",
] as const; ] as const;
export type StatutPenal = (typeof optionsStatutPenal)[number]; export type StatutPenal = (typeof optionsStatutPenal)[number];

View file

@ -26,6 +26,7 @@ export const typesEvenementsPenal = [
"Appel du 2ème jugement", // placeholder "Appel du 2ème jugement", // placeholder
"Tribunal de police judiciaire", "Tribunal de police judiciaire",
"Administrateur AD'HOC", "Administrateur AD'HOC",
"Relaxe Tribunal correctionnel",
] as const; ] as const;
export function isEvtTypeProcedurePenale(evtType: TypeEvenement): boolean { export function isEvtTypeProcedurePenale(evtType: TypeEvenement): boolean {

View file

@ -1,5 +1,20 @@
import { StatsType } from "../desc/StatsDesc"; 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 = { export const statsPenalesDesc = {
label: "Stats Pénales", label: "Stats Pénales",
stats: { stats: {
@ -70,31 +85,15 @@ export const statsPenalesDesc = {
tribunalCorrectionnel1: { tribunalCorrectionnel1: {
label: "Tribunal Correctionnel 1er passage", label: "Tribunal Correctionnel 1er passage",
stats: { stats: statsTribunalDesc,
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",
},
},
}, },
tribunalCorrectionnel2: { tribunalCorrectionnel2: {
label: "Tribunal Correctionnel 2eme passage", label: "Tribunal Correctionnel 2eme passage",
stats: { stats: statsTribunalDesc,
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",
},
}, },
tribunalCorrectionnel3: {
label: "Tribunal Correctionnel 3eme passage",
stats: statsTribunalDesc,
}, },
nbFamilleAvecStageParentalité: { nbFamilleAvecStageParentalité: {

View file

@ -15,10 +15,17 @@ import { filterFamillesWithOneOfEvenements } from "../filterFamillesWithOneOfEve
import { filterFamillesWithOneOfEvenementsOfType } from "../filterFamillesWithOneOfEvenementsOfType"; import { filterFamillesWithOneOfEvenementsOfType } from "../filterFamillesWithOneOfEvenementsOfType";
import { StatsPenales } from "./StatsPenales"; import { StatsPenales } from "./StatsPenales";
import { nbFamillesAvecPagesLiees } from "./nbFamillesAvecPagesLiees"; import { nbFamillesAvecPagesLiees } from "./nbFamillesAvecPagesLiees";
import { info } from "console";
type FamilleAvecInfoTribunaux = Famille & { type FamilleAvecInfoTribunaux = Famille & {
evtTribunal1?: EvenementFamille; infoTribunaux: InfoTribunalCorrectionnel[];
evtTribunal2?: EvenementFamille; };
type InfoTribunalCorrectionnel = {
evtTribunal: EvenementFamille;
evtRelaxe?: EvenementFamille;
evtAdminAdhoc?: EvenementFamille;
evtAppel?: EvenementFamille;
}; };
export function computeStatsPenales(familles: Famille[]): StatsPenales { export function computeStatsPenales(familles: Famille[]): StatsPenales {
@ -51,11 +58,10 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] = const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] =
famillesResistantesOuEx.map((f) => { famillesResistantesOuEx.map((f) => {
const evtTribunaux = f.EvenementsEL.filter(isTribunalCorrectionnel); const infoTribunaux = buildInfoTribunaux(f);
return { return {
...f, ...f,
evtTribunal1: evtTribunaux.length > 0 ? evtTribunaux[0] : undefined, infoTribunaux: infoTribunaux,
evtTribunal2: evtTribunaux.length > 1 ? evtTribunaux[1] : undefined,
}; };
}); });
@ -96,11 +102,17 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
) )
), ),
}, },
tribunalCorrectionnel1: computeTribunalCorrectionnel1( tribunalCorrectionnel1: computeTribunalCorrectionnel(
famillesAvecInfoTribunaux famillesAvecInfoTribunaux,
0
), ),
tribunalCorrectionnel2: computeTribunalCorrectionnel2( tribunalCorrectionnel2: computeTribunalCorrectionnel(
famillesAvecInfoTribunaux famillesAvecInfoTribunaux,
1
),
tribunalCorrectionnel3: computeTribunalCorrectionnel(
famillesAvecInfoTribunaux,
2
), ),
nbFamilleAvecRequisitionJudiciaire: nbFamillesAvecPagesLiees( nbFamilleAvecRequisitionJudiciaire: nbFamillesAvecPagesLiees(
@ -176,51 +188,41 @@ function computeCompositionPenales(
}; };
} }
function computeTribunalCorrectionnel1( function computeTribunalCorrectionnel(
famillesResistantesOuEx: FamilleAvecInfoTribunaux[] famillesResistantesOuEx: FamilleAvecInfoTribunaux[],
indexTribunal: number
): StatsPenales["tribunalCorrectionnel1"] { ): StatsPenales["tribunalCorrectionnel1"] {
const now = new Date(); const now = new Date();
const famillesPassees = famillesResistantesOuEx.filter( 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( const famillesConvoquees = famillesResistantesOuEx.filter(
(f) => f.evtTribunal1 && !isEvenementBefore(f.evtTribunal1, now) (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 { return {
nbFamillesPassees: nbFamillesAvecPagesLiees(famillesPassees), nbFamillesPassees: nbFamillesAvecPagesLiees(famillesPassees),
nbFamillesConvoquees: nbFamillesAvecPagesLiees(famillesProgrammees), nbFamillesConvoquees: nbFamillesAvecPagesLiees(famillesConvoquees),
nbFamillesRelaxees: nbFamillesAvecPagesLiees(famillesRelaxees),
nbFamilleAppelDuJugement: nbFamillesAvecPagesLiees( nbFamillesAppelDuJugement: nbFamillesAvecPagesLiees(
filterFamillesWithOneOfEvenementsOfType( famillesAppelDuJugement
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"
)
), ),
}; };
} }
@ -284,3 +286,35 @@ function computeIntervalProcureurTribunalCorrectionnel(
function isTribunalCorrectionnel(e: EvenementFamille): boolean { function isTribunalCorrectionnel(e: EvenementFamille): boolean {
return e.Type === "Tribunal correctionnel"; 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"
),
};
});
}