# LOT 11.10 - Correctif persistance check licence PLACE vers supervision commerciale

Date : 2026-05-28 14:35 UTC

## Constat

Trois anomalies restaient visibles sur la fiche d'administration licence :

1. Le compteur **SMS 365 jours** restait a 0 alors que des lignes `license_usage_stats` existaient bien dans la base licence `synolui94`.
2. Les champs **Courses comptabilisees (425j)**, **Evenements actifs** et **Runs actifs** restaient a 0 apres ouverture de PLACE.
3. Aucune ligne `PLACE_LICENSE_CHECK` n'etait creee dans `license_usage_stats` malgre un `last_check_at` coherent sur la licence.

## Cause racine

Le code OVH courant ne contenait pas encore les methodes repository appelees par la page admin :

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

La page `admin/license.php` basculait donc sur ses valeurs de repli et affichait 0.

Le endpoint `api/license/check.php` executait bien le controle licence et mettait bien a jour `last_check_at`, mais `LicenseService::check()` ne persistait pas le bloc `local_usage` envoye par PLACE dans `license_usage_stats`.

## Corrections realisees

### `ovh/SRC/LicenseRepository.php`

Ajout des methodes suivantes :

- `getLatestUsageStats(int $licenseId): ?array`
- `countBillableSmsRolling365(int $licenseId): int`
- `getCommercialUsageSummary(int $licenseId): ?array`
- `recordPlaceLicenseCheckUsage(int $licenseId, array $localUsage, string $installationId): void`

La synthese commerciale combine maintenant :

- la derniere ligne `PLACE_LICENSE_CHECK` pour les courses/evenements/runs ;
- le meilleur compteur SMS connu dans `license_usage_stats` sur 365 jours pour eviter qu'un check PLACE a `sms_sent_count = 0` n'ecrase les SMS OVH deja comptabilises.

### `ovh/SRC/LicenseService.php`

Dans `check()` :

- detection du bloc `local_usage` recu depuis PLACE ;
- insertion non bloquante d'une ligne `PLACE_LICENSE_CHECK` dans `license_usage_stats` ;
- audit `check` enrichi avec `local_usage_received` ;
- audit `usage_persist_error` en cas d'erreur de persistance sans invalider la licence.

Dans la licence signee retournee a PLACE :

- ajout des limites commerciales issues de la table `licenses` ;
- ajout du bloc `commercial_usage` consolide.

## Fichiers modifies

- `ovh/SRC/LicenseRepository.php`
- `ovh/SRC/LicenseService.php`

## Procedure de deploiement

Copier uniquement les fichiers du ZIP incrementiel dans l'arborescence OVH existante en respectant les chemins.

Aucune migration SQL destructive n'est necessaire si la table `license_usage_stats` existe deja.

## Validation attendue

1. Deployer les deux fichiers PHP.
2. Ouvrir PLACE pour declencher un check licence.
3. Verifier dans `synolui94.license_usage_stats` la creation d'une ligne :
   - `source = 'PLACE_LICENSE_CHECK'` ;
   - `rolling_365_course_count > 0` selon la base locale ;
   - `active_events_count > 0` ;
   - `active_runs_count > 0`.
4. Recharger la fiche admin licence.
5. Verifier :
   - SMS 365 jours = compteur consolide present en base ;
   - Courses comptabilisees (425j) = derniere remontee PLACE ;
   - Evenements actifs = derniere remontee PLACE ;
   - Runs actifs = derniere remontee PLACE ;
   - Source = `PLACE_LICENSE_CHECK + OVH_SMS_RUNNER` si les deux sources sont presentes.

## Notes

Le correctif reste volontairement non bloquant : une erreur de persistance des statistiques ne doit pas empecher un poste PLACE valide de poursuivre son exploitation.
