# 🔧 FIX TIMEZONE CALENDRIER - PROCÉDURE COMPLÈTE ## ⚠ IMPORTANT: Cette procĂ©dure doit ĂȘtre suivie EXACTEMENT Le dĂ©calage horaire persiste car le changement du parser PostgreSQL nĂ©cessite: 1. **REBUILD** de l'image Docker (pas juste restart!) 2. **SUPPRESSION** des Ă©vĂ©nements synchronisĂ©s avant le fix 3. **RESYNCHRONISATION** avec Google Calendar --- ## 📋 ÉTAPE PAR ÉTAPE (À FAIRE DANS L'ORDRE!) ### ÉTAPE 1: Diagnostic initial (optionnel mais recommandĂ©) ```bash docker exec notes-todo-app node scripts/full-diagnosis-timezone.js ``` **Ce script montre:** - Si le parser fonctionne (dates = strings ou objets Date) - Comment PostgreSQL stocke les dates - Comment l'API renvoie les dates - OĂč se situe exactement le problĂšme **Si le diagnostic dit "Le driver pg renvoie toujours des objets Date":** → Le parser n'est PAS actif → Rebuild obligatoire **Si le diagnostic dit "Le parser fonctionne!":** → Les anciennes donnĂ©es sont corrompues → Suppression + resync --- ### ÉTAPE 2: REBUILD COMPLET (OBLIGATOIRE!) ```bash # ArrĂȘter les containers docker-compose down # Rebuild l'image notes-app docker-compose build --no-cache notes-app # RedĂ©marrer tout docker-compose up -d ``` **⏱ DurĂ©e: 2-3 minutes** **Attendez que le serveur soit complĂštement dĂ©marrĂ©:** ```bash docker-compose logs -f notes-app ``` Attendez de voir: ``` ✓ Serveur NoteFlow dĂ©marrĂ© sur le port 2222 ``` Puis appuyez sur **Ctrl+C** --- ### ÉTAPE 3: Suppression des Ă©vĂ©nements corrompus ```bash docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 -c "DELETE FROM calendar_events" ``` **RĂ©sultat attendu:** ``` DELETE 15 ``` (ou le nombre d'Ă©vĂ©nements que vous aviez) **⚠ C'est normal!** Les Ă©vĂ©nements seront resynchronisĂ©s Ă  l'Ă©tape suivante. --- ### ÉTAPE 4: VĂ©rification du parser ```bash docker exec notes-todo-app node scripts/full-diagnosis-timezone.js ``` **Vous devriez maintenant voir:** ``` ✅ Le parser fonctionne! Les dates sont renvoyĂ©es comme strings ``` **Si vous voyez encore "objets Date":** → Le rebuild n'a pas fonctionnĂ© → Recommencez l'ÉTAPE 2 avec `--no-cache` --- ### ÉTAPE 5: Resynchronisation Google Calendar 1. Ouvrez **http://localhost:2222** 2. Connectez-vous 3. Allez dans **Admin** → **Google Calendar** 4. Cliquez sur **🔄 Synchroniser** **RĂ©sultat attendu:** ``` 15 Ă©vĂ©nements synchronisĂ©s ``` --- ### ÉTAPE 6: VÉRIFICATION FINALE Dans la box **Rendez-vous** sur la page d'accueil: **Comparez avec Google Calendar:** | Google Calendar | NoteFlow (avant) | NoteFlow (aprĂšs) | |----------------|------------------|------------------| | 10:00 | 11:00 ❌ | 10:00 ✅ | | 14:30 | 15:30 ❌ | 14:30 ✅ | | 09:15 | 10:15 ❌ | 09:15 ✅ | **Les heures doivent ĂȘtre IDENTIQUES!** --- ## 🔍 SI LE PROBLÈME PERSISTE ### Test 1: VĂ©rifier que le rebuild a bien Ă©tĂ© fait ```bash # Voir la date de build de l'image docker images | grep noteflow # VĂ©rifier les logs du build docker-compose build notes-app 2>&1 | grep "types.setTypeParser" ``` ### Test 2: VĂ©rifier manuellement une date ```bash docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 -c " SELECT title, start_time, start_time AT TIME ZONE 'Europe/Paris' as heure_paris FROM calendar_events ORDER BY start_time ASC LIMIT 1; " ``` **Comparez `heure_paris` avec l'heure dans Google Calendar.** ### Test 3: Test direct JavaScript ```bash docker exec notes-todo-app node -e " const { Pool } = require('pg'); const pool = new Pool({ connectionString: process.env.DATABASE_URL }); pool.query('SELECT start_time FROM calendar_events LIMIT 1') .then(r => { const val = r.rows[0]?.start_time; console.log('Type:', typeof val); console.log('Value:', val); if (typeof val === 'string') { console.log('✅ Parser OK - String'); } else { console.log('❌ Parser KO - Objet Date'); } pool.end(); }); " ``` --- ## 🆘 DÉPANNAGE ### ProblĂšme: "Le parser renvoie toujours des objets Date" **Cause:** Le rebuild n'a pas pris en compte les changements **Solution:** ```bash docker-compose down docker system prune -f docker-compose build --no-cache --pull notes-app docker-compose up -d ``` ### ProblĂšme: "Les heures sont toujours dĂ©calĂ©es aprĂšs resync" **Cause:** Cache navigateur **Solution:** 1. Ouvrez les DevTools (F12) 2. Onglet **Network** → Cocher **Disable cache** 3. Actualisez la page (Ctrl+F5 ou Cmd+Shift+R) 4. Videz le cache navigateur: - Chrome: Ctrl+Shift+Del - Firefox: Ctrl+Shift+Del - Edge: Ctrl+Shift+Del ### ProblĂšme: "Certains Ă©vĂ©nements corrects, d'autres dĂ©calĂ©s" **Cause:** MĂ©lange d'Ă©vĂ©nements avant/aprĂšs le fix **Solution:** ```bash # Supprimer TOUS les Ă©vĂ©nements docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 -c "DELETE FROM calendar_events" # Resynchroniser # (depuis l'interface web) ``` --- ## ✅ CHECKLIST FINALE Cochez quand fait: - [ ] ÉTAPE 1: Diagnostic initial effectuĂ© - [ ] ÉTAPE 2: Rebuild complet avec `--no-cache` - [ ] ÉTAPE 3: ÉvĂ©nements supprimĂ©s (DELETE FROM) - [ ] ÉTAPE 4: Diagnostic confirme "parser OK" - [ ] ÉTAPE 5: Google Calendar resynchronisĂ© - [ ] ÉTAPE 6: Heures vĂ©rifiĂ©es = identiques Ă  Google - [ ] Cache navigateur vidĂ© (Ctrl+F5) - [ ] Aucun dĂ©calage horaire observĂ© --- ## 🎯 RÉSUMÉ EN 4 COMMANDES ```bash # 1. Rebuild complet docker-compose down && docker-compose build --no-cache notes-app && docker-compose up -d # 2. Attendre 30s sleep 30 # 3. Supprimer Ă©vĂ©nements docker exec noteflow-postgres psql -U noteflow -d noteflow -p 5499 -c "DELETE FROM calendar_events" # 4. Puis resynchroniser Google Calendar depuis l'interface web ``` --- ## 📊 POURQUOI CE FIX FONCTIONNE **Avant (cassĂ©):** ``` PostgreSQL → driver pg parse en Date object → dĂ©calage timezone ``` **AprĂšs (corrigĂ©):** ``` PostgreSQL → driver pg renvoie string ISO → frontend parse avec bon timezone ``` **La clĂ©:** `types.setTypeParser(1184, str => str)` Ce parser transforme les TIMESTAMPTZ PostgreSQL en strings ISO au lieu d'objets Date, ce qui permet au frontend de gĂ©rer correctement le timezone avec `timeZone: 'Europe/Paris'`. --- **Commit:** 1a68d87 - Fix: DĂ©sactivation parsing Date PostgreSQL **Date:** 2025-11-14 **Si vous suivez cette procĂ©dure EXACTEMENT, le problĂšme SERA rĂ©solu!** 🎉