diff --git a/src/data/Famille.ts b/src/data/Famille.ts index 4a5eff3..efb3874 100644 --- a/src/data/Famille.ts +++ b/src/data/Famille.ts @@ -15,6 +15,7 @@ export type Famille = Readonly<{ Sortie: Date | null; // sorted by date asc Evenements: EvenementFamille[]; + DerniereModification: Date; }>; export function periodOfResistance( @@ -42,6 +43,16 @@ export function isResistant( return por !== null && isPeriodContaining(por, date); } +export function isIntegration(famille: Famille) { + return ( + famille.Statut === "Se questionne" || + famille.Statut === "Déclaration validée - Attente éléments" || + famille.Statut === "Rédaction Déclaration" || + famille.Statut === "Désobéissance décidée" || + famille.Statut === "À préciser" + ); +} + export function isExResistant( family: Famille, date: Date = new Date(Date.now()) diff --git a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts index 2c51acf..9555955 100644 --- a/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts +++ b/src/notion/fetch/fetchFamiliesWithEventsFromNotion.ts @@ -100,6 +100,10 @@ function buildFamily( Integration: datePropertyToDate(pageProperties, "Intégration"), Sortie: datePropertyToDate(pageProperties, "Sortie"), Evenements: familyEvents.filter((fe) => fe.notionIdFamille === page.id), + DerniereModification: datePropertyToDate( + pageProperties, + "Dernière modification" + )!, }; return family; } diff --git a/src/notion/utils/properties/datePropertyToDate.ts b/src/notion/utils/properties/datePropertyToDate.ts index 4b10505..16ec510 100644 --- a/src/notion/utils/properties/datePropertyToDate.ts +++ b/src/notion/utils/properties/datePropertyToDate.ts @@ -6,13 +6,19 @@ export function datePropertyToDate( propName: string ): Date | null { const propValue = extractPagePropertyValue(pageProperties, propName); - if (propValue.type !== "date") { + if (propValue.type === "date") { + if (propValue.date === null) { + return null; + } + return new Date(Date.parse(propValue.date.start)); + } else if (propValue.type === "last_edited_time") { + if (propValue.last_edited_time === null) { + return null; + } + return new Date(Date.parse(propValue.last_edited_time)); + } else { throw new Error( - `Property ${propName} was expected to have type "date" but got "${propValue.type}".` + `Property ${propName} was expected to have type "date" or "last_edited_time" but got "${propValue.type}".` ); } - if (propValue.date === null) { - return null; - } - return new Date(Date.parse(propValue.date.start)); } diff --git a/src/statistiques/v2/generales/StatsGenerales.ts b/src/statistiques/v2/generales/StatsGenerales.ts index deddbbe..3e5e038 100644 --- a/src/statistiques/v2/generales/StatsGenerales.ts +++ b/src/statistiques/v2/generales/StatsGenerales.ts @@ -3,34 +3,34 @@ import { StatsType } from "../StatsDesc"; export const statsGeneralesDesc = { label: "Stats Générales", stats: { - nbFamillesActuellementResistantes: { - label: "Nb Familles actuellement Résistantes", + nbFamillesResistantesActuelles: { + label: "Nb Familles Résistantes actuelles", }, - nbFamillesResistantesDepuisLeDebut: { - label: "Nb Familles Résistantes depuis le début du mouvement", + nbFamillesResistantesActuellesOuPassees: { + label: "Nb Familles Résistantes actuelles ou passées", }, dureeResistanceMoyenne: { - label: "Duree de résistantes moyenne", + label: "Durée moyenne de résistance", unit: " jours", }, dureeResistanceMedianne: { - label: "Duree de résistantes médiane", + label: "Durée médiane de résistance", unit: " jours", }, contexteEntree: { - label: "Context d'entrée des familles", + label: "Contexte d'entrée des familles", stats: { pasDeDemandePleinDroit: { - label: "Nb Familles Pas de demande (Plein droit)", + label: "Pas de demande (Plein droit)", }, pasDeDemande: { - label: "Nb Familles Pas de demande", + label: "Pas de demande", }, apresRefus: { - label: "Nb Familles Après refus - NbFamilles", + label: "Après refus", }, apresMiseEnDemeure: { - label: "Nb Familles Après mise en demeure", + label: "Après mise en demeure", }, apresPoursuiteProcureur: { @@ -38,6 +38,9 @@ export const statsGeneralesDesc = { }, }, }, + nbFicheIntegrationActiviteRecente: { + label: "Nb fiche d'intégration avec une activité < 30j", + }, }, } as const; diff --git a/src/statistiques/v2/generales/computeStatsGenerales.ts b/src/statistiques/v2/generales/computeStatsGenerales.ts index a49430e..c047306 100644 --- a/src/statistiques/v2/generales/computeStatsGenerales.ts +++ b/src/statistiques/v2/generales/computeStatsGenerales.ts @@ -1,7 +1,9 @@ +import { differenceInDays } from "date-fns"; import { dureeResistanceInDays, Famille, isExResistant, + isIntegration, isResistant, } from "../../../data/Famille"; import { average } from "../../../utils/math/average"; @@ -15,12 +17,18 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { const dureesResistances = famillesResistantesOrEx.map( (f) => dureeResistanceInDays(f)! ); + const now = new Date(); + const fichesIntegrationRecementModifiees = familles.filter( + (f) => + isIntegration(f) && differenceInDays(now, f.DerniereModification) <= 30 + ); const statsGenerales: StatsGenerales = { - nbFamillesActuellementResistantes: familles.filter((f) => isResistant(f)) + nbFamillesResistantesActuelles: familles.filter((f) => isResistant(f)) .length, - nbFamillesResistantesDepuisLeDebut: famillesResistantesOrEx.length, + nbFamillesResistantesActuellesOuPassees: famillesResistantesOrEx.length, dureeResistanceMedianne: median(dureesResistances), dureeResistanceMoyenne: average(dureesResistances), + contexteEntree: { pasDeDemandePleinDroit: famillesResistantesOrEx.filter( (f) => f.ContexteEntree === "Pas de demande (Plein droit)" @@ -38,6 +46,8 @@ export function computeStatsGenerales(familles: Famille[]): StatsGenerales { (f) => f.ContexteEntree === "Après poursuite procureur" ).length, }, + nbFicheIntegrationActiviteRecente: + fichesIntegrationRecementModifiees.length, }; return statsGenerales; }