From 29de3198f53c6056cdac903fa65f25f30f9415ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Arod?= Date: Wed, 23 Oct 2024 17:43:27 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20header=20Proc=C3=A9dure=20P=C3=A9nale?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/data/EvenementFamille.ts | 18 +++---- src/data/TypeEvenementsPenal.ts | 51 +++++++++++++------ src/index.ts | 16 ++++-- .../publish/blocks/createCalloutBlock.ts | 24 +++++++++ .../publish/v2/publishStatsGenerales.ts | 4 +- .../v2/penales/computeStatsPenales.ts | 4 +- 6 files changed, 82 insertions(+), 35 deletions(-) create mode 100644 src/notion/publish/blocks/createCalloutBlock.ts diff --git a/src/data/EvenementFamille.ts b/src/data/EvenementFamille.ts index a095746..1b8d97e 100644 --- a/src/data/EvenementFamille.ts +++ b/src/data/EvenementFamille.ts @@ -1,8 +1,10 @@ import { Period } from "../period/Period"; import { isPeriodContaining } from "../period/isPeriodContaining"; import { TypeEvenement } from "./TypeEvenement"; -import { typesEvenementsPenal } from "./TypeEvenementsPenal"; -import { TypeEvenementsPenal } from "./TypeEvenementsPenal"; +import { + isEvtTypeProcedurePenale, + isEvtTypeProcedurePenaleHorsGendarmerie, +} from "./TypeEvenementsPenal"; import { typesEvenementsSocial as typesEvenementsCivil } from "./TypeEvenementsSocial"; import { TypesEvenementsSocial as TypesEvenementsCivil } from "./TypeEvenementsSocial"; @@ -15,20 +17,14 @@ export type EvenementFamille = Readonly<{ "Enfants concernés": string; }>; -export function isProcedurePenale(evenement: EvenementFamille): boolean { - return ( - typesEvenementsPenal.includes(evenement.Type as TypeEvenementsPenal) && - evenement.Type !== "Mise en demeure de scolarisation" - ); +export function isEvtProcedurePenale(evenement: EvenementFamille): boolean { + return isEvtTypeProcedurePenale(evenement.Type); } export function isProcedurePenaleHorsGendarmerie( evenement: EvenementFamille ): boolean { - return ( - isProcedurePenale(evenement) && - evenement.Type !== "Gendarmerie/Forces de l'ordre" - ); + return isEvtTypeProcedurePenaleHorsGendarmerie(evenement.Type); } export function isCompositionPenale(evenement: EvenementFamille): boolean { diff --git a/src/data/TypeEvenementsPenal.ts b/src/data/TypeEvenementsPenal.ts index b1347e9..18f6acb 100644 --- a/src/data/TypeEvenementsPenal.ts +++ b/src/data/TypeEvenementsPenal.ts @@ -1,28 +1,49 @@ +import { TypeEvenement } from "./TypeEvenement"; + export type TypeEvenementsPenal = (typeof typesEvenementsPenal)[number]; export const typesEvenementsPenal = [ "Mise en demeure de scolarisation", "Gendarmerie/Forces de l'ordre", - "Réquisition judiciaire", + // Procureur "Audition procureur", + "Refus CRPC", + "Acceptation CRPC", // PLaceholder see does not exist in Notion yet // See https://discord.com/channels/990921361121746984/1245360366322585691/1248260713634336839 + "Classement pénal sans suite", + "Composition pénale refusée", "Composition pénale acceptée", - "Refus CRPC", - "Acceptation CRPC", // PLaceholder see does not exist in Notion yet // See https://discord.com/channels/990921361121746984/1245360366322585691/1248260713634336839 - - "Tribunal correctionnel", - "Administrateur AD'HOC", - "Appel du 1er jugement", - "Stage parentalité", - - "Réquisition judiciaire", - "Appel du 2eme jugement", // placeholder - - "Tribunal de police judiciaire", - - "Classement pénal sans suite", "Acceptation avertissement pénal probatoire", + "Stage parentalité", + "Réquisition judiciaire", + + // Tribunal + "Tribunal correctionnel", + "Appel du 1er jugement", + "Appel du 2eme jugement", // placeholder + "Tribunal de police judiciaire", + "Administrateur AD'HOC", ] as const; + +export function isEvtTypeProcedurePenale(evtType: TypeEvenement): boolean { + return ( + typesEvenementsPenal.includes(evtType as TypeEvenementsPenal) && + evtType !== "Mise en demeure de scolarisation" + ); +} + +export const typeEvenementsProcedurePenale = typesEvenementsPenal.filter( + isEvtTypeProcedurePenale +); + +export function isEvtTypeProcedurePenaleHorsGendarmerie( + evtType: TypeEvenement +): boolean { + return ( + isEvtTypeProcedurePenale(evtType) && + evtType !== "Gendarmerie/Forces de l'ordre" + ); +} diff --git a/src/index.ts b/src/index.ts index f5797d0..c073886 100644 --- a/src/index.ts +++ b/src/index.ts @@ -17,6 +17,7 @@ import { computeStatsGeneralesMensuelles } from "./statistiques/v2/generales/com import { mermaidDiagramStatsGeneralesMensuelles } from "./statistiques/v2/generales/mermaidDiagramStatsGeneralesMensuelles"; import { publishStatsGenerales } from "./notion/publish/v2/publishStatsGenerales"; import { nettoyerDonneesFamilles } from "./data/nettoyage/nettoyerDonneesFamilles"; +import { typeEvenementsProcedurePenale } from "./data/TypeEvenementsPenal"; type ProcessOptions = { dryRun: boolean; @@ -133,11 +134,16 @@ function buildProcessOptions(): ProcessOptions { console.log("Publishing statistics..."); await publishStatisticsToNotion(elStats, currentDate, notionClient); - const header = ` -Note: Sauf mention contraire les statistiques sont basées sur les familles résistantes & ex-résistantes (en ignorant les évènements hors de la période d'appartenance à EL') -Dernière mise à jour le ${formatDate(currentDate, "dd/MM/yyyy à HH:mm")} + const header = `Notes: +- Dernière mise à jour le ${formatDate(currentDate, "dd/MM/yyyy à HH:mm")} +- Sauf mention contraire les statistiques sont basées sur les familles résistantes & ex-résistantes (en ignorant les évènements hors de la période d'appartenance à EL')`; + const headerPenale = + header + + ` +- La Procédure Pénale ici inclus les évènemnts de type ${typeEvenementsProcedurePenale.join( + ", " + )}.`; - `; await publishStatsGenerales( notionClient, header, @@ -147,7 +153,7 @@ Dernière mise à jour le ${formatDate(currentDate, "dd/MM/yyyy à HH:mm")} await publishStatsToPage( notionClient, "969eac5c-a4eb-49d4-b4ad-c341c9c4c785", - header, + headerPenale, statsPenalesDesc, statsPenales ); diff --git a/src/notion/publish/blocks/createCalloutBlock.ts b/src/notion/publish/blocks/createCalloutBlock.ts new file mode 100644 index 0000000..c081aa8 --- /dev/null +++ b/src/notion/publish/blocks/createCalloutBlock.ts @@ -0,0 +1,24 @@ +import { BlockObjectRequest } from "@notionhq/client/build/src/api-endpoints"; + +export function createCalloutBlock(content: string): CalloutBlockObjectRequest { + return { + callout: { + rich_text: [ + { + text: { + content: content, + }, + }, + ], + icon: { + emoji: "💡", + }, + color: "gray_background", + }, + }; +} + +export type CalloutBlockObjectRequest = Extract< + BlockObjectRequest, + { callout: unknown } +>; diff --git a/src/notion/publish/v2/publishStatsGenerales.ts b/src/notion/publish/v2/publishStatsGenerales.ts index 3a4fbd8..9224aaf 100644 --- a/src/notion/publish/v2/publishStatsGenerales.ts +++ b/src/notion/publish/v2/publishStatsGenerales.ts @@ -1,12 +1,12 @@ import { Client } from "@notionhq/client"; import { createMermaidCodeBlock } from "../blocks/createMermaidCodeBlock"; -import { createParagraphBlock } from "../blocks/createParagraphBlock"; import { createStatGroupChildrenListItemBlock } from "./createStatGroupListItemBlock"; import { updatePageContent } from "./updatePageContent"; import { StatsGenerales, statsGeneralesDesc, } from "../../../statistiques/v2/generales/StatsGenerales"; +import { createCalloutBlock } from "../blocks/createCalloutBlock"; export async function publishStatsGenerales( notionClient: Client, @@ -14,7 +14,7 @@ export async function publishStatsGenerales( statsGenerales: StatsGenerales, mermaidDiagramStatsGeneralesMensuelles: string ) { - const headerBlock = createParagraphBlock(header); + const headerBlock = createCalloutBlock(header); const statsBlocks = createStatGroupChildrenListItemBlock( statsGeneralesDesc, statsGenerales diff --git a/src/statistiques/v2/penales/computeStatsPenales.ts b/src/statistiques/v2/penales/computeStatsPenales.ts index e3146e4..8d20a42 100644 --- a/src/statistiques/v2/penales/computeStatsPenales.ts +++ b/src/statistiques/v2/penales/computeStatsPenales.ts @@ -5,7 +5,7 @@ import { isEvenementBefore, isProcureur, isGendarmerie, - isProcedurePenale, + isEvtProcedurePenale, EvenementFamille, isProcedurePenaleHorsGendarmerie, } from "../../../data/EvenementFamille"; @@ -62,7 +62,7 @@ export function computeStatsPenales(familles: Famille[]): StatsPenales { nbFamillesMisesEnDemeure: famillesMisesEnDemeure.length, nbFamillesAvecProcedurePenale: filterFamillesWithOneOfEvenements( famillesResistantesOuEx, - isProcedurePenale + isEvtProcedurePenale ).length, nbFamillesAvecGendarmerie: famillesGendarmerie.length, nbFamillesAvecGendarmerieSansSuiteACeJour: