---
suivi: 1469
date: 2026-09-07
sujet: Historique Chronologique fiche demande juridique
chantier: juridique / demandes
type: feature
statut: poussé
hash: ceb34e89
fichiers:
  - app/Support/Juridique/DemandeJuridiqueChronologieBuilder.php
  - app/Support/Juridique/DemandeJuridiquePresenter.php
  - resources/js/Pages/Juridique/Show.vue
  - resources/js/Components/Juridique/DemandeJuridiqueCommentairesPanel.vue
  - resources/js/Components/Commentaires/EntiteCommentairesPanel.vue
  - public/build/
  - tests/Unit/DemandeJuridiqueChronologie1469Test.php
  - tests/Unit/DemandeJuridiqueChronologie1469SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - docs/suivi/SUIVI_1469_juridique_historique_chronologique.md
---

# SUIVI #1469 — Historique Chronologique demande juridique

## PROMPT ENVOYÉ

Fusionner en une chronologie unique (titre exact « Historique Chronologique »)
les événements d’historique, les commentaires (texte complet) et les pièces
jointes (œil aperçu #1456). Formulaire commentaires conservé sans liste.
Bloc Pièces jointes inchangé (doublon assumé liste ↔ chronologie).

## BASE GIT

```
git log --oneline -1 origin/main
2a241a43 chore(suivi): hash fiche #1468
```

## FICHES LUES

- **#1456** — Dialog local Show.vue + `juridiquePieceJointeApercu.js` ; ne pas
  toucher DocumentPreviewDialog.
- **#1455** — PieceJointeMimeSupport + inline ; contrôleur download intact.
- **#1442** — `$groupesM365` (pas de réassignation payload) ; ce lot n’ajoute
  pas de lecture groupes sur show.
- **#1439 / #1447** — `max-h-[60vh] overflow-y-auto`, pas overflow-x-hidden.
- **#1468** — KPI liste préservé.

## MESURES ÉTAPE 1

1. **Contrôleur** : `DemandeJuridiqueController::show` (~L438) → Inertia
   `Juridique/Show` avec prop `demande` =
   `DemandeJuridiquePresenter::serializeDetail`. Sous-props des 3 blocs :
   `pieces`, `commentaires`, `historiques` (+ désormais `chronologie`).

2. **Événements** : table `demande_juridique_historique`, modèle
   `DemandeJuridiqueHistorique`, service
   `DemandeJuridiqueHistoriqueService`, libellés via
   `DemandeJuridiquePresenter::libelleHistorique`.
   **OUI — les pièces sont DÉJÀ des événements** :
   `ACTION_PIECE_AJOUTEE` (`piece_ajoutee`), `nouvelle_valeur` =
   `{nom} (visibilité : Demandeur|Interne)`, `created_at` timestamp.
   Pas de `piece_id` stocké. **Doublon évité** : spécialiser ces événements
   en nature `piece_jointe` (enrichissement URLs aperçu), ne PAS ajouter une
   seconde boucle sur `pieces`.

3. **Commentaires** : `entite_commentaires` (morph),
   `EntiteCommentairePresenter`, rendu `@mentions` via
   `TacheSuiviCommentBody`. Panel mutualisé
   `EntiteCommentairesPanel` (+ wrapper juridique).

4. **Pièces** : morph `pieces_jointes` ; props #1456 déjà dans
   `serializePiece` (nom_original, mime, preview_*, download_url,
   preview_url `?inline=1`, etc.).

5. **Aperçu** : Dialog local Show.vue + helper
   `juridiquePieceJointeApercu.js` — **réutilisés**, un seul Dialog.

6. **Horodatages** : historique `created_at` (timestamp, pas updated_at) ;
   commentaires `created_at` ; pièces `created_at`. Tri homogène sur
   `horodatage_ts` (unix).

## TABLEAU DE MAPPING

| nature | source | clé tri | contenu | action | visibilité |
|---|---|---|---|---|---|
| evenement | demande_juridique_historique.* | created_at | libelle_humain | — | accès fiche |
| commentaire | entite_commentaires.body (+ mentions) | created_at | texte complet + mentions | — | accès fiche (pas de restriction commentaire) |
| piece_jointe | histo piece_ajoutee enrichi + pieces_jointes | created_at événement | libellé + nom | œil → Dialog ou téléchargement (#1456) | peutAcceder (= liste actuelle) |
| piece non prévisualisable | idem | idem | idem | œil → download_url | idem |

## STRUCTURE NORMALISÉE

Champs communs : nature, id, horodatage, horodatage_ts, date_formatee,
auteur_nom, impersonator_nom. Repli null pour champs hors nature
(action, libelle_humain, body, mentions, piece_id, nom_original,
download_url, preview_url, est_visualisable, mime, preview_kind).

## REQUÊTES AJOUTÉES

**0** requête SQL supplémentaire : réutilise les relations déjà eager-loadées
par `serializeDetail` (historiques, entiteCommentaires, pieces). Agrégation
en PHP sur collections déjà en mémoire.

## RELEVÉ FUTUR COUPLAGE TÂCHES (lecture seule)

- Suiveurs : pivot `demande_suiveurs` ;
  `DemandeJuridiqueSuiveurResolver` / `DemandeJuridiqueSuiveurService` ;
  Graph M365 (#1451).
- Tâches manuelles : `TacheSuiviService::creer` (créateur, assigné, échéance).
- Tâches système : `TaskSyncService` + `TaskType::CODE_*` (ex.
  `CompleterSaisieFactureTaskSync`).
- Exemple module → tâche : `ParcelleOccupationEcheanceTacheService`.
- Pas de type « demande pièce juridique » aujourd’hui.

## SYNTHÈSE

Builder `DemandeJuridiqueChronologieBuilder` + prop `chronologie`. Vue :
titre « Historique Chronologique », liste max-h 60vh, formulaire commentaires
sans liste (`afficher_liste=false`). Dialog #1456 inchangé.

## DÉPLOIEMENT / TEST

```
git pull origin main
php artisan optimize:clear
php artisan view:clear
find app/ config/ database/ -name "*.php" -exec touch {} +
php artisan journal:sync
```

Pas de migrate. Pas de npm/composer/optimize sur OVH.

## LEÇON

Pièces déjà tracées en historique → enrichir l’événement, ne pas rejouer la
collection pieces. Commentaires mutualisés : prop `afficher_liste` pour ne
pas casser Foncier / Registre.
