feat: stats tribunal de police Relaxe et Appel

This commit is contained in:
Sébastien Arod 2025-05-26 21:22:29 +02:00
parent e6cbd790aa
commit 2a202fc126
5 changed files with 108 additions and 73 deletions

View file

@ -27,13 +27,13 @@ export const typesEvenementsPenal = [
"Administrateur AD'HOC", "Administrateur AD'HOC",
"Relaxe Tribunal correctionnel", "Relaxe Tribunal correctionnel",
"Vice de procédure tribunal correctionnel", "Vice de procédure tribunal correctionnel",
"Procès appel TC",
"Appel du parquet", "Appel du parquet",
"Procès appel TC",
// Tribunal de police // Tribunal de police
"Tribunal de police judiciaire", "Tribunal de police judiciaire",
"Relaxe Tribunal de police",
"Appel Tribunal Police opposition ordonnance pénale",
"Procès appel TP", "Procès appel TP",
"Relaxe Tribunal de police",
"Appel Tribunal Police opposition ordonnance pénale"
// [,,,"Amendes",,,,"Classement sous condition","Information non médico-sociale"] // [,,,"Amendes",,,,"Classement sous condition","Information non médico-sociale"]
] as const; ] as const;

View file

@ -0,0 +1,10 @@
import { EvenementFamille } from "../../../data/EvenementFamille";
export type InfoTribunalCorrectionnel = {
evtTribunal: EvenementFamille;
evtRelaxe?: EvenementFamille;
evtAdminAdhoc?: EvenementFamille;
evtViceDeProcedure?: EvenementFamille;
evtAppel?: EvenementFamille;
};

View file

