# TRAIL DPS 4.2.7 - LOT 3.2.2 - Recu EULA serveur Licence

Date : 7 aout 2026

## Objectif

Renforcer la preuve d'acceptation de l'EULA `DPS-TRAIL-EULA-2026-08-07` en dupliquant le recu local PLACE dans la base Licence, sans faire de la disponibilite du serveur une condition de poursuite d'un LIVE.

Le texte contractuel reste porte par la source canonique PLACE `SRC/Assets/eula_dps_trail.txt`. Le serveur Licence ne stocke pas le texte : il archive l'identite probatoire de l'acceptation (version, SHA-256, date, installation, empreinte machine et contexte commercial resolu cote serveur).

## Flux

1. PLACE enregistre localement l'acceptation avant l'appel d'activation ou lors de la validation d'une nouvelle EULA.
2. Le payload `activate` ou `check` transporte `eula_acceptance_receipt`.
3. Licence valide la structure, le SHA-256, l'horodatage et la concordance de `installation_id`.
4. Licence enrichit le recu avec ses propres donnees : license_id, technical_license_uuid, organization_uuid, subscription_uuid, periode commerciale et empreinte machine calculee.
5. Un `receipt_fingerprint_sha256` serveur est calcule sur l'identite stable du recu.
6. L'enregistrement est idempotent. Les retransmissions incrementent `receive_count` et actualisent `last_received_at_utc`.
7. Licence retourne un accuse `eula_receipt` signe Ed25519 avec la cle de signature Licence ; PLACE verifie cette signature et la concordance version/hash/date avant de conserver l'accuse local, sans le retransmettre recursivement.

## Resilience

- Client ancien : aucun `eula_acceptance_receipt` -> `NOT_PROVIDED`, licence inchangee.
- Migration serveur non encore appliquee : `PERSIST_ERROR`, mais activation/check restent valides.
- Serveur indisponible : le recu local reste signe par l'integrite de l'etat licence et sera retransmis lors d'un prochain check.
- Recu invalide : `REJECTED`, sans revocation automatique de la licence ; l'anomalie est auditee pour diagnostic.

## Base de donnees

Nouvelle table additive : `eula_acceptance_receipts`.

Le lien `license_id` utilise `ON DELETE SET NULL`. Une suppression administrative definitive de licence ne supprime donc pas la preuve EULA ; les UUID techniques/commerciaux et l'empreinte du recu restent conserves.

Migration : `sql/2026_08_07_eula_acceptance_receipts.sql`.

Application :

```bash
php scripts/lot3_migrate_schema.php --dry-run
php scripts/lot3_migrate_schema.php --apply
php scripts/lot3_check_readiness.php
```

## Administration

`public/admin/license.php` affiche une section **Recus EULA serveur** avec :

- date d'acceptation UTC ;
- version EULA et SHA-256 ;
- canal d'acceptation ;
- installation ;
- organisation et souscription ;
- premiere/derniere reception serveur et compteur de retransmissions ;
- empreinte SHA-256 du recu serveur.

## Ordre de deploiement recommande

1. Sauvegarde MySQL Licence.
2. Deploiement des fichiers OVH LOT 3.2.2.
3. `php scripts/lot3_migrate_schema.php --dry-run`.
4. `php scripts/lot3_migrate_schema.php --apply`.
5. `php scripts/lot3_check_readiness.php`.
6. Deploiement PLACE contenant le transport du recu EULA.
7. Controle sur une licence de test : un `check` doit creer une ligne EULA et l'admin doit l'afficher.

## Rollback

Le rollback applicatif peut restaurer les fichiers PHP/Python precedents. La table `eula_acceptance_receipts` est additive et doit etre conservee : elle contient des elements probatoires. Aucun rollback ne doit la supprimer automatiquement.
