# Plugin WordPress « biome-partenaires » (SST) — inventaire complet

Inventaire exhaustif de l'ancien module de candidature des sous-traitants, pour
decider ce qui doit etre porte sur le nouveau site.

## 0. Trois versions, et laquelle fait foi

Le plugin n'est sur **aucune branche deployee** du depot
`BiomeOrganization/biome.immo` : il est absent de `main`, qui porte pourtant la
vraie liste des plugins WordPress. Il vit sur deux branches de travail, dans des
etats tres differents :

| Source | Version | Taille | Ce qu'elle vaut |
|---|---|---|---|
| `feature/plugin-biome-partenaires` | **1.1.4** (2026-06-03) | 18 fichiers, `class-admin.php` 10 Ko | Version ANCIENNE. A ignorer. |
| `feature/plugin-multi-forms` | **1.6.14** | 42 fichiers, `class-admin.php` 41 Ko, `class-db.php` 55 Ko | **La reference.** Tout ce document en decrit le contenu. |
| <https://sst.biome.immo/travailler-avec-biome/> | en ligne | — | Le formulaire reellement expose. Conforme a la 1.6.14. |

> **Avertissement.** Une premiere version de ce document decrivait la 1.1.4 et
> concluait notamment que « la verification BCE n'est qu'un badge decoratif ».
> **C'etait faux** : la 1.6.14 embarque une integration BCE reelle (§5). Toute
> conclusion tiree de la 1.1.4 doit etre reverifiee ici.

---

## 1. Architecture

Un **registre de formulaires** (`Biome_Registry`) et une **classe de base
abstraite** (`Biome_Form_Base`) permettent d'enregistrer plusieurs formulaires,
chacun avec son shortcode et ses actions AJAX derivees de son slug :

| Formulaire | Slug | Role |
|---|---|---|
| `Biome_Form_Partenaire` | `partenaire` | La candidature generale, en 4 etapes |
| `Biome_Form_Electricien` | `electricien` | **Questionnaire metier**, rattache a un partenaire existant |
| `Biome_Form_Chauffage_Sanitaire` | `chauffage-sanitaire` | idem |

La classe de base fournit : shortcode, endpoints AJAX (`submit`, `save_step`),
verification de nonce, exclusion Autoptimize, et un contrat pour les
questionnaires metier (`has_metier_data`, `get_metier_data`,
`save_metier_data`, `get_edit_fields`).

**Detail d'implementation notable** : au chargement, le plugin force la
connexion MySQL en UTC (`SET time_zone = '+00:00'`) pour que toutes les dates
soient stockees en UTC et affichees dans le fuseau du site.

---

## 2. Le formulaire partenaire — 4 etapes + photos

### Etape 1 — « Vos corps de metier »

| Champ | Type | Obligatoire | Options |
|---|---|---|---|
| `metier_ids[]` | cases a cocher | oui | 16 metiers (§4) |
| `nb_ouvriers` | liste | oui | `1`, `2-3`, `4-6`, `7-10`, `10+` |
| `statut_professionnel` | radio | oui | 6 valeurs (ci-dessous) |
| `statut_professionnel_autre` | texte | si « Autre » | placeholder « Votre situation professionnelle » |
| `gsm_s1` | telephone | oui | placeholder `+32 4XX XX XX XX` |

**Statut professionnel** : `independant_principal`,
`independant_complementaire`, `societe_salaries`, `societe_sans_salaries`,
`flexi_job`, `autre`.

> **Le telephone est demande ICI**, pas a l'etape 4 — et c'est ce qui rend la
> sauvegarde progressive exploitable : un candidat qui abandonne reste
> joignable. Il est ensuite redemande a l'etape 4 (`gsm`), donc la donnee
> existe en double dans le formulaire.

### Etape 2 — « Zone d'intervention & disponibilite »

`province_ids[]` (obligatoire, 6 provinces), `rayon_km` (`25`/`50`/`80`/`100`/`0`
= pas de limite, defaut 80), `bp-dispo`
(`immediate`/`date`/`non_disponible`), `date_dispo` (si `date`).

### Etape 3 — « Collaboration »

