diff --git a/.gitignore b/.gitignore index e6d5d24..9bd86d1 100644 --- a/.gitignore +++ b/.gitignore @@ -151,3 +151,4 @@ app.*.symbols .gclient_previous_sync_commits em2rp/lib/config/env.dart +em2rp/lib/config/env.dart diff --git a/em2rp/.firebase/hosting.YnVpbGRcd2Vi.cache b/em2rp/.firebase/hosting.YnVpbGRcd2Vi.cache index 93bcadc..e15b966 100644 --- a/em2rp/.firebase/hosting.YnVpbGRcd2Vi.cache +++ b/em2rp/.firebase/hosting.YnVpbGRcd2Vi.cache @@ -35,16 +35,16 @@ assets/assets/images/tshirt-incrust.webp,1737393735487,af7cb34adfca19c0b41c8eb63 assets/assets/icons/truss.svg,1761734811263,8ddfbbb4f96de5614348eb23fa55f61b2eb1edb064719a8bbd791c35883ec4cc assets/assets/icons/tape.svg,1761734809221,631183f0ff972aa4dc3f9f51dc7abd41a607df749d1f9a44fa7e77202d95ccde assets/assets/icons/flight-case.svg,1761734822495,0cef47fdf5d7efdd110763c32f792ef9735df35c4f42ae7d02d5fbda40e6148d -version.json,1780684985789,5b31e1bebe4b07f1612f0ca0723533e4fa9af717cce5aaf7f436b67a01921ec5 -index.html,1780684991212,7dd070b4e8d51aa49d899690a8e2603bf8de2bd9e31f202a84d3f19ff280ae4b -assets/FontManifest.json,1780685062499,e38b95988f5d060cf9b7ce97cb5ac9236d6f4cc04a11d69567df97b2b4cbc5e5 -flutter_bootstrap.js,1780684991197,dcaa7d74bebad3b4e933b0d006a51aafff48543ae49b65d2d8d9819d5f57b6d3 -flutter_service_worker.js,1780685065763,b0206b1cc6753839a88d8dfb841e0eb53a68068a2b28a497bee28ce58f204ece -assets/AssetManifest.json,1780685062499,a75793b913dabecfa1b5eade2735ec6f8f280210572cf25d0ce010d2a6d95e8f -assets/AssetManifest.bin.json,1780685062499,a26149597dbbee9aeaec0377943061e2b76c73bf974246f6af0b1a82e7455eaa -assets/AssetManifest.bin,1780685062499,61f45b0f17a664717759ebf0f1271212f4658bd4b83e35bd5d134689b73a01d6 -assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1780685065006,d41473de1f7708a0702d7f19327693486512db442f6ab0cf7774e6d6576f9fcb -assets/shaders/ink_sparkle.frag,1780685062685,591c7517d5cb43eb91ea451e0d3f9f585cbf8298cf6c46a9144b77cb0775a406 -assets/fonts/MaterialIcons-Regular.otf,1780685065009,1551d6f32ad2bc8ed771c39fdef3fc01f0188517d44127e47ad826188ca8c82f -assets/NOTICES,1780685062499,102c38a40984e6287801c2c98c5920dab4edead49226e54933bf706c4d1bb18e -main.dart.js,1780685061297,be3f32c15b5c877c1a279d4ff0abca5928c7551d58d35e0c6e311bc4859b5e91 +version.json,1781276622421,53cb7b032096362a439141e58e2c19c6cd4d85422fa90618e3d5604b7450e50a +index.html,1781276629719,7dd070b4e8d51aa49d899690a8e2603bf8de2bd9e31f202a84d3f19ff280ae4b +flutter_service_worker.js,1781276711892,99cbb3dcbfa5b6e969bc6301858f448f52e353bfb6263bf506cc56badd845649 +flutter_bootstrap.js,1781276629703,fb4c37e9827d0987f039b599cc441392fe88066945703b54093492427fe51021 +assets/FontManifest.json,1781276708232,e38b95988f5d060cf9b7ce97cb5ac9236d6f4cc04a11d69567df97b2b4cbc5e5 +assets/AssetManifest.json,1781276708232,a75793b913dabecfa1b5eade2735ec6f8f280210572cf25d0ce010d2a6d95e8f +assets/AssetManifest.bin.json,1781276708232,a26149597dbbee9aeaec0377943061e2b76c73bf974246f6af0b1a82e7455eaa +assets/AssetManifest.bin,1781276708232,61f45b0f17a664717759ebf0f1271212f4658bd4b83e35bd5d134689b73a01d6 +assets/shaders/ink_sparkle.frag,1781276708458,591c7517d5cb43eb91ea451e0d3f9f585cbf8298cf6c46a9144b77cb0775a406 +assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1781276711048,d41473de1f7708a0702d7f19327693486512db442f6ab0cf7774e6d6576f9fcb +assets/fonts/MaterialIcons-Regular.otf,1781276711054,1551d6f32ad2bc8ed771c39fdef3fc01f0188517d44127e47ad826188ca8c82f +assets/NOTICES,1781276708232,b4202bcf340224c6c2ba4b0e4d4c560f929a8bec3865a3f5c253b8abd8761b78 +main.dart.js,1781276707053,1e2a854e74ffd2a641bf323c7cbf19bbdf8660e0edba953511550ab61df3f495 diff --git a/em2rp/CHANGELOG.md b/em2rp/CHANGELOG.md index 1d3281b..b1331d0 100644 --- a/em2rp/CHANGELOG.md +++ b/em2rp/CHANGELOG.md @@ -2,6 +2,9 @@ Toutes les modifications notables de ce projet seront documentées dans ce fichier. +## 12/06/2026 +- Fix bug date des evenements, migration des dates vers le fuseau horaire Europe/Paris + ## 05/06/2026bis Fix bug vue mobile, amélioration de la vue de calcule des frais de déplacement diff --git a/em2rp/functions/migrate_event_dates.js b/em2rp/functions/migrate_event_dates.js new file mode 100644 index 0000000..70bad73 --- /dev/null +++ b/em2rp/functions/migrate_event_dates.js @@ -0,0 +1,73 @@ +const admin = require("firebase-admin"); +const serviceAccount = require("./serviceAccountKey.json"); + +// Initialiser Firebase Admin +admin.initializeApp({ + credential: admin.credential.cert(serviceAccount), +}); + +const db = admin.firestore(); + +async function migrateEventDates() { + console.log("🔧 Migration: Correction du fuseau horaire des événements"); + console.log("================================================\n"); + + try { + const eventsSnapshot = await db.collection("events").get(); + console.log(`📦 Total d'événements: ${eventsSnapshot.size}`); + + let updatedCount = 0; + const batch = db.batch(); + + for (const doc of eventsSnapshot.docs) { + const data = doc.data(); + let updated = false; + const updates = {}; + + const fixDate = (timestamp) => { + if (!timestamp) return null; + const oldDate = timestamp.toDate(); + + // On prend les composants UTC (qui étaient en fait l'heure locale mal enregistrée) + // et on crée une vraie date locale avec + const newDate = new Date( + oldDate.getUTCFullYear(), + oldDate.getUTCMonth(), + oldDate.getUTCDate(), + oldDate.getUTCHours(), + oldDate.getUTCMinutes(), + oldDate.getUTCSeconds() + ); + + return admin.firestore.Timestamp.fromDate(newDate); + }; + + if (data.StartDateTime) { + updates.StartDateTime = fixDate(data.StartDateTime); + updated = true; + } + + if (data.EndDateTime) { + updates.EndDateTime = fixDate(data.EndDateTime); + updated = true; + } + + if (updated) { + batch.update(doc.ref, updates); + updatedCount++; + } + } + + if (updatedCount > 0) { + await batch.commit(); + console.log(`✅ ${updatedCount} événements corrigés avec succès !`); + } else { + console.log("ℹ️ Aucun événement à corriger."); + } + } catch (error) { + console.error("❌ Erreur lors de la migration:", error); + process.exit(1); + } +} + +migrateEventDates().then(() => process.exit(0)); diff --git a/em2rp/lib/config/app_version.dart b/em2rp/lib/config/app_version.dart index b667486..e8af418 100644 --- a/em2rp/lib/config/app_version.dart +++ b/em2rp/lib/config/app_version.dart @@ -1,6 +1,6 @@ /// Configuration de la version de l'application class AppVersion { - static const String version = '1.2.8'; + static const String version = '1.2.10'; /// Retourne la version complète de l'application static String get fullVersion => 'v$version'; diff --git a/em2rp/lib/models/alert_model.dart b/em2rp/lib/models/alert_model.dart index df060d6..d640549 100644 --- a/em2rp/lib/models/alert_model.dart +++ b/em2rp/lib/models/alert_model.dart @@ -154,7 +154,7 @@ class AlertModel { DateTime parseDate(dynamic value) { if (value == null) return DateTime.now(); if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value) ?? DateTime.now(); + if (value is String) return DateTime.tryParse(value)?.toLocal() ?? DateTime.now(); return DateTime.now(); } diff --git a/em2rp/lib/models/container_model.dart b/em2rp/lib/models/container_model.dart index 159df58..18d947d 100644 --- a/em2rp/lib/models/container_model.dart +++ b/em2rp/lib/models/container_model.dart @@ -254,7 +254,7 @@ class ContainerModel { DateTime? parseDate(dynamic value) { if (value == null) return null; if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value); + if (value is String) return DateTime.tryParse(value)?.toLocal(); if (value is int) return DateTime.fromMillisecondsSinceEpoch(value); return null; } @@ -375,7 +375,7 @@ class ContainerHistoryEntry { DateTime parseDate(dynamic value) { if (value == null) return DateTime.now(); if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value) ?? DateTime.now(); + if (value is String) return DateTime.tryParse(value)?.toLocal() ?? DateTime.now(); if (value is int) return DateTime.fromMillisecondsSinceEpoch(value); return DateTime.now(); } diff --git a/em2rp/lib/models/equipment_model.dart b/em2rp/lib/models/equipment_model.dart index 7d3ceaa..c7dc5bb 100644 --- a/em2rp/lib/models/equipment_model.dart +++ b/em2rp/lib/models/equipment_model.dart @@ -407,7 +407,7 @@ class EquipmentModel { DateTime? parseDate(dynamic value) { if (value == null) return null; if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value); + if (value is String) return DateTime.tryParse(value)?.toLocal(); if (value is int) return DateTime.fromMillisecondsSinceEpoch(value); return null; } diff --git a/em2rp/lib/models/event_model.dart b/em2rp/lib/models/event_model.dart index 31ff8ad..99f25b7 100644 --- a/em2rp/lib/models/event_model.dart +++ b/em2rp/lib/models/event_model.dart @@ -356,7 +356,7 @@ class EventModel { DateTime parseDate(dynamic value, DateTime defaultValue) { if (value == null) return defaultValue; if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value) ?? defaultValue; + if (value is String) return DateTime.tryParse(value)?.toLocal() ?? defaultValue; return defaultValue; } diff --git a/em2rp/lib/models/event_type_model.dart b/em2rp/lib/models/event_type_model.dart index a428f05..dc7149c 100644 --- a/em2rp/lib/models/event_type_model.dart +++ b/em2rp/lib/models/event_type_model.dart @@ -18,7 +18,7 @@ class EventTypeModel { DateTime parseCreatedAt(dynamic value) { if (value == null) return DateTime.now(); if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value) ?? DateTime.now(); + if (value is String) return DateTime.tryParse(value)?.toLocal() ?? DateTime.now(); return DateTime.now(); } diff --git a/em2rp/lib/models/maintenance_model.dart b/em2rp/lib/models/maintenance_model.dart index f64be5e..da300de 100644 --- a/em2rp/lib/models/maintenance_model.dart +++ b/em2rp/lib/models/maintenance_model.dart @@ -72,7 +72,7 @@ class MaintenanceModel { DateTime? parseDate(dynamic value) { if (value == null) return null; if (value is Timestamp) return value.toDate(); - if (value is String) return DateTime.tryParse(value); + if (value is String) return DateTime.tryParse(value)?.toLocal(); if (value is int) return DateTime.fromMillisecondsSinceEpoch(value); return null; } diff --git a/em2rp/lib/services/api_service.dart b/em2rp/lib/services/api_service.dart index dd84700..9ee393e 100644 --- a/em2rp/lib/services/api_service.dart +++ b/em2rp/lib/services/api_service.dart @@ -48,10 +48,10 @@ class FirebaseFunctionsApiService implements ApiService { // Types Firestore if (value is Timestamp) { - return value.toDate().toIso8601String(); + return value.toDate().toUtc().toIso8601String(); } if (value is DateTime) { - return value.toIso8601String(); + return value.toUtc().toIso8601String(); } if (value is DocumentReference) { return value.path; diff --git a/em2rp/lib/utils/calendar_utils.dart b/em2rp/lib/utils/calendar_utils.dart index 3cb2aaf..ba87e59 100644 --- a/em2rp/lib/utils/calendar_utils.dart +++ b/em2rp/lib/utils/calendar_utils.dart @@ -104,9 +104,8 @@ class CalendarUtils { static List getEventsForDay( DateTime day, List events) { - final nextDay = day.add(const Duration(days: 1)); - final dayStart = DateTime(day.year, day.month, day.day, 2, 0); - final dayEnd = DateTime(nextDay.year, nextDay.month, nextDay.day, 2, 59, 59); + final dayStart = DateTime(day.year, day.month, day.day, 0, 0, 0); + final dayEnd = DateTime(day.year, day.month, day.day, 23, 59, 59); return events.where((event) { return !(event.endDateTime.isBefore(dayStart) || diff --git a/em2rp/web/version.json b/em2rp/web/version.json index 9fe8860..5274c2b 100644 --- a/em2rp/web/version.json +++ b/em2rp/web/version.json @@ -1,7 +1,7 @@ { - "version": "1.2.8", + "version": "1.2.10", "updateUrl": "https://app.em2events.fr", "forceUpdate": true, - "releaseNotes": "Fix bug vue mobile, amélioration de la vue de calcule des frais de déplacement", - "timestamp": "2026-06-05T18:43:05.788Z" + "releaseNotes": "- Fix bug date des evenements, migration des dates vers le fuseau horaire Europe/Paris", + "timestamp": "2026-06-12T15:03:42.420Z" } \ No newline at end of file