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:
16
server/db.ts
16
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<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 ====================
|
||||
|
||||
export async function createApprenant(data: InsertApprenant) {
|
||||
|
||||
@@ -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<number>();
|
||||
|
||||
// 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 };
|
||||
}),
|
||||
|
||||
|
||||
9
todo.md
9
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
|
||||
|
||||
Reference in New Issue
Block a user