`contact_preferences[]` **obligatoire** (`whatsapp`, `gsm`, `messenger`,
`email`), `bp-promo` (travaille pour d'autres promoteurs, defaut oui),
`promoteurs_actuels` (obligatoire si oui), `remarques`.

### Etape 4 — « Vos coordonnees »

`prenom` et `nom` (obligatoires), `societe`, `numero_tva`, `gsm`
(obligatoire), `email`, `adresse`, `langue` (obligatoire — fr/nl/en/ro/pl/pt/
other). Societe, TVA, e-mail et adresse sont **facultatifs**.

### Etape 5 — photos (facultative, apres enregistrement)

« Encore un petit effort, montrez-nous vos realisations », avec l'argument « les
artisans qui partagent des photos sont contactes en priorite ». Multi-selection,
JPG/PNG/WEBP/HEIC, **10 Mo max par photo**, sans plafond de nombre. Deposees
dans `wp-content/uploads/biome-partenaires/{id}/`, donc **accessibles
publiquement par leur URL**.

### Comportements de parcours

- **Sauvegarde progressive** : `biome_sauvegarder_etape` est appele **a chaque
  changement d'etape**, et `sessionStorage['biome_draft_id']` conserve
  l'identifiant du brouillon — le parcours survit a un rechargement de page.
- **Pre-remplissage par le GSM** (`handle_lookup_gsm`) : quand le candidat
  saisit un numero deja connu, le formulaire recupere societe, GSM, e-mail et
  adresse depuis la table `wp_ressources_avenants`. **Cette table n'est pas
  creee par le plugin** : elle vient d'un autre systeme (import ou CRM), non
  visible dans ce depot. Dependance externe a eclaircir avant tout portage.
- Validation cote client : TVA (regex), GSM (>= 8 chiffres), e-mail, requis par
  etape, messages sous chaque champ.

---

## 3. Les questionnaires metier

Deuxieme couche, ignoree jusqu'ici : une fois le partenaire enregistre, un
questionnaire **specifique a son metier** collecte les conditions de
collaboration, avec une **grille de prix**. Chacun a sa table
(`biome_partenaire_electricien_1`, `biome_partenaire_chauffage_sanitaire_1` — le
suffixe numerique suggere un versionnement du questionnaire).

**Electricien** — types de chantiers, photovoltaique, ventilation simple flux,
logements/an, maisons en parallele, plans electriques, organismes de controle,
marques, materiel impose, blochets, argex, bloc platre, **jours** par phase
(encastrement, finitions), nb de personnes, organisation, puis les **prix
unitaires** : point lumineux, interrupteur double, prise simple, prise double,
coffret, photovoltaique, reception, et un **prix global pour 150 m²**.

**Chauffage / sanitaire** — types de chantiers, logements/an, maisons en
parallele, fournisseurs, marques chauffage et sanitaire, materiel impose, argex,
bloc platre, **jours** par phase (encastrement, plancher chauffant, finitions),
nb de personnes, organisation, puis les **prix** : radiateur, chauffage au sol,
chaudiere, douche, WC, prix global.

> C'est un outil d'achat, pas de qualification. **Les deux questionnaires sont
> desormais refaits sur le nouveau site** (decision du 2026-09-07), structure
> dans `config/questionnaires-metier.php` et atteignable par un lien nominatif
> sans compte. Les cles de champs reprennent les noms de colonnes ci-dessus,
> pour que les 25 reponses importees et les nouvelles se lisent pareil.

---

## 4. Referentiels

**16 metiers** (`biome_metiers` : `slug`, `label_fr`, `label_nl`, `label_en`,
`code_nace`, `ordre`, `actif`), dans l'ordre d'affichage :

| Ordre | Slug | Libelle | NACE |
|---|---|---|---|
| 1 | `terrassement` | Terrassement | 43.12 |
| 2 | `gros_oeuvre` | Gros Œuvre | 41.20 |
| 3 | `rejointoyeur` | Rejointoyeur | 43.99 |
| 4 | `toiture` | Toiture | 43.91 |
| 5 | `menuiserie` | Menuiserie int. / ext. | 43.32 |
| 6 | `plafonnage` | Plafonnage | 43.31 |
| 7 | `poseur_bloc_platre` | Poseur de bloc de platre | 43.31 |
| 8 | `electricite` | Electricite | 43.21 |
| 9 | `chauffage_sanitaire` | Chauffage / Sanitaire | 43.22 |
| 10 | `ventilation` | Ventilation | 43.22 |
| 11 | `chape_isolante` | Chape Isolante | 43.33 |
| 12 | `chape` | Chape | 43.33 |
| 13 | `carrelage` | Carrelage | 43.33 |
| 14 | `peintre` | Peintre | 43.34 |
| 15 | `amenagement_exterieur` | Amenagement exterieur | 81.30 |
| 16 | `panneaux_photovoltaiques` | Panneaux photovoltaiques | 43.21 |

Desactives : `cuisiniste`, `terrassement_egout`.

**6 provinces** — Namur/Namen, Liege/Luik, Brabant wallon/Waals-Brabant,
Hainaut/Henegouwen, Luxembourg/Luxemburg, Toute la Wallonie/Heel Wallonie.

**Le referentiel est editable depuis l'admin** en 1.6.14 (`render_edit_metier`
+ `handle_save_metier`), ce qui n'etait pas le cas en 1.1.4.

