feat: update dashboard components and analytics for 7-day summaries

- Modified `ManagerWeeklySummary`, `MetricsTab`, and `ProductivityAnalytics` to reflect a focus on the last 7 days instead of the current week.
- Enhanced `ManagerSummaryService` and `MetricsService` to calculate metrics over a sliding 7-day window, improving data relevance.
- Added a new utility function `formatDistanceToNow` for better date formatting in French.
- Updated comments and documentation to clarify changes in timeframes.
This commit is contained in:
Julien Froidefond
2025-09-23 21:22:59 +02:00
parent 336b5c1006
commit fd3827214f
14 changed files with 738 additions and 32 deletions

View File

@@ -13,6 +13,8 @@ export interface ProductivityMetrics {
week: string;
completed: number;
average: number;
weekNumber?: number;
weekStart?: Date;
}>;
priorityDistribution: Array<{
priority: string;
@@ -137,35 +139,41 @@ export class AnalyticsService {
* Calcule la vélocité (tâches terminées par semaine)
*/
private static calculateVelocity(tasks: Task[], start: Date, end: Date) {
const weeklyData: Array<{ week: string; completed: number; average: number }> = [];
const weeklyData: Array<{ week: string; completed: number; average: number; weekNumber: number; weekStart: Date }> = [];
const completedTasks = tasks.filter(task => task.completedAt);
// Grouper par semaine
const weekGroups = new Map<string, number>();
// Grouper par semaine en utilisant le numéro de semaine comme clé
const weekGroups = new Map<number, { count: number; weekStart: Date }>();
completedTasks.forEach(task => {
if (task.completedAt && task.completedAt >= start && task.completedAt <= end) {
const weekStart = this.getWeekStart(task.completedAt);
const weekKey = weekStart.toISOString().split('T')[0];
weekGroups.set(weekKey, (weekGroups.get(weekKey) || 0) + 1);
const weekNumber = this.getWeekNumber(weekStart);
if (!weekGroups.has(weekNumber)) {
weekGroups.set(weekNumber, { count: 0, weekStart });
}
weekGroups.get(weekNumber)!.count++;
}
});
// Calculer la moyenne mobile
const values = Array.from(weekGroups.values());
const values = Array.from(weekGroups.values()).map(w => w.count);
const average = values.length > 0 ? values.reduce((a, b) => a + b, 0) / values.length : 0;
// Convertir en format pour le graphique
weekGroups.forEach((count, weekKey) => {
const weekDate = parseDate(weekKey);
weekGroups.forEach((data, weekNumber) => {
weeklyData.push({
week: `Sem. ${this.getWeekNumber(weekDate)}`,
completed: count,
average: Math.round(average * 10) / 10
week: `Sem. ${weekNumber}`,
completed: data.count,
average: Math.round(average * 10) / 10,
weekNumber,
weekStart: data.weekStart
});
});
return weeklyData.sort((a, b) => a.week.localeCompare(b.week));
// Trier par numéro de semaine (pas alphabétiquement)
return weeklyData.sort((a, b) => a.weekNumber - b.weekNumber);
}
/**