diff --git a/src/data/Contact.ts b/src/data/Contact.ts index 1e8065e..f96cf07 100644 --- a/src/data/Contact.ts +++ b/src/data/Contact.ts @@ -3,5 +3,7 @@ import { Mission } from "./Mission"; export type Contact = { notionId: string; notionIdFamille: string; + Nom: string; Missions: Mission[]; + AExercéUneMission: boolean; }; diff --git a/src/data/Famille.ts b/src/data/Famille.ts index 7fb3c3d..8a50a73 100644 --- a/src/data/Famille.ts +++ b/src/data/Famille.ts @@ -12,6 +12,7 @@ import { import { StatutSocial } from "./StatutSocial"; import { StatutPenal } from "./StatutPenal"; import { Mission } from "./Mission"; +import { Contact } from "./Contact"; export type Famille = Readonly<{ notionId: string; @@ -36,6 +37,7 @@ export type Famille = Readonly<{ DerniereModification: Date; Missions: Mission[]; + Contacts: Contact[]; }>; export function periodOfResistance( diff --git a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts index ccd66e4..abbd968 100644 --- a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts +++ b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts @@ -30,6 +30,7 @@ import { StatutSocial } from "../../data/StatutSocial"; import { Contact } from "../../data/Contact"; import { Mission } from "../../data/Mission"; import { relationPropertyToPageIds } from "../utils/properties/relationPropertyToPageIds"; +import { checkboxPropertyToBoolean } from "../utils/properties/checkboxPropertyToBoolean"; type Departement = { notionId: string; @@ -106,8 +107,12 @@ export async function fetchFamiliesWithEventsFromNotion( const contacts: Contact[] = contactPages.map((page) => ({ notionId: page.id, - name: titlePropertyToText(page.properties, "Nom"), notionIdFamille: relationPropertyToPageId(page.properties, "Famille")!, + Nom: titlePropertyToText(page.properties, "Nom"), + AExercéUneMission: checkboxPropertyToBoolean( + page.properties, + "A exercé une mission" + ), Missions: missions.filter((m) => m.ContactsNotionIds.includes(page.id)), })); @@ -183,6 +188,7 @@ function buildFamily( Missions: contacts .filter((c) => c.notionIdFamille === page.id) .flatMap((c) => c.Missions), + Contacts: contacts.filter((c) => c.notionIdFamille === page.id), }; return family; } diff --git a/src/notion/utils/properties/checkboxPropertyToBoolean.ts b/src/notion/utils/properties/checkboxPropertyToBoolean.ts new file mode 100644 index 0000000..30ac4b1 --- /dev/null +++ b/src/notion/utils/properties/checkboxPropertyToBoolean.ts @@ -0,0 +1,15 @@ +import { PageProperties } from "../types/PageProperties"; +import { extractPagePropertyValue } from "./extractPagePropertyValue"; + +export function checkboxPropertyToBoolean( + pageProperties: PageProperties, + propName: string +): boolean { + const propValue = extractPagePropertyValue(pageProperties, propName); + if (propValue.type !== "checkbox") { + throw new Error( + `Property ${propName} was expected to have type "checkbox" but got "${propValue.type}".` + ); + } + return propValue.checkbox; +} diff --git a/src/statistiques/v2/generales/StatsGenerales.ts b/src/statistiques/v2/generales/StatsGenerales.ts index 59ab345..fd70623 100644 --- a/src/statistiques/v2/generales/StatsGenerales.ts +++ b/src/statistiques/v2/generales/StatsGenerales.ts @@ -44,6 +44,15 @@ export const statsGeneralesDesc = { nbFamillesResistantesAssumantDesMissionsEL: { label: "Nb familles résistantes assumant des missions EL", }, + nbFamillesResistantesAyantAssumeDesMissionsEL: { + label: "Nb familles résistantes ayant assumé des missions EL", + }, + nbResistantsAssumantDesMissionsEL: { + label: "Nb résistant.e.s assumant des missions EL", + }, + nbResistantsAyantAssumeDesMissionsEL: { + label: "Nb résistant.e.s ayant assumé des missions EL", + }, }, } as const; diff --git a/src/statistiques/v2/generales/computeStatsGenerales.ts b/src/statistiques/v2/generales/computeStatsGenerales.ts index 71ae4dd..60b150c 100644 --- a/src/statistiques/v2/generales/computeStatsGenerales.ts +++ b/src/statistiques/v2/generales/computeStatsGenerales.ts @@ -28,6 +28,18 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { const famillesResistantesAssumantDesMissionsEL = famillesResistantes.filter( (f) => f.Missions.length > 0 ); + const famillesResistantesAyantAssumeDesMissionsEL = + famillesResistantes.filter( + (f) => + f.Missions.length === 0 && + f.Contacts.filter((c) => c.AExercéUneMission).length > 0 + ); + const resistantesAssumantDesMissionsEL = famillesResistantes + .flatMap((f) => f.Contacts) + .filter((c) => c.Missions.length > 0); + const resistantesAyantAssumeDesMissionsEL = famillesResistantes + .flatMap((f) => f.Contacts) + .filter((c) => c.Missions.length === 0 && c.AExercéUneMission === true); const statsGenerales: StatsGenerales = { nbFamillesResistantesActuelles: nbFamillesAvecPagesLiees(famillesResistantes), @@ -55,6 +67,11 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { nbFicheFamillesParStatut: sortByKey(countBy(familles, (f) => f.Statut)), nbFamillesResistantesAssumantDesMissionsEL: famillesResistantesAssumantDesMissionsEL.length, + nbFamillesResistantesAyantAssumeDesMissionsEL: + famillesResistantesAyantAssumeDesMissionsEL.length, + nbResistantsAssumantDesMissionsEL: resistantesAssumantDesMissionsEL.length, + nbResistantsAyantAssumeDesMissionsEL: + resistantesAyantAssumeDesMissionsEL.length, }; return statsGenerales; }