feat(VSN-2790): module Acompte + cohérence UI Inspections / BDC / Acompte
Contexte
Ticket [VSN-2790] — Ajout du module Acompte sous Facturation & Paiement (à la suite du module Avance), avec intégration bidirectionnelle au module BDC. La MR embarque aussi des correctifs d'UI sur les tables Inspections et un alignement pixel-perfect des tables BDC + Acompte sur le pattern unifié de l'app.
Périmètre fonctionnel livré
Module Acompte (nouveau)
-
Liste des acomptes au pattern unifié de l'app (
TableControlBar+TabsCustom+TabContentContainer+ filtres + tri + recherche + reset colonnes). - Création d'acompte via cascade Client → Département → BDC, avec paramétrage financier (type fixe / pourcentage, montant, date d'émission).
-
Fiche acompte à 2 onglets :
- Détail acompte — informations générales, paramètres financiers, Suivi de déduction (barre de progression + tuiles Montant initial / Déduit / Restant à déduire / Dernière déduction).
-
Facture d'acompte — génération de la référence
FA-AC-YYYY-XXX, calcul HT/TVA/TTC.
- Wizard "Déduire automatiquement" multi-acomptes avec 3 modes par acompte (totale / précise / pourcentage), récapitulatif net à payer, clamp automatique sur le restant.
-
Statuts :
draft,facture,deduit,annule. Types :fixed,percent. - Store Zustand
useAcompteStoreadossé à un data-source pluggable (mockDataSourceactif,apiDataSourcestub prêt à brancher), pilotable viaNEXT_PUBLIC_USE_MOCK_ACOMPTE. - Historique d'audit (création BDC / création manuelle / génération facture / modification / déduction / annulation) écrit côté store, prêt à exposer.
Intégration BDC ↔ Acompte
- La section Acomptes dans la fiche BDC lit désormais l'
useAcompteStore(source de vérité unique). Les acomptes créés depuis le BDC ouvrent avecorigin: 'from_bdc'et apparaissent immédiatement dans la liste globale Acomptes. -
totalAcomptesetresteFacturerduSummaryPanelBDC recalculés à partir du store Acompte. - En-tête redondant supprimé sur la fiche BDC (flèche retour + ID + boutons) — l'onglet de page joue déjà ce rôle.
Cohérence UI
-
Tables Inspections (
mes-inspections,rapports,planning) : suppression dumaxWidth="xl"qui plafonnait le rendu à 1536px, colonne Actions en largeur fixe140pxcollée à droite, colonne titre/createdAt absorbe l'espace en1fr. -
Tables BDC + Acompte : alignement pixel-perfect en éliminant tout
1frdugridTemplateColumns(cause racine documentée ci-dessous), en-têtes alignés à gauche comme le reste de l'app,align: 'center'retiré des colonnes BDC. - En-tête redondant aussi supprimé sur la fiche Acompte ; onglet Historique des actions retiré (le store conserve l'audit, juste pas exposé).
- Carte Suivi de l'acompte renommée Suivi de déduction de l'acompte avec une 4ᵉ tuile Dernière déduction.
Cause racine de l'alignement (référence pour la prochaine table à migrer)
minmax(Xpx, 1fr) se résout indépendamment dans chaque container CSS Grid. Entre l'en-tête (1 grid container) et chaque ligne (N grid containers), des écarts subpixel (1–2px) apparaissent — masqués par justify-center mais visibles dès qu'on aligne à gauche. Solution : largeurs fixes en pixels uniquement dans gridTemplateColumns. Trade-off accepté : la table ne s'étire plus au-delà d'environ 1700px.
Ce qui est stubbé (en attente du module Facture)
- Écriture réelle d'une facture d'acompte (aujourd'hui : génération de référence + tuiles HT/TVA/TTC en mémoire store).
- Enregistrement réel des déductions sur la facture finale d'un BDC.
- Flux AVOIR sur annulation d'acompte facturé.
Tout est isolé dans acompte-data-source.ts derrière apiDataSource, donc le branchement back se fait sans toucher à l'UI.