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));
}
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) {

View File

@@ -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 };
}),