mirror of
https://github.com/R0m1k3/noteflow.git
synced 2026-10-24 07:38:17 +02:00
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.
This commit is contained in:
2 files changed
+268
No files matched your search
@@ -0,0 +1,157 @@
|
||||
# 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
|
||||
Reference in new issue
Block a user