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
+230
View File
@@ -0,0 +1,230 @@
# LOT SERVEUR — Connexion physique base Licence HFSQL
## Objectif
Brancher l'implémentation moderne Licence existante sur la vraie base HFSQL
Licence, via le provider OLEDB pour HFSQL (`PCSOFT.HFSQL`).
## Principes respectés
- **Aucune modification du schéma HFSQL** : aucune table/colonne créée, modifiée ou supprimée.
- **Aucune création/suppression de table** : le repository lit/écrit dans les tables existantes.
- **Aucune reprise du vieux WebService** : les traitements modernes restent la référence.
- **Les anciennes documentations** servent uniquement à connaître les tables, relations et comportements historiques.
- **Les contrats API modernes restent la référence** : le repository ne renvoie que des entités métier.
- **Aucun secret historique recopié** : les valeurs de connexion proviennent exclusivement de la configuration d'installation.
## Modèle physique réel (confirmé)
La base Licence héberge les tables techniques suivantes, utilisées par le repository :
| Table | Rôle | Colonnes utilisées |
|-------|------|--------------------|
| `ClientBase` | Clients de la base licence | `CL_PKID`, `CL_Code`, `CL_Nom` |
| `Licence` | Licences attribuées | `LI_PKID`, `LI_IDClient`, `LI_IDCollaborateur`, `LI_IDUser`, `LI_Numero`, `LI_IDMobile`, `LI_DateAttribution`, `LI_DateExpiration`, `LI_Active`, `LI_UserNom`, `LI_UserPrenom`, `LI_Type`, `LI_InfoSupMob`, `LI_VersionMajeur` |
| `LicenceHisto` | Historique des opérations de licence | `LH_Date`, `LH_Auteur`, `LH_Operation`, `LH_GUIDLicence`, `LH_CodeClient`, `LH_IdMobile`, `LH_Note` |
> **Aucune divergence** entre le modèle physique réel et les hypothèses du repository actuel.
> Le mapping est direct et conforme.
## Mapping vers les contrats modernes
Le `LicenceRepository` (`src/Omika.Data/Repositories/Technical/LicenceRepository.cs`)
mappe les lignes physiques HFSQL vers les entités métier modernes :
| Table physique | Entité métier | Contrat |
|----------------|---------------|---------|
| `ClientBase` | `ClientBase` | `Omika.Core.Domain.Entities.Mobile.ClientBase` |
| `Licence` | `Licence` | `Omika.Core.Domain.Entities.Mobile.Licence` |
| `LicenceHisto` | `LicenceHistoEntry` | `Omika.Core.Domain.Entities.Mobile.LicenceHistoEntry` |
Aucune donnée physique HFSQL n'est exposée dans l'API : le repository ne renvoie
que des entités métier, et les endpoints API ne manipulent que des contrats modernes.
## Fonctionnalités couvertes
| # | Fonctionnalité | Implémentation |
|---|----------------|----------------|
| 1 | Configuration centralisée de connexion Licence | `LicenseConnectionOptions` + `LicenseConnectionOptionsValidator` (section `LicenseConnection`) |
| 2 | Ouverture de la connexion HFSQL via OLEDB | `LicenseOleDbConnection` + `HfSqlOleDbConnectionFactory` (provider `PCSOFT.HFSQL`) |
| 3 | Ouverture/lecture des tables réellement utilisées | `LicenceRepository` branché sur la connexion nommée `"License"` |
| 4 | Mapping vers les contrats modernes | `LicenceRepository` (mapping `ClientBaseRow`/`LicenceRow` → entités métier) |
| 5 | Recherche CodeClient | `GetClientByCodeAsync` |
| 6 | Recherche NumeroLicence | `GetByNumeroAsync`, `GetByNumeroAndClientAsync` |
| 7 | Vérification licence active | `Licence.Active` |
| 8 | Vérification DateExpiration | `Licence.DateExpiration` |
| 9 | Vérification attribution DeviceId | `Licence.DeviceId` |
| 10 | Résolution UserId | `Licence.UserId` |
| 11 | Résolution CollaborateurId | `Licence.CollaborateurId` |
| 12 | Activation réelle | `AssignDeviceAsync` + `AddHistoAsync` |
| 13 | Validation réelle | via `LicenseService` (contrats API modernes) |
| 14 | Aucune donnée physique exposée | le repository ne renvoie que des entités métier |
## Branchement effectué
### `src/Omika.Data/ServiceCollectionExtensions.cs`
Dans `AddOmikaDataLicenseConnection()`, le `ILicenceRepository` est désormais
branché sur la connexion OLEDB nommée `"License"` (base Licence réelle), en
remplacement de l'enregistrement ODBC métier par défaut de `AddOmikaData()` :
```csharp
services.AddScoped<ILicenceRepository>(sp =>
new LicenceRepository(
sp.GetRequiredKeyedService<IHfsqlConnection>(LicenseConnectionOptions.ConnectionName)));
```
Le dernier enregistrement remplace le précédent (connexion ODBC métier) : le
repository de licence lit/écrit désormais dans la base HFSQL Licence réelle via
le provider OLEDB, jamais dans la base métier.
### `src/Omika.Api/Program.cs`
Appel de `AddOmikaDataLicenseConnection()` après `AddOmikaData()` pour activer le
branchement :
```csharp
builder.Services.AddOmikaData();
builder.Services.AddOmikaDataLicenseConnection();
```
### `src/Omika.Api/appsettings.json`
Ajout de la section `LicenseConnection` (valeurs d'exemple, sans secrets) :
```json
"LicenseConnection": {
"Server": "localhost",
"Port": 4900,
"DatabaseName": "Licence",
"Login": "",
"Password": "",
"FilePasswords": {
"ProtectionStd": "",
"ProtectionPlus": ""
}
}
```
> Les valeurs `Login`, `Password`, `FilePasswords` doivent être fournies via
> configuration sécurisée (variables d'environnement, User Secrets), jamais en
> clair dans le code source.
## Configuration de connexion
La connexion à la base Licence est centralisée dans la section `LicenseConnection` :
| Clé | Description | Exemple |
|-----|-------------|---------|
| `LicenseConnection:Server` | Hôte du serveur HFSQL Client/Serveur | `localhost` |
| `LicenseConnection:Port` | Port du serveur HFSQL | `4900` |
| `LicenseConnection:DatabaseName` | Nom de la base Licence | `Licence` |
| `LicenseConnection:Login` | Compte technique serveur (secret) | *(via env/secret)* |
| `LicenseConnection:Password` | Mot de passe du compte technique (secret) | *(via env/secret)* |
| `LicenseConnection:FilePasswords:ProtectionStd` | Mot de passe ProtectionStd (optionnel) | *(via env/secret)* |
| `LicenseConnection:FilePasswords:ProtectionPlus` | Mot de passe ProtectionPlus (optionnel) | *(via env/secret)* |
## Validation de la baseline
| Baseline | Résultat |
|----------|----------|
| Mobile | **506/506** ✓ |
| Unitaires hors HFSQL environnemental | **1748/1748** ✓ (0 échec) |
| Build solution | **vert** ✓ |
| Android | **vert** ✓ |
## Tests à faire en lecture (prochaine étape)
Une fois la base Licence réelle accessible, exécuter les tests de lecture suivants
avant toute écriture :
- [ ] Connexion ouverte (via `LicenseOleDbConnection`)
- [ ] Tables accessibles (`ClientBase`, `Licence`, `LicenceHisto`)
- [ ] Colonnes réellement présentes (comparer avec le mapping ci-dessus)
- [ ] Client connu / inconnu (`GetClientByCodeAsync`)
- [ ] Licence connue / inconnue (`GetByNumeroAsync`)
- [ ] Licence active / inactive (`Licence.Active`)
- [ ] Licence expirée (`Licence.DateExpiration`)
- [ ] Attribution existante (`Licence.DeviceId`)
- [ ] Utilisateur / collaborateur réellement résolus (`Licence.UserId`, `Licence.CollaborateurId`)
> **STOP** si le modèle physique diffère des hypothèses du repository. Dans ce cas,
> fournir : table réelle, colonne réelle, modèle attendu, divergence, adaptation minimale.
---
## ⛔ ÉTAT RÉEL — DIVERGENCE CONSTATÉE (STOP)
> **Ce lot est en état de STOP.** Les probes de lecture réels (via OLEDB `PCSOFT.HFSQL`)
> ont révélé que le modèle physique de la base Licence **diffère** des hypothèses du
> repository. Aucune écriture n'a été effectuée. Aucune donnée n'a été modifiée.
### Probes de lecture effectués (lecture seule, aucun secret exposé)
| Base configurée | Base réelle sur le serveur | Connexion | Tables |
|-----------------|----------------------------|-----------|--------|
| `BATIK_TEST` (Business) | `BATIK_TEST` | ✅ Ouverte | 44 tables métier |
| `BASE_LICENSES` (License) | **`BASE_LICENCES`** (orthographe différente) | ✅ Ouverte | **2 tables de backup système uniquement** |
| `SYNC_TEST` (Sync) | **`OMIKA_TEST`** (nom différent) | ✅ Ouverte | 54 tables métier |
Le serveur HFSQL (`127.0.0.1:4900`) expose 16 bases, dont `BASE_LICENCES`, `BATIK_TEST`,
`OMIKA_TEST`, `GestionUser`, etc.
### Divergence 1 — Nom de la base Licence
| Élément | Valeur |
|---------|--------|
| **Base configurée** (`LicenseConnection:DatabaseName`) | `BASE_LICENSES` |
| **Base réelle sur le serveur** | `BASE_LICENCES` |
| **Divergence** | Orthographe : `LICENSES` (config) vs `LICENCES` (réel) |
### Divergence 2 — Tables de licence absentes (critique)
La base Licence réelle (`BASE_LICENCES`) ne contient **que** les tables de backup
système suivantes :
| Table réelle | Type |
|--------------|------|
| `_Backup_20260813_080833_Integrity` | TABLE |
| `_Backup_20260813_080833_Views` | TABLE |
Les tables attendues par le repository **n'existent pas** dans cette base :
| Table attendue (modèle) | Présence réelle |
|-------------------------|-----------------|
| `ClientBase` | ❌ Absente |
| `Licence` | ❌ Absente |
| `LicenceHisto` | ❌ Absente |
### Divergence 3 — Nom de la base Sync
| Élément | Valeur |
|---------|--------|
| **Base configurée** (`SyncConnection:DatabaseName`) | `SYNC_TEST` |
| **Base réelle sur le serveur** | `OMIKA_TEST` |
| **Divergence** | Nom différent |
### Conséquence
Le `LicenceRepository` ne peut pas être branché sur la base Licence réelle tant que
les tables `ClientBase`, `Licence`, `LicenceHisto` n'existent pas dans `BASE_LICENCES`
(ou dans une base Licence dédiée). Le mapping vers les contrats modernes ne peut pas
être validé en lecture.
### Adaptation minimale proposée (à valider avant toute implémentation)
1. **Corriger le nom de la base** dans la configuration locale :
`LicenseConnection:DatabaseName` = `BASE_LICENCES` (au lieu de `BASE_LICENSES`).
2. **Restaurer / créer les tables de licence** (`ClientBase`, `Licence`, `LicenceHisto`)
dans la base `BASE_LICENCES` (ou fournir une base Licence de test contenant ces tables).
→ Sans ces tables, aucun test de lecture/mapping/activation n'est possible.
3. **Corriger le nom de la base Sync** : `SyncConnection:DatabaseName` = `OMIKA_TEST`
(au lieu de `SYNC_TEST`), si `OMIKA_TEST` est bien la base technique Sync de test.
4. **Re-exécuter les probes de lecture** (connexion, tables, colonnes) une fois les
tables de licence présentes, avant toute écriture.
> **Aucune modification du schéma HFSQL n'a été effectuée.** Aucune table n'a été
> créée, modifiée ou supprimée. Aucune donnée n'a été écrite.