---
suivi: 1600
date: 2026-09-17
sujet: Paramètres bancaires des programmes (liste + saisie en ligne)
chantier: comptabilite / programmes
type: feature
statut: poussé
hash: d92f1ff9
fichiers:
  - app/Support/Compta/ProgrammeParametresBancairesAcces.php
  - app/Support/Compta/ProgrammeParametresBancairesQuery.php
  - app/Http/Controllers/Compta/ProgrammeParametresBancairesController.php
  - routes/web.php
  - resources/js/Pages/Compta/ProgrammeParametresBancaires.vue
  - resources/js/Components/Foncier/InlineEditableField.vue
  - resources/js/Layouts/AppShell.vue
  - tests/Unit/ProgrammeParametresBancaires1600SourceTest.php
  - database/data/journal_mises_a_jour_post_2026_06_12.php
  - public/build/
  - docs/suivi/SUIVI_1600_parametres_bancaires_programmes.md
---

# SUIVI #1600 — Paramètres bancaires des programmes

## PROMPT ENVOYÉ

Page unique Comptabilité listant tous les programmes, saisie directe dans le
tableau (IBAN, BIC, banque, société Intacct, compte de paiement, classe),
compteurs incomplets / sans coordonnées, menu COMPTABILITÉ. Pas de migration.
Ne pas modifier `/programmes/{id}/edit`, comptabilisation, Sage.

## FICHES LUES

- **#1372 LEÇON** — une fonction `m365GroupNames()` brut pour UI + 403 ;
  tester avec COMPTA, pas Admin ERP (`Gate::before`). Impact : même patron
  ici ; pas `hasAnyM365Group` / `hasM365Groupe` (true pour Admin ERP).
- **#1197 LEÇON** — réutiliser `InlineEditableField`, ne pas en créer un
  second. Impact : PATCH `{ champ, valeur }` + whitelist ; `beforeEdit`
  ajouté pour charger les comptes à la demande.
- **#1478 / #1322** — visibilité menu Comptabilité : flag nav **ou**
  `m365GroupNames` brut comme Libérations RG. Impact : même mécanisme que
  RG (`m365GroupNames` brut, pas un second flag Inertia).
- **#1599** — même module Comptabilité, sérialisé (HEAD après #1599).
- **#1598 LEÇON** — `php -l` / Reflection ne voient pas une variable d’une
  branche. Impact : `locationId` posé avant le `where` ; merge `'' → null`
  avant validation.

Aucune fiche antérieure sur une liste transverse des IBAN programmes.

## ÉTABLI AVANT CODAGE

### Programmes hors ERP — colonnes en base

Même table `programmes`, même modèle. `storeHorsErp` n’écrit que
`libelle`, `entite_id`, `enseigne_id`, `statut = hors_erp`. Les colonnes
`iban`, `bic`, `banque`, `financial_entity_id`, `intacct_class_analytics_id`
**existent** (fillable) et sont en pratique NULL. Rendu : cellules vides,
non éditables, mention « programme hors ERP ». L’entité de rattachement
reste visible sous le libellé (identité), pas dans la colonne Société
modifiable. Exclus des deux compteurs (`statut <> hors_erp`).

### Droits retenus

| Groupe | Accès page / menu / PATCH |
|---|---|
| GS_COMPTABILITE | oui (métier) |
| GS_ADMIN_ERP | oui (support, patron Libérations RG) |
| GS_DSI | **non** (paramétrage Intacct ≠ saisie bancaire) |
| GS_DIRECTION_GENERALE | **non** ici (conserve l’onglet fiche #1372) |

Contrôle : `abort_unless` + `m365GroupNames()` brut.
`Gate::before` / compte Robin ne prouvent pas le refus.

### Avertissement factures émises

Écran actuel (`ProgrammeSocieteBancairePanel`) : bandeau **si `canEdit`**,
sans tester la présence de factures (toujours affiché à l’éditeur).

Page #1600 : confirmation **avant** enregistrement société ou classe si le
programme a au moins une `factures` non soft-deleted avec
`intacct_bill_id` / `intacct_record_no` non vides **ou** statut
`comptabilisee` / `en_paiement` / `payee`. Avertir, ne pas bloquer.
Sous-requête SQL `EXISTS` (pas de N+1).

## SYNTHÈSE

Page `/comptabilite/parametres-bancaires-programmes`. Saisie via
`InlineEditableField` existant. Changer la société vide le compte de la
ligne et le signale. Comptes bancaires : GET filtré `location_id` de
l’entité, à la demande. Filtre / tri SQL. Défaut : programmes actifs.

## REQUÊTES SQL DE LA PAGE

5 : liste (joins + EXISTS factures), compteurs (2 SUM), enseignes,
entités, classes. Pas de chargement des ~183 comptes par ligne.

## MAPPING

Voir synthèse livrable.

## DÉPLOIEMENT-TEST

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

Pas de migration.

## LEÇON

Liste transverse compta : mêmes groupes menu et `abort_unless` (m365 brut).
Hors ERP = statut, pas un autre schéma ; ne pas les compter comme
incomplets. Compte bancaire Intacct = `financial_entity_id` filtré sur
`entites.intacct_id` = `location_id`. Avertissement fiche actuelle ≠
condition factures : la page liste applique la condition réelle.
