# Rapport d'exécution — v3.32.1 (la fiche AO en colonne unique, comme la maquette)

**Correctif d'affichage pur. Aucune migration, aucune dépendance composer, aucun changement du
contrat d'ingestion. Se livre aux deux installations, à l'identique — tient sur une base vide.**

---

## Où était le défaut

### 1. Les deux colonnes (volet A)

Le défaut n'était **pas** dans les schémas de la fiche : ni `VeilleInfolist`, ni `TenderInfolist`,
ni les composants partagés (`FicheAo`) ne déclaraient deux colonnes. C'est **Filament** qui les
imposait : quand un schéma d'infolist ne déclare aucune colonne,
`ViewRecord::defaultInfolist()` pose `columns(2)` (vendor,
`filament/filament/src/Resources/Pages/ViewRecord.php`), et chaque section — largeur 1 par
défaut — se range alors côte à côte, dans l'ordre où elle est déclarée : gauche, droite, gauche…
D'où le résumé à droite de l'en-tête et la projection au milieu de page.

**Correctif** : `->columns(1)` posé sur le schéma dans les DEUX infolists
(`VeilleInfolist::configure()`, `TenderInfolist::configure()`) — la source commune : la fiche de
veille, les clôturés et la fiche d'une de nos offres changent d'un coup. La seule zone à deux
colonnes restante est la grille **interne** de la section « Exigences & conditions »
(`FicheAoHtml::deuxColonnes()`, CSS `.fao-deux`), qui s'empile déjà en une colonne sous 768 px.

Au passage, l'ordre de la maquette est rétabli sur toute la hauteur :

1. en-tête + grille des 12 champs ;
2. « Le travail à faire » ;
3. « Bordereau des prix » ;
4. « Ce qu'il faut présenter » / « Conditions du marché » (une section, grille interne à 2 colonnes) ;
5. « Résultat & concurrence » (clôturés) ;
6. « Projection de prix (IA) » — pleine largeur, désormais **repliée par défaut** ;
7. pied d'actions (Prédire le prix (IA), PDF, portail, Drive) ;
8. notes / liens (fiche de veille) ou « Suivi » (nos offres) ;
9. pièces justificatives repliées : méthode du RC, fiche portail ;
10. « Texte intégral du dossier (portail / OCR) » (replié).

Les actions d'en-tête n'ont pas bougé.

### 2. Les deux sections vides (volet B)

Ce n'étaient pas des sections du schéma : ce sont les **squelettes du rendu différé (lazy) de
Livewire** — un `div.fi-loading-section` gris de `height: 8rem` (= les ~128 px mesurés), pleine
largeur, sans titre ni contenu, affiché à la place d'un composant tant qu'il n'est pas chargé :

- **en haut** : la bannière « analyse en cours » (`AiAnalysisStatusWidget`, widget d'en-tête de la
  fiche) — qui, une fois chargée, ne rend RIEN quand aucune analyse n'est à suivre ;
- **en bas** : l'onglet « Concurrence » (`TenderResultsRelationManager`), chargé seulement quand
  il entre dans le viewport.

**Correctif** : rendu **synchrone** (`protected static bool $isLazy = false;`) sur la bannière et
sur les quatre onglets d'un AO (Concurrence, Bordereau, Checklist, Cautions). Le squelette
disparaît partout ; la bannière vide ne rend qu'un div de hauteur nulle ; l'onglet Concurrence
s'affiche directement comme un tableau titré. Ces composants ne coûtent qu'une requête chacun.

## Recette (faite avant le tag, navigateur sur base de recette `socle_v3321_review`)

- fiche d'un AO actif : sections empilées dans l'ordre ci-dessus, toutes pleine largeur (mesuré :
  1 408 px sur 1 408 px disponibles), 0 `fi-loading-section`, aucun bloc vide en haut ni en bas ;
- fiche d'un clôturé : « Résultat & concurrence » à sa place (après Exigences & conditions),
  attributaire + tableau des concurrents, aucun bloc vide ;
- projection présente : pleine largeur, repliée par défaut ;
- écran étroit (viewport 375 px) : tout s'empile, « présenter » / « conditions » l'un sous
  l'autre (`.fao-deux` à une colonne) ;
- maquette `docs/maquettes/fiche-ao-v3.32.html` ouverte à côté : même squelette visuel ;
- la vue imprimable (blade dédié, hors Filament) était déjà en colonne unique : non touchée.

## Tests

`php artisan test` : **2 538 tests verts** (1 skippé, comme avant). Aucun test n'affirmait la
disposition en deux colonnes : rien à adapter. Pint propre.

## Fichiers touchés (8, code seul)

- `app/Filament/Admin/Resources/Veille/Schemas/VeilleInfolist.php` — `columns(1)`, notes/liens
  remontés avant les pièces justificatives ;
- `app/Filament/Admin/Resources/Tenders/Schemas/TenderInfolist.php` — `columns(1)`, « Suivi »
  remonté avant les pièces justificatives ;
- `app/Filament/Admin/Resources/Tenders/Schemas/SectionsDossierIa.php` — projection
  `->collapsed()` ;
- `app/Filament/Admin/Widgets/AiAnalysisStatusWidget.php` — `$isLazy = false` ;
- `app/Filament/Admin/Resources/Tenders/RelationManagers/{TenderResults,BordereauLines,ChecklistItems,Guarantees}RelationManager.php`
  — `$isLazy = false`.

## Déploiement

Aucune migration, aucune commande, aucun réglage : remplacer le code suffit.