---

## 5. Integration BCE — le point le plus important

**Ce n'est pas la BCE officielle : le plugin interroge le portail Biome.**

```
GET https://portail.biome-constructions.be/api/bce/entreprise/{10 chiffres}
en-tete X-API-Key   timeout 10 s   sslverify true
```

La cle vient de la constante PHP **`BIOME_BCE_API_KEY`**, definie dans
`wp-config.php` — donc absente du depot. Le numero est nettoye de tout
caractere non numerique et doit faire exactement 10 chiffres.

**Trois declencheurs :**

1. **Automatique** a l'ouverture d'une fiche, si aucune donnee en cache et
   qu'un numero de TVA est renseigne.
2. **Bouton « ↻ Actualiser »** (`admin_post_biome_bce_refresh`, nonce propre a
   chaque fiche) : supprime la ligne en cache, puis reinterroge.
3. **Page d'admin « Test API BCE »** : on saisit un numero, elle affiche le code
   HTTP et le JSON brut. Outil de diagnostic.

**Cache** en table `biome_bce_infos`, une ligne par partenaire, horodatee
`fetched_at`, **sans duree de validite** : la donnee reste figee jusqu'a un clic
sur Actualiser.

**Donnees renvoyees et stockees** : `enterprise_number`, **`status`** (`AC` =
actif ; toute autre valeur est signalee en rouge sur la fiche), `start_date`,
type d'entreprise (code + libelle), forme juridique (code + libelle),
**situation juridique** (code + libelle, avec un code juge OK ou en alerte),
denomination **officielle** et **commerciale**, adresse complete (rue, numero,
boite, code postal, commune, pays), `contacts` (JSON) et **`activities`** (JSON,
avec `nace_code` et `label`).

> **Un defaut a ne pas reproduire.** `_fetch_bce()` appelle le portail des que
> le numero comporte 10 chiffres, sans verifier sa **cle de controle** (les deux
> derniers chiffres valent 97 moins les 8 premiers modulo 97). Un numero mal
> saisi part donc en appel pour rien.

> **Ce qui manque, et qui serait le vrai gain.** La fiche affiche les activites
> NACE en pastilles mais **ne les compare jamais** aux metiers declares. Or le
> referentiel porte deja un `code_nace` par metier. Les deux moities du controle
> existent ; personne ne les a mises face a face. C'est la que se detecterait
> automatiquement le candidat qui coche « Electricite » sans y etre enregistre.

---

## 6. Donnees stockees — 12 tables + 1 vue

| Table | Role |
|---|---|
| `biome_partenaires` | la candidature |
| `biome_metiers`, `biome_provinces` | referentiels |
| `biome_partenaire_metiers`, `biome_partenaire_provinces` | liaisons |
| `biome_partenaire_photos` | photos de realisations (publiques) |
| `biome_bce_infos` | cache BCE (§5) |
| `biome_notes` | **notes de suivi** : type `appel`/`email`/`visite`/`autre`/`system`, contenu, auteur, date |
| `biome_tags` | **etiquettes libres** par partenaire, avec auteur et date |
| `biome_fichiers` | **pieces jointes** ajoutees par l'equipe : uuid, nom d'origine, nom stocke, mime, taille, auteur |
| `biome_partenaire_electricien_1`, `biome_partenaire_chauffage_sanitaire_1` | questionnaires metier (§3) |
| `biome_v_partenaires_qualifies` (vue) | agregation metiers/provinces, hors archives |

