# Modèles de courriel et de rapport — génération compatible Batik / Omika > Implémentation de la **génération d'un email/rapport à partir d'un modèle** > (substitution des rubriques), utilisable dans l'application mobile quelle que > soit la base connectée (Batik ou Omika). ## 1. Comportement reproduit En WINDEV, la génération d'un email/rapport correspond à : 1. choisir un modèle (`MailModele` / `ModeleRapport`) ; 2. insérer des rubriques/mots-clés (`MotClef`, `RubriquesDocument`) ; 3. substituer ces jetons par les données réelles (client, intervention, dates…) ; 4. prévisualiser puis envoyer/enregistrer. La présente implémentation reproduit l'étape 3 (substitution) côté .NET, avec une dégradation propre sur Batik (qui n'a ni `ModeleRapport`, ni `RubriquesDocument`). ## 2. Convention provisoire de jetons Les jetons sont délimités par `[[` et `]]`, insensibles à la casse : ``` Bonjour [[NomClient]], intervention du [[DateIntervention]]. ``` La clé correspond au `MotClef.Mot` (ou `MotClef.Code`, ou à une rubrique Omika). > ⚠️ **Convention provisoire.** La syntaxe réelle de `LIB_RubMailRapport` / > `LIB_ModelesEmails` n'est pas dans les exports WINDEV. Le moteur est isolé dans > `Omika.Core/Services/RubriqueSubstitutionEngine.cs` : il suffit d'ajuster le > délimiteur pour s'aligner sur la syntaxe exacte lorsque celle-ci sera connue. ## 3. Compatibilité Batik / Omika | Capacité | Batik | Omika | |---|---|---| | Modèles de courriel (`MailModele`) | ✅ (sans `MM_Extra`/`MM_EnvoiMob`) | ✅ | | Modèles de rapport | lecture seule via l'ancien `ModeleRapportMob` | `ModeleRapport` | | Mots-clés de substitution (`MotClef`) | ✅ | ✅ | | Rubriques structurées (`RubriquesDocument`) | ❌ (liste vide) | ✅ | La dégradation s'appuie sur `SchemaCapabilities.SupportsReportModels` / `SupportsDocumentFields` et sur les repositories adaptatifs. ## 4. Endpoints ajoutés - `GET /modele-mails` / `GET /modele-mails/{id}` - `GET /modele-rapports` / `GET /modele-rapports/{id}` - `GET /mot-clefs` - `GET /rubriques-documents` (vide sur Batik) - `POST /generation/email` — `{ modelId, values, langue? }` → `{ sujet, corps, unknownTokens }` - `POST /generation/rapport` ## 5. Reste à faire (côté mobile) 1. Appeler les endpoints depuis `Omika.App.Local` (`MobileApiClient`) ; 2. mettre en cache les modèles/mots-clés (SQLite) ; 3. appliquer la substitution **localement** avec `RubriqueSubstitutionEngine` (déjà dans `Omika.Core`, donc disponible sur mobile) ; 4. écran « Générer un email/rapport » (Avalonia) + envoi du courriel via `MessageExterne` ou enregistrement du rapport comme `Document`.