# TRAIL DPS 4.2 - LOT 11.12 - Correctif 500 admin et persistance usage licence

Horodatage : 2026-05-28 14:55 UTC

## Retour terrain pris en compte

Apres deploiement du LOT 11.11 :

1. La page `licence.synoluvia.fr/admin/license.php?id=1` retourne une erreur HTTP 500.
2. La table `license_usage_stats` reste bloquee a 3 lignes SMS OVH.
3. Aucune ligne `PLACE_LICENSE_CHECK` ne remonte les courses, evenements actifs et runs actifs.

## Diagnostic realise sur les sources jointes

### Cause 1 - Erreur 500 admin OVH

Le fichier actuel `ovh/config/bootstrap.php` charge les classes licence avec :

```php
require_once __DIR__ . '/../src/Database.php';
```

Or le ZIP OVH fourni contient le dossier `ovh/SRC` en majuscules, pas `ovh/src` en minuscules.

Sur hebergement Linux, la casse est significative. Si `src` n'existe pas, l'admin et les endpoints licence provoquent une erreur fatale PHP au chargement du bootstrap.

Correction LOT 11.12 :

- resolution robuste du dossier source OVH ;
- priorite a `ovh/SRC` ;
- fallback vers `ovh/src` uniquement si necessaire ;
- message JSON explicite si aucun dossier source valide n'est trouve.

### Cause 2 - Donnees SMS presentes mais non affichees

Le dump `license_usage_stats` contient deja :

- id 1 : `sms_sent_count = 1`, source `OVH_SMS_RUNNER` ;
- id 2 : `sms_sent_count = 2`, source `OVH_SMS_RUNNER` ;
- id 3 : `sms_sent_count = 3`, source `OVH_SMS_RUNNER`.

Mais le fichier OVH actuel `SRC/LicenseRepository.php` ne contient toujours pas les methodes utilisees par `admin/license.php` :

- `getCommercialUsageSummary()` ;
- `getLatestUsageStats()` ;
- `countBillableSmsRolling365()`.

La page admin tombait donc sur les valeurs de repli et affichait `0`.

Correction LOT 11.12 :

- ajout des methodes de lecture `license_usage_stats` ;
- conservation du dernier compteur SMS OVH positif ;
- consolidation d'un snapshot PLACE avec le dernier compteur SMS OVH.

### Cause 3 - Check licence PLACE non persiste dans `license_usage_stats`

Le fichier actuel `SRC/LicenseService.php` execute seulement :

- verification licence ;
- `updateCheck()` ;
- audit `check`.

Il ne lit pas `local_usage` et n'insere donc aucune ligne `PLACE_LICENSE_CHECK`.

Correction LOT 11.12 :

- lecture de `local_usage`, `license_usage` ou `commercial_usage` dans le payload check ;
- insertion d'une ligne `PLACE_LICENSE_CHECK` lorsque le poste PLACE transmet un snapshot ;
- insertion non bloquante : si la persistance echoue, le check licence reste valide et l'erreur est tracee dans `license_audit_log` ;
- audit enrichi avec `client_version`, `local_usage_received`, `local_usage_persisted`, `local_usage_error`, `local_usage_keys`, `client_payload_keys`.

### Cause 4 - Diagnostic PLACE incomplet

Le client PLACE actuel calcule deja le snapshot local, mais si l'import du service d'usage echoue, aucun diagnostic n'etait transmis.

Correction LOT 11.12 :

- version client transmise : `lot-11.12-place-usage-debug` ;
- transmission de `local_usage_error` meme si le module de calcul local n'est pas importable ;
- maintien de `sms_sent_count = 0` cote PLACE afin de ne jamais ecraser le compteur SMS OVH.

## Fichiers modifies

### OVH

- `ovh/config/bootstrap.php`
- `ovh/SRC/LicenseRepository.php`
- `ovh/SRC/LicenseService.php`
- `ovh/docs/LOT_11_12_CORRECTIF_500_ET_PERSISTANCE_USAGE_LICENCE.md`

### PLACE

- `SRC/Services/license_api_client.py`

## Fichiers non modifies volontairement

- `SRC/Services/license_usage_service.py` : le calcul local present dans les sources jointes est coherent sur la base SQLite fournie.

## Validation locale realisee

### PHP

Commande executee :

```bash
find public SRC config -name '*.php' -type f -print0 | xargs -0 -n1 php -l
```

Resultat : aucune erreur de syntaxe PHP detectee.

### Python

Commande executee :

```bash
python -m compileall -q SRC
```

Resultat : compilation Python OK.

### SQLite PLACE fournie

Sur la base `DPS_TRAIL_backup_2026-05-28_1340(5).db`, les compteurs locaux attendus sont :

- courses comptabilisees 425 jours : `20` ;
- evenements actifs : `2` ;
- runs actifs : `2`.

## Procedure de deploiement conseillee

1. Deployer le contenu du ZIP incrementiel LOT 11.12.
2. Verifier que `ovh/config/bootstrap.php` est bien remplace sur le serveur.
3. Recharger `https://licence.synoluvia.fr/admin/license.php?id=1`.
4. Verifier que `SMS 365 jours` affiche `3` avant meme un nouveau check PLACE.
5. Lancer PLACE ou forcer un controle licence.
6. Verifier dans `license_audit_log` la presence d'un audit `check` contenant :

```json
"client_version": "lot-11.12-place-usage-debug"
```

7. Verifier dans `license_usage_stats` l'apparition d'une ligne :

```text
source = PLACE_LICENSE_CHECK
rolling_365_course_count = 20
active_events_count = 2
active_runs_count = 2
```

## Interpretation si la ligne PLACE n'apparait toujours pas

- Si `client_version = lot-11.12-place-usage-debug` n'apparait pas dans `license_audit_log`, le poste PLACE n'execute pas le fichier `SRC/Services/license_api_client.py` livre dans ce lot.
- Si `client_version` apparait mais `local_usage_received = false`, le poste PLACE contacte bien OVH mais ne transmet pas le snapshot local ; consulter `local_usage_error` et `client_payload_keys` dans l'audit.
- Si `local_usage_received = true` et `local_usage_persisted = false`, consulter l'audit `usage_persist_error` immediatement voisin pour connaitre l'erreur SQL exacte.
