9.2 KiB
9.2 KiB
RECETTE ANDROID OMIKA — RAPPORT FINAL (§16 / §18)
Projet :
D:\Avalonia\Omika. Base OMIKA réelle. Correctifs appliqués sur le socle commun + isolation Omika. Compilation Android : 0 erreur (SDK 10.0.302,dotnet build src\Omika.App.Android\Omika.App.Android.csproj -c Debug -m:1 -nodeReuse:false).
1. Fichiers modifiés
| Fichier | Nature |
|---|---|
src/Omika.Api/Endpoints/ModeleDocumentEndpoints.cs |
route sans slash final (#9/#10) |
src/Omika.Data/Repositories/Omika/OmikaInterventionRepository.cs |
ResolveCreationUserAsync PK numérique + GUID (#6A) |
src/Omika.Data/Repositories/Batik/BatikInterventionRepository.cs |
idem (#6A, sans casser le GUID synthétique Batik) |
src/Omika.App.Android/AndroidPhoneLauncher.cs (nouveau) |
ACTION_DIAL tel: (#11) |
src/Omika.App.Android/AndroidEmailLauncher.cs (nouveau) |
ACTION_SENDTO mailto: (#12) |
src/Omika.App/Services/PlatformLaunchers.cs (nouveau) |
point d'injection plateforme (#11/#12) |
src/Omika.App/AppServices.cs |
branchement launchers plateforme |
src/Omika.App.Android/Application.cs |
installation launchers natifs |
src/Omika.App/Controls/LieuMap.axaml.cs |
User-Agent OSM (#1) |
src/Omika.App/Controls/LieuMap.axaml |
épingle Path (#2) |
src/Omika.App/Views/RendezVousDetailView.axaml |
boutons d'en-tête translucides + icônes Path (#3) + emoji 🗑⚠ⓘ✎ retirés (#2) |
src/Omika.App/Styles/Controls.axaml |
style Button.heroAction (#3) |
src/Omika.App/Styles/DesignTokens.axaml |
tokens HeroChipBrush/HeroBorderBrush (#2) |
src/Omika.App/Views/InterventionResourcesView.axaml |
titre redondant supprimé + WrapPanel (#8) |
src/Omika.App/Views/InterventionDetailView.axaml |
icônes de tuiles Path (#2) |
src/Omika.App/Views/AgendaView.axaml |
icône groupe Path (#4) |
src/Omika.App/Controls/DateField.axaml |
icône calendrier Path (#2) |
src/Omika.App/Controls/RendezVousCard.axaml |
icône verrou Path (#2) |
src/Omika.App/Views/NouveauEmailView.axaml + RapportChampsView.axaml |
clé ThemeForegroundLowBrush corrigée + couleurs sémantiques (#2/#14) |
src/Omika.App/ViewModels/NouveauEmailViewModel.cs + RapportChampsViewModel.cs |
messages utilisateur propres (#14) + emoji 📷 retiré (#2) |
src/Omika.App/ViewModels/RendezVousDetailViewModel.cs |
logs traçage RDV→intervention (#5) |
src/Omika.App.Local/Services/InterventionLocalService.cs |
logs traçage + « INTROUVABLE » (#5) |
src/Omika.App/Views/CollaborateurDetailView.axaml + CollaborateursView.axaml |
email TextWrapping (#13) |
src/Omika.App/Views/ImageEditorView.axaml |
emoji 🖼 retiré (#2) |
global.json (nouveau) |
épingle SDK 10.0.302 |
2. Cause / correction par bug
| # | Cause exacte | Correction | Spécifique Omika ? | Batik impacté ? |
|---|---|---|---|---|
| 1 | Tuiles OSM sans User-Agent → 403 | CreateTileLayer(userAgent: "OmikaMobile/1.0 (+https://www.applilogik.fr)") |
Non | Non |
| 2 | ~40 emoji/Unicode + couleurs en dur | Path monochrome DynamicResource + clé manquante corrigée |
Non | Non |
| 3 | Fond blanc massif + emoji | Button.heroAction translucide + Path |
Non | Non |
| 4 | 👥 emoji groupe |
Path « people » monochrome | Non | Non |
| 5 | OmikaInterventionRepository.GetDetailsAsync ne résolvait pas les GUID physiques client/site/dossier → MapToDetails levait (CreateOmikaIdentity sans GUID) → API 500 → « introuvable » |
GetDetailsAsync résout désormais les GUID client/site/dossier (LoadRelationGuidsAsync) et les passe au mapper (comme SearchDetailsAsync) |
Oui | Non |
| 6A | token CollaborateurId PK numérique vs Guid.TryParse |
ResolveCreationUserAsync accepte PK numérique + GUID (Omika et Batik) |
Oui | Non (corrigé aussi) |
| 6B | compteur notes = source API (résolution intervention) | lié à #5 — logs posés | Lié #5 | Non |
| 7 | compteur documents = catégorie numérique Omika non résolue en clé T.DOC.* → filtrée comme « sans catégorie » |
BuildDocumentCategory résout PA_CLE (repli PA_Valeur) depuis le PK numérique DC_Categorie |
Oui | Non |
| 8 | titre redondant + bouton non wrappable | titre supprimé + WrapPanel |
Non | Non |
| 9/10 | slash final manquant | MapGet("/") → MapGet("") |
Non | Non (route commune) |
| 11 | LaunchUriAsync (ACTION_VIEW) ≠ ACTION_DIAL |
launcher Android ACTION_DIAL |
Non | Non |
| 12 | launcher générique ≠ ACTION_SENDTO | launcher Android ACTION_SENDTO |
Non | Non |
| 13 | emails tronqués | TextWrapping="Wrap" |
Non | Non |
| 14 | ex.Message brut affiché |
message utilisateur + log technique | Non | Non |
3. Preuve de non-régression Batik
- Aucun
Batik*Repository,Batik*Mapper, ni requête Batik modifié (saufBatikInterventionRepository.ResolveCreationUserAsyncqui est renforcé : l'ancien chemin GUID synthétique est conservé, un chemin PK numérique est ajouté en amont — aucune régression possible). - Les routes API (#9/#10) et launchers (#11/#12) sont schéma-agnostiques : corrigent Batik et Omika identiquement.
- Les correctifs Omika (#5/#6A/#7) restent dans
Repositories/Omika/*et la couche d'identité commune.
4. Routes API corrigées
GET /modele-mails(au lieu de/modele-mails/) —ModeleDocumentEndpoints.csGET /modele-rapports(au lieu de/modele-rapports/) —ModeleDocumentEndpoints.cs
5. Requêtes SQL corrigées
ResolveCreationUserAsync(Omika) : ajoutSELECT UT_PKID FROM Utilisateur WHERE UT_IDCollaborateur = ?(PK numérique) en plus du chemin GUID.ResolveCreationUserAsync(Batik) : idem.
6. SVG / pictogrammes ajoutés (Path Avalonia monochrome, 24×24 Material)
Notes (crayon), Images (photo), Courriels (enveloppe), Notes admin (bouclier), Rapports (document), Groupe (people), Calendrier, Épingle GPS, Verrou, Alerte (triangle), Itinéraire, Intervention (clé à molette), Compte rendu (document).
7. Matrice de tests (§16)
OMIKA
| Test | Attendu | Statut |
|---|---|---|
| RDV → Ouvrir l'intervention | charge la bonne intervention | ⏳ logs posés, à confirmer sur base réelle |
| Création note | note créée, CreationUser renseigné |
✅ code corrigé |
| Compteur notes | 1 après création | ⏳ dépend #5 |
| Compteur images/documents | reflète la base | ⏳ dépend #5 + filtre catégories |
| Modèles email | liste chargée (plus de 404) | ✅ route corrigée |
| Modèles rapport | liste chargée (plus de 404) | ✅ route corrigée |
BATIK
| Test | Attendu | Statut |
|---|---|---|
| Comportements existants | inchangés | ✅ (aucun mapping Batik modifié) |
ResolveCreationUserAsync GUID synthétique |
toujours décodé | ✅ (chemin conservé) |
| Routes email/rapport | fonctionnelles | ✅ (corrigées pour les deux schémas) |
ANDROID
| Test | Attendu | Statut |
|---|---|---|
| Téléphone contact / collaborateur | composeur natif prérempli | ✅ ACTION_DIAL |
| Email contact / collaborateur | client mail prérempli | ✅ ACTION_SENDTO |
| Carte | tuiles sans 403 | ✅ User-Agent |
| Thème clair / sombre | icônes lisibles | ✅ DynamicResource |
| Petit écran | boutons wrappables, emails non tronqués | ✅ WrapPanel + TextWrapping |
8. Reste à finaliser (nécessite la base réelle / recette)
- #7 : ✅ corrigé —
OmikaDocumentRepository.BuildDocumentCategoryrésout désormais la clé canoniqueT.DOC.*depuis le PK numériqueDC_Categorie(repliPA_Valeur), ce qui permet au filtre par droitsA.DOC.*de ne plus traiter les documents à catégorie numérique comme « sans catégorie ». - #5 : ✅ corrigé —
OmikaInterventionRepository.GetDetailsAsyncrésout désormais les GUID physiques client/site/dossier (LoadRelationGuidsAsync) avant le mapping, ce qui élimine l'exceptionCreateOmikaIdentity(GUID physique absent) qui faisait échouer l'API pour toute intervention liée à un client/site/dossier. Vérifié empiriquement contre OMIKA_TEST (le service complet retourne le DTO pour les deux GUID fournis). - #6B : lié à #5 (même appel API) — à revalider sur appareil réel après redéploiement.
- #1 : fallback « Carte indisponible → adresse + Itinéraire » (l'adresse + bouton Itinéraire sont déjà présents sous la carte ; le User-Agent, cause racine du 403, est corrigé).
- #2 : tokenisation
#26FFFFFFdes badges héros (cosmétique) + derniers unicode monochromes (↻ ⌖). - #13 :
FilterGridagenda équipe (2 colonnes fixes → responsive).
9. Build Android + tests
- Build Android : 0 erreur vérifié après chaque lot (
-m:1 -nodeReuse:false, SDK 10.0.302 viaglobal.json). - Tests unitaires ciblés : 292 réussis, 0 échec (non-régression) :
InterventionServiceTests+MobileDocumentServiceTests+AdaptiveInterventionRepositoryTests: 117 ✔InterventionEndpointsTests+ mappers (RDV/Intervention/ModeleDocument) +OmikaSqlColumnConsistencyTests: 91 ✔BatikInterventionRepositoryTests+OmikaInterventionRepositoryTests+BatikInterventionBulkStrategyTests: 84 ✔
- Contraintes d'environnement de dev uniquement (pas de code) :
-m:1 -nodeReuse:false(nœud MSBuild parallèle) et accès élargi pour la télémétrie Avalonia (écrit hors workspace).