# TRAIL DPS 4.2 - LOT 11.13 - Correctif persistance PLACE_LICENSE_CHECK

Horodatage : 2026-05-28

## Symptôme traité

- La page administration licence est de nouveau disponible après le correctif bootstrap.
- Les checks licence PLACE remontent bien dans `license_audit_log`.
- Aucune ligne `PLACE_LICENSE_CHECK` n'apparait pourtant dans `license_usage_stats`.

## Diagnostic consolidé

Le dump `license_audit_log.sql` montre que les checks récents restent enregistrés avec un payload minimal :

- `installation_id`
- `fingerprint_hash`

Il n'y a pas d'information visible permettant de confirmer la réception du snapshot local PLACE, car le code OVH actuel ne conservait pas les clés de payload client dans l'audit et ne persistait pas encore de manière robuste les statistiques PLACE.

## Correctifs livrés

### OVH

- `config/bootstrap.php`
  - résolution robuste du dossier source OVH : `SRC` puis `src` ;
  - évite une régression Linux liée à la casse des chemins.

- `SRC/LicenseService.php`
  - lecture des payloads suivants :
    - `local_usage`
    - `license_usage`
    - `commercial_usage`
    - `usage_snapshot`
    - `local_usage_json`
    - métriques à plat ;
  - insertion non bloquante dans `license_usage_stats` avec source `PLACE_LICENSE_CHECK` ;
  - audit enrichi de chaque check :
    - `client_version`
    - `local_usage_received`
    - `local_usage_persisted`
    - `local_usage_keys`
    - `client_payload_keys`
    - erreur éventuelle de persistance ;
  - retour JSON enrichi : `usage_received`, `usage_persisted`, `usage_error`.

- `SRC/LicenseRepository.php`
  - ajout réel des méthodes de lecture admin `getCommercialUsageSummary`, `getLatestUsageStats`, `countBillableSmsRolling365` ;
  - ajout de `recordPlaceLicenseCheckUsage` ;
  - conservation du compteur SMS OVH positif lors d'un check PLACE ;
  - normalisation des clés `rolling_365_course_count` et `rolling_425_course_count` ;
  - test d'existence de table plus robuste avec fallback `SHOW TABLES`.

- `sql/lot_11_13_license_usage_stats_integrity.sql`
  - script non destructif de vérification/création de `license_usage_stats` si besoin.

### PLACE

- `SRC/Services/license_api_client.py`
  - envoi redondant du snapshot local sous plusieurs formes compatibles :
    - `local_usage`
    - `license_usage`
    - `commercial_usage`
    - `local_usage_json`
    - métriques à plat ;
  - marquage `client_version = lot-11.13-place-usage-payload`.

- `SRC/Services/license_usage_service.py`
  - ajout de l'alias `rolling_425_course_count` dans le snapshot envoyé.

## Vérification attendue après déploiement

1. Déployer les fichiers OVH et PLACE du zip incrémentiel.
2. Ouvrir TRAIL DPS PLACE pour déclencher un check licence.
3. Contrôler `license_audit_log` sur le dernier check :

```json
"client_version": "lot-11.13-place-usage-payload"
"local_usage_received": true
"local_usage_persisted": true
```

4. Contrôler `license_usage_stats` :

```text
source = PLACE_LICENSE_CHECK
rolling_365_course_count = 20
active_events_count = 2
active_runs_count = 2
sms_sent_count >= 3
```

## Interprétation si cela ne remonte toujours pas

- Si `client_version` est absent dans le dernier audit : le poste PLACE n'exécute pas le `license_api_client.py` livré ou un ancien build/exécutable est lancé.
- Si `client_version` est présent mais `local_usage_received=false` : le calcul local n'a pas été envoyé ; vérifier `local_usage_error` dans l'audit.
- Si `local_usage_received=true` mais `local_usage_persisted=false` : lire `usage_persist_error` dans `license_audit_log`.
