# #02 — Refonte de la grille de stands 2027

> Statut : ✅ **fait** — 15/08/2026, migration `0.6`. Deux points à confirmer avec le client,
> en fin de ticket.

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

## Demande client

> Constat : trop de tailles de stands proposés + besoin de clarté visuellement.

La grille 2027 fournie **réduit fortement l'offre** et change tous les tarifs.

## Ce qui change

| | 2026 (actuel) | 2027 (demandé) |
| --- | --- | --- |
| Surfaces | 3, 4, 5, 8, 10, 12, 16, 20, 24, 30, 40, 50 m² | **4, 8, 12, 16, 24, 32, 64 m²** |
| Variantes en base JS | 85 entrées | **45 entrées** |
| Supprimé | | 3, 5, 10, 20, 30, 40, 50 m² |
| Ajouté | | **32 m²**, **64 m²** |

`30m2` disparaît au profit de `32m2`, et `64m2` est une nouvelle borne haute (le maximum actuel
est `50m2`). Les clés JS `32m2_*` et `64m2_*` n'existent pas et sont à créer.

## Grille tarifaire 2027 (€ HT)

Colonne 1 = Tarifs Fidélité (jusqu'au 31/10/2026) · Colonne 2 = Adhérents · Colonne 3 = Classiques.
Elles correspondent respectivement aux clés JS `fidelite`, `adherent`, `non_adherent`.

| Stand | Fidélité | Adhérent | Classique |
| --- | ---: | ---: | ---: |
| 4m2 | 1 040 | 1 240 | 1 660 |
| 4m2 premium | 1 330 | 1 550 | 1 970 |
| 4m2 premium + | 1 380 | 1 600 | 2 020 |
| 4m2 - 1 angle | 1 280 | 1 500 | 1 920 |
| 4m2 - 1 angle premium | 1 530 | 1 750 | 2 170 |
| 4m2 - 1 angle premium + | 1 580 | 1 800 | 2 220 |
| 8m2 | 2 160 | 2 600 | 3 440 |
| 8m2 premium | 2 660 | 3 100 | 3 940 |
| 8m2 premium + | 2 760 | 3 200 | 4 040 |
| 8m2 - 1 angle | 2 360 | 2 800 | 3 640 |
| 8m2 - 1 angle premium | 2 860 | 3 300 | 4 140 |
| 8m2 - 1 angle premium + | 2 960 | 3 400 | 4 240 |
| 8m2 - 2 angles | 2 560 | 3 000 | 3 840 |
| 8m2 - 2 angles premium | 3 060 | 3 500 | 4 340 |
| 8m2 - 2 angles premium + | 3 160 | 3 600 | 4 440 |
| 12m2 | 3 240 | 3 900 | 5 160 |
| 12m2 premium | 3 990 | 4 650 | 5 910 |
| 12m2 premium + | 4 140 | 4 800 | 6 060 |
| 12m2 - 1 angle | 3 440 | 4 100 | 5 360 |
| 12m2 - 1 angle premium | 4 190 | 4 850 | 6 110 |
| 12m2 - 1 angle premium + | 4 340 | 5 000 | 6 260 |
| 12m2 - 2 angles | 3 640 | 4 300 | 5 560 |
| 12m2 - 2 angles premium | 4 390 | 5 050 | 6 310 |
| 12m2 - 2 angles premium + | 4 540 | 5 200 | 6 460 |
| 16m2 - 1 angle | 5 000 | 5 880 | 7 560 |
| 16m2 - 1 angle premium | 6 000 | 6 880 | 8 560 |
| 16m2 - 1 angle premium + | 6 200 | 7 080 | 8 760 |
| 16m2 - 2 angles | 5 200 | 6 080 | 7 760 |
| 16m2 - 2 angles premium | 6 200 | 7 080 | 8 760 |
| 16m2 - 2 angles premium + | 6 400 | 7 280 | 8 960 |
| 24m2 - 1 angle | 7 400 | 8 720 | 11 240 |
| 24m2 - 1 angle premium | 8 900 | 10 220 | 12 740 |
| 24m2 - 1 angle premium + | 9 200 | 10 520 | 13 040 |
| 24m2 - 2 angles | 7 600 | 8 920 | 11 440 |
| 24m2 - 2 angles premium | 9 100 | 10 420 | 12 940 |
| 24m2 - 2 angles premium + | 9 400 | 10 720 | 13 240 |
| 32m2 - 2 angles | 10 000 | 11 760 | 15 120 |
| 32m2 - 2 angles premium | 12 000 | 13 720 | 17 120 |
| 32m2 - 2 angles premium + | 12 400 | 14 160 | 17 520 |
| 32m2 - 4 angles | 10 400 | 12 160 | 15 520 |
| 32m2 - 4 angles premium | 12 400 | 14 160 | 17 520 |
| 32m2 - 4 angles premium + | 12 800 | 14 560 | 17 920 |
| 64m2 - 4 angles | 20 000 | 23 520 | 30 240 |
| 64m2 - 4 angles premium | 22 000 | 25 520 | 32 240 |
| 64m2 - 4 angles premium + | 22 400 | 25 920 | 32 640 |

**45 variantes.** Le libellé sans mention d'angle correspond au « nu » actuel (clés `*_nu`).

## Ce qui a été fait

### Les options du formulaire sont dérivées des tarifs

Plutôt que de saisir la grille deux fois — une liste d'options d'un côté, une table de prix de
l'autre — les 47 options de `radio_1` sont **générées à partir des clés tarifaires** par
`reex_stands_datas()` ([inc/reex_stands.php](../plugins/reuseeconomyexpo/inc/reex_stands.php)).

La clé décrit le stand : `12m2_2_angles_premium_plus` se lit surface, angles, gamme, et donne le
libellé « 12m² - 2 angles premium + » / « 12m² - 2 corners premium + ». Un stand proposé sans prix
devient donc **impossible** plutôt que seulement détectable — c'est un cran au-delà de ce que #00
avait mis en place.

`reex_stand_decrire()` expose la même règle de décomposition, dont
[#03](REEX2027-03-angles-conditionnels.md) aura besoin pour construire le choix en deux temps.

### Migration 0.6

[`reex_maj_0_6_grille_stands_2027()`](../plugins/reuseeconomyexpo/inc/reex_migrations.php) remplace
les options de `radio_1`, et corrige deux choses au passage dans le même bloc affiché :

- **la date limite du tarif fidélité** dans l'en-tête du tableau de prix, restée au 30/09/2025 dans
  les deux langues, portée au 31/10/2026 (réponse A2) ;
- **les dimensions des stands supprimés** (5, 10, 20, 30, 50 m²), qui décrivaient des surfaces
  devenues impossibles à commander.

Les tarifs eux-mêmes sont dans `reex_tarifs_2027()`, pas dans la migration.

### Tarifs

`reex_tarifs_2027()` redéfinit le groupe `stands` en entier : 47 clés au lieu de 78.
`reex_tarifs_2026()` n'est pas touchée — les contrats des éditions passées restent rejouables aux
prix qui étaient les leurs.

### Date du tarif fidélité (A2)

Portée au 31/10/2026 aux **trois** endroits, et non deux comme l'annonçait ce ticket : les deux
lignes de [set_tarif_mode.html](../squelettes/inclure/set_tarif_mode.html#L13) — le test de date et
la clause sur la date d'envoi du dossier — plus l'en-tête du tableau de prix dans le formulaire,
qui affichait encore « Jusqu'au 30/09/2025 ».

## Vérification

- **La grille correspond au ticket.** Les 45 variantes ont été extraites mécaniquement du tableau
  ci-dessus, puis confrontées à la table émise par le plugin : les 45 × 3 montants correspondent.
- **Les libellés sont produits deux fois.** Générés par `reex_stands_datas()` d'un côté, dérivés du
  ticket de l'autre : sorties identiques à l'octet près.
- **Bijection options ↔ tarifs.** Aucune option sans prix, aucun prix sans option, les trois
  colonnes servies pour les 47 clés.
- **Cohérence interne de la grille client** : ordre fidélité < adhérent < classique respecté
  partout, progression croissante par gamme et par nombre d'angles. Les deux triplets identiques
  (16m² 1 angle premium + = 16m² 2 angles premium, 32m² 2 angles premium + = 32m² 4 angles premium)
  reproduisent une particularité déjà présente dans la grille 2026 : ce n'est pas une coquille.
- **Migration rejouable** : second passage sans écriture, empreinte du formulaire inchangée.
- **Options de la saisie préservées** : `class`, `conteneur_class`, `obligatoire`, libellé et
  `explication_apres` intacts après le patch.
- `node --test tests/tarifs/` — 15 tests.

Les 47 options n'ont **pas été vues dans un navigateur** : cela demande un compte exposant. Le
rendu du tableau de prix pour les bornes 32 et 64 m² reste donc à contrôler à l'œil.

## Décision prise contre l'avis du ticket : `3m2_habille`

Ce ticket demandait de traiter `3m2_habille` « comme les autres surfaces supprimées, sauf avis
contraire ». Avis contraire : **il est conservé**.

`contract_form.js` masque tous les stands sauf `3m2_habille` lorsque l'auteur porte
`jeune_pousse_2027`. Le retirer laisserait ces exposants devant un formulaire sans aucun choix
possible. Le mécanisme jeune pousse reste actif pour 2027 —
[#12](REEX2027-12-startup-moins-3-ans.md), qui le refond, est en Lot 2 et mis de côté.

Le tarif 2026 est repris tel quel (850 / 850 / 1100), et **confirmé par le client le 21/08/2026**.

## Les dimensions des deux nouvelles surfaces — reçues, migration 0.15

La liste sous la grille donne les dimensions de chaque surface. Celles des deux nouvelles n'avaient
pas été fournies et n'ont pas été inventées : la liste est restée muette jusqu'au 21/08/2026.

| Surface | Dimensions |
| --- | --- |
| 32 m² | 8 m (largeur) × 4 m (profondeur) |
| 64 m² | 8,5 m × 7,5 m |

⚠️ **8,5 × 7,5 fait 63,75 m², pas 64.** Le client a demandé d'afficher ses cotes telles quelles
(22/08/2026) : c'est la dimension d'implantation qui fait foi, la surface commerciale reste 64 m².
L'écart est signalé dans la migration pour qu'on ne le « corrige » pas par mégarde à la relecture.

La modification porte sur un texte libre, pas sur une liste d'options : elle ne se déduit pas de la
table des tarifs comme le reste du ticket. La migration repère la ligne du 24 m² **dans les deux
langues** et n'écrit rien si l'une des deux manque — un encart remanié en back-office ne doit pas
faire atterrir les dimensions au milieu d'autre chose.

## À confirmer avec le client

| Sujet | Pourquoi |
| --- | --- |
| ~~Dimensions des stands 32 et 64 m²~~ | ✅ reçues le 21/08/2026, en ligne (migration 0.15). |
| ~~Tarif du stand jeune pousse `3m2_habille`~~ | ✅ confirmé le 21/08/2026 à 850 / 1 100 €. |

Deux points hors périmètre relevés dans le même bloc de texte, à reprendre :
le formulaire renvoie encore au PDF **« REEX26 - Stands et options »**
(`offres_reex_2026.pdf`), et une explication s'intitule **« Nouveauté 2026 : SERVEX »**.

## Critères d'acceptation

- ✅ Les 45 variantes sont sélectionnables et tarifées dans les trois colonnes.
- ✅ Aucune clé tarifaire ne reste sans option correspondante, ni l'inverse.
- ✅ Les dossiers des éditions antérieures restent consultables : la table 2026 est intacte, et
  c'est le millésimage introduit par #00 qui le garantit — sans lui, la nouvelle grille aurait
  repricé rétroactivement les contrats archivés.
- ⏳ Contrôle visuel du tableau de prix, avec un compte exposant.

## Conséquence hors périmètre, à traiter dans #13

La liste des stands éligibles à la co-exposition est codée en dur dans
[article-bloc-coexposants.html:4](../squelettes/compositions/article-bloc-coexposants.html#L4) et
repose sur les paliers 8 / 10 / 16 et 20 m². Deux de ces surfaces n'existent plus, et les nouvelles
(12, 24, 32, 64 m²) n'y figurent pas : en l'état, seuls quelques stands de 8 m² ouvrent encore
droit à un co-exposant. Détail et question au client dans
[#13](REEX2027-13-coexposants-alignement.md).
