Premiere commit - Omika
This commit is contained in:
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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é
|
||||
|
@@ -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.
|
||||
|
||||
|
||||
|
||||
@@ -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
@@ -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.
|
||||
|
||||
@@ -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,
|
||||
|
@@ -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)
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user