From 6761044f4ada0a31c37bc76306e1525a54809232 Mon Sep 17 00:00:00 2001 From: Manus Date: Wed, 11 Feb 2026 08:07:04 -0500 Subject: [PATCH] =?UTF-8?q?Checkpoint:=20Correction=20critique=20:=20pr?= =?UTF-8?q?=C3=A9servation=20des=20signatures=20lors=20de=20l'ajout/modifi?= =?UTF-8?q?cation=20de=20dates=20dans=20une=20s=C3=A9quence=20-=20Remplace?= =?UTF-8?q?ment=20de=20la=20logique=20de=20suppression/recr=C3=A9ation=20p?= =?UTF-8?q?ar=20une=20mise=20=C3=A0=20jour=20intelligente?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/db.ts | 16 ++++++++++++ server/routers.ts | 63 +++++++++++++++++++++++++++++------------------ todo.md | 9 +++++++ 3 files changed, 64 insertions(+), 24 deletions(-) diff --git a/server/db.ts b/server/db.ts index add21bb..cfbe2cc 100644 --- a/server/db.ts +++ b/server/db.ts @@ -329,6 +329,22 @@ export async function deleteDatesBySequence(sequenceId: number) { await db.delete(datesFormation).where(eq(datesFormation.sequenceId, sequenceId)); } +export async function updateDateFormation(id: number, data: Partial) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.update(datesFormation) + .set(data) + .where(eq(datesFormation.id, id)); +} + +export async function deleteDateFormation(id: number) { + const db = await getDb(); + if (!db) throw new Error("Database not available"); + + await db.delete(datesFormation).where(eq(datesFormation.id, id)); +} + // ==================== APPRENANTS ==================== export async function createApprenant(data: InsertApprenant) { diff --git a/server/routers.ts b/server/routers.ts index 39a5bcb..805af60 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -544,28 +544,36 @@ export const appRouter = router({ const existingDates = await db.getDatesBySequence(id); console.log('[UPDATE SEQUENCE] Dates existantes:', existingDates.length); - // Comparer les dates pour détecter les changements - const datesChanged = existingDates.length !== dates.length || - existingDates.some((existing, index) => { - const newDate = dates[index]; - if (!newDate) return true; - const existingDebut = new Date(existing.dateDebut).toISOString(); - const existingFin = new Date(existing.dateFin).toISOString(); - const newDebut = parseLocalDateTime(newDate.dateDebut).toISOString(); - const newFin = parseLocalDateTime(newDate.dateFin).toISOString(); - return existingDebut !== newDebut || existingFin !== newFin; - }); + // Créer un map des dates existantes par ID + const existingDatesMap = new Map(existingDates.map(d => [d.id, d])); - // Ne supprimer/recréer les dates que si elles ont changé - if (datesChanged) { - console.log('[UPDATE SEQUENCE] Dates modifiées, suppression et recréation'); - // Supprimer les anciennes dates - await db.deleteDatesBySequence(id); - console.log('[UPDATE SEQUENCE] Anciennes dates supprimées'); - - // Créer les nouvelles dates - for (const date of dates) { - console.log('[UPDATE SEQUENCE] Création date:', date); + // Créer un Set des IDs de dates à conserver + const datesToKeep = new Set(); + + // Traiter chaque date de la nouvelle liste + for (const date of dates) { + if (date.id && existingDatesMap.has(date.id)) { + // Date existante : mettre à jour si nécessaire + const existing = existingDatesMap.get(date.id)!; + const newDebut = parseLocalDateTime(date.dateDebut); + const newFin = parseLocalDateTime(date.dateFin); + + const debutChanged = new Date(existing.dateDebut).getTime() !== newDebut.getTime(); + const finChanged = new Date(existing.dateFin).getTime() !== newFin.getTime(); + const ordreChanged = existing.ordre !== date.ordre; + + if (debutChanged || finChanged || ordreChanged) { + console.log('[UPDATE SEQUENCE] Mise à jour date ID:', date.id); + await db.updateDateFormation(date.id, { + dateDebut: newDebut, + dateFin: newFin, + ordre: date.ordre, + }); + } + datesToKeep.add(date.id); + } else { + // Nouvelle date : créer + console.log('[UPDATE SEQUENCE] Création nouvelle date:', date); await db.createDateFormation({ sequenceId: id, dateDebut: parseLocalDateTime(date.dateDebut), @@ -573,11 +581,18 @@ export const appRouter = router({ ordre: date.ordre, }); } - console.log('[UPDATE SEQUENCE] Toutes les dates ont été créées'); - } else { - console.log('[UPDATE SEQUENCE] Dates inchangées, conservation des rappels'); } + // Supprimer les dates qui ne sont plus dans la liste + for (const existing of existingDates) { + if (!datesToKeep.has(existing.id)) { + console.log('[UPDATE SEQUENCE] Suppression date ID:', existing.id); + await db.deleteDateFormation(existing.id); + } + } + + console.log('[UPDATE SEQUENCE] Gestion des dates terminée'); + return { success: true }; }), diff --git a/todo.md b/todo.md index 67a18b6..afd1ba2 100644 --- a/todo.md +++ b/todo.md @@ -1604,3 +1604,12 @@ - [x] Déployer sur production - [ ] Tester la validation formateur (doit fonctionner sans fetch failed) - [ ] Vérifier que la signature est bien enregistrée localement + +## CRITIQUE - Perte de signatures lors de l'ajout d'une date dans une séquence + +- [x] Analyser le code qui gère l'ajout de dates dans une séquence (procédure sequences.update) +- [x] Identifier pourquoi les signatures des dates précédentes sont supprimées (suppression en cascade via deleteDatesBySequence) +- [x] Vérifier si c'est un problème de suppression en cascade ou de réinitialisation (confirmé : suppression en cascade) +- [x] Corriger le bug pour préserver toutes les signatures existantes (logique de mise à jour intelligente) +- [x] Déployer sur le VPS de TEST (108.143.67.56) +- [ ] Tester en ajoutant une nouvelle date et vérifier que les signatures précédentes sont toujours présentes