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:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user