From 456cb3279d0f284f29bb8c052c8d45e0d6b2972d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Arod?= Date: Mon, 16 Jun 2025 10:29:41 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20am=C3=A9liore=20la=20gestion=20des=20don?= =?UTF-8?q?n=C3=A9es=20manquante?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/format/formatValue.ts | 6 +++++- .../publish/v2/createSingleValueStatListItemBlock.ts | 8 ++++---- src/statistiques/v2/desc/StatsDesc.ts | 6 +++++- src/statistiques/v2/generales/computeStatsGenerales.ts | 4 ++-- src/statistiques/v2/math/average.ts | 7 +++++++ src/statistiques/v2/math/max.ts | 7 +++++++ src/{utils => statistiques/v2}/math/median.ts | 6 ++++-- src/statistiques/v2/math/min.ts | 7 +++++++ src/statistiques/v2/math/percent.ts | 8 ++++++++ src/statistiques/v2/penales/computeStatsAmendes.ts | 10 ++++++---- src/statistiques/v2/penales/computeStatsPenales.ts | 2 +- .../intervals/computeIntervalGendarmerieProcureur.ts | 3 ++- .../computeIntervalMedGendarmerieOuProcureur.ts | 3 ++- .../intervals/computeIntervalProcedurePenale.ts | 5 +++-- .../computeIntervalProcureurTribunalCorrectionnel.ts | 3 ++- src/utils/math/average.ts | 5 ----- src/utils/math/percent.ts | 3 --- 17 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 src/statistiques/v2/math/average.ts create mode 100644 src/statistiques/v2/math/max.ts rename src/{utils => statistiques/v2}/math/median.ts (56%) create mode 100644 src/statistiques/v2/math/min.ts create mode 100644 src/statistiques/v2/math/percent.ts delete mode 100644 src/utils/math/average.ts delete mode 100644 src/utils/math/percent.ts diff --git a/src/format/formatValue.ts b/src/format/formatValue.ts index 0214cc4..ccc9463 100644 --- a/src/format/formatValue.ts +++ b/src/format/formatValue.ts @@ -1,9 +1,13 @@ +import { StatsValue } from "../statistiques/v2/desc/StatsDesc"; import { ValueFormatOptions } from "./ValueFormatOptions"; export function formatValue( - value: number, + value: StatsValue, valueFormatOptions: ValueFormatOptions ) { + if (value === undefined) { + return "Pas de données"; + } const valueStr = value.toLocaleString("fr-FR", { useGrouping: false, maximumFractionDigits: diff --git a/src/notion/publish/v2/createSingleValueStatListItemBlock.ts b/src/notion/publish/v2/createSingleValueStatListItemBlock.ts index ce753a4..aeb4b49 100644 --- a/src/notion/publish/v2/createSingleValueStatListItemBlock.ts +++ b/src/notion/publish/v2/createSingleValueStatListItemBlock.ts @@ -1,7 +1,7 @@ import { formatValue } from "../../../format/formatValue"; import { ValueFormatOptions } from "../../../format/ValueFormatOptions"; -import { StatsData } from "../../../statistiques/v2/desc/StatsDesc"; -import { chunk, isNumber } from "lodash"; +import { StatsData, StatsValue } from "../../../statistiques/v2/desc/StatsDesc"; +import { chunk, isObject } from "lodash"; import { BlockObjectRequest } from "@notionhq/client/build/src/api-endpoints"; export function createSingleValueStatListItemBlock( @@ -9,7 +9,7 @@ export function createSingleValueStatListItemBlock( formatOptions: ValueFormatOptions, data: StatsData ): BlockObjectRequest { - if (isNumber(data)) { + if (!isObject(data)) { return bulletedListNumberData(label, data, formatOptions); } else if (data.relatedPageIds.length === 0) { return bulletedListNumberData(label, data.value, formatOptions); @@ -50,7 +50,7 @@ export function createSingleValueStatListItemBlock( function bulletedListNumberData( label: string, - data: number, + data: StatsValue, formatOptions: ValueFormatOptions ): BlockObjectRequest { return { diff --git a/src/statistiques/v2/desc/StatsDesc.ts b/src/statistiques/v2/desc/StatsDesc.ts index ffb31dc..b5c6026 100644 --- a/src/statistiques/v2/desc/StatsDesc.ts +++ b/src/statistiques/v2/desc/StatsDesc.ts @@ -65,7 +65,11 @@ export function isMultiValueStatDesc(x: StatDesc): x is MultiValueStatDesc { return "type" in x && x.type === "multi"; } -export type StatsData = number | { value: number; relatedPageIds: string[] }; +export type StatsValue = number | undefined; + +export type StatsData = + | StatsValue + | { value: StatsValue; relatedPageIds: string[] }; export type StatType = T extends StatGroupListDesc ? Record< diff --git a/src/statistiques/v2/generales/computeStatsGenerales.ts b/src/statistiques/v2/generales/computeStatsGenerales.ts index 60b150c..36db78d 100644 --- a/src/statistiques/v2/generales/computeStatsGenerales.ts +++ b/src/statistiques/v2/generales/computeStatsGenerales.ts @@ -4,8 +4,8 @@ import { isExResistant, isResistant, } from "../../../data/Famille"; -import { average } from "../../../utils/math/average"; -import { median } from "../../../utils/math/median"; +import { average } from "../math/average"; +import { median } from "../math/median"; import { StatsGenerales } from "./StatsGenerales"; import _, { countBy, uniq } from "lodash"; import { isIntegrationEnCours } from "../../../data/StatutFamille"; diff --git a/src/statistiques/v2/math/average.ts b/src/statistiques/v2/math/average.ts new file mode 100644 index 0000000..4fb0925 --- /dev/null +++ b/src/statistiques/v2/math/average.ts @@ -0,0 +1,7 @@ +import { StatsValue } from "../desc/StatsDesc"; + +export function average(values: number[]): StatsValue { + if (values.length === 0) return undefined; + + return values.reduce((a, b) => a + b) / values.length; +} diff --git a/src/statistiques/v2/math/max.ts b/src/statistiques/v2/math/max.ts new file mode 100644 index 0000000..a9b83a8 --- /dev/null +++ b/src/statistiques/v2/math/max.ts @@ -0,0 +1,7 @@ +import { StatsValue } from "../desc/StatsDesc"; + +export function max(values: number[]): StatsValue { + if (values.length === 0) return undefined; + + return Math.max(...values); +} diff --git a/src/utils/math/median.ts b/src/statistiques/v2/math/median.ts similarity index 56% rename from src/utils/math/median.ts rename to src/statistiques/v2/math/median.ts index dfbc6f9..65e11dd 100644 --- a/src/utils/math/median.ts +++ b/src/statistiques/v2/math/median.ts @@ -1,5 +1,7 @@ -export function median(values: number[]): number { - if (values.length === 0) return NaN; +import { StatsValue } from "../desc/StatsDesc"; + +export function median(values: number[]): StatsValue { + if (values.length === 0) return undefined; const sorted = [...values].sort((a, b) => a - b); diff --git a/src/statistiques/v2/math/min.ts b/src/statistiques/v2/math/min.ts new file mode 100644 index 0000000..8c5d91a --- /dev/null +++ b/src/statistiques/v2/math/min.ts @@ -0,0 +1,7 @@ +import { StatsValue } from "../desc/StatsDesc"; + +export function min(values: number[]): StatsValue { + if (values.length === 0) return undefined; + + return Math.min(...values); +} diff --git a/src/statistiques/v2/math/percent.ts b/src/statistiques/v2/math/percent.ts new file mode 100644 index 0000000..e6c04df --- /dev/null +++ b/src/statistiques/v2/math/percent.ts @@ -0,0 +1,8 @@ +import { StatsValue } from "../desc/StatsDesc"; + +export function percent(value: StatsValue, total: StatsValue): StatsValue { + if (value === undefined || total === undefined) { + return undefined; + } + return (100 * value) / total; +} diff --git a/src/statistiques/v2/penales/computeStatsAmendes.ts b/src/statistiques/v2/penales/computeStatsAmendes.ts index a3ac57a..78cce8b 100644 --- a/src/statistiques/v2/penales/computeStatsAmendes.ts +++ b/src/statistiques/v2/penales/computeStatsAmendes.ts @@ -3,6 +3,8 @@ import { Famille } from "../../../data/Famille"; import { NamedStatsType } from "../desc/StatsDesc"; import { statsAmendesDesc } from "./StatsPenales"; import { isEvtProcedurePenale } from "../../../data/EvenementFamille"; +import { max } from "../math/max"; +import { min } from "../math/min"; export function computeStatsAmendes( familles: Famille[] @@ -38,10 +40,10 @@ export function computeStatsAmendes( .map((a) => a.Montant); const stats = { - amendeMinAvecSursi: Math.min(...montantsAvecSursi), - amendeMaxAvecSursi: Math.max(...montantsAvecSursi), - amendeMinFerme: Math.min(...montantsFerme), - amendeMaxFerme: Math.max(...montantsFerme), + amendeMinAvecSursi: min(montantsAvecSursi), + amendeMaxAvecSursi: max(montantsAvecSursi), + amendeMinFerme: min(montantsFerme), + amendeMaxFerme: max(montantsFerme), }; return [evtType, stats]; }) diff --git a/src/statistiques/v2/penales/computeStatsPenales.ts b/src/statistiques/v2/penales/computeStatsPenales.ts index 2ae2423..b680cc4 100644 --- a/src/statistiques/v2/penales/computeStatsPenales.ts +++ b/src/statistiques/v2/penales/computeStatsPenales.ts @@ -23,7 +23,7 @@ import { } from "./computeFamilleAvecInfosProceduresPenales"; import { computeIntervalMedGendarmerieOuProcureur } from "./intervals/computeIntervalMedGendarmerieOuProcureur"; import { groupBy } from "lodash"; -import { percent } from "../../../utils/math/percent"; +import { percent } from "../math/percent"; import { isEvtTypeProcedurePenaleHorsGendarmerie } from "../../../data/TypeEvenementsPenal"; import { computeStatsAmendes } from "./computeStatsAmendes"; diff --git a/src/statistiques/v2/penales/intervals/computeIntervalGendarmerieProcureur.ts b/src/statistiques/v2/penales/intervals/computeIntervalGendarmerieProcureur.ts index 4a21254..a1df449 100644 --- a/src/statistiques/v2/penales/intervals/computeIntervalGendarmerieProcureur.ts +++ b/src/statistiques/v2/penales/intervals/computeIntervalGendarmerieProcureur.ts @@ -4,10 +4,11 @@ import { FamilleAvecInfosProceduresPenales, InfosProcedurePenale, } from "../computeFamilleAvecInfosProceduresPenales"; +import { StatsValue } from "../../desc/StatsDesc"; export function computeIntervalGendarmerieProcureur( familles: FamilleAvecInfosProceduresPenales[] -): number { +): StatsValue { return computeIntervalProcedurePenale( familles, (procPenal: InfosProcedurePenale): number | undefined => { diff --git a/src/statistiques/v2/penales/intervals/computeIntervalMedGendarmerieOuProcureur.ts b/src/statistiques/v2/penales/intervals/computeIntervalMedGendarmerieOuProcureur.ts index cd30f63..5126276 100644 --- a/src/statistiques/v2/penales/intervals/computeIntervalMedGendarmerieOuProcureur.ts +++ b/src/statistiques/v2/penales/intervals/computeIntervalMedGendarmerieOuProcureur.ts @@ -5,10 +5,11 @@ import { } from "../computeFamilleAvecInfosProceduresPenales"; import { computeIntervalProcedurePenale } from "./computeIntervalProcedurePenale"; import { min } from "lodash"; +import { StatsValue } from "../../desc/StatsDesc"; export function computeIntervalMedGendarmerieOuProcureur( familles: FamilleAvecInfoProceduresPenales[] -): number { +): StatsValue { return computeIntervalProcedurePenale( familles, (procPenal: InfosProcedurePenale): number | undefined => { diff --git a/src/statistiques/v2/penales/intervals/computeIntervalProcedurePenale.ts b/src/statistiques/v2/penales/intervals/computeIntervalProcedurePenale.ts index 06cf6e3..a37117d 100644 --- a/src/statistiques/v2/penales/intervals/computeIntervalProcedurePenale.ts +++ b/src/statistiques/v2/penales/intervals/computeIntervalProcedurePenale.ts @@ -1,5 +1,6 @@ import { Famille } from "../../../../data/Famille"; -import { average } from "../../../../utils/math/average"; +import { StatsValue } from "../../desc/StatsDesc"; +import { average } from "../../math/average"; import { FamilleAvecInfosProceduresPenales as FamilleAvecInfoProceduresPenales, InfosProcedurePenale, @@ -13,7 +14,7 @@ export function computeIntervalProcedurePenale( famille: Famille ) => number | undefined, intervalName: string -): number { +): StatsValue { const intervals: number[] = famillesAvecInfoProceduresPenales.flatMap((f) => { return f.proceduresPenales .map((pp) => { diff --git a/src/statistiques/v2/penales/intervals/computeIntervalProcureurTribunalCorrectionnel.ts b/src/statistiques/v2/penales/intervals/computeIntervalProcureurTribunalCorrectionnel.ts index 9847164..9e88376 100644 --- a/src/statistiques/v2/penales/intervals/computeIntervalProcureurTribunalCorrectionnel.ts +++ b/src/statistiques/v2/penales/intervals/computeIntervalProcureurTribunalCorrectionnel.ts @@ -4,10 +4,11 @@ import { FamilleAvecInfosProceduresPenales, InfosProcedurePenale, } from "../computeFamilleAvecInfosProceduresPenales"; +import { StatsValue } from "../../desc/StatsDesc"; export function computeIntervalProcureurTribunalCorrectionnel( familles: FamilleAvecInfosProceduresPenales[] -): number { +): StatsValue { return computeIntervalProcedurePenale( familles, (procPenal: InfosProcedurePenale): number | undefined => { diff --git a/src/utils/math/average.ts b/src/utils/math/average.ts deleted file mode 100644 index 9c8f781..0000000 --- a/src/utils/math/average.ts +++ /dev/null @@ -1,5 +0,0 @@ -export function average(values: number[]): number { - if (values.length === 0) return NaN; - - return values.reduce((a, b) => a + b) / values.length; -} diff --git a/src/utils/math/percent.ts b/src/utils/math/percent.ts deleted file mode 100644 index 4ebf237..0000000 --- a/src/utils/math/percent.ts +++ /dev/null @@ -1,3 +0,0 @@ -export function percent(value: number, total: number): number { - return (100 * value) / total; -}