import 'dart:math'; import 'package:manager_api_new/api.dart'; /// GeoPointDTO ne porte plus `latitude`/`longitude` depuis le passage à PostGIS : /// la position vit dans `geometry.coordinates`, que `GeometryMapper` sérialise /// côté serveur sous la forme `[X, Y]` — donc **[longitude, latitude]**, l'ordre /// GeoJSON. C'est aussi ce que lit mymuseum-visitapp (`Models/agenda.dart`). /// /// ⚠️ Ne pas généraliser aux géométries de GuidedStep : celles-là sont écrites /// par manager-app dans l'ordre inverse, `[lat, lng]` (cf. `visitapp-web/src/lib/geo.ts`). extension GeoPointPosition on GeoPointDTO { double? get lat => _coordinate(1); double? get lng => _coordinate(0); /// Clé numérique dérivée des coordonnées, utilisée par `geo_point_filter` pour /// apparier un `TreeNode` et son GeoPoint (l'`id` du DTO ne convient pas : il est /// réattribué à la volée à l'affichage). /// /// Formule reprise telle quelle de l'ancien code — représentation textuelle /// tronquée à 10 caractères, points et signes retirés. Elle n'est pas persistée, /// mais **les deux côtés de l'appariement doivent produire la même valeur** : elle /// était dupliquée à quatre endroits, elle ne vit plus qu'ici. int get coordinateKey { String part(double? value) { if (value == null) return '0'; final text = value.toString(); return text .substring(0, min(text.length, 10)) .replaceAll('.', '') .replaceAll('-', ''); } return int.parse(part(lat) + part(lng)); } /// `coordinates` est typé `Object?` dans le client généré : sans ce narrowing, /// tout calcul dessus part en `dynamic` et casse à la compilation. double? _coordinate(int index) { final coordinates = geometry?.coordinates; if (coordinates is! List || coordinates.length <= index) return null; final value = coordinates[index]; return value is num ? value.toDouble() : null; } }