Manuel utilisateur
Centre d'aide/Manuel utilisateur/Introduction à la facturation 3PL

Introduction à la facturation 3PL

Dernière mise à jour 2026-10-13

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.

  1. Body : merchant_id, period_from, period_to (YYYY-MM-DD), rate_sheet_id optionnel, quantities (usage, manuel), notes.
  2. Résolution de la grille : celle passée explicitement gagne ; sinon la règle active du merchant est utilisée. Sans règle → 400.
  3. Protection anti-doublon : un relevé existant pour la même période est rejeté (unique par organisation×merchant×période).
  4. 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.
  5. 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.
Pas de mesurage automatique : les quantités comme les palette-jours ou les nombres de pièces doivent être calculées à la main et passées avant génération ; le mesurage automatique n’est pas implémenté.
  • 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).
Règle de devise : merchant.currency l’emporte sur la devise par défaut du tenant ; transportée uniquement, jamais convertie.