Skip to content

feat(VSN-2808): module Avoir + intégration BDC

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

Contexte

Ticket [VSN-2808] — Mise en place du module Avoir (notes de crédit) dans Facturation & Paiement, à la suite des modules BDC, Avance et Acompte. Un avoir permet de corriger ou annuler tout ou partie d'une facture déjà émise (erreur de facturation, modification d'annexe, remise commerciale, ajustement d'exploitation, etc.).

Périmètre fonctionnel livré

Module Avoir (nouveau)

  • Liste des avoirs au pattern unifié de l'app (TableControlBar + TabsCustom + TabContentContainer + filtres + tri + recherche + reset colonnes).
  • Création d'avoir via cascade Client → Département → Facture, avec récupération automatique des montants HT / TVA / TTC de la facture sélectionnée. Type total (annulation complète) ou partiel (correction). Saisie du motif et du montant HT à corriger, recalcul live de la TVA (20%) et du TTC.
  • Fiche avoir à 2 onglets :
    • Détail avoir — informations générales (Client, Département, Réf facture, Réf BDC, Réf avoir, Date), paramètres financiers (verrouillés dès que status !== 'draft'), tuiles d'impact sur la facture (HT initial / Avoir HT / Net facturé après avoir), récapitulatif sidebar.
    • Document d'avoir — émission (génère AVR-YYYY-XXX et fige le statut Brouillon → Émis), annulation, mention « avoir sur facture X ».
  • Statuts : Brouillon / Émis / Annulé. Types : Avoir total / Avoir partiel.
  • Store Zustand useAvoirStore adossé à un data-source pluggable (mockDataSource actif, apiDataSource stub prêt à brancher), pilotable via NEXT_PUBLIC_USE_MOCK_AVOIR.
  • Audit historique (création BDC / création manuelle / émission / modification / annulation) écrit côté store, exposable côté UI quand le besoin se présentera.

Règles de gestion implémentées (ticket § Règles)

  • Un avoir est toujours rattaché à une facture (enforced côté store via createAvoirFromFacture).
  • Un avoir ne peut pas être modifié une fois émis (champs verrouillés dès status !== 'draft').
  • Un avoir ne peut pas dépasser le montant HT de la facture d'origine (clamp côté store + validation UI dans le formulaire de création et la fiche).
  • Recalcul automatique du net facturé dans le BDC.

Intégration BDC Avoir

  • Nouvelle section AvoirsSection dans la fiche BDC qui lit useAvoirStore.getAvoirsByBdc (source de vérité unique). Liste les avoirs liés au BDC (Réf, Facture, Motif, Type, Montant HT, Document, Statut) et calcule Net facturé après avoirs (seuls les avoirs émis impactent le facturé).

Ce qui est stubbé (en attente d'autres modules)

  • Module Facture non encore présent dans le repo. En remplacement : 8 factures mockées dans _avoir.ts, type placeholder FactureLite, prop prefilledFactureId sur CreateForm prête à recevoir un id de facture quand le bouton « Créer avoir » sera ajouté à la fiche facture.
  • Module Journal non présent. Le ticket demande que les avoirs apparaissent dans le Journal — à brancher quand le module sera livré.
  • Bouton « Créer avoir » côté fiche facture : non câblé (Facture module manquant).

Tout est isolé dans avoir-data-source.ts derrière apiDataSource, donc la bascule back se fait sans toucher à l'UI.

Rapports de requête de fusion