Aller au contenu principal

Achats fournisseurs

Le module Achats centralise tout ce qui concerne les commandes fournisseurs : bons de commande (PO), autofacture IA depuis les PDF reçus, réception partielle, mapping automatique vers le stock, et calcul du COGS (Cost Of Goods Sold) pour le bénéfice net.

1. Workflow standard

1. Réception facture fournisseur (PDF par email ou upload manuel)

2. Extraction IA (cascade Anthropic → OpenAI → Gemini)
→ JSON structuré : fournisseur, lignes, totaux HT/TVA/TTC

3. Validation manuelle + mapping produits
→ ligne extraction ↔ InventoryItem (création ou existant)

4. Génération automatique d'un PurchaseOrder (PO-####)
→ statut `received` ou `partial`

5. Décrément stock-attendu / incrément stock physique

6. COGS HT injecté dans /api/goals/progress (bénéfice net)

2. Autofacture IA — extraction PDF

Upload manuel : /supplier-invoices → bouton "Importer une facture" → sélection PDF → cascade IA. Résultat brut affiché dans une fenêtre dédiée pour validation.

Auto-import par email : configure dans /settings → Achats une adresse de forwarding générée (ex. factures.abc123@invoices.fixvault.fr). Tu transmets toutes tes factures fournisseur à cette adresse → SendGrid Inbound Parse → extraction automatique.

Champs extraits

  • Fournisseur (nom, SIRET, adresse, email)
  • Date de facture, n° facture, n° de commande
  • Lignes : description, quantité, prix unitaire HT, total HT, TVA
  • Totaux : sous-total HT, frais de port HT, remise, TVA, TTC

Cascade IA

  1. Claude Haiku 4.5 (prioritaire — meilleur rapport qualité/prix sur l'extraction tabulaire)
  2. GPT-4o-mini (fallback si Anthropic indispo)
  3. Gemini 2.0 Flash (dernier recours)

Le résultat est mis en cache 24 h pour ne pas re-payer la même extraction si on rouvre la fenêtre.

3. Mapping produits (Learning DB)

À la première extraction d'un fournisseur, FixVault demande de mapper manuellement chaque ligne extraction vers un InventoryItem. Ces mappings sont enregistrés dans la table SupplierProductMapping :

MSI EAN8056789 → InventoryItem "Écran iPhone 13 OEM"
WAVLINK 32MB → InventoryItem "Cable USB-C → Lightning"

Aux extractions suivantes du même fournisseur, le mapping est appliqué automatiquement. Le tech voit "12 lignes mappées sur 14" — il complète les 2 nouvelles à la main, et la prochaine fois ce sera 14/14.

Endpoint : GET / POST / DELETE /api/supplier-invoices/mappings.

4. Bon de commande (PO)

Un PO est une commande engagée auprès d'un fournisseur (statut au-delà de draft). Statuts :

StatutDescription
draftBrouillon — pas encore commandé, ne compte pas dans le COGS
orderedCommande passée auprès du fournisseur
partialRéception partielle (au moins 1 item reçu, d'autres en attente)
receivedTout reçu — stock incrémenté en totalité
cancelledAnnulé — pas dans le COGS

Flux de réception partielle : bouton "Recevoir" sur chaque ligne → quantité reçue ≤ quantité commandée → stock incrémenté de la quantité reçue uniquement → statut PO passe automatiquement à partial (ou received si tout est reçu).

5. COGS et bénéfice net

GET /api/goals/progress calcule le bénéfice net micro-entrepreneur en agrégeant les PO de la période sélectionnée :

COGS HT = Σ totalTTC - Σ totalTVA (régime normal, TVA récupérable)
COGS = Σ totalTTC (franchise — TVA non récupérable)

Filtre des PO inclus : status IN ('ordered', 'partial', 'received') — les draft et cancelled sont exclus pour ne pas fausser le calcul.

6. Routes API utiles

# Lister les PO en cours
curl -sS -H "Authorization: Bearer $TOKEN" \
"https://app.fixvault.fr/api/supplier-invoices/purchase-orders?status=ordered,partial"

# Marquer une ligne comme reçue
curl -sS -X PATCH \
"https://app.fixvault.fr/api/supplier-invoices/purchase-orders/<poId>/items/<itemId>/receive" \
-H "Authorization: Bearer $TOKEN" \
-H 'Content-Type: application/json' \
-d '{"receivedQty": 5}'

Pour la liste complète : voir API & Intégrations § 22.

7. Bonnes pratiques

  • Forwardez tout : transférez systématiquement vos factures fournisseur à l'adresse d'auto-import — vous gagnez du temps et le COGS est toujours à jour.
  • Validez avant de mapper : si l'IA s'est trompée (ligne ratée, total faux), corrigez l'extraction avant de mapper, sinon le mapping pollue le learning.
  • Réception au plus juste : ne marquez "received" qu'après contrôle physique. Une ligne received avec quantité fantôme casse le rapprochement comptable.
  • Vérifiez la TVA récupérable : si vous êtes en franchise (TVA non appliquée), passez tvaFranchise: true dans tenant.settings.businessContext → le COGS sera calculé en TTC.