fix(event): dates no longer break when editing event
This commit is contained in:
@@ -151,3 +151,4 @@ app.*.symbols
|
|||||||
.gclient_previous_sync_commits
|
.gclient_previous_sync_commits
|
||||||
em2rp/lib/config/env.dart
|
em2rp/lib/config/env.dart
|
||||||
|
|
||||||
|
em2rp/lib/config/env.dart
|
||||||
|
|||||||
@@ -35,16 +35,16 @@ assets/assets/images/tshirt-incrust.webp,1737393735487,af7cb34adfca19c0b41c8eb63
|
|||||||
assets/assets/icons/truss.svg,1761734811263,8ddfbbb4f96de5614348eb23fa55f61b2eb1edb064719a8bbd791c35883ec4cc
|
assets/assets/icons/truss.svg,1761734811263,8ddfbbb4f96de5614348eb23fa55f61b2eb1edb064719a8bbd791c35883ec4cc
|
||||||
assets/assets/icons/tape.svg,1761734809221,631183f0ff972aa4dc3f9f51dc7abd41a607df749d1f9a44fa7e77202d95ccde
|
assets/assets/icons/tape.svg,1761734809221,631183f0ff972aa4dc3f9f51dc7abd41a607df749d1f9a44fa7e77202d95ccde
|
||||||
assets/assets/icons/flight-case.svg,1761734822495,0cef47fdf5d7efdd110763c32f792ef9735df35c4f42ae7d02d5fbda40e6148d
|
assets/assets/icons/flight-case.svg,1761734822495,0cef47fdf5d7efdd110763c32f792ef9735df35c4f42ae7d02d5fbda40e6148d
|
||||||
version.json,1780684985789,5b31e1bebe4b07f1612f0ca0723533e4fa9af717cce5aaf7f436b67a01921ec5
|
version.json,1781276622421,53cb7b032096362a439141e58e2c19c6cd4d85422fa90618e3d5604b7450e50a
|
||||||
index.html,1780684991212,7dd070b4e8d51aa49d899690a8e2603bf8de2bd9e31f202a84d3f19ff280ae4b
|
index.html,1781276629719,7dd070b4e8d51aa49d899690a8e2603bf8de2bd9e31f202a84d3f19ff280ae4b
|
||||||
assets/FontManifest.json,1780685062499,e38b95988f5d060cf9b7ce97cb5ac9236d6f4cc04a11d69567df97b2b4cbc5e5
|
flutter_service_worker.js,1781276711892,99cbb3dcbfa5b6e969bc6301858f448f52e353bfb6263bf506cc56badd845649
|
||||||
flutter_bootstrap.js,1780684991197,dcaa7d74bebad3b4e933b0d006a51aafff48543ae49b65d2d8d9819d5f57b6d3
|
flutter_bootstrap.js,1781276629703,fb4c37e9827d0987f039b599cc441392fe88066945703b54093492427fe51021
|
||||||
flutter_service_worker.js,1780685065763,b0206b1cc6753839a88d8dfb841e0eb53a68068a2b28a497bee28ce58f204ece
|
assets/FontManifest.json,1781276708232,e38b95988f5d060cf9b7ce97cb5ac9236d6f4cc04a11d69567df97b2b4cbc5e5
|
||||||
assets/AssetManifest.json,1780685062499,a75793b913dabecfa1b5eade2735ec6f8f280210572cf25d0ce010d2a6d95e8f
|
assets/AssetManifest.json,1781276708232,a75793b913dabecfa1b5eade2735ec6f8f280210572cf25d0ce010d2a6d95e8f
|
||||||
assets/AssetManifest.bin.json,1780685062499,a26149597dbbee9aeaec0377943061e2b76c73bf974246f6af0b1a82e7455eaa
|
assets/AssetManifest.bin.json,1781276708232,a26149597dbbee9aeaec0377943061e2b76c73bf974246f6af0b1a82e7455eaa
|
||||||
assets/AssetManifest.bin,1780685062499,61f45b0f17a664717759ebf0f1271212f4658bd4b83e35bd5d134689b73a01d6
|
assets/AssetManifest.bin,1781276708232,61f45b0f17a664717759ebf0f1271212f4658bd4b83e35bd5d134689b73a01d6
|
||||||
assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1780685065006,d41473de1f7708a0702d7f19327693486512db442f6ab0cf7774e6d6576f9fcb
|
assets/shaders/ink_sparkle.frag,1781276708458,591c7517d5cb43eb91ea451e0d3f9f585cbf8298cf6c46a9144b77cb0775a406
|
||||||
assets/shaders/ink_sparkle.frag,1780685062685,591c7517d5cb43eb91ea451e0d3f9f585cbf8298cf6c46a9144b77cb0775a406
|
assets/packages/cupertino_icons/assets/CupertinoIcons.ttf,1781276711048,d41473de1f7708a0702d7f19327693486512db442f6ab0cf7774e6d6576f9fcb
|
||||||
assets/fonts/MaterialIcons-Regular.otf,1780685065009,1551d6f32ad2bc8ed771c39fdef3fc01f0188517d44127e47ad826188ca8c82f
|
assets/fonts/MaterialIcons-Regular.otf,1781276711054,1551d6f32ad2bc8ed771c39fdef3fc01f0188517d44127e47ad826188ca8c82f
|
||||||
assets/NOTICES,1780685062499,102c38a40984e6287801c2c98c5920dab4edead49226e54933bf706c4d1bb18e
|
assets/NOTICES,1781276708232,b4202bcf340224c6c2ba4b0e4d4c560f929a8bec3865a3f5c253b8abd8761b78
|
||||||
main.dart.js,1780685061297,be3f32c15b5c877c1a279d4ff0abca5928c7551d58d35e0c6e311bc4859b5e91
|
main.dart.js,1781276707053,1e2a854e74ffd2a641bf323c7cbf19bbdf8660e0edba953511550ab61df3f495
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
Toutes les modifications notables de ce projet seront documentées dans ce fichier.
|
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
|
## 05/06/2026bis
|
||||||
Fix bug vue mobile, amélioration de la vue de calcule des frais de déplacement
|
Fix bug vue mobile, amélioration de la vue de calcule des frais de déplacement
|
||||||
|
|
||||||
|
|||||||
@@ -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));
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/// Configuration de la version de l'application
|
/// Configuration de la version de l'application
|
||||||
class AppVersion {
|
class AppVersion {
|
||||||
static const String version = '1.2.8';
|
static const String version = '1.2.10';
|
||||||
|
|
||||||
/// Retourne la version complète de l'application
|
/// Retourne la version complète de l'application
|
||||||
static String get fullVersion => 'v$version';
|
static String get fullVersion => 'v$version';
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ class AlertModel {
|
|||||||
DateTime parseDate(dynamic value) {
|
DateTime parseDate(dynamic value) {
|
||||||
if (value == null) return DateTime.now();
|
if (value == null) return DateTime.now();
|
||||||
if (value is Timestamp) return value.toDate();
|
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();
|
return DateTime.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ class ContainerModel {
|
|||||||
DateTime? parseDate(dynamic value) {
|
DateTime? parseDate(dynamic value) {
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
if (value is Timestamp) return value.toDate();
|
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);
|
if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -375,7 +375,7 @@ class ContainerHistoryEntry {
|
|||||||
DateTime parseDate(dynamic value) {
|
DateTime parseDate(dynamic value) {
|
||||||
if (value == null) return DateTime.now();
|
if (value == null) return DateTime.now();
|
||||||
if (value is Timestamp) return value.toDate();
|
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);
|
if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
|
||||||
return DateTime.now();
|
return DateTime.now();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -407,7 +407,7 @@ class EquipmentModel {
|
|||||||
DateTime? parseDate(dynamic value) {
|
DateTime? parseDate(dynamic value) {
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
if (value is Timestamp) return value.toDate();
|
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);
|
if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -356,7 +356,7 @@ class EventModel {
|
|||||||
DateTime parseDate(dynamic value, DateTime defaultValue) {
|
DateTime parseDate(dynamic value, DateTime defaultValue) {
|
||||||
if (value == null) return defaultValue;
|
if (value == null) return defaultValue;
|
||||||
if (value is Timestamp) return value.toDate();
|
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;
|
return defaultValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class EventTypeModel {
|
|||||||
DateTime parseCreatedAt(dynamic value) {
|
DateTime parseCreatedAt(dynamic value) {
|
||||||
if (value == null) return DateTime.now();
|
if (value == null) return DateTime.now();
|
||||||
if (value is Timestamp) return value.toDate();
|
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();
|
return DateTime.now();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ class MaintenanceModel {
|
|||||||
DateTime? parseDate(dynamic value) {
|
DateTime? parseDate(dynamic value) {
|
||||||
if (value == null) return null;
|
if (value == null) return null;
|
||||||
if (value is Timestamp) return value.toDate();
|
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);
|
if (value is int) return DateTime.fromMillisecondsSinceEpoch(value);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,10 +48,10 @@ class FirebaseFunctionsApiService implements ApiService {
|
|||||||
|
|
||||||
// Types Firestore
|
// Types Firestore
|
||||||
if (value is Timestamp) {
|
if (value is Timestamp) {
|
||||||
return value.toDate().toIso8601String();
|
return value.toDate().toUtc().toIso8601String();
|
||||||
}
|
}
|
||||||
if (value is DateTime) {
|
if (value is DateTime) {
|
||||||
return value.toIso8601String();
|
return value.toUtc().toIso8601String();
|
||||||
}
|
}
|
||||||
if (value is DocumentReference) {
|
if (value is DocumentReference) {
|
||||||
return value.path;
|
return value.path;
|
||||||
|
|||||||
@@ -104,9 +104,8 @@ class CalendarUtils {
|
|||||||
|
|
||||||
static List<EventModel> getEventsForDay(
|
static List<EventModel> getEventsForDay(
|
||||||
DateTime day, List<EventModel> events) {
|
DateTime day, List<EventModel> events) {
|
||||||
final nextDay = day.add(const Duration(days: 1));
|
final dayStart = DateTime(day.year, day.month, day.day, 0, 0, 0);
|
||||||
final dayStart = DateTime(day.year, day.month, day.day, 2, 0);
|
final dayEnd = DateTime(day.year, day.month, day.day, 23, 59, 59);
|
||||||
final dayEnd = DateTime(nextDay.year, nextDay.month, nextDay.day, 2, 59, 59);
|
|
||||||
|
|
||||||
return events.where((event) {
|
return events.where((event) {
|
||||||
return !(event.endDateTime.isBefore(dayStart) ||
|
return !(event.endDateTime.isBefore(dayStart) ||
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"version": "1.2.8",
|
"version": "1.2.10",
|
||||||
"updateUrl": "https://app.em2events.fr",
|
"updateUrl": "https://app.em2events.fr",
|
||||||
"forceUpdate": true,
|
"forceUpdate": true,
|
||||||
"releaseNotes": "Fix bug vue mobile, amélioration de la vue de calcule des frais de déplacement",
|
"releaseNotes": "- Fix bug date des evenements, migration des dates vers le fuseau horaire Europe/Paris",
|
||||||
"timestamp": "2026-06-05T18:43:05.788Z"
|
"timestamp": "2026-06-12T15:03:42.420Z"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user