Colonnes de `biome_partenaires` au-dela des champs du formulaire : `uuid`,
`statut`, `source` (`formulaire_web`, `import_bce`, `appel_telephone`, `autre`,
**`admin_manuel`**), copies denormalisees `metiers`/`provinces`,
`date_soumission`, `date_modification`, `date_dernier_contact`,
`message_j0_envoye`, `date_j0`, `date_relance_j7`, `date_relance_j14`,
`formulaire_complete`, `wp_user_id`, et `tarif_mode`/`tarif_montant` (plus
collectes par le formulaire, mais toujours au schema et a l'export).

Contraintes : `uuid` UNIQUE, **`numero_tva` UNIQUE**, index sur statut, langue,
disponibilite, date de soumission, source, e-mail.

**Le pipeline a change** entre les deux versions : `qualifie` a disparu, `rdv_fixe`
et `perdu` sont apparus. Les 7 etats de la 1.6.14 sont **nouveau, a contacter,
RDV fixe, en mission, suspendu, perdu, archive**.

---

## 7. L'administration

Menu **« Biome »**, 6 pages : Tableau de bord, Contacts, Nouveau contact,
Parametres, Test API BCE, et l'edition d'un metier (menu masque).

**Tableau de bord** — compteurs par statut (Nouveaux, A contacter, RDV fixe, En
activite, Perdu, Archive, Total, Formulaire complet), une file « **A traiter en
priorite** » et un flux « **Activite recente** ».

**Liste des contacts** — filtres par **statut (multiple)**, **langue**,
**metier**, **colonne metier**, **colonne province**, **formulaire d'origine
(multiple)**, plus une recherche libre (prenom, nom, societe, e-mail, TVA). Tri
sur date / nom / statut / langue / disponibilite, pagination par 20.

**Fiche** — toutes les donnees, la carte BCE (§5), les questionnaires metier,
les notes, les tags, les fichiers et les photos.

**Actions disponibles** (toutes protegees par nonce et par la capacite
`biome_manage`) :

| Action | Effet |
|---|---|
| `biome_update_statut` | changer le statut |
| `biome_add_note` / `biome_delete_note` | ajouter / supprimer une note de suivi |
| `biome_add_tag` / `biome_delete_tag` | ajouter / supprimer une etiquette |
| `biome_delete_fichier` | supprimer une piece jointe |
| `biome_delete_photo` | supprimer une photo |
| `biome_get_photos` (AJAX) | charger la galerie |
| `biome_create_contact` | **creer un partenaire a la main** (source `admin_manuel`) |
| `biome_save_metier` | modifier le referentiel des metiers |
| `biome_save_form_pages` | associer chaque formulaire a une page WordPress |
| `biome_bce_refresh` | reinterroger la BCE (§5) |
| `biome_bce_test` (AJAX) | tester l'API sur un numero |
| `biome_export_csv` | export CSV |

**Export CSV** — respecte les filtres courants, BOM UTF-8 pour Excel,
separateur `;`, 23 colonnes : ID, UUID, Statut, Prenom, Nom, Societe, N° TVA,
GSM, Email, Adresse, Langue, Metiers, Provinces, Rayon km, Disponibilite, Date
dispo, Tarif mode, Tarif montant, Travaille promoteur, Promoteurs, Ouvriers,
Remarques, Date soumission. **Ni les donnees BCE, ni les questionnaires metier,
ni les notes n'y figurent.**

---

## 8. Role et permissions

La 1.6.14 cree un **role WordPress dedie** : `biome_gestionnaire`
(« Biome Gestionnaire »), avec la capacite **`biome_manage`**. Le role est cree
a l'activation et **supprime a la desactivation**.

La capacite est accordee **dynamiquement en memoire** (filtre `user_has_cap`,
aucune ecriture en base) a quiconque possede `manage_options` ou `edit_posts`.

Pour ce role, le plugin **restreint le menu WordPress** et **redirige vers le
tableau de bord Biome a la connexion** (`redirect_gestionnaire_on_login`,
`restrict_gestionnaire_menu`) : un gestionnaire ne voit donc pas le reste de
WordPress.

---

## 9. Reglages

Seuls **4 reglages** subsistent en 1.6.14 (les delais J+7 / J+14 configurables
de la 1.1.4 ont disparu de la page) :

| Option | Defaut | Role |
|---|---|---|
| `biome_workflow_relances_max` | 2 | 0 a 2 |
| `biome_workflow_email_actif` | 1 | coupe tous les envois |
| `biome_email_expediteur` | `noreply@biome.immo` | expediteur |
| `biome_email_notification` | e-mail admin WordPress | destinataire interne |

Plus `biome_formulaire_version` / `biome_db_version` (versions, pour les
migrations) et l'association formulaire → page WordPress.

---

## 10. Ce qui ne fonctionne pas — verifie sur la 1.6.14

1. **Aucun e-mail n'est jamais envoye.** `Biome_Email::send_confirmation()` et
   `send_notification()` sont ecrites, avec leurs gabarits HTML, et **ne sont
   appelees nulle part** — ni dans la 1.1.4, ni dans la 1.6.14. Le module
   enregistre en base et ne notifie personne : ni le candidat, ni l'equipe.
2. **Les relances ne partent jamais.** `Biome_Workflow::schedule_relances()`
   n'est jamais appelee, donc aucun evenement n'est planifie. Et les deux
   gestionnaires sortent immediatement : ils exigent `message_j0_envoye`, qui
   n'est **jamais mis a 1**.
3. **Le cache BCE n'expire pas.** Sans clic sur Actualiser, une entreprise
   radiee apres la premiere consultation reste affichee comme active.
4. **Les marques atterrissent dans le champ des organismes de controle.**
   Constate sur les donnees de production : **54 valeurs** de
   `organismes_controle` sont des noms de marques (Niko, Legrand, Hager, ABB,
   Schneider). Les deux groupes de cases sont adjacents dans le questionnaire
   electricien et collectes par le meme selecteur. Ces valeurs sont importees
   **telles quelles**, sans correction silencieuse (voir
   [`architecture-donnees.md`](architecture-donnees.md)).

---

## 11. Historique

**11 migrations** de 1.1.0 a 1.6.6. Etapes marquantes : 1.1.0 (suppression des
tarifs, `contact_preferences`, table photos, refonte des metiers), 1.1.3 (TVA
rendue optionnelle), 1.1.4 (photovoltaique, promoteurs obligatoire si oui),
1.3.0 / 1.4.0 (notes, tags, fichiers), 1.6.0 et suivantes (multi-formulaires,
BCE, role dedie, tableau de bord).

---

## 12. La reprise des donnees

Le dump de production (12 tables, 562 Ko) contient :

| Table | Lignes | Reprise |
|---|---|---|
| `biome_partenaires` | **309** | oui — dont 92 profils incomplets (`formulaire_complete = 0`) |
| `biome_notes` | **758** | oui — 531 traces automatiques, 227 notes humaines |
| `biome_partenaire_photos` | **558** | 555 (3 orphelines, signalees) |
| `biome_bce_infos` | **181** | oui — autant d'appels au portail economises |
| liaisons metiers / provinces | 438 / 495 | oui |
| questionnaires metier | 21 + 4 | oui, en JSON lecture seule |
| `biome_metiers` / `_provinces` | 18 / 6 | servent de referentiel de traduction |
| `biome_tags` | 1 | oui |
| `biome_fichiers` | 0 | sans objet |

Import par `app:importer-partenaires-wordpress`, **idempotent** (rattachement
par `wordpress_id`) et dote d'un mode simulation. Il lit le dump SQL
DIRECTEMENT, sans base MySQL intermediaire : le mutualise OVH ne permet pas
d'en creer une facilement, et lire le fichier rend l'import rejouable depuis
n'importe quel poste.

Points de vigilance releves sur les donnees reelles :

- **Aucune candidature n'est en statut `nouveau` ou `a_contacter`** : les 309
  sont toutes triees (perdu 119, suspendu 87, archive 72, en mission 23, RDV
  fixe 8). Le fichier est entierement travaille, ce qui donne son prix aux 758
  notes.
- **87 des 92 profils incomplets n'ont pas de telephone.** Le champ n'a ete
  place a l'etape 1 que recemment (249 candidatures sur 309 n'ont pas non plus
  de statut professionnel, autre champ recent) : les anciens abandons sont donc
  injoignables. Les nouveaux ne le seront plus.
