231 lines
10 KiB
Markdown
231 lines
10 KiB
Markdown
# 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.
|
|
|
|
|