---
titre: Note d'impl — Liste globale transactions (E08 partie liste)
statut: Livrée (MVP SUPERADMIN)
date: 2026-05-14
priorite: P0 — alignement fonctionnel liste multi-comptes
---

# Note d'impl — Liste globale transactions (E08 liste)

Synthèse de ce qui a été livré pour la **liste des transactions** scoped **organisation courante** (filtres centraux + pagination), en complément du **CRUD par compte** déjà présent sous l’onglet compte (`TransactionController` + `_section.html.twig`). Utile à croiser avec [`001-import-reste-a-faire.md`](001-import-reste-a-faire.md) si import et liste sont travaillés en parallèle.

## Objectif

- Écran **liste** multi-comptes avec **zone de filtres** (P0 + P1 cadrage interne) : période, compte, sens, catégorie, type, montants (valeur absolue), tags (ET/OU), recherche libellé/référence, tri date ou montant signé, pagination ~50.
- Navigation : entrée **Transactions** dans la sidebar (SUPERADMIN), lien **« Vue liste »** depuis la section transactions d’un compte.

## Implémentation technique

| Zone | Fichiers / éléments |
|------|---------------------|
| Route & contrôle | `GET /admin/transactions` — `admin_transactions_index` — `TransactionListController` |
| Filtres GET | `App\Dto\Admin\TransactionListFilters` (parse + `toQueryParams` pour pagination / liens) |
| Données | `TransactionRepository::findForOrganizationList`, `createOrganizationListQueryBuilder` — `Doctrine\ORM\Tools\Pagination\Paginator` |
| Org courante | Si superadmin sans `user.current_organization_id` : **première organisation par nom** (`OrganizationRepository::findFirstOrderedByName`) + `flush` |
| UI liste | `templates/admin/transaction/index.html.twig` — barre filtres **compacte** type maquette E08 (deux lignes) |
| Styles | `public/css/app.css` — préfixe `.viz-filters-*`, `.viz-txn-*` |
| JS | `public/js/transaction-list-filters.js` — debounce recherche `q` + bascule champs date pour **Période = Personnalisé** |
| Navigation | `templates/_partials/sidebar.html.twig` — Transactions actif ; `templates/admin/transaction/_section.html.twig` — lien préfiltré `accounts[]` |

## Décisions produit / garde-fous

1. **Période par défaut** : sans paramètres GET, **« Toutes les périodes »** (`preset=all`, pas de filtre `booking_date`). Évite une liste vide lorsque les données ne couvrent pas le « mois courant » du serveur (ex. jeux de test 2025 vs date système 2026).
2. **Rôle** : accès **SUPERADMIN** uniquement sur cette route (aligné au reste du backoffice actuel). **Pas** de `BankAccountVoter` / multi-membership sur cet écran pour l’instant.
3. **UI compacte** : compte, catégorie et type sont des **listes simples** (un choix ou « Tous »). Une URL ancienne avec plusieurs `accounts[]` / `categories[]` reste interprétée côté serveur mais l’UI n’affiche qu’un seul choix représentatif.

## Hors périmètre (pour plus tard vs spec E08 complète)

- **Filtres** bien (`property`) / plateforme (`rental_platform`) sur la liste.
- **Vue détail** dédiée E09 `/transactions/{id}` (la liste pointe encore vers **éditer** comme avant).
- **Actions de masse** (maquette bulk bar).
- **Export CSV** depuis la liste.
- **Route publique `/transactions`** (spec MVP) — actuellement sous **`/admin/transactions`**.

## Vérifications utiles en recette

- Organisation sans compte actifs : liste vide mais pas d’erreur (requête `_ IN ()` évité ou scope vide documenté).
- Tags AND avec plusieurs pilules cochées : sous-requêtes `EXISTS` distinctes.

---

*Référence maquette filtres HTML : fichier interne utilisateur `viizia-transactions-e08.html`.*
