# TRAIL DPS 4.2 - LOT 11.22.1 - Validation de mise en facturation SMS

## Objectif

Ajouter une validation metier dans l'administration OVH pour confirmer qu'une periode SMS a ete mise en facturation et eviter qu'un client soit facture deux fois pour les memes SMS.

## Fichiers modifies ou ajoutes

- `ovh/SRC/SmsBillingReportService.php`
- `ovh/public/admin/billing_sms.php`
- `ovh/sql/lot_11_22_1_sms_billing_validation.sql`
- `ovh/docs/LOT_11_22_1_2026_05_28_VALIDATION_FACTURATION_SMS.md`

## Fonctionnement

La page `admin/billing_sms.php` affiche maintenant une carte **Validation de mise en facturation**.

L'administrateur doit cocher la confirmation puis cliquer sur **Valider la mise en facturation**.

L'action cree :

- un lot de facturation dans `sms_billing_batches` ;
- une ligne par SMS fige dans `sms_billing_items` ;
- une reference de lot du type `SMSBILL-YYYYMMDD-HHMMSS-XXXXXX`.

Chaque `sms_log_id` est protege par une contrainte unique afin d'interdire une double facturation technique du meme SMS.

## Effet sur les exports

Les SMS deja presents dans `sms_billing_items` avec un lot actif `status = billed` sont exclus :

- de la synthese par licence ;
- de la repartition par type de SMS ;
- de l'export CSV synthese ;
- de l'export CSV detail.

La page affiche aussi un historique des dernieres mises en facturation recouvrant la periode consultee.

## Donnees personnelles

Le telephone n'est pas stocke en clair dans les tables de validation. Seul un hash SHA-256 est conserve dans `sms_billing_items.phone_hash` pour tracer le figement sans exposer directement le numero.

## Verification conseillee

1. Ouvrir `admin/billing_sms.php`.
2. Filtrer une periode contenant des SMS non factures.
3. Exporter la synthese/detail CSV si besoin.
4. Cocher la confirmation puis cliquer sur **Valider la mise en facturation**.
5. Verifier qu'une reference `SMSBILL-*` apparait dans l'historique.
6. Verifier que les SMS concernes ne reapparaissent plus dans les SMS a facturer.

## Remarque de deploiement

Le service tente de creer automatiquement les tables si elles n'existent pas. Le fichier SQL est fourni pour execution manuelle si l'utilisateur SQL de l'admin n'a pas les droits DDL.
