---
suivi: 1864
date: 2026-10-12
sujet: Lecture des fiches monprojet v2
chantier: monprojet
type: feature
statut: poussé
hash: a846352dd
fichiers:
  - app/Support/Monprojet/MonprojetVocabulaire.php
  - app/Support/Monprojet/MonprojetTranches.php
  - app/Support/Monprojet/MonprojetAffichage.php
  - app/Support/Monprojet/MonprojetSignature.php
  - app/Services/Monprojet/MonprojetEnveloppeControle.php
  - app/Services/Monprojet/MonprojetIngestionService.php
  - app/Services/Monprojet/MonprojetTableauBordService.php
  - app/Services/Monprojet/MonprojetPurgeService.php
  - app/Models/MonprojetFiche.php
  - app/Http/Controllers/MonprojetFicheController.php
  - database/migrations/2026_10_12_190000_add_monprojet_contrat_v2_columns.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - resources/js/Pages/Monprojet/Index.vue
  - resources/js/Pages/Monprojet/Show.vue
  - resources/js/Pages/Monprojet/TableauBord.vue
  - tests/Unit/MonprojetContratV2Test.php
  - public/build/
  - docs/suivi/SUIVI_1864_monprojet_contrat_v2.md
---

# SUIVI #1864 — Lecture des fiches monprojet v2

## Fiches lues

- #1809 — pipeline signature, quarantaine, fiches v1. L’affichage v1 de la fiche n’est pas réécrit. Les droits restent l’intersection des groupes bruts, sans `authorize()`.
- #1814 — tableau de bord et purge. Les durées (3 ans avec coordonnées, 12 mois sans, prénom à 30 jours) ne changent pas. Les nouveaux textes d’identité suivent la même purge. « Exemple chiffré » n’était pas une colonne : ce lot en ajoute une, saisie à la main.
- #1858 — la relève part du site. Ce lot ne touche pas le déclencheur ni Microsoft.

Le contrat lu est `C:\annexes\docs\contrats\monprojet_email_v2.md`. Il fait foi. `pieces_en_plus` n’y figure pas encore : le champ est accepté et affiché, sans liste fermée.

## PROMPT ENVOYÉ

Aligner Projets prospects sur le contrat v2 avant l’envoi côté site. Versions 1 et 2. Colonnes de filtre, le reste en JSON. Fiche par groupes, liste, exemple envoyé, tableau de bord. Aucune transmission partenaires.

## SYNTHÈSE

La relève accepte les enveloppes `version` 1 et 2. La signature reste `version|id|emis_le|sha256(canonique(fiche)+canonique(transcription))`, avec le numéro réel. Une autre version, une signature fausse, une date hors fenêtre ou un identifiant déjà vu vont en quarantaine, comme avant.

Une valeur fermée inconnue n’est pas refusée. Elle est stockée `autre` sur une colonne, le texte reçu dans `valeurs_brutes`, et affichée « Autre : {valeur} » sur une fiche v2. Sur une fiche v1, l’affichage reste « Autre » et « Valeur reçue ». Un montant libre de budget ou de terrain est ramené à la tranche de la borne basse, le texte reçu à côté, en italique. Les anciens codes (`moins_200`…, `moins_400`, `de_400_a_600`, `plus_600` pour le terrain, horizons et foyers v1) restent lisibles avec leur ancien libellé.

`mode_contact` peut être une chaîne ou une liste. Les chambres « 3 » et l’entier 3 valent le code `3`.

Le consentement partenaires est enregistré et affiché. Il ne déclenche aucun envoi.

## Mapping

Libellé affiché = libellé relu, sauf les priorités où l’écran reprend le libellé affiché du contrat (pastille).

