# #05 — Nouvelle section « Électricité »

> Statut : ✅ **fait** — 16/08/2026, migration **0.7**.
> Les 2 ampérages en réserve ont été **confirmés tels quels** le 21/08/2026. Plus rien en attente.

**Formulaire :** `offres_stands_exposants_2027` (id 58) · **Charge :** M
**Dépend de :** [#00](REEX2027-00-socle-prix-formidable-js.md)

## Demande client

> Puis, ajouter une section "électricité" entre stands et mobiliers

## Ce qui a été fait

La section n'existait **nulle part** dans le formulaire 2027. Elle existait en 2025 (`radio_2`,
18 puissances) puis a disparu du millésime 2026 — mais le champ caché `coffrets_electriques_amount`
est resté dans `demande_inscription_2027`, et `contract_form.js` savait toujours facturer la ligne.
Il ne manquait que la saisie et les tarifs.

| Fichier | Rôle |
| --- | --- |
| `plugins/reuseeconomyexpo/inc/reex_tarifs.php` | Les 24 montants, dans `reex_tarifs_2027()` |
| `plugins/reuseeconomyexpo/inc/reex_coffrets.php` | Grammaire des clés, ampérages, **génération des options** |
| `plugins/reuseeconomyexpo/inc/reex_migrations.php` | `reex_maj_0_7_electricite_2027()` |
| `squelettes/js/reex_tarifs.js` | `arrondir()` et `formaterMontant()` |
| `tests/tarifs/` | 24 montants retranscrits, ordre et libellés des options, arrondi |

La saisie est posée entre `explication_2` (fin du bloc stands) et `fieldset_2` (mobiliers), avec son
propre encart d'explication, comme les autres sections du formulaire.

### Les options sont dérivées de la table des tarifs

Même principe que les stands depuis [#02](REEX2027-02-grille-stands-2027.md) :
`reex_coffrets_datas(2027)` produit les 25 options à partir des clés tarifaires. Un coffret sans
prix n'est plus seulement détectable, il est **impossible**.

### L'ampérage n'est pas dans la clé

La clé est `6kW_permanent` — puissance et famille de courant, rien d'autre. L'ampérage vit dans
`reex_coffrets_amperages()`, pour deux raisons :

- c'est un **libellé, pas une identité** : deux coffrets de même puissance et même famille sont le
  même produit quel que soit l'ampérage affiché ;
- **un ampérage se corrige**, et la correction ne doit jamais renommer une clé sous laquelle des
  réponses d'exposants sont déjà enregistrées. Deux d'entre eux ont justement fait l'objet d'un
  doute — levé depuis, mais la précaution reste bonne.

Il n'y a pas de transposition JavaScript de ce fichier, contrairement à `reex_stands.js` : le
navigateur n'a besoin que des prix, les libellés sont écrits dans le formulaire par la migration.

## Intitulés d'ampérage — tranché

| Écrit dans le document | Retenu | Statut |
| --- | --- | --- |
| 6 kW / **81** | 6 kW / **8A** | ✅ coquille confirmée |
| 8 kW / **12A** | 8 kW / **12A** | ✅ **confirmé le 21/08/2026**, intermittent et permanent |
| 10 kW / **16A** | 10 kW / **16A** | ✅ **confirmé le 21/08/2026**, dans les deux familles |

Les deux lignes qui paraissaient douteuses sont donc justes : **la suite des ampérages n'est pas
croissante**, le 8 kW est bien à 12A quand le 6 kW est à 8A, et le 10 kW partage l'ampérage du
4 kW. C'est le matériel du prestataire, pas une erreur de saisie.

Le choix de les avoir reprises telles quelles plutôt que « corrigées » se trouve donc validé, et le
doute méritait d'être posé avant de les modifier — les clés portent des réponses d'exposants.

Les **prix** de ces trois lignes sont cohérents — un test vérifie que le permanent est toujours plus
cher que l'intermittent et que les deux croissent avec la puissance.

## Les premiers tarifs à décimales de toute la table

Jusqu'ici tous les montants étaient entiers. Les coffrets se comptent au centime (312,50 · 593,60 ·
1 122,30…), ce qui a demandé deux ajouts dans `reex_tarifs.js`, utilisés partout où un montant est
additionné ou affiché :

- `arrondir()` — sans quoi un total part en `2753.6000000000004` dans le champ caché, puis sur le
  contrat ;
- `formaterMontant()` — deux décimales et virgule française **uniquement** si le montant en porte.
  Un montant entier s'affiche exactement comme avant : aucune édition passée ne voit son affichage
  changer. C'est vérifié par un test de non-régression.

L'acompte, qui s'affichait brut, passe au même formatage à deux décimales que le TTC dont il dérive.

## Deux effets de bord traités

**La clé `aucun` existe maintenant dans trois groupes tarifaires** (coffrets, packs de visibilité,
co-exposants). Le récapitulatif dispatchait sur la seule valeur de la réponse : une réponse « aucun »
à l'électricité aurait aussi remis à zéro la ligne des packs de visibilité. Le total serait resté
juste, mais le détail — celui qui est facturé — aurait été faux. `contract_form.js` s'appuie
désormais sur la classe de la saisie, que le squelette dépose déjà sur le champ depuis #00, et ne
retombe sur la valeur seule que si la classe manque.

**La section crée un second `.editer.prices-grid`.** `stand_selector.js` prenait le premier de la
page ; il remonte maintenant depuis les stands eux-mêmes. Se repérer à l'ordre du DOM aurait fait
disparaître le parcours en étapes en silence le jour où il aurait changé.

## Questions restées ouvertes

- **Un seul coffret par exposant ?** Implémenté ainsi (boutons radio), comme en 2025. À confirmer
  pour les grands stands (32 et 64 m²).
- **Un coffret est-il obligatoire ?** Non : la saisie est obligatoire au sens « il faut répondre »,
  et l'option « aucun » permet de ne pas en commander.
- **Puissance minimale selon la surface ?** Non demandé, non fait.
- Le visuel de coffret demandé par le client relève de [#04](REEX2027-04-visuels-stands.md) — asset
  non fourni.

## Critères d'acceptation

- [x] Les 24 tarifs sont sélectionnables et répercutés dans le total et le récapitulatif.
- [x] Aucune clé de l'ancien bloc `coffrets_electriques` ne subsiste en 2027 — le groupe est
      remplacé en entier, et un test vérifie qu'aucun montant de 2026 ne survit.
- [x] Les montants au centime s'affichent et s'additionnent correctement.
- [ ] Les libellés d'ampérage validés par le client sont ceux affichés — **2 sur 12 en attente**.
- [ ] Contrôle visuel dans un navigateur — demande un compte exposant.

## À savoir pour le déploiement

Le CSV `dossiers-exposants.html` produit ses colonnes depuis la **définition** du formulaire et ses
cellules depuis les **réponses enregistrées**. Un dossier envoyé avant cette migration n'a pas de
réponse pour `radio_2` : sa ligne aurait une cellule de moins et l'export se décalerait. Aucun
dossier 2027 n'existe à ce jour, mais la migration doit partir **avant l'ouverture des inscriptions**.
