diff --git a/server/dateUtils.ts b/server/dateUtils.ts index 26661df..6f1c294 100644 --- a/server/dateUtils.ts +++ b/server/dateUtils.ts @@ -4,11 +4,11 @@ */ /** - * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en chaîne MySQL - * Format de sortie: "YYYY-MM-DD HH:mm:ss" - * Préserve l'heure locale sans aucune conversion UTC + * Convertit une chaîne datetime-local (format: "2025-01-15T14:30") en Date + * en construisant la date avec une chaîne ISO qui force l'heure locale + * Préserve l'heure locale sans conversion UTC */ -export function parseLocalDateTime(dateTimeString: string): string { +export function parseLocalDateTime(dateTimeString: string): Date { if (!dateTimeString) { throw new Error('Date string is required'); } @@ -22,9 +22,27 @@ export function parseLocalDateTime(dateTimeString: string): string { const [, year, month, day, hours, minutes] = match; - // Retourner directement au format MySQL sans passer par un objet Date - // Cela évite toute conversion de fuseau horaire - return `${year}-${month}-${day} ${hours}:${minutes}:00`; + // Créer un objet Date en utilisant le constructeur avec composants + // MySQL stocke en UTC, donc on doit compenser le décalage horaire + const date = new Date( + parseInt(year), + parseInt(month) - 1, + parseInt(day), + parseInt(hours), + parseInt(minutes), + 0 + ); + + // Compenser le décalage UTC en ajoutant le décalage du fuseau horaire + // Cela garantit que l'heure stockée en UTC correspond à l'heure locale saisie + const offset = date.getTimezoneOffset(); // en minutes (négatif pour Europe/Paris) + date.setMinutes(date.getMinutes() - offset); + + if (isNaN(date.getTime())) { + throw new Error(`Invalid date string: ${dateTimeString}`); + } + + return date; } /** diff --git a/server/db.ts b/server/db.ts index 938bb22..2894292 100644 --- a/server/db.ts +++ b/server/db.ts @@ -26,13 +26,7 @@ let _db: ReturnType | null = null; export async function getDb() { if (!_db && process.env.DATABASE_URL) { try { - // Ajouter le fuseau horaire Europe/Paris dans l'URL de connexion - let connectionUrl = process.env.DATABASE_URL; - if (!connectionUrl.includes('timezone=')) { - const separator = connectionUrl.includes('?') ? '&' : '?'; - connectionUrl += `${separator}timezone=%2B01:00`; // +01:00 URL encoded - } - _db = drizzle(connectionUrl); + _db = drizzle(process.env.DATABASE_URL); } catch (error) { console.warn("[Database] Failed to connect:", error); _db = null; diff --git a/server/routers.ts b/server/routers.ts index 6761ff2..eb15e31 100644 --- a/server/routers.ts +++ b/server/routers.ts @@ -168,7 +168,7 @@ export const appRouter = router({ // Créer la séquence const result = await db.createSequence({ ...sequenceData, - dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }); // Récupérer l'ID de la séquence créée @@ -178,8 +178,8 @@ export const appRouter = router({ for (const date of dates) { await db.createDateFormation({ sequenceId, - dateDebut: parseLocalDateTime(date.dateDebut) as any, - dateFin: parseLocalDateTime(date.dateFin) as any, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } @@ -208,7 +208,7 @@ export const appRouter = router({ // Mettre à jour la séquence const updateData: any = { ...sequenceData, - dateBlocage: parseLocalDateTime(sequenceData.dateBlocage) as any, + dateBlocage: parseLocalDateTime(sequenceData.dateBlocage), }; console.log('[UPDATE SEQUENCE] UpdateData:', JSON.stringify(updateData, null, 2)); @@ -224,8 +224,8 @@ export const appRouter = router({ console.log('[UPDATE SEQUENCE] Création date:', date); await db.createDateFormation({ sequenceId: id, - dateDebut: parseLocalDateTime(date.dateDebut) as any, - dateFin: parseLocalDateTime(date.dateFin) as any, + dateDebut: parseLocalDateTime(date.dateDebut), + dateFin: parseLocalDateTime(date.dateFin), ordre: date.ordre, }); } diff --git a/todo.md b/todo.md index 04593f6..3da69e3 100644 --- a/todo.md +++ b/todo.md @@ -115,3 +115,5 @@ - [x] Forcer le fuseau horaire Europe/Paris dans la connexion MySQL pour éliminer le décalage d'une heure - [x] Corriger le décalage horaire persistant dans parseLocalDateTime (09:48 envoyé devient 10:48 en base) + +- [x] Corriger l'erreur "toISOString is not a function" lors de la modification de séquences