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",
"Poursuivi à tort",
"Tribunal de police",
"Relaxe TC",
] as const;
export type StatutPenal = (typeof optionsStatutPenal)[number];

View file

@ -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 {

View file

@ -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é: {

View file

@ -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"
),
};
});
}