- **Les libelles des metiers du dump correspondent exactement** a ceux de
  `config/site.php`, la liste du site ayant ete relevee sur le formulaire en
  ligne. Les deux metiers desactives ('Terrassement / Egouttage', 'Cuisiniste')
  sont conserves tels quels plutot que supprimes.
- **La BCE renvoie des codes NACE-BEL a 5 chiffres** (`43211`), la ou le
  referentiel du plugin en stocke a 4 (`43.21`). La comparaison au niveau du
  GROUPE absorbe cette difference.

---

## 13. Etat du portage sur le nouveau site

| Element | Etat |
|---|---|
| Formulaire 4 etapes, progression, champs conditionnels | **Porte** (PR #125) |
| Referentiels metiers / provinces / effectifs / rayons / disponibilites / langues / canaux | **Porte** |
| Statut professionnel + « precisez » | **Porte** (branche d'alignement) |
| Telephone a l'etape 1 + enregistrement partiel | **Porte** (idem) |
| Photos de realisations | **Porte, et affichees** ; stockage **prive** au lieu de public |
| Pipeline de statuts | **Porte et corrige** : les 7 etats de la 1.6.14, plus `qualifie` conserve en « historique » pour ne pas perdre les candidatures deja traitees |
| Notification interne a l'equipe | **Porte — et fonctionnelle**, contrairement au plugin |
| Filtres admin | **Porte** : metier, zone, disponibilite, statut, profil incomplet |
| Purge RGPD | **Ajoute** (inexistant dans le plugin) |
| **Integration BCE** | **PORTEE** — service, commande planifiee, cache borne en fraicheur, carte dans la fiche, action « Actualiser la BCE ». Transport `journal` par defaut : il ne reste qu'a renseigner `BCE_API_KEY` et `BCE_TRANSPORT=http`. Deux defauts du plugin corriges : cache sans expiration, et appel emis sur un numero a cle de controle fausse. |
| **Comparaison NACE / metiers declares** | **CONSTRUITE** (`App\Services\Bce\CoherenceNace`) — comparaison au niveau du GROUPE NACE, signalee dans la fiche. N'existait nulle part. |
| Notes de suivi, tags | **PORTES**, et les 758 notes / 1 etiquette de production sont importees. Les notes humaines s'affichent en clair, les 531 traces automatiques sont repliees. Une action permet d'en ajouter. |
| Pieces jointes (`biome_fichiers`) | **Non portee** — table VIDE en production (0 ligne) : inutile de creer un ecran pour une fonctionnalite jamais utilisee |
| Tableau de bord avec compteurs et file de priorite | **Non porte** |
| Creation manuelle d'un contact | **Non portee** |
| Questionnaires metier (electricien, chauffage/sanitaire) | **PORTES, formulaires compris.** Les 25 questionnaires remplis (avec leurs grilles de prix negociees) sont importes, et les deux formulaires qui les alimentent sont refaits : 4 etapes, champs conditionnels, pre-remplissage des reponses connues, acces par lien nominatif sans compte. Structure declarative dans `config/questionnaires-metier.php`. |
| Relances J+7 / J+14 | **VOLONTAIREMENT NON PORTEES** (decision du 2026-09-07). Elles ne partaient jamais dans le plugin ; le suivi reste manuel, par les notes. Les colonnes `date_relance_j7` / `date_relance_j14` ne sont pas importees. |
| Referentiel metiers editable en admin | **Non porte** (listes dans `config/site.php`) |
| Export CSV | **Non porte** |
| Role dedie + redirection a la connexion | **Non porte** — le site a deja ses 4 roles et ses permissions par section |
| Pre-remplissage par le GSM (`wp_ressources_avenants`) | **Non porte** — dependance externe a eclaircir |
| `uuid` | **PORTE** — c'est la cle d'acces au questionnaire metier, donc les UUID d'origine sont repris tels quels pour ne pas casser un lien deja envoye. Une nouvelle candidature en recoit un a la creation. |
| Filtre par langue, `source`, `date_dernier_contact`, `wp_user_id` | **Non portes** |
| Codes NACE, libelles NL/EN | **Non portes** — mais requis pour la comparaison NACE |
| Vue SQL `biome_v_partenaires_qualifies` | **Sans objet** — remplacee par les filtres Eloquent |
| Unicite stricte de la TVA | **Volontairement non repris** : doublon accepte puis signale |

Detail des choix de portage : [`architecture-donnees.md`](architecture-donnees.md).
