quote → cash
FR/EN Contact

Pattern·Avancé··Mis à jour le 05/10/2026

Pattern · Taxe

Code de TVA par pays, sans Apex

Faire varier le code de TVA — pas seulement le taux — selon le pays du client, avec de la configuration et un flow.

Salesforce docs documenté par SalesforceTerrain constaté sur une vraie orgRecommandé ce que nous recommandonsÀ vérifier non vérifié

Le problème

Un produit d’abonnement était figé sur un seul code de TVA. Vendu à un client d’un autre pays, aucun taux ne correspondait et la facture sortait sans aucune taxe — en silence. Les produits événementiels, qui portent leur code depuis le lieu de l’événement, n’étaient pas touchés, ce qui faisait passer le bug pour aléatoire.

Le contexte

Deux familles de produits aux règles opposées : certains imposent leur propre code parce que le fait générateur se produit à un endroit précis, les autres doivent prendre le code du pays du client.

L’architecture recommandée

D’abord le constat négatif, parce qu’il ferme les pistes évidentes : aucun mécanisme natif ne fait varier le code de TVA par pays. TaxTreatmentItem ne porte que produit et code, sans aucun champ géographique. Et la decision table fiscale standard prend un code en entrée et rend un taux — elle ne peut jamais produire un code.

Le code doit donc être posé sur la ligne avant le calcul, et survivre au reprice. Le levier est TaxPolicy.TreatmentSelection = Manual : un traitement posé sur la ligne commande alors le calcul et n’est pas redérivé.

Mise en œuvre

  1. Déclarer la règle sur le produit. Une picklist à deux valeurs suffit : le produit impose son code, ou le code vient du client.
  2. Porter la zone fiscale sur le compte, en picklist maintenue par la comptabilité et non dérivée de l’adresse — les exceptions sont un vrai besoin.
  3. Poser le traitement par un flow à la création et à la mise à jour de la ligne de devis, en mappant zone vers code.
  4. Passer la policy en Manual pour que le traitement survive au Reprice All.
  5. Ne pas écrire un second flow pour la commande. Le context service transporte le traitement de la ligne de devis vers la ligne de commande tout seul.

Ce que ça coûte

Un flow plutôt que de l’Apex, c’est pas de classe de test et pas de problème de couverture au déploiement — sur une org projet, la couverture était le seul obstacle à une mise en production, donc éviter l’Apex valait de l’argent réel.

Le coût : la sélection Manual rend la ligne autoritaire. Si le flow se trompe, rien en aval ne le rattrape.

Attention

  • Un critère de flow écrit Status = "Activated" ne part jamais sur une org en français, où la valeur s’affiche « Activé ». Le flow échoue en silence et aucun échéancier n’est jamais créé. Tout critère de flow écrit en anglais est suspect sur une org localisée.
  • Le code de TVA n’atteint jamais InvoiceLine.TaxCode. Lisez-le via TaxTreatment.TaxCode.

Composants Salesforce

Ressources Salesforce