diff --git a/src/components/ui-showcase/UIShowcaseClient.tsx b/src/components/ui-showcase/UIShowcaseClient.tsx index a913303..8c32d0d 100644 --- a/src/components/ui-showcase/UIShowcaseClient.tsx +++ b/src/components/ui-showcase/UIShowcaseClient.tsx @@ -64,6 +64,7 @@ export function UIShowcaseClient() { description: 'Migration vers les composants UI génériques', impact: 'high', completedAt: new Date(), + updatedAt: new Date(), tags: ['refactoring', 'ui'], todosCount: 8 }, @@ -73,6 +74,7 @@ export function UIShowcaseClient() { description: 'Ajout de 10 nouveaux thèmes avec CSS variables', impact: 'medium', completedAt: new Date(Date.now() - 86400000), + updatedAt: new Date(Date.now() - 86400000), tags: ['themes', 'css'], todosCount: 3 } diff --git a/src/components/ui/AchievementCard.tsx b/src/components/ui/AchievementCard.tsx index 3218e4c..e068378 100644 --- a/src/components/ui/AchievementCard.tsx +++ b/src/components/ui/AchievementCard.tsx @@ -12,6 +12,7 @@ export interface AchievementData { description?: string; impact: 'low' | 'medium' | 'high'; completedAt: Date; + updatedAt: Date; tags?: string[]; todosCount?: number; } @@ -46,9 +47,12 @@ export function AchievementCard({ - - {format(achievement.completedAt, 'dd/MM', { locale: fr })} - +
+
Terminé: {format(achievement.completedAt, 'dd/MM', { locale: fr })}
+ {achievement.updatedAt && achievement.updatedAt.getTime() !== achievement.completedAt.getTime() && ( +
Mis à jour: {format(achievement.updatedAt, 'dd/MM', { locale: fr })}
+ )} +
{/* Titre */} diff --git a/src/services/analytics/manager-summary.ts b/src/services/analytics/manager-summary.ts index c548121..ef03898 100644 --- a/src/services/analytics/manager-summary.ts +++ b/src/services/analytics/manager-summary.ts @@ -42,6 +42,7 @@ export interface KeyAccomplishment { tags: string[]; impact: 'high' | 'medium' | 'low'; completedAt: Date; + updatedAt: Date; relatedItems: string[]; // IDs des tâches/checkboxes liées todosCount: number; // Nombre de todos associés } @@ -261,6 +262,7 @@ export class ManagerSummaryService { tags: task.taskTags?.map(tt => tt.tag.name) || [], impact, completedAt: task.completedAt || task.updatedAt, + updatedAt: task.updatedAt, relatedItems: [task.id], todosCount: allRelatedTodos // Nombre total de todos associés à cette tâche }); @@ -283,6 +285,7 @@ export class ManagerSummaryService { tags: [], // Todos standalone n'ont pas de tags par défaut impact, completedAt: todo.date, + updatedAt: todo.date, // Pour les todos, updatedAt = completedAt relatedItems: [todo.id], todosCount: 1 // Un todo = 1 todo }); diff --git a/src/services/task-management/tasks.ts b/src/services/task-management/tasks.ts index 6397ab6..78be152 100644 --- a/src/services/task-management/tasks.ts +++ b/src/services/task-management/tasks.ts @@ -67,15 +67,18 @@ export class TasksService { tags?: string[]; dueDate?: Date; }): Promise { + const status = taskData.status || 'todo'; const task = await prisma.task.create({ data: { title: taskData.title, description: taskData.description, - status: taskData.status || 'todo', + status: status, priority: taskData.priority || 'medium', dueDate: taskData.dueDate, source: 'manual', // Source manuelle - sourceId: `manual-${Date.now()}` // ID unique + sourceId: `manual-${Date.now()}`, // ID unique + // Si créée directement en done/archived, définir completedAt + completedAt: (status === 'done' || status === 'archived') ? getToday() : null }, include: { taskTags: { @@ -135,12 +138,16 @@ export class TasksService { updatedAt: getToday() }; - - if (updates.status === 'done' && !task.completedAt) { + // Logique pour completedAt : date de résolution définitive + if (updates.status === 'done') { + // Première fois qu'on marque comme done -> définir completedAt + updateData.completedAt = getToday(); + } else if (updates.status === 'archived' && !task.completedAt) { + // Première fois qu'on archive -> définir completedAt (archiver = résoudre) updateData.completedAt = getToday(); - } else if (updates.status && updates.status !== 'done' && task.completedAt) { - updateData.completedAt = null; } + // Si elle était déjà done/archived et qu'on change le statut, + // on garde la completedAt existante (ne jamais l'effacer) await prisma.task.update({ where: { id: taskId },