Skip to content

feat(VSN-2790): module Acompte + cohérence UI Inspections / BDC / Acompte

yahya.elmokhtari a demandé de fusionner VSN-2790 vers develop

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 useAcompteStore adossé à un data-source pluggable (mockDataSource actif, apiDataSource stub prêt à brancher), pilotable via NEXT_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 avec origin: 'from_bdc' et apparaissent immédiatement dans la liste globale Acomptes.
  • totalAcomptes et resteFacturer du SummaryPanel BDC 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 du maxWidth="xl" qui plafonnait le rendu à 1536px, colonne Actions en largeur fixe 140px collée à droite, colonne titre/createdAt absorbe l'espace en 1fr.
  • Tables BDC + Acompte : alignement pixel-perfect en éliminant tout 1fr du gridTemplateColumns (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.

Rapports de requête de fusion