---
suivi: 1609
date: 2026-09-18
sujet: Recherche classe Intacct sur la page de masse
chantier: comptabilite / parametres-bancaires-programmes
type: feature
statut: poussé
hash: fbad3a96
fichiers:
  - resources/js/Components/IntacctClassAnalyticsSelect.vue
  - resources/js/Pages/Compta/ProgrammeParametresBancaires.vue
  - app/Support/Compta/ProgrammeParametresBancairesQuery.php
  - tests/Unit/IntacctRechercheClasse1609SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/assets/ProgrammeParametresBancaires-Bu6PEy-X.js
  - public/build/assets/IntacctClassAnalyticsSelect-CvuhCkIt.js
  - public/build/manifest.json
  - docs/suivi/SUIVI_1609_recherche_classe_intacct.md
---

# SUIVI #1609 — recherche classe Intacct (page de masse)

## PROMPT ENVOYÉ

Remplacer le `<select>` natif « Classe (Intacct) » de
`/comptabilite/parametres-bancaires-programmes` par le composant de
recherche déjà utilisé sur la fiche programme. Recherche classid +
nom, partielle, insensible casse/accents. Inactives non proposées,
mais affichées si déjà posées. Persistance inchangée. Mesurer si la
liste est tronquée. Ne pas inventer un second composant.

## FICHES LUES

- **#1600 LEÇON** — page liste, whitelist inline, hors ERP exclus des
  compteurs, compte bancaire à la demande. Impact : on réutilise
  `updateChamp` / `CHAMPS_INLINE` ; on ne touche ni société, ni compte,
  ni compteurs.
- **#1445 LEÇON** — sélecteur programme (#1372) charge déjà toutes les
  ACTIVE. Impact : même source `intacct_classes` statut=active, pas de
  filtre enseigne.
- **#1372 LEÇON** — paramètres Intacct sur l’onglet Coordonnées ;
  `intacct_class_analytics_id`. Impact : même champ, même composant
  `IntacctClassAnalyticsSelect`.
- **#1197 LEÇON** — `InlineEditableField` pour les autres colonnes.
  Impact : on ne l’étend pas à 922 options ; overlay PrimeVue vs blur.

## 1. COMPOSANT FICHE (mesure / alignement)

| | |
|---|---|
| Fichier | `resources/js/Components/IntacctClassAnalyticsSelect.vue` |
| Consommateur fiche | `ProgrammeSocieteBancairePanel.vue` (onglet Coordonnées, bloc Paramètres Intacct) |
| Props fiche | `v-model` = `form.intacct_class_analytics_id` ; `intacct-classes` ; `disabled` ; `invalid` |
| Placeholder | « Rechercher une classe… » |
| Libellé option | `<classid> — <nom>` |
| Valeur | `Number(id)` = `intacct_classes.id` |

Alimentation fiche : payload Inertia **complet** des classes actives,
dans `ProgrammeController::edit`, clé `intacct_classes`. Pas
d’endpoint de recherche, pas de chargement paresseux. Requête :
`IntacctClass::query()->where('statut', 'active')->orderBy('classid')->get(['id','classid','nom'])` — **sans** `take` / `limit`.

## 2. PAGE DE MASSE AVANT / APRÈS

Avant : `InlineEditableField type=select` alimenté par
`options.classes` (`ProgrammeParametresBancairesQuery::optionsClasses`).

Après : le **même** `IntacctClassAnalyticsSelect` (mode `compact`),
PATCH inchangé `{ champ: 'intacct_class_analytics_id', valeur: id }`.

`optionsClasses()` : toutes les actives, `{id, classid, nom, statut}`,
**sans** `take` / `limit` / `paginate`. Liste **non tronquée** dans le
code. Mesure runtime : voir synthèse (connexion locale 3306).

Payload estimé ~70–110 Ko JSON pour ~922 actives — acceptable. Un
endpoint de recherche serveur n’est **pas** implémenté (accord Robin
requis). Cause de l’inutilisabilité : absence de typeahead, pas une
liste coupée.

Overlay : `append-to="body"` + `overlay-class="z-[4000]"` pour ne pas
être coupé par `overflow-x-auto` du tableau (pas d’`overflow-x-hidden`).

Classe inactive déjà posée : join `intacct_classes.statut as classe_statut`
+ prop `valeurCourante` ; option `disabled` ; hint ambre. Re-POST
inactive toujours rejeté (validation inchangée `exists … statut=active`).

## MAPPING

Libellé affiché | Valeur postée | Champ back | Table.colonne
---|---|---|---
`<classid> — <nom>` | `intacct_classes.id` (entier) | `champ=intacct_class_analytics_id` + `valeur=<id>` | `programmes.intacct_class_analytics_id`
`(inactive)` suffixé si statut inactive (affichage seul) | non postulable (disabled + Rule exists active) | — | `intacct_classes.statut`
— | **jamais** `classid` texte | — | `intacct_classes.classid` (affichage / recherche)
— | **jamais** écrit ici | — | `programmes.intacct_class_id` (legacy, inchangé)

## DÉPLOIEMENT-TEST

1. Taper « racine » → SAS RACINE.
2. Taper « ACACI » → classid ACACI… .
3. Accent / sans accent → même liste.
4. Choisir, enregistrer, recharger : persisté.
5. Inactive absente des propositions.
6. Programme déjà inactif : classe affichée + hint.
7. Deux programmes de suite sans recharger.
8. Dernière ligne : liste visible (overlay body).
9. Compteur incomplets diminue après pose d’une classe.

OVH : `git pull origin main` puis `php artisan view:clear` et
`php artisan journal:sync`. Pas de migrate. Pas de npm sur le serveur.

## LEÇON

922 options dans un `<select>` natif : inutilisable même si la liste
n’est pas tronquée. Réutiliser le PrimeVue Select filtrant de la fiche
(`append-to="body"` dans un tableau `overflow-x-auto`). Poster
`intacct_classes.id` dans `programmes.intacct_class_analytics_id`,
jamais le `classid` ni le legacy `intacct_class_id`. Recherche
accents : filtrer via `FilterService` qui plie **saisie et champs**
(NFD) ; plier seulement les options ne suffit pas si l’utilisateur
tape l’accent.
