Feat: Ajout stats athlètes
This commit is contained in:
46
front_end/src/utils/athleteUtils.tsx
Normal file
46
front_end/src/utils/athleteUtils.tsx
Normal 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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user