@ -1,6 +1,6 @@
import { StatsType } from "../desc/StatsDesc"; import { StatsType } from "../desc/StatsDesc";
export const statsTribunalDesc = { export const statsTribunalCorrectionnelDesc = {
nbFamillesConvoquees: { nbFamillesConvoquees: {
label: "Nb familles convoquées mais pas encore passées", label: "Nb familles convoquées mais pas encore passées",
}, },
@ -91,15 +91,15 @@ export const statsPenalesDesc = {
tribunalCorrectionnel1: { tribunalCorrectionnel1: {
label: "Tribunal Correctionnel 1er passage", label: "Tribunal Correctionnel 1er passage",
stats: statsTribunalDesc, stats: statsTribunalCorrectionnelDesc,
}, },
tribunalCorrectionnel2: { tribunalCorrectionnel2: {
label: "Tribunal Correctionnel 2eme passage", label: "Tribunal Correctionnel 2eme passage",
stats: statsTribunalDesc, stats: statsTribunalCorrectionnelDesc,
}, },
tribunalCorrectionnel3: { tribunalCorrectionnel3: {
label: "Tribunal Correctionnel 3eme passage", label: "Tribunal Correctionnel 3eme passage",
stats: statsTribunalDesc, stats: statsTribunalCorrectionnelDesc,
}, },
nbFamilleAvecStageParentalité: { nbFamilleAvecStageParentalité: {
@ -108,9 +108,19 @@ export const statsPenalesDesc = {
nbFamilleAvecRequisitionJudiciaire: { nbFamilleAvecRequisitionJudiciaire: {
label: "Nb Familles avec Réquisition Judiciaire", label: "Nb Familles avec Réquisition Judiciaire",
}, },
nbFamillesTribunalDePolice: { tribunalDePolice: {
label: "Tribunal de Police",
stats: {
nbFamilles: {
label: "Nb familles avec Tribunal de police", label: "Nb familles avec Tribunal de police",
}, },
nbFamillesAppel: {
label: "Nb familles ayant fait appel",
},nbFamillesRelaxee: {
label: "Nb familles relaxées",
},
},
},
intervalGendarmerieProcureur: { intervalGendarmerieProcureur: {
label: "Délai moyen entre Gendarmerie et Procureur", label: "Délai moyen entre Gendarmerie et Procureur",
unit: " jours", unit: " jours",

View file

@ -0,0 +1,43 @@
import { Famille } from "../../../data/Famille";
import { isTribunalCorrectionnel } from "./computeStatsPenales";
import { InfoTribunalCorrectionnel } from "./InfoTribunalCorrectionnel";
export function buildInfoTribunauxCorrectionnel(f: Famille): InfoTribunalCorrectionnel[] {
const evtTribunaux = f.EvenementsEL.filter(isTribunalCorrectionnel);
return evtTribunaux.map((evtTribunal, index) => {
const prevEvtTrib = (index - 1 >= 0) ? evtTribunaux[index - 1] : null;
const nextEvtTrib = index + 1 < evtTribunaux.length ? evtTribunaux[index + 1] : null;
const eventsBetweenPreviousTribAndCurrentTrib = f.EvenementsEL.filter(
(e) => evtTribunal.Date != null &&
e.Date != null &&
e.Date <= evtTribunal.Date &&
(prevEvtTrib?.Date == null || e.Date > prevEvtTrib.Date)
);
const eventsBetweenCurrentTribAndNextTrib = 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: eventsBetweenPreviousTribAndCurrentTrib.find(
(e) => e.Type === "Administrateur AD'HOC"
),
evtAppel: eventsBetweenCurrentTribAndNextTrib.find(
(e) => (index === 0 && e.Type === "Appel jugement Tribunal Correctionnel") ||
(index === 1 && e.Type == "Appel du 2ème jugement TC")
),
evtViceDeProcedure: eventsBetweenCurrentTribAndNextTrib.find(
(e) => e.Type === "Vice de procédure tribunal correctionnel"
),
evtRelaxe: eventsBetweenCurrentTribAndNextTrib.find(
(e) => e.Type === "Relaxe Tribunal correctionnel"
),
};
});
}

View file

@ -15,19 +15,13 @@ 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 { buildInfoTribunauxCorrectionnel } from "./buildInfoTribunauxCorrectionnel";
import { InfoTribunalCorrectionnel } from "./InfoTribunalCorrectionnel";
type FamilleAvecInfoTribunaux = Famille & { type FamilleAvecInfoTribunaux = Famille & {
infoTribunaux: InfoTribunalCorrectionnel[]; infoTribunaux: InfoTribunalCorrectionnel[];
}; };
type InfoTribunalCorrectionnel = {
evtTribunal: EvenementFamille;
evtRelaxe?: EvenementFamille;
evtAdminAdhoc?: EvenementFamille;
evtViceDeProcedure?: EvenementFamille;
evtAppel?: EvenementFamille;
};
export function computeStatsPenales(familles: Famille[]): StatsPenales { export function computeStatsPenales(familles: Famille[]): StatsPenales {
const famillesResistantesOuEx = familles.filter( const famillesResistantesOuEx = familles.filter(
(f) => isResistant(f) || isExResistant(f) (f) => isResistant(f) || isExResistant(f)
@ -58,7 +52,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] = const famillesAvecInfoTribunaux: FamilleAvecInfoTribunaux[] =
famillesResistantesOuEx.map((f) => { famillesResistantesOuEx.map((f) => {
const infoTribunaux = buildInfoTribunaux(f); const infoTribunaux = buildInfoTribunauxCorrectionnel(f);
return { return {
...f, ...f,
infoTribunaux: infoTribunaux, infoTribunaux: infoTribunaux,
@ -128,12 +122,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
) )
), ),
nbFamillesTribunalDePolice: nbFamillesAvecPagesLiees( tribunalDePolice: computeTribunalPolice(famillesResistantesOuEx),
filterFamillesWithOneOfEvenementsOfType(
famillesResistantesOuEx,
"Tribunal de police judiciaire"
)
),
intervalGendarmerieProcureur: computeIntervalGendarmerieProcureur(familles), intervalGendarmerieProcureur: computeIntervalGendarmerieProcureur(familles),
intervalProcureurTribunalCorrectionnel: intervalProcureurTribunalCorrectionnel:
@ -142,6 +131,31 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
return statsPenales; return statsPenales;
} }
function computeTribunalPolice(
famillesResistantesOuEx: Famille[]
): StatsPenales["tribunalDePolice"] {
return {
nbFamilles: nbFamillesAvecPagesLiees(
filterFamillesWithOneOfEvenementsOfType(
famillesResistantesOuEx,
"Tribunal de police judiciaire"
)
),
nbFamillesAppel: nbFamillesAvecPagesLiees(
filterFamillesWithOneOfEvenementsOfType(
famillesResistantesOuEx,
"Appel Tribunal Police opposition ordonnance pénale"
)
),
nbFamillesRelaxee: nbFamillesAvecPagesLiees(
filterFamillesWithOneOfEvenementsOfType(
famillesResistantesOuEx,
"Relaxe Tribunal de police"
)
),
};
}
function computeCrpc( function computeCrpc(
famillesResistantesOuEx: Famille[] famillesResistantesOuEx: Famille[]
): StatsPenales["procureur"]["crpc"] { ): StatsPenales["procureur"]["crpc"] {
@ -235,9 +249,12 @@ function computeTribunalCorrectionnel(
nbFamillesAppelDuJugement: nbFamillesAvecPagesLiees( nbFamillesAppelDuJugement: nbFamillesAvecPagesLiees(
famillesAppelDuJugement famillesAppelDuJugement
), ),
nbFamillesAdministrateurAdhoc: nbFamillesAvecPagesLiees(famillesAdministrateurAdhoc), nbFamillesAdministrateurAdhoc: nbFamillesAvecPagesLiees(
nbFamillesViceDeProcedure: nbFamillesAvecPagesLiees(famillesViceDeProcedure), famillesAdministrateurAdhoc
),
nbFamillesViceDeProcedure: nbFamillesAvecPagesLiees(
famillesViceDeProcedure
),
}; };
} }
@ -297,51 +314,6 @@ function computeIntervalProcureurTribunalCorrectionnel(
return average(intervals); return average(intervals);
} }
function isTribunalCorrectionnel(e: EvenementFamille): boolean { export 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 prevEvtTrib = ( index - 1 >= 0) ? evtTribunaux[index - 1] : null;
const nextEvtTrib =
index + 1 < evtTribunaux.length ? evtTribunaux[index + 1] : null;
const eventsBetweenPreviousTribAndCurrentTrib = f.EvenementsEL.filter(
(e) =>
evtTribunal.Date != null &&
e.Date != null &&
e.Date <= evtTribunal.Date &&
(prevEvtTrib?.Date == null || e.Date > prevEvtTrib.Date)
);
const eventsBetweenCurrentTribAndNextTrib = 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: eventsBetweenPreviousTribAndCurrentTrib.find(
(e) => e.Type === "Administrateur AD'HOC"
),
evtAppel: eventsBetweenCurrentTribAndNextTrib.find(
(e) =>
(index === 0 && e.Type === "Appel jugement Tribunal Correctionnel") ||
(index === 1 && e.Type == "Appel du 2ème jugement TC")
),
evtViceDeProcedure: eventsBetweenCurrentTribAndNextTrib.find(
(e) => e.Type === "Vice de procédure tribunal correctionnel"
),
evtRelaxe: eventsBetweenCurrentTribAndNextTrib.find(
(e) => e.Type === "Relaxe Tribunal correctionnel"
),
};
});
}