| Champ du contrat | Colonne / JSON | Libellé affiché |
|---|---|---|
| version | version | (technique, pas à l’écran) |
| projet | projet | Projet |
| prenom | prenom | Prénom |
| nom | details.nom | Nom |
| prenom_nom | details.prenom_nom | Prénom et nom |
| commune_libelle | commune_libelle | Commune |
| commune_insee | commune_insee | Commune (code entre parenthèses) |
| autres_communes | autres_communes | Autres communes |
| ouvert_propositions | ouvert_propositions | Ouvert aux propositions |
| rayon_km | details.rayon_km | Rayon |
| lieu_travail | details.lieu_travail | Lieu de travail |
| temps_trajet_max | details.temps_trajet_max | Temps de trajet |
| foyer | foyer | Foyer |
| chambres | chambres | Chambres |
| pieces_en_plus | details.pieces_en_plus | Pièces en plus |
| pieces_en_plus_precision | details.pieces_en_plus_precision | Pièces en plus (italique) |
| type_maison | details.type_maison | Type de maison |
| surface_habitable | details.surface_habitable | Surface habitable |
| exterieurs | details.exterieurs | Extérieurs |
| priorites | details.priorites | Priorités |
| priorites_precision | details.priorites_precision | Priorités (italique) |
| surface_terrain | surface_terrain | Taille du terrain |
| situation_actuelle | situation_actuelle | Situation actuelle |
| budget | budget | Budget |
| avancement | details.avancement | Avancement |
| horizon | horizon | Premières démarches |
| precision | details.precision | Précision |
| mode_contact | mode_contact | Contact |
| email | email | E-mail |
| telephone | telephone | Téléphone |
| consentement.le | consentement_le | Consentement |
| consentement.politique_version | consentement_politique_version | Consentement |
| consentement_partenaires.accepte | consentement_partenaires_accepte | Partenaires |
| consentement_partenaires.le | details.consentement_partenaires.le | Partenaires : accepté le … |
| consentement_partenaires.libelle_version | details.consentement_partenaires.libelle_version | (conservé, pas une ligne seule) |
| description | description | Description |
| (saisie Hectarion) | exemple_envoye_le | Exemple envoyé le |
| (saisie Hectarion) | exemple_envoye_par | Envoyé par |
| (saisie Hectarion) | statut_traitement | Statut |

Valeurs postées du suivi, inchangées : nouveau, en_cours, traite, sans_suite.

Filtres de la liste : budget, commune, premières démarches (`horizon`), projet, partenaires (`oui` / `non`). Le nom et le statut se filtrent aussi.

## Migration

`2026_10_12_190000_add_monprojet_contrat_v2_columns.php`

Colonnes ajoutées : `version` (défaut 1), `projet`, `surface_terrain`, `situation_actuelle`, `consentement_partenaires_accepte`, `exemple_envoye_le`, `exemple_envoye_par`, `details`. `commune_insee` devient nullable. `mode_contact` passe en texte pour une liste.

`down()` retire les colonnes et les index, remet `commune_insee` obligatoire (vide remplacé par `00000`) et `mode_contact` en 40 caractères.

## DÉPLOIEMENT-TEST

```
git pull origin main
php artisan optimize:clear
php artisan view:clear
php artisan migrate --force
php artisan journal:sync
```

Pas de npm, pas de composer, pas de config:cache sur OVH.

1. Une fiche v2 complète apparaît par groupes, avec la valeur brute en italique à côté de la tranche.
2. Une fiche v1 déjà reçue garde la présentation précédente.
3. Mode de contact en chaîne ou en liste : icônes e-mail, téléphone, SMS.
4. Ancien code de budget ou de terrain : ancien libellé. Valeur inconnue : « Autre : … », fiche quand même créée.
5. Filtres budget, commune, premières démarches, projet, partenaires.
6. « Exemple envoyé le » et « Envoyé par » s’enregistrent et apparaissent dans l’historique.
7. Tableau de bord : délai moyen, fiches en attente d’exemple, nouvelles tranches. Aucun e-mail partenaires n’est envoyé.

## LEÇON

Le contrat v2 dit « toute autre version est refusée » côté site, parce que le site n’émet que la v2. Hectarion doit continuer à lire la v1 déjà reçue : le refus de version ne porte que sur un numéro autre que 1 ou 2.

`pieces_en_plus` n’a pas encore de liste fermée dans le contrat. Tant que la liste est vide, le texte est affiché tel quel. Le jour où les codes arrivent, les inconnus passeront en « Autre : … » sans rejeter la fiche.

Le consentement partenaires n’est pas une autorisation d’envoi. Aucun message ne part de ce lot.
