Premiere commit - Omika

This commit is contained in:
2026-10-23 18:46:50 +02:00
commit 8ea76c1b24
2155 changed files with 984301 additions and 0 deletions
@@ -0,0 +1,143 @@
# T24-A — Prompt IA local + référentiel administrable ScreenCode/FeatureCode
> Statut : PRÉPROD LOCAL / recette manuelle. Aucun Git, aucune Production.
## 1. Générer le prompt IA (Partie A)
### Principe
Le centre Diagnostics génère un **prompt d'analyse local** depuis un diagnostic/erreur.
**Aucun appel IA externe** (OpenAI, ChatGPT ou autre) : le système se contente de :
```
diagnostic → construire un texte local → afficher le prompt → permettre « Copier »
```
Le prompt n'est **jamais enregistré en PostgreSQL** (génération à la demande uniquement, V1).
### Boutons
- **Détail diagnostic** (`/Diagnostics/{id}`) : bouton « Générer le prompt IA » à proximité du
contexte technique.
- **Détail erreur** (`/Erreurs/{id}`) : bouton « Générer le prompt IA » (depuis l'occurrence la
plus récente du groupe).
Un clic déclenche la génération **côté serveur** (handler Razor Pages `OnGetPromptAsync`), puis
affiche le prompt dans une modale dédiée avec un bouton **« Copier le prompt »** (réutilise
`OmikaCopy()`, aucune nouvelle librairie JS).
### Service partagé
La construction du prompt est centralisée dans `Omika.Diagnostics.Core` :
`DiagnosticPromptBuilder.Build(DiagnosticEventRecord, IReadOnlyList<DiagnosticEventRecord>?)`.
Le chargement des événements corrélés est partagé par
`DiagnosticsDetailModel.GetCorrelatedEventsAsync(...)` (utilisé par le détail diagnostic ET le
détail erreur). Aucune logique dupliquée.
### Informations incluses (si disponibles)
- **CONTEXTE** : ClientCode, Environment, ServerInstance, Source, Component, Platform,
OperatingSystem, OperatingSystemVersion, Manufacturer, Model, AppVersion, AppBuild,
ScreenCode, FeatureCode.
- **ERREUR** : EventCode, Level, Priority, ErrorCode, Timestamp, DurationMs.
- **MESSAGE** : Message (tronqué à 2000 caractères).
- **EXCEPTION** : ExceptionType, StackTrace (tronquée à 4000 caractères).
- **HTTP / MÉTADONNÉES** : uniquement les clés whitelistées (`method`, `statusCode`,
`routeTemplate`, `retryCount`, …) et valeurs simples non interdites.
- **CORRÉLATION** : TraceId, OperationId, SessionId.
- **IDENTITÉ TECHNIQUE AUTORISÉE** : LicenseNumber (numéro fonctionnel), DeviceKey et ActorKey
**tronqués** (pseudonymes HMAC-SHA256, jamais réversibles).
- **ÉVÉNEMENTS CORRÉLÉS** (si TraceId/OperationId) : chronologie compacte, **bornée à 25
événements**, sans stack trace (timestamp, level, eventCode, component, message court,
screen/feature).
### Informations exclues (jamais)
password, password_hash, ApiKey, api_key_hash, Bearer token, SigningKey, HmacKey,
ConnectionString, DeviceId brut, UserId brut, CollaborateurId brut, ClientId brut, email,
téléphone, IMEI, serial, MAC, secret de licence.
La politique **réutilise** les filtres existants : `DiagnosticForbiddenData`
(jetons interdits) et `DiagnosticMetadataPolicy` (whitelist des clés). Aucune seconde logique de
filtrage. Défense en profondeur : chaque valeur relue est re-vérifiée avant inclusion.
### Format
Le prompt commence par :
> « Analyse cette erreur Omika et aide-moi à déterminer sa cause probable. »
puis demande explicitement : cause probable, niveau de confiance, fichier/méthode à vérifier en
priorité, éléments de preuve, hypothèses alternatives, correctif recommandé, tests de
confirmation, dire si l'erreur semble volontaire/de test, distinguer faits confirmés et hypothèses.
### Exemple /dev/throw
L'événement de recette `API_HTTP_ERROR` / `InvalidOperationException` / `/dev/throw` /
`TELEMETRY_TEST_ERROR` / `Development` produit un prompt contenant naturellement ces données —
**aucune règle codée en dur** « /dev/throw ».
## 2. Référentiel administrable (Partie B)
### Règle absolue
`diagnostic_event` **reste la vérité** sur ce qui a réellement été observé. Le référentiel
(`diagnostics_reference`) est un **enrichissement** (libellé / description / ordre / état) et ne
détermine **jamais** quels événements sont acceptés. Un code observé non référencé reste visible
dans les filtres.
### Table `diagnostics_reference` (migration 011)
`id`, `reference_type` (`SCREEN_CODE` / `FEATURE_CODE`), `code` (normalisé TRIM+UPPER),
`label`, `description`, `enabled`, `sort_order`, `created_at_utc`, `updated_at_utc`.
- Unicité : `(reference_type, UPPER(code))` — index unique.
- **Code immuable** après création. Pour corriger un code : créer une nouvelle entrée + archiver
l'ancienne.
- **Archivage = `enabled=false`**, jamais de DELETE physique (V1).
### Ownership / GRANT (011)
- Propriétaire : `omika_diagnostics_owner`.
- `omika_diagnostics_web` : `SELECT`, `INSERT`, `UPDATE (label, description, enabled,
sort_order, updated_at_utc)` + `USAGE` séquence. **Aucun DELETE.**
- `omika_diagnostics_api` et `omika_diagnostics_worker` : **aucun droit** (testé négativement).
### Initialisation (idempotente)
Les **29 ScreenCode** et **3 FeatureCode** du catalogue applicatif sont seedés par la migration
avec leurs libellés (`ON CONFLICT DO NOTHING`). Un libellé modifié par un Admin n'est **jamais
écrasé** au redémarrage.
### Pages
- `/Referentiel` : consultation (Support + Admin) — sections Codes écran / Codes fonctionnalité
alimentées par le référentiel DB (libellé + description + état), repli catalogue statique si DB
indisponible.
- `/Referentiel/Admin` : **Admin uniquement** — liste (Type, Code, Libellé, Description, État,
Dernière modification, Actions), création, modification (libellé/description/état/tri),
archivage/réactivation, et section **« Codes observés non référencés »** avec **ajout rapide**.
### Procédure : ajout d'un nouveau code
1. Un événement arrive avec un `screen_code`/`feature_code` inconnu (ex. `FACTURE_DETAIL`).
2. Le code **apparaît automatiquement** dans les filtres Diagnostics (alimentés par
`diagnostic_event`), affiché `FACTURE_DETAIL (non référencé)`.
3. Dans `/Referentiel/Admin` → « Codes observés non référencés » → « Ajouter » (type + code
préremplis) → Admin renseigne le libellé/la description.
4. Le filtre affiche alors `Détail de facture (FACTURE_DETAIL)` — **sans modifier les données
historiques**. La recherche SQL utilise toujours le **code**, jamais le libellé.
### Dropdowns / filtrage
Les listes déroulantes continuent d'être alimentées par les codes **réellement observés** (jamais
`SELECT` sur `diagnostics_reference` uniquement). Si une référence existe : `Libellé (CODE)` ;
sinon : `CODE (non référencé)`. La valeur du filtre reste toujours le CODE.
## 3. Corrections UX (Partie C)
- Filtre « Acteur » → **« Acteur pseudonymisé »** + aide : « Identifiant pseudonymisé permettant
de retrouver les événements d'un même utilisateur. »
- Page/menu « Versions » → **« Versions Omika »**.
- « Version la plus représentée » → **« Version Omika la plus observée »** + note : « Les valeurs
correspondent aux événements observés, pas au nombre d'installations. »
## 4. Sécurité
- Prompt généré : 0 fuite de données interdites (testé — `DiagnosticPromptBuilderTests`).
- HTML : le prompt est affiché via `textContent` (aucune injection HTML).
- Aucun enregistrement du prompt (ni PostgreSQL, ni log).
- Migration 011 : aucune colonne secret, aucun mot de passe.
## 5. Tests
- `Omika.Diagnostics.Tests` : 574/574 (baseline 536 + 38 tests T24-A).
- `Omika.Tests` : 3366/3370 — 4 échecs environnementaux/préexistants (construction de vues
Avalonia ×2, course temporelle ShellViewModel, accès HFSQL), **aucune régression** liée à T24-A
(T24-A est isolé dans le sous-système Diagnostics, non référencé par Omika.Tests).
## 6. Migration 011
`infra/postgresql/011_diagnostics_reference.sql` — ordre final : `001 → … → 010 → 011`.
Idempotente, non destructive (aucun DROP/DELETE), aucun mot de passe.
+89
View File
@@ -0,0 +1,89 @@
# Backend — Statut final
État de fermeture du backend métier Omika, prêt pour la future application mobile.
## Schéma Batik / Omika
- Détection de schéma réelle au démarrage (`DatabaseSchemaDetector`), basée sur la structure (colonnes canaris), jamais sur le nom de la base.
- Routage runtime : `ApplicationRuntimeContext.Current.DetectedVersion` → `AdaptiveRepository` → implémentation `Batik*` ou `Omika*`.
- Aucune logique basée sur le nom de la base.
## HFSQL
- Accès OLE DB : **VERIFIED** (provider `PCSOFT.HFSQL`).
- Source des mots de passe : **EXPLICIT_LOCAL_CONFIG** (`config/hfsql-test.local.json`).
- Dérivation de mot de passe utilisée : **NO** (mots de passe fournis explicitement).
- `ProtectionPlusSecret` utilisé pour la connexion : **NO**.
## Business aggregates (8 VERIFIED)
| Agrégat | Statut |
|---------|--------|
| Client | VERIFIED |
| Personne | VERIFIED |
| Lieu/Site | VERIFIED |
| Document | VERIFIED |
| Intervention | VERIFIED |
| Dossier | VERIFIED |
| PlanningRDV | VERIFIED |
| Collaborateur | VERIFIED |
0 PARTIAL, 0 NOT_STARTED.
## Reference data
- **PublicRead** : ParametreMetier (`GET /reference-data/{key}`, READ_ONLY_VERIFIED).
- **InternalOnly** : Societe, Equipe, ParametreMetierEntete, EtatIntervention.
- **SchemaSpecific** : Role, Etats (Omika uniquement).
- **NotRequired** : ModeleRapport.
## API
Groupes d'endpoints enregistrés dans `Program.cs` :
- Health
- Client
- Contact (Personne)
- ReferenceData
- Document
- Site (Lieu)
- Intervention
- Dossier
- RendezVous (PlanningRDV)
- Collaborateur
Aucun endpoint préventif supplémentaire. Conforme à la règle « ne crée pas automatiquement un endpoint pour chaque table ».
## Adaptive repositories
Tous les agrégats publics disposent d'un repository adaptatif (`Adaptive*Repository`) qui route selon `DetectedVersion` :
- Client, Contact, Site, Document, Intervention, Dossier, RendezVous, Collaborateur, ReferenceData.
## Tests
- **1144 PASS / 0 FAIL / 0 SKIP**.
- Intégrations réelles OLE DB (BATIK_TEST / OMIKA_TEST) pour les parcours principaux : Client (Create), Intervention (lifecycle), Dossier (lifecycle), PlanningRDV (lifecycle), Collaborateur (lifecycle) — avec rollback atomique.
- Les tests d'intégration s'ignorent proprement si le serveur HFSQL est injoignable (détection `E_FAIL`/`0x80004005`).
## Limitations connues
- **ElementSupprime** : absent physiquement de OMIKA_TEST actuel ; traité comme optionnel (VERSION_OPTIONAL).
- **Equipe → Collaborateur** : relation INTERNAL_ONLY, pas d'identité canonique publique (aucune table de correspondance).
- **Role** : Omika-specific, non exposé publiquement.
- **ModeleRapport** : NOT_REQUIRED.
- **Document.Update** : NOT_APPLICABLE (document immuable après création).
- **Intervention PartialFailureRollback** : non couvert spécifiquement, mais transaction/lifecycle validés (rollback externe prouvé).
## Éléments volontairement non exposés
- Tables de jointure (JOIN_TABLE) : pas de CRUD public.
- Configuration système (Utilisateur, ParametreSysteme) : pas d'endpoint public.
- Référentiels internes (Societe, Equipe, ParametreMetierEntete, EtatIntervention, Role, Etats, ModeleRapport) : pas d'endpoint public.
- IDs publics opaques (string) : aucun PK HFSQL brut exposé, aucun GUID fabriqué pour masquer l'absence d'identité canonique.
## Statut final
- **BackendBusinessLayer** : READY.
- **BackendForMobileDevelopment** : READY.
- **Blockers** : NONE.
+31
View File
@@ -0,0 +1,31 @@
DomainEntity,BatikTable,OmikaTable,Category,Create,ReadOne,ReadList,Update,Delete,PublicApi,ExistingService,ExistingRepository,ExistingEndpoint,BatikSupported,OmikaSupported,Status,Notes
Client,Client,Client,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,YES,YES,YES,YES,YES,YES,VERIFIED,CRUD complet via ClientService/AdaptiveClientRepository
Personne,Personne,Personne,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,YES,YES,YES,YES,YES,YES,VERIFIED,CRUD complet via ContactService/AdaptiveContactRepository
Adresse,Adresse,Adresse,BUSINESS_CHILD,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Adresse partagée entre clients/personnes/sites
Lieu,Lieu,Lieu,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,Site/lieu d'intervention; CRUD via SiteService/AdaptiveSiteRepository/BatikSiteRepository/OmikaSiteRepository; suppression=archivage
Document,Document,Document,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,NOT_APPLICABLE,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,Document immuable après création; suppression = archivage (Archive)
Intervention,Intervention,Intervention,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,CRUD complet via InterventionService/AdaptiveInterventionRepository; suppression=archivage; intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS sur BATIK_TEST/OMIKA_TEST; relations Collaborateur/Personne câblées; IDs invalides→DomainValidationException sans écriture partielle
Dossier,Dossier,Dossier,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,CRUD complet via DossierService/AdaptiveDossierRepository; suppression=archivage; intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS sur BATIK_TEST/OMIKA_TEST; DO_NumDossier rubrique calculée Omika exclue des écritures (erreur HFSQL 28000002)
PlanningRDV,Planning_RDV,RDVPlanning,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,Rendez-vous; CRUD via RendezVousService/AdaptiveRendezVousRepository; suppression=archivage; intégration réelle CREATE→UPDATE→CANCEL→ARCHIVE→ROLLBACK PASS
Collaborateur,Collaborateur,Collaborateur,BUSINESS_AGGREGATE,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,IMPLEMENTED,SEMANTIC_DELETE,YES,YES,YES,YES,YES,YES,VERIFIED,Collaborateur interne; CRUD via CollaborateurService/AdaptiveCollaborateurRepository; suppression=archivage (CO_Actif=false); intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS
Societe,Societe,Societe,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,YES,YES,INTERNAL_ONLY,Société (référentiel); lecture interne uniquement, aucun besoin public démontré
Equipe,Equipe,Equipe,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,YES,YES,INTERNAL_ONLY,Équipe (référentiel); pas d'identité publique canonique, aucun GUID fabriqué
Utilisateur,Utilisateur,Utilisateur,SYSTEM_CONFIGURATION,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Utilisateur système
ParametreMetier,ParametreMetier,ParametreMetier,REFERENCE_DATA,NOT_APPLICABLE,READ_ONLY,READ_ONLY,NOT_APPLICABLE,NOT_APPLICABLE,YES,YES,YES,YES,YES,YES,READ_ONLY_VERIFIED,Référentiel métier (types/statuts); lecture publique via GET /reference-data/{key}; IReferenceDataRepository/Service + Adaptive + Batik/Omika
ParametreMetierEntete,ParametreMetierEntete,ParametreMetierEntete,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,YES,YES,INTERNAL_ONLY,En-tête des paramètres métier; historique/protégé, lecture interne uniquement
ParametreSysteme,ParametreSysteme,ParametreSysteme,SYSTEM_CONFIGURATION,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Paramètres système
EtatIntervention,EtatIntervention,EtatIntervention,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,YES,YES,INTERNAL_ONLY,États d'intervention; table d'historique chargée en interne par Intervention, pas de liste publique autonome
ClientAdresse,ClientAdresse,ClientAdresse,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation client-adresse (via agrégat)
ClientLieu,ClientLieu,ClientLieu,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation client-lieu (via agrégat)
ClientBddExterne,ClientBddExterne,ClientBddExterne,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation client-base externe
InterventionCollaborateur,InterventionCollaborateur,InterventionCollaborateur,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation intervention-collaborateur
InterventionPersonne,InterventionPersonne,InterventionPersonne,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation intervention-personne
LieuPersonne,LieuPersonne,LieuPersonne,JOIN_TABLE,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,YES,YES,NOT_STARTED,Relation lieu-personne
ElementSupprime,,ElementSupprime,VERSION_OPTIONAL,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NOT_STARTED,NO,NO,NO,NO,NO,YES,NOT_STARTED,Table de suppression logique (Omika uniquement)
Role,,Role,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,NO,YES,SCHEMA_SPECIFIC,Rôles (Omika uniquement); lecture interne, absent sous Batik (SchemaCapabilities.SupportsRoles)
Etats,,Etats,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,NO,YES,SCHEMA_SPECIFIC,États (Omika uniquement); lecture interne, absent sous Batik
ModeleRapport,,ModeleRapport,REFERENCE_DATA,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NOT_APPLICABLE,NO,NO,NO,NO,NO,YES,NOT_REQUIRED,Modèles de rapport (Omika uniquement); aucun besoin public démontré
1 DomainEntity BatikTable OmikaTable Category Create ReadOne ReadList Update Delete PublicApi ExistingService ExistingRepository ExistingEndpoint BatikSupported OmikaSupported Status Notes
2 Client Client Client BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED YES YES YES YES YES YES VERIFIED CRUD complet via ClientService/AdaptiveClientRepository
3 Personne Personne Personne BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED YES YES YES YES YES YES VERIFIED CRUD complet via ContactService/AdaptiveContactRepository
4 Adresse Adresse Adresse BUSINESS_CHILD NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Adresse partagée entre clients/personnes/sites
5 Lieu Lieu Lieu BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED Site/lieu d'intervention; CRUD via SiteService/AdaptiveSiteRepository/BatikSiteRepository/OmikaSiteRepository; suppression=archivage
6 Document Document Document BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED NOT_APPLICABLE SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED Document immuable après création; suppression = archivage (Archive)
7 Intervention Intervention Intervention BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED CRUD complet via InterventionService/AdaptiveInterventionRepository; suppression=archivage; intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS sur BATIK_TEST/OMIKA_TEST; relations Collaborateur/Personne câblées; IDs invalides→DomainValidationException sans écriture partielle
8 Dossier Dossier Dossier BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED CRUD complet via DossierService/AdaptiveDossierRepository; suppression=archivage; intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS sur BATIK_TEST/OMIKA_TEST; DO_NumDossier rubrique calculée Omika exclue des écritures (erreur HFSQL 28000002)
9 PlanningRDV Planning_RDV RDVPlanning BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED Rendez-vous; CRUD via RendezVousService/AdaptiveRendezVousRepository; suppression=archivage; intégration réelle CREATE→UPDATE→CANCEL→ARCHIVE→ROLLBACK PASS
10 Collaborateur Collaborateur Collaborateur BUSINESS_AGGREGATE IMPLEMENTED IMPLEMENTED IMPLEMENTED IMPLEMENTED SEMANTIC_DELETE YES YES YES YES YES YES VERIFIED Collaborateur interne; CRUD via CollaborateurService/AdaptiveCollaborateurRepository; suppression=archivage (CO_Actif=false); intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS
11 Societe Societe Societe REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO YES YES INTERNAL_ONLY Société (référentiel); lecture interne uniquement aucun besoin public démontré
12 Equipe Equipe Equipe REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO YES YES INTERNAL_ONLY Équipe (référentiel); pas d'identité publique canonique aucun GUID fabriqué
13 Utilisateur Utilisateur Utilisateur SYSTEM_CONFIGURATION NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Utilisateur système
14 ParametreMetier ParametreMetier ParametreMetier REFERENCE_DATA NOT_APPLICABLE READ_ONLY READ_ONLY NOT_APPLICABLE NOT_APPLICABLE YES YES YES YES YES YES READ_ONLY_VERIFIED Référentiel métier (types/statuts); lecture publique via GET /reference-data/{key}; IReferenceDataRepository/Service + Adaptive + Batik/Omika
15 ParametreMetierEntete ParametreMetierEntete ParametreMetierEntete REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO YES YES INTERNAL_ONLY En-tête des paramètres métier; historique/protégé lecture interne uniquement
16 ParametreSysteme ParametreSysteme ParametreSysteme SYSTEM_CONFIGURATION NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Paramètres système
17 EtatIntervention EtatIntervention EtatIntervention REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO YES YES INTERNAL_ONLY États d'intervention; table d'historique chargée en interne par Intervention pas de liste publique autonome
18 ClientAdresse ClientAdresse ClientAdresse JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation client-adresse (via agrégat)
19 ClientLieu ClientLieu ClientLieu JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation client-lieu (via agrégat)
20 ClientBddExterne ClientBddExterne ClientBddExterne JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation client-base externe
21 InterventionCollaborateur InterventionCollaborateur InterventionCollaborateur JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation intervention-collaborateur
22 InterventionPersonne InterventionPersonne InterventionPersonne JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation intervention-personne
23 LieuPersonne LieuPersonne LieuPersonne JOIN_TABLE NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO YES YES NOT_STARTED Relation lieu-personne
24 ElementSupprime ElementSupprime VERSION_OPTIONAL NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NOT_STARTED NO NO NO NO NO YES NOT_STARTED Table de suppression logique (Omika uniquement)
25 Role Role REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO NO YES SCHEMA_SPECIFIC Rôles (Omika uniquement); lecture interne absent sous Batik (SchemaCapabilities.SupportsRoles)
26 Etats Etats REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO NO YES SCHEMA_SPECIFIC États (Omika uniquement); lecture interne absent sous Batik
27 ModeleRapport ModeleRapport REFERENCE_DATA NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NOT_APPLICABLE NO NO NO NO NO YES NOT_REQUIRED Modèles de rapport (Omika uniquement); aucun besoin public démontré
+106
View File
@@ -0,0 +1,106 @@
# Matrice de couverture CRUD
État de la couverture CRUD pour les agrégats métier Batik et Omika.
## Résumé
| Catégorie | Nombre | Statut |
|-----------|--------|--------|
| BUSINESS_AGGREGATE | 8 | 8 VERIFIED, 0 PARTIAL, 0 NOT_STARTED |
| BUSINESS_CHILD | 1 | NOT_STARTED |
| REFERENCE_DATA | 8 | 1 READ_ONLY_VERIFIED, 4 INTERNAL_ONLY, 2 SCHEMA_SPECIFIC, 1 NOT_REQUIRED |
| JOIN_TABLE | 6 | NOT_STARTED |
| SYSTEM_CONFIGURATION | 2 | NOT_STARTED |
| VERSION_OPTIONAL | 1 | NOT_STARTED |
## Agrégats métier (BUSINESS_AGGREGATE)
| Entité | Batik | Omika | Create | ReadOne | ReadList | Update | Delete | Statut |
|--------|-------|-------|--------|---------|----------|--------|--------|--------|
| Client | Client | Client | ✅ | ✅ | ✅ | ✅ | ✅ | VERIFIED |
| Personne | Personne | Personne | ✅ | ✅ | ✅ | ✅ | ✅ | VERIFIED |
| Lieu | Lieu | Lieu | ✅ | ✅ | ✅ | ✅ | 🗄️ | VERIFIED |
| Document | Document | Document | ✅ | ✅ | ✅ | N/A | 🗄️ | VERIFIED |
| Intervention | Intervention | Intervention | ✅ | ✅ | ✅ | ✅ | 🗄️ | VERIFIED |
| Dossier | Dossier | Dossier | ✅ | ✅ | ✅ | ✅ | 🗄️ | VERIFIED |
| PlanningRDV | Planning_RDV | RDVPlanning | ✅ | ✅ | ✅ | ✅ | 🗄️ | VERIFIED |
| Collaborateur | Collaborateur | Collaborateur | ✅ | ✅ | ✅ | ✅ | 🗄️ | VERIFIED |
## Référentiels (REFERENCE_DATA)
Lecture seule uniquement. Pas de CRUD administratif générique (C/U/D volontairement absents).
| Entité | Batik | Omika | Lecture | Classification | Statut |
|--------|-------|-------|---------|----------------|--------|
| Societe | Societe | Societe | ❌ | INTERNAL_REFERENCE_ONLY | INTERNAL_ONLY |
| Equipe | Equipe | Equipe | ❌ | INTERNAL_REFERENCE_ONLY | INTERNAL_ONLY |
| ParametreMetier | ParametreMetier | ParametreMetier | ✅ | PUBLIC_READ_REFERENCE | READ_ONLY_VERIFIED |
| ParametreMetierEntete | ParametreMetierEntete | ParametreMetierEntete | ❌ | INTERNAL_REFERENCE_ONLY | INTERNAL_ONLY |
| EtatIntervention | EtatIntervention | EtatIntervention | ❌ | INTERNAL_REFERENCE_ONLY | INTERNAL_ONLY |
| Role | — | Role | ❌ | SCHEMA_SPECIFIC | SCHEMA_SPECIFIC |
| Etats | — | Etats | ❌ | SCHEMA_SPECIFIC | SCHEMA_SPECIFIC |
| ModeleRapport | — | ModeleRapport | ❌ | NOT_REQUIRED | NOT_REQUIRED |
### Détail des classifications
- **ParametreMetier** (PUBLIC_READ_REFERENCE) : lecture publique via `GET /reference-data/{key}`. Câblé : `IReferenceDataRepository → AdaptiveReferenceDataRepository`, `IReferenceDataService → ReferenceDataService`, `BatikReferenceDataRepository` (filtre `PA_Code`) / `OmikaReferenceDataRepository` (filtre `PA_Categorie`). Retourne `ReferenceValueDto` (Key/LegacyId/Code/Label).
- **Societe** (INTERNAL_REFERENCE_ONLY) : aucun besoin public démontré (pas de sélecteur de société requis par l'application).
- **Equipe** (INTERNAL_REFERENCE_ONLY) : pas d'identité publique canonique exploitable indépendamment ; aucun GUID fabriqué.
- **ParametreMetierEntete** (INTERNAL_REFERENCE_ONLY) : référentiel historique/protégé, pas de CRUD public.
- **EtatIntervention** (INTERNAL_REFERENCE_ONLY) : table d'historique des états d'une intervention (chargée en interne par Intervention) ; les valeurs d'état proviennent de ParametreMetier. Pas de liste publique autonome.
- **Role** (SCHEMA_SPECIFIC) : Omika uniquement ; absent sous Batik (indiqué par `SchemaCapabilities.SupportsRoles`). Lecture interne.
- **Etats** (SCHEMA_SPECIFIC) : Omika uniquement ; absent sous Batik. Lecture interne.
- **ModeleRapport** (NOT_REQUIRED) : Omika uniquement ; aucun besoin public démontré.
## Tables de jointure (JOIN_TABLE)
Aucun CRUD public exposé. Gérées via les agrégats.
| Table | Batik | Omika |
|-------|-------|-------|
| ClientAdresse | ✅ | ✅ |
| ClientLieu | ✅ | ✅ |
| ClientBddExterne | ✅ | ✅ |
| InterventionCollaborateur | ✅ | ✅ |
| InterventionPersonne | ✅ | ✅ |
| LieuPersonne | ✅ | ✅ |
## Configuration système (SYSTEM_CONFIGURATION)
| Table | Batik | Omika |
|-------|-------|-------|
| Utilisateur | ✅ | ✅ |
| ParametreSysteme | ✅ | ✅ |
## Version optionnelle (VERSION_OPTIONAL)
| Table | Batik | Omika | Statut |
|-------|-------|-------|--------|
| ElementSupprime | — | ✅ | NOT_STARTED |
## Notes
- Client et Personne sont entièrement implémentés (VERIFIED).
- Lieu/Site est VERIFIED : CRUD complet implémenté et testé unitairement (Create/ReadOne/ReadList/Update + Archive) via SiteService/AdaptiveSiteRepository/BatikSiteRepository/OmikaSiteRepository. BATIK : table Lieu, création Adresse transactionnelle, type résolu via ParametreMetier. OMIKA : table Lieu, LI_CleType, GUID, Adresse Omika. API /sites. DI : ISiteRepository → AdaptiveSiteRepository, ISiteService → SiteService.
- Document est VERIFIED : Create/Read/List + Archive (suppression sémantique). Update = NOT_APPLICABLE (document immuable après création).
- Intervention est VERIFIED : CRUD complet implémenté et testé unitairement (Create/ReadOne/ReadList/Update + Archive), intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS contre BATIK_TEST/OMIKA_TEST, relations Collaborateur/Personne câblées (UPDATE), IDs relation invalides → DomainValidationException sans écriture partielle.
- Dossier est VERIFIED : CRUD complet implémenté et testé unitairement (Create/ReadOne/ReadList/Update + Archive), intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS contre BATIK_TEST/OMIKA_TEST. NB : dans la base Omika, DO_NumDossier est une rubrique CALCULÉE (erreur HFSQL 28000002) — elle est exclue des INSERT/UPDATE, générée par la base.
- RendezVous (PlanningRDV) est VERIFIED : CRUD complet implémenté et testé unitairement (Create/ReadOne/ReadList/Update + Cancel + Archive), intégration réelle CREATE→UPDATE→CANCEL→ARCHIVE→ROLLBACK PASS contre BATIK_TEST/OMIKA_TEST. NB : le provider OLE DB ne sait pas marshaler `DateOnly` vers un Variant — la couche de connexion normalise désormais `DateOnly` en `DateTime` avant transmission.
- Collaborateur est VERIFIED : CRUD complet implémenté et testé unitairement (Create/ReadOne/ReadList/Update + Archive), intégration réelle CREATE→UPDATE→ARCHIVE→ROLLBACK PASS contre BATIK_TEST/OMIKA_TEST. NB : l'archivage logique est réalisé par désactivation (CO_Actif = false), aucun DELETE physique. Les associations d'équipe (Equipe_Collaborateur) sont lues mais non converties en GUID canoniques (aucune table de correspondance) ; Role est NOT_APPLICABLE (géré via les agrégats).
- Les contrats de service existent pour Document, Intervention, RendezVous, Collaborateur et ReferenceData.
- REFERENCE_DATA : seul ParametreMetier est exposé en lecture publique (READ_ONLY_VERIFIED). Les autres référentiels sont internes (INTERNAL_ONLY), spécifiques à un schéma (SCHEMA_SPECIFIC) ou non requis (NOT_REQUIRED). Aucun endpoint supplémentaire n'a été créé : conforme à la règle « ne crée pas automatiquement un endpoint pour chaque table ».
- Les tables de jointure ne doivent pas être exposées en CRUD public.
- ElementSupprime est absent de OMIKA_TEST actuel : à traiter comme optionnel.
+163
View File
@@ -0,0 +1,163 @@
# État d'implémentation CRUD
État réel de l'implémentation CRUD par agrégat métier, basé sur le code et les tests réellement présents.
## Légende
- **VERIFIED** : implémenté et testé (unitaire et/ou intégration).
- **PARTIAL** : implémenté mais avec des zones non couvertes (intégration réelle, relations).
- **NOT_STARTED** : non implémenté.
- **NOT_APPLICABLE** : opération non pertinente pour l'entité.
- **NOT_COVERED** : non exécuté (intégration réelle absente).
## Client — VERIFIED
- Create / ReadOne / ReadList / Update / Delete : implémentés et testés.
- Via `ClientService` / `AdaptiveClientRepository` / `ClientEndpoints`.
- Suppression : archivage logique.
## Personne — VERIFIED
- Create / ReadOne / ReadList / Update / Delete : implémentés et testés.
- Via `ContactService` / `AdaptiveContactRepository` / `ContactEndpoints`.
- Suppression : archivage logique.
## Lieu/Site — VERIFIED
- Create / ReadOne / ReadList / Update / Delete : implémentés et testés.
- Via `SiteService` / `AdaptiveSiteRepository` / `BatikSiteRepository` / `OmikaSiteRepository` / `SiteEndpoints`.
- BATIK : table physique `Lieu`, création Adresse transactionnelle, type résolu via `ParametreMetier`.
- OMIKA : table physique `Lieu`, `LI_CleType`, GUID, Adresse Omika.
- `AdaptiveSiteRepository` route selon `DatabaseSchemaVersion`.
- API : `/sites`.
- DI : `ISiteRepository → AdaptiveSiteRepository`, `ISiteService → SiteService`.
- Suppression : archivage logique.
- Tests : `BatikSiteMapperTests`, `OmikaSiteMapperTests` (PASS).
## Document — VERIFIED
- Create / ReadOne / ReadList : implémentés et testés.
- Update : NOT_APPLICABLE (document immuable après création).
- Delete : SEMANTIC_DELETE (archivage via `Archive`).
## Intervention — VERIFIED
### CRUD (implémenté et testé unitairement)
| Opération | Statut | Implémentation | Tests |
|-----------|--------|----------------|-------|
| Create | IMPLEMENTED | `InterventionService.CreateAsync` → `AdaptiveInterventionRepository` → `Batik/OmikaInterventionRepository` | `BatikInterventionRepositoryTests`, `OmikaInterventionRepositoryTests`, `InterventionServiceTests`, `InterventionEndpointsTests` |
| ReadOne | IMPLEMENTED | `GetByIdAsync` → `GetDetailsAsync` | idem |
| ReadList/Search | IMPLEMENTED | `SearchAsync` | idem |
| Update | IMPLEMENTED | `UpdateAsync` | idem |
| Delete | SEMANTIC_DELETE | `ArchiveAsync` (archivage logique, jamais DELETE) | idem |
### Relations
| Relation | Statut | Détail |
|----------|--------|--------|
| EtatIntervention | VERIFIED (unitaire) | Chargée via `LoadEtatsInterventionAsync`, mappée en `ActionIntervention`. Testée dans `BatikInterventionRepositoryTests`. |
| InterventionCollaborateur | VERIFIED (unitaire) | `CollaborateurIds` persistés dans `InterventionCollaborateur` (DELETE + INSERT) sur Update. IDs invalides → `DomainValidationException` sans écriture partielle. Testé (`UpdateAsync_PersistsCollaborateurAndPersonneRelations`, `UpdateAsync_InvalidCollaborateurId_ThrowsControlledError`). |
| InterventionPersonne | VERIFIED (unitaire) | `ContactIds` persistés dans `InterventionPersonne` (DELETE + INSERT) sur Update. IDs invalides → `DomainValidationException` sans écriture partielle. Testé (`UpdateAsync_PersistsPersonneRelations`, `UpdateAsync_InvalidContactId_ThrowsControlledError`). |
### Intégration
| Cible | Statut | Détail |
|-------|--------|--------|
| BATIK_TEST | PASS | `HfSqlOleDbInterventionLifecycleIntegrationTests.Batik_CreateUpdateArchive_RollsBackAtomically` exécuté et PASS : CREATE → UPDATE → ARCHIVE → ROLLBACK dans une transaction externe unique. |
| OMIKA_TEST | PASS | `HfSqlOleDbInterventionLifecycleIntegrationTests.Omika_CreateUpdateArchive_RollsBackAtomically` exécuté et PASS : CREATE → UPDATE → ARCHIVE → ROLLBACK dans une transaction externe unique. |
Les tests `HfSqlOleDbInterventionLifecycleIntegrationTests` exécutent le cycle de vie complet contre les vraies bases BATIK_TEST/OMIKA_TEST via le provider OLE DB, puis annulent (rollback) pour ne laisser aucune trace. Ils s'ignorent uniquement si la config est absente ou le serveur injoignable.
### Transaction
| Opération | Statut | Détail |
|-----------|--------|--------|
| CreateTransaction | PASS | `CreateAsync(command, transaction, ct)` exécute l'INSERT racine et les relations dans UNE transaction (interne ou externe). Exercé en intégration. |
| UpdateTransaction | PASS | `UpdateAsync(command, transaction, ct)` exécute UPDATE + DELETE/INSERT relations dans UNE transaction. Exercé en intégration. |
| Rollback | PASS | Rollback externe prouvé en intégration (CREATE→UPDATE→ARCHIVE→ROLLBACK). |
| PartialFailureRollback | NOT_COVERED | Aucun test ne provoque une erreur après une première écriture pour démontrer le rollback interne. Non bloquant : Create/Update utilisent bien une transaction unique, l'intégration réelle passe, le rollback externe est prouvé, aucune perte silencieuse de relations. |
### Application
| Couche | Statut | Détail |
|--------|--------|--------|
| AdaptiveRepository | PASS | `AdaptiveInterventionRepository` délègue selon le schéma détecté. Testé (`AdaptiveInterventionRepositoryTests`). |
| Service | PASS | `InterventionService` orchestre requête → critère → repository → DTO. Testé (`InterventionServiceTests`). |
| API | PASS | `InterventionEndpoints` (GET/POST/PUT/DELETE). Testé (`InterventionEndpointsTests`). |
## Dossier — VERIFIED
### CRUD (implémenté et testé unitairement)
| Opération | Statut | Implémentation | Tests |
|-----------|--------|----------------|-------|
| Create | IMPLEMENTED | `DossierService.CreateAsync` → `AdaptiveDossierRepository` → `Batik/OmikaDossierRepository` | `BatikDossierRepositoryTests`, `OmikaDossierRepositoryTests`, `DossierServiceTests`, `DossierEndpointsTests` |
| ReadOne | IMPLEMENTED | `GetDetailsAsync` | idem |
| ReadList/Search | IMPLEMENTED | `SearchAsync` | idem |
| Update | IMPLEMENTED | `UpdateAsync` | idem |
| Delete | SEMANTIC_DELETE | `ArchiveAsync` (archivage logique, jamais DELETE) | idem |
### Intégration
| Cible | Statut | Détail |
|-------|--------|--------|
| BATIK_TEST | PASS | `HfSqlOleDbDossierLifecycleIntegrationTests.Batik_CreateUpdateArchive_RollsBackAtomically` exécuté et PASS : CREATE → UPDATE → ARCHIVE → ROLLBACK dans une transaction externe unique. |
| OMIKA_TEST | PASS | `HfSqlOleDbDossierLifecycleIntegrationTests.Omika_CreateUpdateArchive_RollsBackAtomically` exécuté et PASS : CREATE → UPDATE → ARCHIVE → ROLLBACK dans une transaction externe unique. |
Les tests `HfSqlOleDbDossierLifecycleIntegrationTests` exécutent le cycle de vie complet contre les vraies bases BATIK_TEST/OMIKA_TEST via le provider OLE DB, puis annulent (rollback) pour ne laisser aucune trace. Ils s'ignorent uniquement si la config est absente ou le serveur injoignable.
### Particularité Omika — DO_NumDossier (rubrique calculée)
Dans la base Omika, `DO_NumDossier` est une **rubrique calculée** : toute écriture (INSERT/UPDATE) lève l'erreur HFSQL `28000002` (« Opération interdite sur la rubrique <Dossier.DO_NumDossier> : il s'agit d'une rubrique calculée »). Le `OmikaDossierRepository` exclut donc `DO_NumDossier` des INSERT/UPDATE : la valeur est générée par la base elle-même. La lecture (SELECT) reste possible. Ce comportement a été découvert et corrigé lors de l'intégration réelle.
### Transaction
| Opération | Statut | Détail |
|-----------|--------|--------|
| CreateTransaction | PASS | `CreateAsync(command, transaction, ct)` exécute l'INSERT racine dans UNE transaction (interne ou externe). Exercé en intégration. |
| UpdateTransaction | PASS | `UpdateAsync(command, transaction, ct)` exécute l'UPDATE dans UNE transaction. Exercé en intégration. |
| Rollback | PASS | Rollback externe prouvé en intégration (CREATE→UPDATE→ARCHIVE→ROLLBACK). |
### Application
| Couche | Statut | Détail |
|--------|--------|--------|
| AdaptiveRepository | PASS | `AdaptiveDossierRepository` délègue selon le schéma détecté. Testé (`AdaptiveDossierRepositoryTests`). |
| Service | PASS | `DossierService` orchestre requête → critère → repository → DTO. Testé (`DossierServiceTests`). |
| API | PASS | `DossierEndpoints` (GET/POST/PUT/DELETE). Testé (`DossierEndpointsTests`). |
## Référentiels (REFERENCE_DATA) — lecture seule
Les référentiels sont exposés en **lecture seule uniquement**. Aucun CRUD administratif générique (Create/Update/Delete) n'est créé : conforme à la règle « ne crée pas automatiquement un endpoint pour chaque table ».
### ParametreMetier — READ_ONLY_VERIFIED (PUBLIC_READ_REFERENCE)
Seul référentiel exposé en lecture publique, via le mécanisme générique existant :
- Endpoint : `GET /reference-data/{key}` (`MapReferenceDataEndpoints`).
- Service : `IReferenceDataService → ReferenceDataService`.
- Repository : `IReferenceDataRepository → AdaptiveReferenceDataRepository` (route selon le schéma détecté).
- Implémentations : `BatikReferenceDataRepository` (filtre `PA_Code`) / `OmikaReferenceDataRepository` (filtre `PA_Categorie`).
- Retour : `ReferenceValueDto` (Key / LegacyId / Code / Label).
- DI : enregistré dans `ServiceCollectionExtensions` (Scoped).
### Autres référentiels — aucune exposition publique
| Entité | Classification | Justification |
|--------|----------------|---------------|
| Societe | INTERNAL_REFERENCE_ONLY | Aucun besoin public démontré (pas de sélecteur de société requis). |
| Equipe | INTERNAL_REFERENCE_ONLY | Pas d'identité publique canonique exploitable indépendamment ; aucun GUID fabriqué. |
| ParametreMetierEntete | INTERNAL_REFERENCE_ONLY | Référentiel historique/protégé, pas de CRUD public. |
| EtatIntervention | INTERNAL_REFERENCE_ONLY | Table d'historique des états d'une intervention, chargée en interne par Intervention ; les valeurs d'état proviennent de ParametreMetier. Pas de liste publique autonome. |
| Role | SCHEMA_SPECIFIC | Omika uniquement ; absent sous Batik (`SchemaCapabilities.SupportsRoles`). Lecture interne. |
| Etats | SCHEMA_SPECIFIC | Omika uniquement ; absent sous Batik. Lecture interne. |
| ModeleRapport | NOT_REQUIRED | Omika uniquement ; aucun besoin public démontré. |
Aucun nouveau code n'a été nécessaire pour ce lot : le seul référentiel public (ParametreMetier) était déjà implémenté et câblé. Les autres restent internes.
## Blocker
Aucun. L'intégration réelle contre BATIK_TEST/OMIKA_TEST avec rollback est couverte et PASS pour Intervention et Dossier. Dossier est VERIFIED (avec la particularité Omika `DO_NumDossier` rubrique calculée gérée).
File diff suppressed because it is too large Load Diff
+71
View File
@@ -0,0 +1,71 @@
# HFSQL Model Audit — Diagnostic
## Batik
### Résumé
- Tables Expected: 48
- Tables Accessible: 48
- Tables Verified: 37
- Tables Partial: 0
- Tables Conflict: 11
- Tables Failed: 0
- Tables AbsentCurrentVersion: 0
- Columns Checked: 560
- Column Conflicts: 13
### Divergences
- Client_Adresse.CA_IDCli_IDAd [MODEL_ONLY] Column declared in model but not present in physical schema.
- Client_BddExterne.CLX_IDBddExterneCLX_IDCLient [MODEL_ONLY] Column declared in model but not present in physical schema.
- Equipe_Collaborateur.EC_IDEquipe_EC_IDCollaborateur [MODEL_ONLY] Column declared in model but not present in physical schema.
- Intervention_BddExterne.INX_IDBaseExtINX_IDIntervention [MODEL_ONLY] Column declared in model but not present in physical schema.
- Intervention_ChampLibre.ICL_IDIntervention_ICL_IDParametreM [MODEL_ONLY] Column declared in model but not present in physical schema.
- MailCat.MMC_CodeModMail_CodeCat [MODEL_ONLY] Column declared in model but not present in physical schema.
- MotClef.MOC_CodeMOC_Langue [MODEL_ONLY] Column declared in model but not present in physical schema.
- MotClef.MOC_MotMOC_Langue [MODEL_ONLY] Column declared in model but not present in physical schema.
- ParametreMetier.PA_CodePA_Valeur [MODEL_ONLY] Column declared in model but not present in physical schema.
- ParametreUtilisateur.PU_CodePU_IDUtilisateur [MODEL_ONLY] Column declared in model but not present in physical schema.
- Planning_RDV_Personne.PRP_PKID_PE_PKID [MODEL_ONLY] Column declared in model but not present in physical schema.
- Societe_Collaborateur.SC_IDCSoc_IDCol [MODEL_ONLY] Column declared in model but not present in physical schema.
- Societe_Collaborateur.SC_IDCSociete_SC_IDCollaborateur [MODEL_ONLY] Column declared in model but not present in physical schema.
## Omika
### Résumé
- Tables Expected: 58
- Tables Accessible: 57
- Tables Verified: 46
- Tables Partial: 0
- Tables Conflict: 11
- Tables Failed: 0
- Tables AbsentCurrentVersion: 1
- Columns Checked: 713
- Column Conflicts: 13
### Divergences
- Client_Adresse.CA_IDCli_IDAd [MODEL_ONLY] Column declared in model but not present in physical schema.
- Client_BddExterne.CLX_IDBddExterneCLX_IDCLient [MODEL_ONLY] Column declared in model but not present in physical schema.
- ElementSupprime.ES_PKID [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_NumEnrg [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_IdEnrg [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_Fichier [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_IdUser [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_DateHeure [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- ElementSupprime.ES_NumEnr_Id [ABSENT_IN_CURRENT_TEST_VERSION] Physical file absent in current test database version.
- Equipe_Collaborateur.EC_IDEquipe_EC_IDCollaborateur [MODEL_ONLY] Column declared in model but not present in physical schema.
- Intervention_BddExterne.INX_IDBaseExtINX_IDIntervention [MODEL_ONLY] Column declared in model but not present in physical schema.
- Intervention_ChampLibre.ICL_IDIntervention_ICL_IDParametreM [MODEL_ONLY] Column declared in model but not present in physical schema.
- MailCat.MMC_CodeModMail_CodeCat [MODEL_ONLY] Column declared in model but not present in physical schema.
- MotClef.MOC_CodeMOC_Langue [MODEL_ONLY] Column declared in model but not present in physical schema.
- MotClef.MOC_MotMOC_Langue [MODEL_ONLY] Column declared in model but not present in physical schema.
- ParametreMetier.PA_CodePA_Valeur [MODEL_ONLY] Column declared in model but not present in physical schema.
- ParametreUtilisateur.PU_CodePU_IDUtilisateur [MODEL_ONLY] Column declared in model but not present in physical schema.
- Planning_RDV_Personne.PRP_PKID_PE_PKID [MODEL_ONLY] Column declared in model but not present in physical schema.
- Societe_Collaborateur.SC_IDCSoc_IDCol [MODEL_ONLY] Column declared in model but not present in physical schema.
- Societe_Collaborateur.SC_IDCSociete_SC_IDCollaborateur [MODEL_ONLY] Column declared in model but not present in physical schema.
+213
View File
@@ -0,0 +1,213 @@
Schema,Table,DiskName,ExpectedGroup,DirectAccess,ProtectedAccess,FinalAccess,FieldCount,HasRows,HfSqlErrorCode
Batik,AccesEtDroit,AccesEtDroit.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Action,Action.fic,ProtectionStd,True,False,DIRECT,9,True,
Batik,Adresse,Adresse.fic,ProtectionStd,True,False,DIRECT,14,True,
Batik,BddExterne,BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,CheckList,CheckList.fic,ProtectionStd,True,False,DIRECT,12,False,
Batik,CheckList_Collab,CheckList_Collab.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,Client,Client.fic,ProtectionStd,True,False,DIRECT,31,True,
Batik,Client_Adresse,Client_Adresse.fic,ProtectionStd,True,False,DIRECT,5,True,
Batik,Client_BddExterne,Client_BddExterne.fic,ProtectionStd,True,False,DIRECT,9,True,
Batik,Client_Lieu,Client_Lieu.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Collaborateur,Collaborateur.fic,ProtectionStd,True,False,DIRECT,20,True,
Batik,CompteRendu,CompteRendu.fic,ProtectionStd,True,False,DIRECT,22,True,
Batik,Compteur,Compteur.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Document,Document.fic,ProtectionStd,True,False,DIRECT,15,True,
Batik,DocumentNote,DocumentNote.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,Dossier,Dossier.fic,ProtectionStd,True,False,DIRECT,17,True,
Batik,Equipe,Equipe.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Equipe_Collaborateur,Equipe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,EtatIntervention,EtatIntervention.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,Intervention,Intervention.fic,ProtectionStd,True,False,DIRECT,29,True,
Batik,Intervention_BddExterne,Intervention_BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Intervention_ChampLibre,Intervention_ChampLibre.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,Intervention_Collaborateur,Intervention_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,False,
Batik,Intervention_Personne,Intervention_Personne.fic,ProtectionStd,True,False,DIRECT,14,True,
Batik,Lieu,Lieu.fic,ProtectionStd,False,False,FAILED,0,False,70114
Batik,Lieu_Personne,Lieu_Personne.fic,ProtectionStd,True,False,DIRECT,15,True,
Batik,MailCat,MailCat.fic,ProtectionStd,True,False,DIRECT,3,True,
Batik,MailModele,MailModele.fic,ProtectionStd,True,False,DIRECT,11,True,
Batik,MessageExterne,MessageExterne.fic,ProtectionStd,True,False,DIRECT,17,True,
Batik,MessageInterne,MessageInterne.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Mobile,Mobile.fic,ProtectionStd,True,False,DIRECT,3,False,
Batik,MobLog,MobLog.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,MobReception,MobReception.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,ModeleRapportMob,ModeleRapportMob.fic,ProtectionStd,False,False,FAILED,0,False,70114
Batik,MotClef,MotClef.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,ParametreApplication,ParametreApplication.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,ParametreMetier,ParametreMetier.fic,ProtectionStd,False,False,FAILED,0,False,70114
Batik,ParametreMetierEntete,ParametreMetierEntete.fic,ProtectionPlus,False,False,FAILED,0,False,70114
Batik,ParametreSysteme,ParametreSysteme.fic,ProtectionPlus,False,False,FAILED,0,False,70114
Batik,ParametreUtilisateur,ParametreUtilisateur.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,Personne,Personne.fic,ProtectionStd,True,False,DIRECT,22,True,
Batik,Planning_RDV,Planning_RDV.fic,ProtectionStd,True,False,DIRECT,35,True,
Batik,Planning_RDV_Personne,Planning_RDV_Personne.fic,ProtectionStd,True,False,DIRECT,10,True,
Batik,Societe,Societe.fic,ProtectionStd,True,False,DIRECT,16,True,
Batik,Societe_Collaborateur,Societe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,SuiviDesTemps,SuiviDesTemps.fic,ProtectionStd,True,False,DIRECT,20,True,
Batik,Telephone,Telephone.fic,ProtectionStd,True,False,DIRECT,4,False,
Batik,Utilisateur,Utilisateur.fic,ProtectionStd,True,False,DIRECT,19,True,
Omika,AccesEtDroit,AccesEtDroit.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,Action,Action.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,Adresse,Adresse.fic,ProtectionStd,True,False,DIRECT,16,True,
Omika,BddExterne,BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,CategorieAcces,CategorieAcces.fic,ProtectionStd,True,False,DIRECT,11,True,
Omika,CheckList,CheckList.fic,ProtectionStd,True,False,DIRECT,12,False,
Omika,CheckList_Collab,CheckList_Collab.fic,ProtectionStd,True,False,DIRECT,8,False,
Omika,Client,Client.fic,ProtectionStd,True,False,DIRECT,37,True,
Omika,Client_Adresse,Client_Adresse.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Client_BddExterne,Client_BddExterne.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,Client_Lieu,Client_Lieu.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Collaborateur,Collaborateur.fic,ProtectionStd,True,False,DIRECT,23,True,
Omika,CompteRendu,CompteRendu.fic,ProtectionStd,True,False,DIRECT,24,True,
Omika,Compteur,Compteur.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Doc_Aide,doc_aide.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,Document,Document.fic,ProtectionStd,True,False,DIRECT,17,False,
Omika,DocumentNote,DocumentNote.fic,ProtectionStd,True,False,DIRECT,6,False,
Omika,Dossier,Dossier.fic,ProtectionStd,True,False,DIRECT,20,True,
Omika,ElementModifie,elementmodifie.fic,ProtectionStd,True,False,DIRECT,5,True,
Omika,ElementSupprime,elementsupprime.fic,ProtectionStd,False,False,FAILED,0,False,70208
Omika,Equipe,Equipe.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Equipe_Collaborateur,Equipe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,EtatIntervention,EtatIntervention.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Etats,Etats.fic,ProtectionPlus,False,False,FAILED,0,False,70114
Omika,Intervention,Intervention.fic,ProtectionStd,True,False,DIRECT,32,True,
Omika,Intervention_BddExterne,Intervention_BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Intervention_ChampLibre,Intervention_ChampLibre.fic,ProtectionStd,True,False,DIRECT,8,False,
Omika,Intervention_Personne,Intervention_Personne.fic,ProtectionStd,True,False,DIRECT,15,True,
Omika,Lieu,Lieu.fic,ProtectionStd,True,False,DIRECT,21,True,
Omika,Lieu_Personne,Lieu_Personne.fic,ProtectionStd,True,False,DIRECT,17,True,
Omika,MailCat,MailCat.fic,ProtectionStd,True,False,DIRECT,3,True,
Omika,MailModele,MailModele.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,MessageExterne,MessageExterne.fic,ProtectionStd,True,False,DIRECT,18,True,
Omika,MessageInterne,MessageInterne.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Mobile,Mobile.fic,ProtectionStd,True,False,DIRECT,3,False,
Omika,MobLog,MobLog.fic,ProtectionStd,True,False,DIRECT,4,False,
Omika,MobReception,MobReception.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,ModeleRapport,ModeleRapport.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,ModeleRapportMob,ModeleRapportMob.fic,ProtectionStd,False,False,FAILED,0,False,70114
Omika,MotClef,MotClef.fic,ProtectionStd,True,False,DIRECT,6,True,
Omika,ParametreApplication,ParametreApplication.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,ParametreMetier,ParametreMetier.fic,ProtectionStd,False,False,FAILED,0,False,70114
Omika,ParametreMetierEntete,ParametreMetierEntete.fic,ProtectionPlus,False,False,FAILED,0,False,70114
Omika,ParametreSysteme,ParametreSysteme.fic,ProtectionPlus,False,False,FAILED,0,False,70114
Omika,ParametreUtilisateur,ParametreUtilisateur.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,Personne,Personne.fic,ProtectionStd,True,False,DIRECT,25,True,
Omika,Planning_RDV,Planning_RDV.fic,ProtectionStd,True,False,DIRECT,39,True,
Omika,Planning_RDV_Personne,Planning_RDV_Personne.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,RDV_Collaborateur,RDV_Collaborateur.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,RDV_Contact,RDV_Contact.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,RDV_Planning,RDV_Planning.fic,ProtectionStd,True,False,DIRECT,22,True,
Omika,Role,Role.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,RubriquesDocument,RubriquesDocument.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,Societe,Societe.fic,ProtectionStd,True,False,DIRECT,18,True,
Omika,Societe_Collaborateur,Societe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,SuiviDesTemps,SuiviDesTemps.fic,ProtectionStd,True,False,DIRECT,25,True,
Omika,Telephone,Telephone.fic,ProtectionStd,True,False,DIRECT,4,False,
Omika,Utilisateur,Utilisateur.fic,ProtectionStd,True,False,DIRECT,20,True,
Batik,AccesEtDroit,AccesEtDroit.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Action,Action.fic,ProtectionStd,True,False,DIRECT,9,True,
Batik,Adresse,Adresse.fic,ProtectionStd,True,False,DIRECT,14,True,
Batik,BddExterne,BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,CheckList,CheckList.fic,ProtectionStd,True,False,DIRECT,12,False,
Batik,CheckList_Collab,CheckList_Collab.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,Client,Client.fic,ProtectionStd,True,False,DIRECT,31,True,
Batik,Client_Adresse,Client_Adresse.fic,ProtectionStd,True,False,DIRECT,5,True,
Batik,Client_BddExterne,Client_BddExterne.fic,ProtectionStd,True,False,DIRECT,9,True,
Batik,Client_Lieu,Client_Lieu.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Collaborateur,Collaborateur.fic,ProtectionStd,True,False,DIRECT,20,True,
Batik,CompteRendu,CompteRendu.fic,ProtectionStd,True,False,DIRECT,22,True,
Batik,Compteur,Compteur.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Document,Document.fic,ProtectionStd,True,False,DIRECT,15,True,
Batik,DocumentNote,DocumentNote.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,Dossier,Dossier.fic,ProtectionStd,True,False,DIRECT,17,True,
Batik,Equipe,Equipe.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Equipe_Collaborateur,Equipe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,EtatIntervention,EtatIntervention.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,Intervention,Intervention.fic,ProtectionStd,True,False,DIRECT,29,True,
Batik,Intervention_BddExterne,Intervention_BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Batik,Intervention_ChampLibre,Intervention_ChampLibre.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,Intervention_Collaborateur,Intervention_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,False,
Batik,Intervention_Personne,Intervention_Personne.fic,ProtectionStd,True,False,DIRECT,14,True,
Batik,Lieu,Lieu.fic,ProtectionStd,False,True,PROTECTION_STD,19,True,70114
Batik,Lieu_Personne,Lieu_Personne.fic,ProtectionStd,True,False,DIRECT,15,True,
Batik,MailCat,MailCat.fic,ProtectionStd,True,False,DIRECT,3,True,
Batik,MailModele,MailModele.fic,ProtectionStd,True,False,DIRECT,11,True,
Batik,MessageExterne,MessageExterne.fic,ProtectionStd,True,False,DIRECT,17,True,
Batik,MessageInterne,MessageInterne.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,Mobile,Mobile.fic,ProtectionStd,True,False,DIRECT,3,False,
Batik,MobLog,MobLog.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,MobReception,MobReception.fic,ProtectionStd,True,False,DIRECT,8,False,
Batik,ModeleRapportMob,ModeleRapportMob.fic,ProtectionStd,False,True,PROTECTION_STD,4,False,70114
Batik,MotClef,MotClef.fic,ProtectionStd,True,False,DIRECT,6,True,
Batik,ParametreApplication,ParametreApplication.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,ParametreMetier,ParametreMetier.fic,ProtectionStd,False,True,PROTECTION_STD,12,True,70114
Batik,ParametreMetierEntete,ParametreMetierEntete.fic,ProtectionPlus,False,True,PROTECTION_PLUS,8,True,70114
Batik,ParametreSysteme,ParametreSysteme.fic,ProtectionPlus,False,True,PROTECTION_PLUS,4,True,70114
Batik,ParametreUtilisateur,ParametreUtilisateur.fic,ProtectionStd,True,False,DIRECT,4,True,
Batik,Personne,Personne.fic,ProtectionStd,True,False,DIRECT,22,True,
Batik,Planning_RDV,Planning_RDV.fic,ProtectionStd,True,False,DIRECT,35,True,
Batik,Planning_RDV_Personne,Planning_RDV_Personne.fic,ProtectionStd,True,False,DIRECT,10,True,
Batik,Societe,Societe.fic,ProtectionStd,True,False,DIRECT,16,True,
Batik,Societe_Collaborateur,Societe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Batik,SuiviDesTemps,SuiviDesTemps.fic,ProtectionStd,True,False,DIRECT,20,True,
Batik,Telephone,Telephone.fic,ProtectionStd,True,False,DIRECT,4,False,
Batik,Utilisateur,Utilisateur.fic,ProtectionStd,True,False,DIRECT,19,True,
Omika,AccesEtDroit,AccesEtDroit.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,Action,Action.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,Adresse,Adresse.fic,ProtectionStd,True,False,DIRECT,16,True,
Omika,BddExterne,BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,CategorieAcces,CategorieAcces.fic,ProtectionStd,True,False,DIRECT,11,True,
Omika,CheckList,CheckList.fic,ProtectionStd,True,False,DIRECT,12,False,
Omika,CheckList_Collab,CheckList_Collab.fic,ProtectionStd,True,False,DIRECT,8,False,
Omika,Client,Client.fic,ProtectionStd,True,False,DIRECT,37,True,
Omika,Client_Adresse,Client_Adresse.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Client_BddExterne,Client_BddExterne.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,Client_Lieu,Client_Lieu.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Collaborateur,Collaborateur.fic,ProtectionStd,True,False,DIRECT,23,True,
Omika,CompteRendu,CompteRendu.fic,ProtectionStd,True,False,DIRECT,24,True,
Omika,Compteur,Compteur.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Doc_Aide,doc_aide.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,Document,Document.fic,ProtectionStd,True,False,DIRECT,17,False,
Omika,DocumentNote,DocumentNote.fic,ProtectionStd,True,False,DIRECT,6,False,
Omika,Dossier,Dossier.fic,ProtectionStd,True,False,DIRECT,20,True,
Omika,ElementModifie,elementmodifie.fic,ProtectionStd,True,False,DIRECT,5,True,
Omika,ElementSupprime,elementsupprime.fic,ProtectionStd,False,False,FAILED,0,False,70208
Omika,Equipe,Equipe.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Equipe_Collaborateur,Equipe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,EtatIntervention,EtatIntervention.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Etats,Etats.fic,ProtectionPlus,False,True,PROTECTION_PLUS,5,True,70114
Omika,Intervention,Intervention.fic,ProtectionStd,True,False,DIRECT,32,True,
Omika,Intervention_BddExterne,Intervention_BddExterne.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,Intervention_ChampLibre,Intervention_ChampLibre.fic,ProtectionStd,True,False,DIRECT,8,False,
Omika,Intervention_Personne,Intervention_Personne.fic,ProtectionStd,True,False,DIRECT,15,True,
Omika,Lieu,Lieu.fic,ProtectionStd,True,False,DIRECT,21,True,
Omika,Lieu_Personne,Lieu_Personne.fic,ProtectionStd,True,False,DIRECT,17,True,
Omika,MailCat,MailCat.fic,ProtectionStd,True,False,DIRECT,3,True,
Omika,MailModele,MailModele.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,MessageExterne,MessageExterne.fic,ProtectionStd,True,False,DIRECT,18,True,
Omika,MessageInterne,MessageInterne.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,Mobile,Mobile.fic,ProtectionStd,True,False,DIRECT,3,False,
Omika,MobLog,MobLog.fic,ProtectionStd,True,False,DIRECT,4,False,
Omika,MobReception,MobReception.fic,ProtectionStd,True,False,DIRECT,8,True,
Omika,ModeleRapport,ModeleRapport.fic,ProtectionStd,True,False,DIRECT,9,True,
Omika,ModeleRapportMob,ModeleRapportMob.fic,ProtectionStd,False,True,PROTECTION_STD,4,False,70114
Omika,MotClef,MotClef.fic,ProtectionStd,True,False,DIRECT,6,True,
Omika,ParametreApplication,ParametreApplication.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,ParametreMetier,ParametreMetier.fic,ProtectionStd,False,True,PROTECTION_STD,14,True,70114
Omika,ParametreMetierEntete,ParametreMetierEntete.fic,ProtectionPlus,False,True,PROTECTION_PLUS,10,True,70114
Omika,ParametreSysteme,ParametreSysteme.fic,ProtectionPlus,False,True,PROTECTION_PLUS,4,True,70114
Omika,ParametreUtilisateur,ParametreUtilisateur.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,Personne,Personne.fic,ProtectionStd,True,False,DIRECT,25,True,
Omika,Planning_RDV,Planning_RDV.fic,ProtectionStd,True,False,DIRECT,39,True,
Omika,Planning_RDV_Personne,Planning_RDV_Personne.fic,ProtectionStd,True,False,DIRECT,10,True,
Omika,RDV_Collaborateur,RDV_Collaborateur.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,RDV_Contact,RDV_Contact.fic,ProtectionStd,True,False,DIRECT,4,True,
Omika,RDV_Planning,RDV_Planning.fic,ProtectionStd,True,False,DIRECT,22,True,
Omika,Role,Role.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,RubriquesDocument,RubriquesDocument.fic,ProtectionStd,True,False,DIRECT,13,True,
Omika,Societe,Societe.fic,ProtectionStd,True,False,DIRECT,18,True,
Omika,Societe_Collaborateur,Societe_Collaborateur.fic,ProtectionStd,True,False,DIRECT,7,True,
Omika,SuiviDesTemps,SuiviDesTemps.fic,ProtectionStd,True,False,DIRECT,25,True,
Omika,Telephone,Telephone.fic,ProtectionStd,True,False,DIRECT,4,False,
Omika,Utilisateur,Utilisateur.fic,ProtectionStd,True,False,DIRECT,20,True,
1 Schema Table DiskName ExpectedGroup DirectAccess ProtectedAccess FinalAccess FieldCount HasRows HfSqlErrorCode
2 Batik AccesEtDroit AccesEtDroit.fic ProtectionStd True False DIRECT 8 True
3 Batik Action Action.fic ProtectionStd True False DIRECT 9 True
4 Batik Adresse Adresse.fic ProtectionStd True False DIRECT 14 True
5 Batik BddExterne BddExterne.fic ProtectionStd True False DIRECT 8 True
6 Batik CheckList CheckList.fic ProtectionStd True False DIRECT 12 False
7 Batik CheckList_Collab CheckList_Collab.fic ProtectionStd True False DIRECT 8 False
8 Batik Client Client.fic ProtectionStd True False DIRECT 31 True
9 Batik Client_Adresse Client_Adresse.fic ProtectionStd True False DIRECT 5 True
10 Batik Client_BddExterne Client_BddExterne.fic ProtectionStd True False DIRECT 9 True
11 Batik Client_Lieu Client_Lieu.fic ProtectionStd True False DIRECT 7 True
12 Batik Collaborateur Collaborateur.fic ProtectionStd True False DIRECT 20 True
13 Batik CompteRendu CompteRendu.fic ProtectionStd True False DIRECT 22 True
14 Batik Compteur Compteur.fic ProtectionStd True False DIRECT 8 True
15 Batik Document Document.fic ProtectionStd True False DIRECT 15 True
16 Batik DocumentNote DocumentNote.fic ProtectionStd True False DIRECT 6 True
17 Batik Dossier Dossier.fic ProtectionStd True False DIRECT 17 True
18 Batik Equipe Equipe.fic ProtectionStd True False DIRECT 7 True
19 Batik Equipe_Collaborateur Equipe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
20 Batik EtatIntervention EtatIntervention.fic ProtectionStd True False DIRECT 6 True
21 Batik Intervention Intervention.fic ProtectionStd True False DIRECT 29 True
22 Batik Intervention_BddExterne Intervention_BddExterne.fic ProtectionStd True False DIRECT 8 True
23 Batik Intervention_ChampLibre Intervention_ChampLibre.fic ProtectionStd True False DIRECT 8 False
24 Batik Intervention_Collaborateur Intervention_Collaborateur.fic ProtectionStd True False DIRECT 7 False
25 Batik Intervention_Personne Intervention_Personne.fic ProtectionStd True False DIRECT 14 True
26 Batik Lieu Lieu.fic ProtectionStd False False FAILED 0 False 70114
27 Batik Lieu_Personne Lieu_Personne.fic ProtectionStd True False DIRECT 15 True
28 Batik MailCat MailCat.fic ProtectionStd True False DIRECT 3 True
29 Batik MailModele MailModele.fic ProtectionStd True False DIRECT 11 True
30 Batik MessageExterne MessageExterne.fic ProtectionStd True False DIRECT 17 True
31 Batik MessageInterne MessageInterne.fic ProtectionStd True False DIRECT 7 True
32 Batik Mobile Mobile.fic ProtectionStd True False DIRECT 3 False
33 Batik MobLog MobLog.fic ProtectionStd True False DIRECT 4 True
34 Batik MobReception MobReception.fic ProtectionStd True False DIRECT 8 False
35 Batik ModeleRapportMob ModeleRapportMob.fic ProtectionStd False False FAILED 0 False 70114
36 Batik MotClef MotClef.fic ProtectionStd True False DIRECT 6 True
37 Batik ParametreApplication ParametreApplication.fic ProtectionStd True False DIRECT 4 True
38 Batik ParametreMetier ParametreMetier.fic ProtectionStd False False FAILED 0 False 70114
39 Batik ParametreMetierEntete ParametreMetierEntete.fic ProtectionPlus False False FAILED 0 False 70114
40 Batik ParametreSysteme ParametreSysteme.fic ProtectionPlus False False FAILED 0 False 70114
41 Batik ParametreUtilisateur ParametreUtilisateur.fic ProtectionStd True False DIRECT 4 True
42 Batik Personne Personne.fic ProtectionStd True False DIRECT 22 True
43 Batik Planning_RDV Planning_RDV.fic ProtectionStd True False DIRECT 35 True
44 Batik Planning_RDV_Personne Planning_RDV_Personne.fic ProtectionStd True False DIRECT 10 True
45 Batik Societe Societe.fic ProtectionStd True False DIRECT 16 True
46 Batik Societe_Collaborateur Societe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
47 Batik SuiviDesTemps SuiviDesTemps.fic ProtectionStd True False DIRECT 20 True
48 Batik Telephone Telephone.fic ProtectionStd True False DIRECT 4 False
49 Batik Utilisateur Utilisateur.fic ProtectionStd True False DIRECT 19 True
50 Omika AccesEtDroit AccesEtDroit.fic ProtectionStd True False DIRECT 10 True
51 Omika Action Action.fic ProtectionStd True False DIRECT 10 True
52 Omika Adresse Adresse.fic ProtectionStd True False DIRECT 16 True
53 Omika BddExterne BddExterne.fic ProtectionStd True False DIRECT 8 True
54 Omika CategorieAcces CategorieAcces.fic ProtectionStd True False DIRECT 11 True
55 Omika CheckList CheckList.fic ProtectionStd True False DIRECT 12 False
56 Omika CheckList_Collab CheckList_Collab.fic ProtectionStd True False DIRECT 8 False
57 Omika Client Client.fic ProtectionStd True False DIRECT 37 True
58 Omika Client_Adresse Client_Adresse.fic ProtectionStd True False DIRECT 8 True
59 Omika Client_BddExterne Client_BddExterne.fic ProtectionStd True False DIRECT 9 True
60 Omika Client_Lieu Client_Lieu.fic ProtectionStd True False DIRECT 7 True
61 Omika Collaborateur Collaborateur.fic ProtectionStd True False DIRECT 23 True
62 Omika CompteRendu CompteRendu.fic ProtectionStd True False DIRECT 24 True
63 Omika Compteur Compteur.fic ProtectionStd True False DIRECT 8 True
64 Omika Doc_Aide doc_aide.fic ProtectionStd True False DIRECT 9 True
65 Omika Document Document.fic ProtectionStd True False DIRECT 17 False
66 Omika DocumentNote DocumentNote.fic ProtectionStd True False DIRECT 6 False
67 Omika Dossier Dossier.fic ProtectionStd True False DIRECT 20 True
68 Omika ElementModifie elementmodifie.fic ProtectionStd True False DIRECT 5 True
69 Omika ElementSupprime elementsupprime.fic ProtectionStd False False FAILED 0 False 70208
70 Omika Equipe Equipe.fic ProtectionStd True False DIRECT 7 True
71 Omika Equipe_Collaborateur Equipe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
72 Omika EtatIntervention EtatIntervention.fic ProtectionStd True False DIRECT 7 True
73 Omika Etats Etats.fic ProtectionPlus False False FAILED 0 False 70114
74 Omika Intervention Intervention.fic ProtectionStd True False DIRECT 32 True
75 Omika Intervention_BddExterne Intervention_BddExterne.fic ProtectionStd True False DIRECT 8 True
76 Omika Intervention_ChampLibre Intervention_ChampLibre.fic ProtectionStd True False DIRECT 8 False
77 Omika Intervention_Personne Intervention_Personne.fic ProtectionStd True False DIRECT 15 True
78 Omika Lieu Lieu.fic ProtectionStd True False DIRECT 21 True
79 Omika Lieu_Personne Lieu_Personne.fic ProtectionStd True False DIRECT 17 True
80 Omika MailCat MailCat.fic ProtectionStd True False DIRECT 3 True
81 Omika MailModele MailModele.fic ProtectionStd True False DIRECT 13 True
82 Omika MessageExterne MessageExterne.fic ProtectionStd True False DIRECT 18 True
83 Omika MessageInterne MessageInterne.fic ProtectionStd True False DIRECT 7 True
84 Omika Mobile Mobile.fic ProtectionStd True False DIRECT 3 False
85 Omika MobLog MobLog.fic ProtectionStd True False DIRECT 4 False
86 Omika MobReception MobReception.fic ProtectionStd True False DIRECT 8 True
87 Omika ModeleRapport ModeleRapport.fic ProtectionStd True False DIRECT 9 True
88 Omika ModeleRapportMob ModeleRapportMob.fic ProtectionStd False False FAILED 0 False 70114
89 Omika MotClef MotClef.fic ProtectionStd True False DIRECT 6 True
90 Omika ParametreApplication ParametreApplication.fic ProtectionStd True False DIRECT 4 True
91 Omika ParametreMetier ParametreMetier.fic ProtectionStd False False FAILED 0 False 70114
92 Omika ParametreMetierEntete ParametreMetierEntete.fic ProtectionPlus False False FAILED 0 False 70114
93 Omika ParametreSysteme ParametreSysteme.fic ProtectionPlus False False FAILED 0 False 70114
94 Omika ParametreUtilisateur ParametreUtilisateur.fic ProtectionStd True False DIRECT 4 True
95 Omika Personne Personne.fic ProtectionStd True False DIRECT 25 True
96 Omika Planning_RDV Planning_RDV.fic ProtectionStd True False DIRECT 39 True
97 Omika Planning_RDV_Personne Planning_RDV_Personne.fic ProtectionStd True False DIRECT 10 True
98 Omika RDV_Collaborateur RDV_Collaborateur.fic ProtectionStd True False DIRECT 13 True
99 Omika RDV_Contact RDV_Contact.fic ProtectionStd True False DIRECT 4 True
100 Omika RDV_Planning RDV_Planning.fic ProtectionStd True False DIRECT 22 True
101 Omika Role Role.fic ProtectionStd True False DIRECT 7 True
102 Omika RubriquesDocument RubriquesDocument.fic ProtectionStd True False DIRECT 13 True
103 Omika Societe Societe.fic ProtectionStd True False DIRECT 18 True
104 Omika Societe_Collaborateur Societe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
105 Omika SuiviDesTemps SuiviDesTemps.fic ProtectionStd True False DIRECT 25 True
106 Omika Telephone Telephone.fic ProtectionStd True False DIRECT 4 False
107 Omika Utilisateur Utilisateur.fic ProtectionStd True False DIRECT 20 True
108 Batik AccesEtDroit AccesEtDroit.fic ProtectionStd True False DIRECT 8 True
109 Batik Action Action.fic ProtectionStd True False DIRECT 9 True
110 Batik Adresse Adresse.fic ProtectionStd True False DIRECT 14 True
111 Batik BddExterne BddExterne.fic ProtectionStd True False DIRECT 8 True
112 Batik CheckList CheckList.fic ProtectionStd True False DIRECT 12 False
113 Batik CheckList_Collab CheckList_Collab.fic ProtectionStd True False DIRECT 8 False
114 Batik Client Client.fic ProtectionStd True False DIRECT 31 True
115 Batik Client_Adresse Client_Adresse.fic ProtectionStd True False DIRECT 5 True
116 Batik Client_BddExterne Client_BddExterne.fic ProtectionStd True False DIRECT 9 True
117 Batik Client_Lieu Client_Lieu.fic ProtectionStd True False DIRECT 7 True
118 Batik Collaborateur Collaborateur.fic ProtectionStd True False DIRECT 20 True
119 Batik CompteRendu CompteRendu.fic ProtectionStd True False DIRECT 22 True
120 Batik Compteur Compteur.fic ProtectionStd True False DIRECT 8 True
121 Batik Document Document.fic ProtectionStd True False DIRECT 15 True
122 Batik DocumentNote DocumentNote.fic ProtectionStd True False DIRECT 6 True
123 Batik Dossier Dossier.fic ProtectionStd True False DIRECT 17 True
124 Batik Equipe Equipe.fic ProtectionStd True False DIRECT 7 True
125 Batik Equipe_Collaborateur Equipe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
126 Batik EtatIntervention EtatIntervention.fic ProtectionStd True False DIRECT 6 True
127 Batik Intervention Intervention.fic ProtectionStd True False DIRECT 29 True
128 Batik Intervention_BddExterne Intervention_BddExterne.fic ProtectionStd True False DIRECT 8 True
129 Batik Intervention_ChampLibre Intervention_ChampLibre.fic ProtectionStd True False DIRECT 8 False
130 Batik Intervention_Collaborateur Intervention_Collaborateur.fic ProtectionStd True False DIRECT 7 False
131 Batik Intervention_Personne Intervention_Personne.fic ProtectionStd True False DIRECT 14 True
132 Batik Lieu Lieu.fic ProtectionStd False True PROTECTION_STD 19 True 70114
133 Batik Lieu_Personne Lieu_Personne.fic ProtectionStd True False DIRECT 15 True
134 Batik MailCat MailCat.fic ProtectionStd True False DIRECT 3 True
135 Batik MailModele MailModele.fic ProtectionStd True False DIRECT 11 True
136 Batik MessageExterne MessageExterne.fic ProtectionStd True False DIRECT 17 True
137 Batik MessageInterne MessageInterne.fic ProtectionStd True False DIRECT 7 True
138 Batik Mobile Mobile.fic ProtectionStd True False DIRECT 3 False
139 Batik MobLog MobLog.fic ProtectionStd True False DIRECT 4 True
140 Batik MobReception MobReception.fic ProtectionStd True False DIRECT 8 False
141 Batik ModeleRapportMob ModeleRapportMob.fic ProtectionStd False True PROTECTION_STD 4 False 70114
142 Batik MotClef MotClef.fic ProtectionStd True False DIRECT 6 True
143 Batik ParametreApplication ParametreApplication.fic ProtectionStd True False DIRECT 4 True
144 Batik ParametreMetier ParametreMetier.fic ProtectionStd False True PROTECTION_STD 12 True 70114
145 Batik ParametreMetierEntete ParametreMetierEntete.fic ProtectionPlus False True PROTECTION_PLUS 8 True 70114
146 Batik ParametreSysteme ParametreSysteme.fic ProtectionPlus False True PROTECTION_PLUS 4 True 70114
147 Batik ParametreUtilisateur ParametreUtilisateur.fic ProtectionStd True False DIRECT 4 True
148 Batik Personne Personne.fic ProtectionStd True False DIRECT 22 True
149 Batik Planning_RDV Planning_RDV.fic ProtectionStd True False DIRECT 35 True
150 Batik Planning_RDV_Personne Planning_RDV_Personne.fic ProtectionStd True False DIRECT 10 True
151 Batik Societe Societe.fic ProtectionStd True False DIRECT 16 True
152 Batik Societe_Collaborateur Societe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
153 Batik SuiviDesTemps SuiviDesTemps.fic ProtectionStd True False DIRECT 20 True
154 Batik Telephone Telephone.fic ProtectionStd True False DIRECT 4 False
155 Batik Utilisateur Utilisateur.fic ProtectionStd True False DIRECT 19 True
156 Omika AccesEtDroit AccesEtDroit.fic ProtectionStd True False DIRECT 10 True
157 Omika Action Action.fic ProtectionStd True False DIRECT 10 True
158 Omika Adresse Adresse.fic ProtectionStd True False DIRECT 16 True
159 Omika BddExterne BddExterne.fic ProtectionStd True False DIRECT 8 True
160 Omika CategorieAcces CategorieAcces.fic ProtectionStd True False DIRECT 11 True
161 Omika CheckList CheckList.fic ProtectionStd True False DIRECT 12 False
162 Omika CheckList_Collab CheckList_Collab.fic ProtectionStd True False DIRECT 8 False
163 Omika Client Client.fic ProtectionStd True False DIRECT 37 True
164 Omika Client_Adresse Client_Adresse.fic ProtectionStd True False DIRECT 8 True
165 Omika Client_BddExterne Client_BddExterne.fic ProtectionStd True False DIRECT 9 True
166 Omika Client_Lieu Client_Lieu.fic ProtectionStd True False DIRECT 7 True
167 Omika Collaborateur Collaborateur.fic ProtectionStd True False DIRECT 23 True
168 Omika CompteRendu CompteRendu.fic ProtectionStd True False DIRECT 24 True
169 Omika Compteur Compteur.fic ProtectionStd True False DIRECT 8 True
170 Omika Doc_Aide doc_aide.fic ProtectionStd True False DIRECT 9 True
171 Omika Document Document.fic ProtectionStd True False DIRECT 17 False
172 Omika DocumentNote DocumentNote.fic ProtectionStd True False DIRECT 6 False
173 Omika Dossier Dossier.fic ProtectionStd True False DIRECT 20 True
174 Omika ElementModifie elementmodifie.fic ProtectionStd True False DIRECT 5 True
175 Omika ElementSupprime elementsupprime.fic ProtectionStd False False FAILED 0 False 70208
176 Omika Equipe Equipe.fic ProtectionStd True False DIRECT 7 True
177 Omika Equipe_Collaborateur Equipe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
178 Omika EtatIntervention EtatIntervention.fic ProtectionStd True False DIRECT 7 True
179 Omika Etats Etats.fic ProtectionPlus False True PROTECTION_PLUS 5 True 70114
180 Omika Intervention Intervention.fic ProtectionStd True False DIRECT 32 True
181 Omika Intervention_BddExterne Intervention_BddExterne.fic ProtectionStd True False DIRECT 8 True
182 Omika Intervention_ChampLibre Intervention_ChampLibre.fic ProtectionStd True False DIRECT 8 False
183 Omika Intervention_Personne Intervention_Personne.fic ProtectionStd True False DIRECT 15 True
184 Omika Lieu Lieu.fic ProtectionStd True False DIRECT 21 True
185 Omika Lieu_Personne Lieu_Personne.fic ProtectionStd True False DIRECT 17 True
186 Omika MailCat MailCat.fic ProtectionStd True False DIRECT 3 True
187 Omika MailModele MailModele.fic ProtectionStd True False DIRECT 13 True
188 Omika MessageExterne MessageExterne.fic ProtectionStd True False DIRECT 18 True
189 Omika MessageInterne MessageInterne.fic ProtectionStd True False DIRECT 7 True
190 Omika Mobile Mobile.fic ProtectionStd True False DIRECT 3 False
191 Omika MobLog MobLog.fic ProtectionStd True False DIRECT 4 False
192 Omika MobReception MobReception.fic ProtectionStd True False DIRECT 8 True
193 Omika ModeleRapport ModeleRapport.fic ProtectionStd True False DIRECT 9 True
194 Omika ModeleRapportMob ModeleRapportMob.fic ProtectionStd False True PROTECTION_STD 4 False 70114
195 Omika MotClef MotClef.fic ProtectionStd True False DIRECT 6 True
196 Omika ParametreApplication ParametreApplication.fic ProtectionStd True False DIRECT 4 True
197 Omika ParametreMetier ParametreMetier.fic ProtectionStd False True PROTECTION_STD 14 True 70114
198 Omika ParametreMetierEntete ParametreMetierEntete.fic ProtectionPlus False True PROTECTION_PLUS 10 True 70114
199 Omika ParametreSysteme ParametreSysteme.fic ProtectionPlus False True PROTECTION_PLUS 4 True 70114
200 Omika ParametreUtilisateur ParametreUtilisateur.fic ProtectionStd True False DIRECT 4 True
201 Omika Personne Personne.fic ProtectionStd True False DIRECT 25 True
202 Omika Planning_RDV Planning_RDV.fic ProtectionStd True False DIRECT 39 True
203 Omika Planning_RDV_Personne Planning_RDV_Personne.fic ProtectionStd True False DIRECT 10 True
204 Omika RDV_Collaborateur RDV_Collaborateur.fic ProtectionStd True False DIRECT 13 True
205 Omika RDV_Contact RDV_Contact.fic ProtectionStd True False DIRECT 4 True
206 Omika RDV_Planning RDV_Planning.fic ProtectionStd True False DIRECT 22 True
207 Omika Role Role.fic ProtectionStd True False DIRECT 7 True
208 Omika RubriquesDocument RubriquesDocument.fic ProtectionStd True False DIRECT 13 True
209 Omika Societe Societe.fic ProtectionStd True False DIRECT 18 True
210 Omika Societe_Collaborateur Societe_Collaborateur.fic ProtectionStd True False DIRECT 7 True
211 Omika SuiviDesTemps SuiviDesTemps.fic ProtectionStd True False DIRECT 25 True
212 Omika Telephone Telephone.fic ProtectionStd True False DIRECT 4 False
213 Omika Utilisateur Utilisateur.fic ProtectionStd True False DIRECT 20 True
+125
View File
@@ -0,0 +1,125 @@
# HFSQL OLE DB Open All — Diagnostic
## Batik
### Résumé
- Tables: 48
- Direct: 43
- ProtectionStd: 0
- ProtectionPlus: 0
- Failed: 5
- ParametreMetier: FAILED
- ParametreMetierEntete: FAILED
- ParametreSysteme: FAILED
- Strategy: WILDCARD_PLUS_OVERRIDES
- ProtectionStd OLE DB: UNRESOLVED
- ProtectionPlus OLE DB: UNRESOLVED
- NegativeControl: NOT_RUN
### Canaris
- ParametreMetier: FAILED
- ParametreMetierEntete: FAILED
- ParametreSysteme: FAILED
### Échecs
- Lieu (Expected=ProtectionStd, HfSql=70114)
- ModeleRapportMob (Expected=ProtectionStd, HfSql=70114)
- ParametreMetier (Expected=ProtectionStd, HfSql=70114)
- ParametreMetierEntete (Expected=ProtectionPlus, HfSql=70114)
- ParametreSysteme (Expected=ProtectionPlus, HfSql=70114)
## Omika
### Résumé
- Tables: 58
- Direct: 52
- ProtectionStd: 0
- ProtectionPlus: 0
- Failed: 6
- ParametreMetier: FAILED
- ParametreMetierEntete: FAILED
- ParametreSysteme: FAILED
- Strategy: WILDCARD_PLUS_OVERRIDES
- ProtectionStd OLE DB: UNRESOLVED
- ProtectionPlus OLE DB: UNRESOLVED
- NegativeControl: NOT_RUN
### Canaris
- ParametreMetier: FAILED
- ParametreMetierEntete: FAILED
- ParametreSysteme: FAILED
### Échecs
- ElementSupprime (Expected=ProtectionStd, HfSql=70208)
- Etats (Expected=ProtectionPlus, HfSql=70114)
- ModeleRapportMob (Expected=ProtectionStd, HfSql=70114)
- ParametreMetier (Expected=ProtectionStd, HfSql=70114)
- ParametreMetierEntete (Expected=ProtectionPlus, HfSql=70114)
- ParametreSysteme (Expected=ProtectionPlus, HfSql=70114)
## Batik
### Résumé
- Tables: 48
- Direct: 43
- ProtectionStd: 3
- ProtectionPlus: 2
- Failed: 0
- ParametreMetier: PROTECTION_STD
- ParametreMetierEntete: PROTECTION_PLUS
- ParametreSysteme: PROTECTION_PLUS
- Strategy: FAILURES_ONLY_EXPLICIT_MAP
- ProtectionStd OLE DB: VERIFIED_FROM_DATABASE
- ProtectionPlus OLE DB: VERIFIED_FROM_DATABASE
- NegativeControl: PASS
### Canaris
- ParametreMetier: PROTECTION_STD
- ParametreMetierEntete: PROTECTION_PLUS
- ParametreSysteme: PROTECTION_PLUS
### Échecs
## Omika
### Résumé
- Tables: 58
- Direct: 52
- ProtectionStd: 2
- ProtectionPlus: 3
- Failed: 1
- ParametreMetier: PROTECTION_STD
- ParametreMetierEntete: PROTECTION_PLUS
- ParametreSysteme: PROTECTION_PLUS
- Strategy: FAILURES_ONLY_EXPLICIT_MAP
- ProtectionStd OLE DB: VERIFIED_FROM_DATABASE
- ProtectionPlus OLE DB: VERIFIED_FROM_DATABASE
- NegativeControl: PASS
### Canaris
- ParametreMetier: PROTECTION_STD
- ParametreMetierEntete: PROTECTION_PLUS
- ParametreSysteme: PROTECTION_PLUS
### Échecs
- ElementSupprime (Expected=ProtectionStd, HfSql=70208)
+129
View File
@@ -0,0 +1,129 @@
# Détecteur de schéma HFSQL (DatabaseSchemaDetector)
## Stratégie générale
Le détecteur détermine la version réelle du schéma de base (Batik ou Omika) à
partir de la **structure physique** exposée par HFSQL OLE DB, et uniquement à
partir de celle-ci.
La décision ne repose **jamais** sur :
- le nom de la base (`BATIK_TEST`, `OMIKA_TEST`, ou tout autre nom client) ;
- le nom du serveur ;
- la présence d'un mot de passe ;
- le nombre de tables ;
- OpenSchema (`GetSchema`).
Chaque canari est testé par une requête structurelle réelle et contrôlée :
```sql
SELECT TOP 0 <colonne> FROM <table>
```
Le **succès / échec structurel** de la requête indique la présence ou l'absence
de la colonne. Aucune donnée métier n'est lue (`TOP 0` ne retourne aucune ligne).
## Canaris utilisés
### Socle commun (présent dans Batik et Omika)
| Table | Colonne | Rôle |
|-------|---------|------|
| `Client` | `CL_PKID` | Confirme que la base est une base Omika/Batik compatible |
### Canaris Omika (colonnes Omika-only de `Client`)
| Table | Colonne | Rôle |
|-------|---------|------|
| `Client` | `CL_CleType` | Marqueur Omika (colonne absente de Batik) |
| `Client` | `GUID` | Marqueur Omika (colonne absente de Batik) |
### Canari de confirmation Omika (table Omika-only)
| Table | Colonne | Rôle |
|-------|---------|------|
| `Role` | `R_PKID` | Confirme la migration Omika en cas d'ambiguïté |
## Pourquoi ces canaris discriminent Batik / Omika
Les colonnes `CL_CleType` et `GUID` de la table `Client` sont marquées
`IsOmikaOnly` dans les modèles physiques générés et ont été **confirmées par le
model-audit** :
- présentes physiquement dans `OMIKA_TEST` (statut `VERIFIED`) ;
- absentes de `BATIK_TEST`.
La table `Role` est une table réellement Omika-only (absente de Batik), confirmée
par le model-audit. Elle sert de canari de confirmation indépendant.
La table `Client` est accessible en accès direct dans les deux bases, ce qui rend
la détection possible sans dépendre des mots de passe de fichiers protégés.
## Algorithme de décision
1. **Socle commun** : `SELECT TOP 0 CL_PKID FROM Client` doit réussir.
Sinon → échec explicite (base non reconnue).
2. **Canaris Omika** : tester `CL_CleType` et `GUID` dans `Client`.
3. **Canari de confirmation** : tester `R_PKID` dans `Role`.
Décision :
- `CL_CleType` **et** `GUID` présents → **Omika**.
- Un seul des deux présent → ambiguïté :
- si `Role` présent → **Omika** ;
- sinon → échec explicite (structure incohérente).
- Aucun canari Omika présent (socle commun valide) → **Batik**.
La base n'est jamais déclarée Batik ou Omika par défaut : la décision repose
toujours sur la structure réellement observée.
## Résultats d'intégration
| Base | Résultat attendu | Résultat observé |
|------|------------------|------------------|
| `BATIK_TEST` | `DatabaseSchemaVersion.Batik` | `Batik` |
| `OMIKA_TEST` | `DatabaseSchemaVersion.Omika` | `Omika` |
Les tests d'intégration réels utilisent `config/hfsql-test.local.json` et le
provider OLE DB `PCSOFT.HFSQL`. Ils sont ignorés automatiquement si la
configuration locale ou le serveur sont indisponibles.
Aucun secret, aucune chaîne de connexion, aucune donnée métier n'est exposée.
## Tests d'intégration du chemin de création (CreateAsync)
En complément de la détection de schéma, des tests d'intégration réels couvrent
le chemin d'écriture `CreateAsync` sur les deux schémas (Batik et Omika) :
- `CreateAsync_Batik_PersistsAndRollsBack`
- `CreateAsync_Omika_PersistsAndRollsBack`
### Principe
1. Les mots de passe de fichiers (Extended Properties) sont résolus par
`HfSqlFileAccessResolver` pour les fichiers nécessaires au chemin Create
(`Client`, `ParametreMetier`, `Adresse`, `Client_Adresse`).
2. Une connexion physique OLE DB est ouverte avec ces mots de passe.
3. Une **transaction externe** est créée sur cette connexion.
4. `CreateAsync` est exécuté **dans cette transaction** via le repository
(Batik ou Omika).
5. Le client canonique retourné est vérifié (nom, identifiant non vide).
6. La transaction est **annulée (rollback)** : aucune trace n'est laissée en base.
### Pourquoi une transaction externe
Les repositories `BatikClientRepository` et `OmikaClientRepository` exposent une
surcharge `CreateAsync(command, DbTransaction?, cancellationToken)` qui réutilise
une transaction externe fournie par l'appelant. En production, la surcharge
standard `CreateAsync(command, cancellationToken)` est utilisée et une transaction
interne est créée puis commitée. Dans les tests, la transaction externe permet de
**vérifier la persistance réelle puis de l'annuler** sans polluer la base.
### Garanties
- Aucune donnée métier n'est laissée en base (rollback systématique).
- Aucun secret, aucune chaîne de connexion, aucun mot de passe n'est exposé.
- Les tests sont ignorés automatiquement si la configuration locale ou le
serveur sont indisponibles.