Files
noteflow/CALENDAR_TIMEZONE_FIX.md
T
Claude f3f64a5a0d Fix: Timezone Europe/Paris + diagnostic complet calendrier
Problème: Décalage d'1 heure persistant malgré types.setTypeParser
Cause probable: Container pas rebuild avec le fix database.js

Ajouts:
1. scripts/check-calendar-timezone.js
   - Diagnostic complet timezone PostgreSQL/Node.js
   - Vérifie si types.setTypeParser(1184) fonctionne
   - Affiche type de données retourné (string vs Date object)
   - Compare valeurs SQL brutes avec valeurs JS

2. CALENDAR_TIMEZONE_FIX.md
   - Documentation complète du problème
   - Procédure de fix étape par étape
   - Explication technique de la cause
   - Historique des tentatives

Utilisation:
```bash
# 1. Diagnostic
node scripts/check-calendar-timezone.js

# 2. Si Date object au lieu de string:
docker-compose build --no-cache notes-app
docker-compose up -d

# 3. Resynchroniser calendrier depuis UI
```

Le fix types.setTypeParser(1184) est déjà en place dans database.js
mais nécessite un rebuild du container pour être actif.
2025-11-15 07:08:20 +00:00

158 lines
3.9 KiB
Markdown

# Fix Décalage Horaire Calendrier
## Problème
Les événements du calendrier Google s'affichent avec 1 heure de décalage dans NoteFlow.
## Cause Racine
Le driver PostgreSQL (`pg`) convertit automatiquement les colonnes `TIMESTAMPTZ` en objets `Date` JavaScript, causant une double conversion de timezone:
1. Google Calendar → PostgreSQL (stockage en UTC)
2. PostgreSQL → JavaScript Date (conversion automatique en timezone locale)
3. Frontend → Affichage (nouvelle conversion)
## Solution Appliquée
### 1. Désactivation du parsing automatique (config/database.js)
```javascript
const { Pool, types } = require('pg');
// IMPORTANT: Désactiver le parsing automatique des TIMESTAMPTZ
types.setTypeParser(1184, function(stringValue) {
return stringValue; // Renvoie la string ISO au lieu d'un objet Date
});
const pool = new Pool({...});
```
### 2. Frontend avec timezone explicite (src/pages/Index.tsx)
```javascript
startDate.toLocaleTimeString('fr-FR', {
hour: '2-digit',
minute: '2-digit',
timeZone: 'Europe/Paris'
})
```
## Procédure de Fix
### Étape 1: Diagnostic
Vérifier si le fix est actif:
```bash
node scripts/check-calendar-timezone.js
```
Ce script va vérifier:
- ✓ Si `start_time` est retourné comme `string` (bon)
- ✗ Si `start_time` est un `Date` object (mauvais - rebuild requis)
### Étape 2: Rebuild du Container (SI NÉCESSAIRE)
Si le diagnostic montre que les dates sont des `Date` objects:
```bash
# 1. Arrêter le container
docker-compose down
# 2. Rebuild SANS cache (important!)
docker-compose build --no-cache notes-app
# 3. Redémarrer
docker-compose up -d
# 4. Vérifier les logs
docker-compose logs -f notes-app
```
### Étape 3: Resynchronisation
1. Ouvrir l'interface web NoteFlow
2. Aller dans Admin → Calendrier
3. Cliquer sur "Synchroniser avec Google Calendar"
4. Vérifier que les heures affichées sont correctes
### Étape 4: Si le problème persiste
Supprimer les événements et re-synchroniser:
```bash
# Se connecter à PostgreSQL
docker exec -it noteflow-postgres psql -U noteflow -d noteflow -p 5499
# Supprimer tous les événements
DELETE FROM calendar_events;
# Quitter
\q
```
Puis re-synchroniser depuis l'interface web.
## Vérification Finale
Comparer un événement dans Google Calendar et NoteFlow:
**Google Calendar:**
- Rendez-vous: 14:00
**NoteFlow (devrait afficher):**
- Rendez-vous: 14:00 ✓
**Si NoteFlow affiche:**
- Rendez-vous: 15:00 ✗ → Reprendre la procédure depuis l'étape 2
## Notes Techniques
### Types PostgreSQL
- `TIMESTAMP` - Sans timezone, stocke la valeur brute
- `TIMESTAMPTZ` - Avec timezone, stocke en UTC + timezone
### Type Parser ID
- `1184` = TIMESTAMPTZ (timestamp with time zone)
- `1114` = TIMESTAMP (timestamp without time zone)
### Timezone PostgreSQL
Par défaut, PostgreSQL utilise UTC:
```sql
SHOW timezone;
-- Résultat: UTC
```
### Timezone Node.js/Container
```bash
echo $TZ
# Si vide, Node.js utilise la timezone système (généralement UTC dans Docker)
```
### Format des Dates Google Calendar
Google Calendar API retourne:
- `event.start.dateTime`: `"2025-11-15T14:00:00+01:00"` (événement avec heure)
- `event.start.date`: `"2025-11-15"` (événement toute la journée)
Ces valeurs sont stockées telles quelles dans PostgreSQL TIMESTAMPTZ.
## Historique des Tentatives
1. ✗ Changed TIMESTAMP → TIMESTAMPTZ
2. ✗ Migration with 'AT TIME ZONE UTC'
3. ✗ Migration with 'AT TIME ZONE Europe/Paris'
4. ✗ Added timeZone: 'Europe/Paris' to frontend
5. ✓ **types.setTypeParser(1184)** - Solution finale
## Contact
Si le problème persiste après toutes ces étapes, vérifier:
1. Version de `pg` dans package.json
2. Logs backend pendant la récupération des événements
3. Network tab du navigateur pour voir les données brutes retournées par l'API