Checkpoint: Correction critique : préservation des signatures lors de l'ajout/modification de dates dans une séquence - Remplacement de la logique de suppression/recréation par une mise à jour intelligente

This commit is contained in:
Manus
2026-02-11 08:07:04 -05:00
parent 2b01c4ba6c
commit 6761044f4a
3 changed files with 64 additions and 24 deletions

View File

@@ -329,6 +329,22 @@ export async function deleteDatesBySequence(sequenceId: number) {
await db.delete(datesFormation).where(eq(datesFormation.sequenceId, sequenceId)); await db.delete(datesFormation).where(eq(datesFormation.sequenceId, sequenceId));
} }
export async function updateDateFormation(id: number, data: Partial<InsertDateFormation>) {
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 ==================== // ==================== APPRENANTS ====================
export async function createApprenant(data: InsertApprenant) { export async function createApprenant(data: InsertApprenant) {

View File

@@ -544,28 +544,36 @@ export const appRouter = router({
const existingDates = await db.getDatesBySequence(id); const existingDates = await db.getDatesBySequence(id);
console.log('[UPDATE SEQUENCE] Dates existantes:', existingDates.length); console.log('[UPDATE SEQUENCE] Dates existantes:', existingDates.length);
// Comparer les dates pour détecter les changements // Créer un map des dates existantes par ID
const datesChanged = existingDates.length !== dates.length || const existingDatesMap = new Map(existingDates.map(d => [d.id, d]));
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;
});
// Ne supprimer/recréer les dates que si elles ont changé // Créer un Set des IDs de dates à conserver
if (datesChanged) { const datesToKeep = new Set<number>();
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 // Traiter chaque date de la nouvelle liste
for (const date of dates) { for (const date of dates) {
console.log('[UPDATE SEQUENCE] Création date:', date); 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({ await db.createDateFormation({
sequenceId: id, sequenceId: id,
dateDebut: parseLocalDateTime(date.dateDebut), dateDebut: parseLocalDateTime(date.dateDebut),
@@ -573,11 +581,18 @@ export const appRouter = router({
ordre: date.ordre, 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 }; return { success: true };
}), }),

View File

@@ -1604,3 +1604,12 @@
- [x] Déployer sur production - [x] Déployer sur production
- [ ] Tester la validation formateur (doit fonctionner sans fetch failed) - [ ] Tester la validation formateur (doit fonctionner sans fetch failed)
- [ ] Vérifier que la signature est bien enregistrée localement - [ ] 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