Feat: Ajout stats athlètes

This commit is contained in:
Amaël Kesteman
2026-01-08 11:22:04 +01:00
parent 0a5d7bccd5
commit fa70da8f25
4 changed files with 120 additions and 18 deletions

View File

@@ -0,0 +1,46 @@
import { Athlete, Session } from '../classes';
export interface StatsAthlete {
nbSessions: number;
nbSessionsPerWeek: number;
isAlerte: boolean;
distributions: Map<string, number>; //le nom de l'activité et son nombre
}
export function niveauAlerte(stats: StatsAthlete, seuilCritique = 0, seuilMax = 0) {
if (stats.nbSessionsPerWeek > seuilMax) return "Alerte ! Niveau maximal atteint.";
if (stats.nbSessionsPerWeek > seuilCritique) return "Attention! Niveau critique atteint.";
return "Normal";
}
export function calculStatsAthlete(sessions: Session[], athlete: Athlete, debut: Date, fin: Date): StatsAthlete {
let nb_sessions = 0;
let nb_semaine = 1; //forcément une semaine
const distributions: Map<string, number> = new Map();
const timeDiff = Math.abs(fin.getTime() - debut.getTime());
nb_semaine = Math.ceil(timeDiff / (1000 * 3600 * 24 * 7));
sessions.forEach(session => {
// verification session dans l'intervalle
if (session.creneau < debut || session.creneau > fin) return;
// verification athlete dans session
if (!session.athletes.some(a => a.id === athlete.id)) return;
//incrementation (verifie si recurent ou non)
const increment = session.isRecurrent ? nb_semaine : 1;
nb_sessions += increment;
}
);
const nbSessionsPerWeek = nb_sessions / nb_semaine;
const isAlerte = nbSessionsPerWeek > 8;
return {
nbSessions: nb_sessions,
nbSessionsPerWeek: nbSessionsPerWeek,
isAlerte: isAlerte,
distributions: distributions
};
}