mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-11 17:29:37 +02:00
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.
158 lines
3.9 KiB
Markdown
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
|