From dcc396af823bb4f9419031537fb4759f6eabeef2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Arod?= Date: Mon, 14 Oct 2024 17:42:57 +0200 Subject: [PATCH] feat: ajout de nbFamillesResistantesActuellesParDepartement --- src/data/Famille.ts | 1 + src/notion/fetch/dbIds.ts | 1 + .../fetchFamiliesWithEventsFromNotion.ts | 27 ++++++++++++++++--- .../v2/generales/StatsGenerales.ts | 8 ++++-- .../v2/generales/computeStatsGenerales.ts | 27 ++++++++++++------- 5 files changed, 50 insertions(+), 14 deletions(-) diff --git a/src/data/Famille.ts b/src/data/Famille.ts index b6c7bf4..6d2e20b 100644 --- a/src/data/Famille.ts +++ b/src/data/Famille.ts @@ -21,6 +21,7 @@ export type Famille = Readonly<{ Sortie: Date | null; Penal: StatutPenal; Social: StatutSocial; + Departement: string | null; // sorted by date asc Evenements: EvenementFamille[]; DerniereModification: Date; diff --git a/src/notion/fetch/dbIds.ts b/src/notion/fetch/dbIds.ts index 3aa672a..7f98d35 100644 --- a/src/notion/fetch/dbIds.ts +++ b/src/notion/fetch/dbIds.ts @@ -1 +1,2 @@ export const familEventsDbId: string = "c4d434b4603c4481a4d445618ecdf999"; +export const departementsDbId: string = "787779be614544069f609bf9d2a7cd15"; diff --git a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts index 8eb38c5..f31b69d 100644 --- a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts +++ b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts @@ -12,7 +12,7 @@ import { statusPropertyToText } from "../utils/properties/statusPropertyToText"; import { titlePropertyToText } from "../utils/properties/titlePropertyToText"; import { queryAllDbResults } from "../utils/queryAllDbResults"; import { richTextPropertyToPlainText } from "../utils/text/richTextPropertyToPlainText"; -import { familEventsDbId } from "./dbIds"; +import { departementsDbId, familEventsDbId } from "./dbIds"; import { propContexteEntree, familiesDbId, @@ -23,6 +23,10 @@ import { import { StatutPenal } from "../../data/StatutPenal"; import { StatutSocial } from "../../data/StatutSocial"; +type Departement = { + notionId: string; + name: string; +}; export async function fetchFamiliesWithEventsFromNotion( notionClient: Client ): Promise { @@ -38,13 +42,24 @@ export async function fetchFamiliesWithEventsFromNotion( }) ).filter(isFullPage); + const departementPages = ( + await queryAllDbResults(notionClient, { + database_id: departementsDbId, + }) + ).filter(isFullPage); + + const departements: Departement[] = departementPages.map((page) => ({ + notionId: page.id, + name: titlePropertyToText(page.properties, "Nom"), + })); + const familyEvents = eventPages.map((pageObjectResponse) => { return buildFamilyEvent(pageObjectResponse); }); const familles: Famille[] = await Promise.all( familyPages.map((pageObjectResponse) => { - return buildFamily(pageObjectResponse, familyEvents); + return buildFamily(pageObjectResponse, familyEvents, departements); }) ); return familles; @@ -69,10 +84,15 @@ function buildFamilyEvent(page: PageObjectResponse): EvenementFamille { function buildFamily( page: PageObjectResponse, - familyEvents: EvenementFamille[] + familyEvents: EvenementFamille[], + departements: Departement[] ): Famille { const pageProperties = page.properties; + const departementId = relationPropertyToPageId(pageProperties, "Département"); + const departement = departementId + ? departements.find((d) => d.notionId === departementId) + : null; const family: Famille = { notionId: page.id, Titre: titlePropertyToText(pageProperties, ""), @@ -84,6 +104,7 @@ function buildFamily( Integration: datePropertyToDate(pageProperties, "Intégration"), Sortie: datePropertyToDate(pageProperties, "Sortie"), Evenements: familyEvents.filter((fe) => fe.notionIdFamille === page.id), + Departement: departement?.name || null, DerniereModification: datePropertyToDate( pageProperties, propDerniereModification diff --git a/src/statistiques/v2/generales/StatsGenerales.ts b/src/statistiques/v2/generales/StatsGenerales.ts index cf2f1d6..dd4e798 100644 --- a/src/statistiques/v2/generales/StatsGenerales.ts +++ b/src/statistiques/v2/generales/StatsGenerales.ts @@ -4,10 +4,14 @@ export const statsGeneralesDesc = { label: "Stats Générales", stats: { nbFamillesResistantesActuelles: { - label: "Nb Familles Résistantes actuelles", + label: "Nb Familles actuellement résistantes", }, nbFamillesResistantesActuellesOuPassees: { - label: "Nb Familles Résistantes actuelles ou passées", + label: "Nb Familles résistantes actuellement ou par le passé", + }, + nbFamillesResistantesActuellesParDepartement: { + label: "Nb familles actuellement résistante par département", + type: "multi", }, dureeResistanceMoyenne: { label: "Durée moyenne de résistance", diff --git a/src/statistiques/v2/generales/computeStatsGenerales.ts b/src/statistiques/v2/generales/computeStatsGenerales.ts index a493150..c0a1e81 100644 --- a/src/statistiques/v2/generales/computeStatsGenerales.ts +++ b/src/statistiques/v2/generales/computeStatsGenerales.ts @@ -9,13 +9,13 @@ import { import { average } from "../../../utils/math/average"; import { median } from "../../../utils/math/median"; import { StatsGenerales } from "./StatsGenerales"; -import { countBy } from "lodash"; +import _, { countBy } from "lodash"; export function computeStatsGenerales(familles: Famille[]): StatsGenerales { const famillesResistantesOrEx = familles.filter( (f) => isResistant(f) || isExResistant(f) ); - const famillesresistantes = familles.filter((f) => isResistant(f)); + const famillesResistantes = familles.filter((f) => isResistant(f)); const dureesResistances = famillesResistantesOrEx.map( (f) => dureeResistanceInDays(f)! @@ -26,21 +26,30 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { isIntegration(f) && differenceInDays(now, f.DerniereModification) <= 30 ); const statsGenerales: StatsGenerales = { - nbFamillesResistantesActuelles: famillesresistantes.length, + nbFamillesResistantesActuelles: famillesResistantes.length, nbFamillesResistantesActuellesOuPassees: famillesResistantesOrEx.length, + + nbFamillesResistantesActuellesParDepartement: sortByKey( + countBy(famillesResistantes, (f) => f.Departement) + ), dureeResistanceMedianne: median(dureesResistances), dureeResistanceMoyenne: average(dureesResistances), - nbFamillesParContexteDEntree: countBy( - famillesResistantesOrEx, - (f) => f.ContexteEntree + nbFamillesParContexteDEntree: sortByKey( + countBy(famillesResistantesOrEx, (f) => f.ContexteEntree) ), nbFicheIntegrationActiviteRecente: fichesIntegrationRecementModifiees.length, - nbFicheIntegrationParStatuts: countBy( - familles.filter((f) => isIntegration(f)), - (f) => f.Statut + nbFicheIntegrationParStatuts: sortByKey( + countBy( + familles.filter((f) => isIntegration(f)), + (f) => f.Statut + ) ), }; return statsGenerales; } + +function sortByKey(record: Record): Record { + return _(record).toPairs().sortBy(0).fromPairs().value(); +}