feat(VSN-2808): module Avoir + intégration BDC
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-XXXet fige le statut Brouillon → Émis), annulation, mention « avoir sur facture X ».
-
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
- Statuts : Brouillon / Émis / Annulé. Types : Avoir total / Avoir partiel.
- Store Zustand
useAvoirStoreadossé à un data-source pluggable (mockDataSourceactif,apiDataSourcestub prêt à brancher), pilotable viaNEXT_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
AvoirsSectiondans la fiche BDC qui lituseAvoirStore.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 placeholderFactureLite, propprefilledFactureIdsurCreateFormprê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.