mirror of
https://framagit.org/enfance-libre/statistiques
synced 2025-12-07 13:13:44 +00:00
feat: stats amendes par type d'évènements
This commit is contained in:
parent
d5755516fb
commit
998714105b
3 changed files with 55 additions and 64 deletions
|
|
@ -24,7 +24,7 @@ export const statsTribunalCorrectionnelDesc = {
|
||||||
},
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
const statsAmendesDesc = {
|
export const statsAmendesDesc = {
|
||||||
amendeMinAvecSursi: {
|
amendeMinAvecSursi: {
|
||||||
label: "Amende avec sursi minimale",
|
label: "Amende avec sursi minimale",
|
||||||
unit: "€",
|
unit: "€",
|
||||||
|
|
@ -169,18 +169,10 @@ export const statsPenalesDesc = {
|
||||||
valueMaxFractioDigits: 0,
|
valueMaxFractioDigits: 0,
|
||||||
},
|
},
|
||||||
amendes: {
|
amendes: {
|
||||||
label: "Amendes",
|
label: "Amendes par type d'évènements",
|
||||||
stats: {
|
type: "group-list",
|
||||||
tc: {
|
|
||||||
label: "Tribunal Correctionnel",
|
|
||||||
stats: statsAmendesDesc,
|
stats: statsAmendesDesc,
|
||||||
},
|
},
|
||||||
tp: {
|
|
||||||
label: "Tribunal de Police",
|
|
||||||
stats: statsAmendesDesc,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
parDepartements: {
|
parDepartements: {
|
||||||
label: "Par départements",
|
label: "Par départements",
|
||||||
type: "group-list",
|
type: "group-list",
|
||||||
|
|
|
||||||
49
src/statistiques/v2/penales/computeStatsAmendes.ts
Normal file
49
src/statistiques/v2/penales/computeStatsAmendes.ts
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
import { uniq } from "lodash";
|
||||||
|
import { Famille } from "../../../data/Famille";
|
||||||
|
import { NamedStatsType } from "../desc/StatsDesc";
|
||||||
|
import { statsAmendesDesc } from "./StatsPenales";
|
||||||
|
import { isEvtProcedurePenale } from "../../../data/EvenementFamille";
|
||||||
|
|
||||||
|
export function computeStatsAmendes(
|
||||||
|
familles: Famille[]
|
||||||
|
): Record<string, NamedStatsType<typeof statsAmendesDesc>> {
|
||||||
|
const flatEvtsProcedurePenale = familles
|
||||||
|
.flatMap((f) => f.EvenementsEL)
|
||||||
|
.filter((e) => isEvtProcedurePenale(e));
|
||||||
|
|
||||||
|
const typeEvtsAvecAmendesFermeOuSursi = uniq(
|
||||||
|
flatEvtsProcedurePenale
|
||||||
|
.filter((e) =>
|
||||||
|
e.Amendes.find(
|
||||||
|
(a) =>
|
||||||
|
!isNaN(a.Montant) &&
|
||||||
|
(a.Type === "avec sursis" || a.Type === "ferme")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.map((e) => e.Type)
|
||||||
|
).sort();
|
||||||
|
|
||||||
|
return Object.fromEntries(
|
||||||
|
typeEvtsAvecAmendesFermeOuSursi.map((evtType) => {
|
||||||
|
const amendesForType = flatEvtsProcedurePenale
|
||||||
|
.filter((e) => e.Type === evtType)
|
||||||
|
.flatMap((e) => e.Amendes)
|
||||||
|
.filter((a) => !isNaN(a.Montant));
|
||||||
|
|
||||||
|
const montantsAvecSursi = amendesForType
|
||||||
|
.filter((a) => a.Type === "avec sursis")
|
||||||
|
.map((a) => a.Montant);
|
||||||
|
const montantsFerme = amendesForType
|
||||||
|
.filter((a) => a.Type === "ferme")
|
||||||
|
.map((a) => a.Montant);
|
||||||
|
|
||||||
|
const stats = {
|
||||||
|
amendeMinAvecSursi: Math.min(...montantsAvecSursi),
|
||||||
|
amendeMaxAvecSursi: Math.max(...montantsAvecSursi),
|
||||||
|
amendeMinFerme: Math.min(...montantsFerme),
|
||||||
|
amendeMaxFerme: Math.max(...montantsFerme),
|
||||||
|
};
|
||||||
|
return [evtType, stats];
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
@ -25,6 +25,7 @@ import { computeIntervalMedGendarmerieOuProcureur } from "./intervals/computeInt
|
||||||
import { groupBy } from "lodash";
|
import { groupBy } from "lodash";
|
||||||
import { percent } from "../../../utils/math/percent";
|
import { percent } from "../../../utils/math/percent";
|
||||||
import { isEvtTypeProcedurePenaleHorsGendarmerie } from "../../../data/TypeEvenementsPenal";
|
import { isEvtTypeProcedurePenaleHorsGendarmerie } from "../../../data/TypeEvenementsPenal";
|
||||||
|
import { computeStatsAmendes } from "./computeStatsAmendes";
|
||||||
|
|
||||||
export type FamilleAvecInfoTribunaux = Famille & {
|
export type FamilleAvecInfoTribunaux = Famille & {
|
||||||
infoTribunaux: InfoTribunalCorrectionnel[];
|
infoTribunaux: InfoTribunalCorrectionnel[];
|
||||||
|
|
@ -76,20 +77,6 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
|
||||||
const famillesAvecInfoProceduresPenales: FamilleAvecInfoProceduresPenales[] =
|
const famillesAvecInfoProceduresPenales: FamilleAvecInfoProceduresPenales[] =
|
||||||
famillesResistantesOuEx.map(computeFamilleAvecInfosProceduresPenales);
|
famillesResistantesOuEx.map(computeFamilleAvecInfosProceduresPenales);
|
||||||
|
|
||||||
const amendesTC = famillesResistantesOuEx
|
|
||||||
.flatMap((f) =>
|
|
||||||
f.EvenementsEL.filter((e) => e.Type === "Tribunal correctionnel")
|
|
||||||
)
|
|
||||||
.flatMap((e) => e.Amendes)
|
|
||||||
.filter((e) => !isNaN(e.Montant));
|
|
||||||
|
|
||||||
const amendesTP = famillesResistantesOuEx
|
|
||||||
.flatMap((f) =>
|
|
||||||
f.EvenementsEL.filter((e) => e.Type === "Tribunal de police judiciaire")
|
|
||||||
)
|
|
||||||
.flatMap((e) => e.Amendes)
|
|
||||||
.filter((e) => !isNaN(e.Montant));
|
|
||||||
|
|
||||||
const statsPenales: StatsPenales = {
|
const statsPenales: StatsPenales = {
|
||||||
nbFamillesMisesEnDemeure: nbFamillesAvecPagesLiees(famillesMisesEnDemeure),
|
nbFamillesMisesEnDemeure: nbFamillesAvecPagesLiees(famillesMisesEnDemeure),
|
||||||
nbFamillesAvecProcedurePenale: nbFamillesAvecPagesLiees(
|
nbFamillesAvecProcedurePenale: nbFamillesAvecPagesLiees(
|
||||||
|
|
@ -177,44 +164,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales {
|
||||||
computeIntervalProcureurTribunalCorrectionnel(
|
computeIntervalProcureurTribunalCorrectionnel(
|
||||||
famillesAvecInfoProceduresPenales
|
famillesAvecInfoProceduresPenales
|
||||||
),
|
),
|
||||||
amendes: {
|
amendes: computeStatsAmendes(famillesResistantesOuEx),
|
||||||
tc: {
|
|
||||||
amendeMinAvecSursi: Math.min(
|
|
||||||
...amendesTC
|
|
||||||
.filter((a) => a.Type === "avec sursis")
|
|
||||||
.map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMaxAvecSursi: Math.max(
|
|
||||||
...amendesTC
|
|
||||||
.filter((a) => a.Type === "avec sursis")
|
|
||||||
.map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMinFerme: Math.min(
|
|
||||||
...amendesTC.filter((a) => a.Type === "ferme").map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMaxFerme: Math.max(
|
|
||||||
...amendesTC.filter((a) => a.Type === "ferme").map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
tp: {
|
|
||||||
amendeMinAvecSursi: Math.min(
|
|
||||||
...amendesTP
|
|
||||||
.filter((a) => a.Type === "avec sursis")
|
|
||||||
.map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMaxAvecSursi: Math.max(
|
|
||||||
...amendesTP
|
|
||||||
.filter((a) => a.Type === "avec sursis")
|
|
||||||
.map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMinFerme: Math.min(
|
|
||||||
...amendesTP.filter((a) => a.Type === "ferme").map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
amendeMaxFerme: Math.max(
|
|
||||||
...amendesTP.filter((a) => a.Type === "ferme").map((a) => a.Montant)
|
|
||||||
),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
parDepartements: Object.fromEntries(
|
parDepartements: Object.fromEntries(
|
||||||
departements.map((d) => [
|
departements.map((d) => [
|
||||||
d,
|
d,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue