Introduction à la facturation 3PL
La chaîne de facturation : postes → grilles tarifaires → règles par merchant → relevés, et les lacunes actuelles (quantités manuelles, pas encore d’UI de relevés).
La chaîne de facturation#
Chaîne : postes de facturation → grilles tarifaires → règles de facturation par merchant → génération de relevés/factures (wms_merchant_invoices + lignes). Tout est sur bureau ; pas de facturation sur mobile.
Postes de facturation#
WMS → Billing → Postes. Créer : code (unique par organisation) / nom / catégorie (8 : storage, inbound, outbound, pick, pack, value_added, freight, other) / pricing_method (6 : per_pallet_day, per_unit, per_order, per_weight, per_cubic_ft, flat) / unit_price / currency (défaut USD) / uom / is_active.
Grilles tarifaires#
- WMS → Billing → Grilles : nom + merchant_id (NULL = global, s’applique à tous) + version + effective_date/expiry_date + is_active. Plusieurs versions possibles.
- Chaque ligne lie un poste ; unit_price_override vide = utilise le prix d’origine. Une ligne peut avoir son propre effective/expiry (vide = suit la grille).
Règles de facturation par merchant#
WMS → Billing → Règles : une règle par merchant (unique par organisation×merchant), pointant vers un rate_sheet_id. Changer de version = changer le rate_sheet_id.
Générer un relevé#
Appelez POST /api/wms/billing/invoices/generate ; il n’y a actuellement pas de page de génération sur bureau, les relevés se génèrent par API.
- Body : merchant_id, period_from, period_to (YYYY-MM-DD), rate_sheet_id optionnel, quantities (usage, manuel), notes.
- Résolution de la grille : celle passée explicitement gagne ; sinon la règle active du merchant est utilisée. Sans règle → 400.
- Protection anti-doublon : un relevé existant pour la même période est rejeté (unique par organisation×merchant×période).
- Calcul ligne par ligne (recalculable) : unit_price = override ?? prix du poste ; qty depuis quantities (flat sans qty = 1 par défaut ; lignes à qty 0 non enregistrées) ; amount = round(qty × unit_price, 2). Chaque ligne porte sa formule pour vérification manuelle.
- Numérotation : MINV-000001 et suivants (numérotation atomique) ; l’en-tête est enregistré avec status=draft plus un instantané de la grille, puis les lignes.
- Lacunes connues : le relevé généré reste en draft ; la transition sent/paid n’est pas implémentée ; pas de pages bureau liste/détail/génération (les APIs GET existent) ; aucun lien avec l’AR comptable (acc_invoices) ; la devise est transportée, non convertie (Phase 1).