---
suivi: 1503
date: 2026-09-10
sujet: Filtre société tableau de bord compta
chantier: comptabilite / synthese
type: feature
statut: poussé
hash: 9bab444d
fichiers:
  - app/Support/SocieteEntiteResolver.php
  - app/Services/Compta/ComptaTableauBordService.php
  - app/Http/Controllers/ComptaTableauBordController.php
  - resources/js/Pages/Factures/TableauBord.vue
  - public/build/
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - tests/Unit/ComptaTableauBord1503SourceTest.php
  - tests/Unit/ComptaTableauBord1503Test.php
  - tests/Feature/ComptaTableauBord1503FeatureTest.php
  - tests/Unit/HarmonisationFiltreSociete1496SourceTest.php
  - docs/suivi/SUIVI_1503_filtre_societe_tableau_bord_compta.md
---

# SUIVI #1503 — Filtre société tableau de bord compta

## PROMPT ENVOYÉ

Barre de filtres (société, multi-select, `f_societe` CSV) en haut de
`/factures/tableau-de-bord`. Reprendre le travail préparatoire du #1495
arrêté (clause 2). Consommer `applyFiltreEntite` / `applyFiltreEntiteOnQuery`
sans recopier. Échues : prédicat Facture porté par le resolver, pas de JOIN
dépôt. Bloc bancaire : filtre dans la dérivée, patron #1487 intact
(GROUP BY d’alias + `LIMIT PHP_INT_MAX`). Propagation `f_societe` dans
chaque URL de carte sauf nomenclature. Push direct `origin/main`.

## BASE GIT

HEAD de départ `224ab966` (fiche #1501). Rebasé sur `origin/main` à jour
`74aab30a` (fiche #1502) avant build Vite. Zone Meta / leads (#1502) non
touchée.

## FICHES LUES

- **#1495** (arrêt, pas de fiche disque) — inventaire des 10 requêtes,
  source d’entité = resolver (dépôt OU programme), pas le COALESCE bancaire.
  Impact : ce lot consomme l’inventaire, n’en rediscute pas.
- **#1496 LEÇON** — CSV unique `QueryIdListParser` ; `applyFiltreEntiteOnQuery`
  écrite, jamais consommée. Impact : ce lot la consomme ; destinations
  lisent enfin le même format.
- **#1500 / #1501 LEÇON** — le filtre MEP doit partir dans chaque appel
  `/lignes` (IntersectionObserver). Mesure prod Robin : `f_societe=13,4`
  ne rend plus que E-13 et E-04. Impact : propager `f_societe` depuis les
  cartes n’est plus un désalignement.
- **#1483 LEÇON** — le clic ouvre exactement le périmètre du compteur.
  Impact : chaque URL de carte (sauf nomenclature) porte `f_societe`.
- **#1487 LEÇON** — GROUP BY d’alias + LIMIT sur la dérivée, sinon
  `derived_merge` ramène le 1055. Impact : filtre **dans** la dérivée,
  pas autour.
- **#1478 LEÇON** — totaux socle, `m365GroupNames()` brut, clic « À
  comptabiliser » conditionnel (DG → `file_compta=1`). Impact : Acces
  non modifié ; URL DG conservée.

## SYNTHÈSE

Barre sous le sous-titre, MultiSelect PrimeVue, libellé « Société »,
aucun défaut, pas de session. Toutes les requêtes du service sont
filtrées (voir inventaire dans la synthèse de livraison). Méthode
rétrocompatible `applyFiltreEntiteOnFactureQuery` pour les échues.
`applyFiltreEntiteOnQuery` consommée dans `aPayerJoinQuery` (à payer,
RIB, dérivée bancaire) et les blocages dépôt. Journal utilisateur.

## DÉPLOIEMENT-TEST

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

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

Comptes : **Sabrina (24) ou Rudy** (GS_COMPTABILITE) ; **Anne (37) ou
Laury (18)** (DG). Pas Robin, pas Guilhem (36).

1. Ouvrir `/factures/tableau-de-bord` sans query → chiffres identiques à avant.
2. Filtrer une société → pipeline, graphique, blocages, banques, échues
   suivent ; « plus ancien : n j » aussi.
3. Deux sociétés → union, pas de double comptage.
4. Société sans facture → écran vide, pas d’erreur.
5. Clic de chaque carte avec filtre → URL porte `f_societe`, même périmètre.
6. Clic « À comptabiliser » : compta → `/factures/comptabilisation?f_societe=`
   ; DG → `/factures?tab=tous&file_compta=1&f_societe=`.
7. Coller la requête bancaire filtrée sur MySQL 8.4 → pas de 1055.
8. Rendu 1440 / 1100 / 800 px (barre lisible).
9. Signalement (non corrigé) : select MEP toujours mono ; union CSV
   filtre la liste mais le select affiche « Toutes les sociétés ».

## LEÇON

Ne pas propager un filtre depuis un tableau de bord tant que les listes
de destination ne lisent pas la même convention (#1495 arrêté, #1496 puis
#1500 l’ont levée). `applyFiltreEntiteOnQuery` écrite « pour plus tard »
reste morte tant qu’un lot ne la branche pas. Sur une dérivée MySQL 8,
le filtre va **dans** la sous-requête limitée, pas dans le GROUP BY
externe — sinon `derived_merge` et 1055. sqlite vert n’a aucune valeur
de preuve sur `only_full_group_by`.
