diff --git a/src/components/ui/AchievementCard.tsx b/src/components/ui/AchievementCard.tsx index 6396b0b..3218e4c 100644 --- a/src/components/ui/AchievementCard.tsx +++ b/src/components/ui/AchievementCard.tsx @@ -76,7 +76,7 @@ export function AchievementCard({ )} {/* Count de todos */} - {achievement.todosCount && achievement.todosCount > 0 && ( + {achievement.todosCount !== undefined && achievement.todosCount > 0 && (
📋 {achievement.todosCount} todo{achievement.todosCount > 1 ? 's' : ''} diff --git a/src/components/ui/ChallengeCard.tsx b/src/components/ui/ChallengeCard.tsx index 36ac006..6b6b312 100644 --- a/src/components/ui/ChallengeCard.tsx +++ b/src/components/ui/ChallengeCard.tsx @@ -79,7 +79,7 @@ export function ChallengeCard({ )} {/* Count de todos */} - {challenge.todosCount && challenge.todosCount > 0 && ( + {challenge.todosCount !== undefined && challenge.todosCount > 0 && (
📋 {challenge.todosCount} todo{challenge.todosCount > 1 ? 's' : ''} diff --git a/src/services/analytics/manager-summary.ts b/src/services/analytics/manager-summary.ts index c7dd154..0d72d3f 100644 --- a/src/services/analytics/manager-summary.ts +++ b/src/services/analytics/manager-summary.ts @@ -97,7 +97,7 @@ export class ManagerSummaryService { ]); // Analyser et extraire les accomplissements clés - const keyAccomplishments = this.extractKeyAccomplishments(tasks, checkboxes); + const keyAccomplishments = await this.extractKeyAccomplishments(tasks, checkboxes); // Identifier les défis à venir const upcomingChallenges = await this.identifyUpcomingChallenges(); @@ -221,11 +221,11 @@ export class ManagerSummaryService { /** * Extrait les accomplissements clés basés sur la priorité */ - private static extractKeyAccomplishments(tasks: TaskType[], checkboxes: CheckboxType[]): KeyAccomplishment[] { + private static async extractKeyAccomplishments(tasks: TaskType[], checkboxes: CheckboxType[]): Promise { const accomplishments: KeyAccomplishment[] = []; // Tâches: prendre toutes les high/medium priority, et quelques low si significatives - tasks.forEach(task => { + for (const task of tasks) { const priority = task.priority.toLowerCase(); // Convertir priorité task en impact accomplissement @@ -237,13 +237,20 @@ export class ManagerSummaryService { } else { // Pour les low priority, ne garder que si c'est vraiment significatif if (!this.isSignificantTask(task.title)) { - return; + continue; } impact = 'low'; } - // Compter les todos (checkboxes) associés à cette tâche - const relatedTodos = checkboxes.filter(cb => cb.task?.id === task.id); + // Compter TOUS les todos associés à cette tâche (pas seulement ceux de la période) + // car l'accomplissement c'est la tâche complétée, pas seulement les todos de la période + const allRelatedTodos = await prisma.dailyCheckbox.count({ + where: { + task: { + id: task.id + } + } + }); accomplishments.push({ id: `task-${task.id}`, @@ -252,12 +259,13 @@ export class ManagerSummaryService { tags: task.taskTags?.map(tt => tt.tag.name) || [], impact, completedAt: task.completedAt || getToday(), - relatedItems: [task.id, ...relatedTodos.map(t => t.id)], - todosCount: relatedTodos.length // Nombre réel de todos associés + relatedItems: [task.id], + todosCount: allRelatedTodos // Nombre total de todos associés à cette tâche }); - }); + } // AJOUTER les todos standalone avec la nouvelle règle de priorité + // Exclure les todos déjà comptés dans les tâches complétées const standaloneTodos = checkboxes.filter(checkbox => !checkbox.task // Todos non liés à une tâche ); @@ -394,6 +402,9 @@ export class ManagerSummaryService { const estimatedEffort = this.estimateEffort(task.title, task.description || undefined); + // Compter les todos associés à cette tâche + const relatedTodos = upcomingCheckboxes.filter(cb => cb.task?.id === task.id); + challenges.push({ id: `task-${task.id}`, title: task.title, @@ -402,8 +413,8 @@ export class ManagerSummaryService { priority, estimatedEffort, blockers: this.identifyBlockers(task.title, task.description || undefined), - relatedItems: [task.id], - todosCount: 0 // TODO: compter les todos associés à cette tâche + relatedItems: [task.id, ...relatedTodos.map(t => t.id)], + todosCount: relatedTodos.length // Nombre réel de todos associés }); });