Calcul de facture
Ce guide explique comment B2Brouter calcule les montants nets et bruts à partir d’entrées telles que la quantité, le prix, la quantité de base, les taxes et d’éventuelles remises ou charges, qui peuvent être fournies sous forme de pourcentages ou de montants fixes. Les calculs prennent en charge les ajustements aux niveaux de la ligne et de la facture.
Tous les calculs et arrondis sont effectués automatiquement par B2Brouter. L’objectif de ce guide est d’expliquer le processus et les résultats auxquels vous devez vous attendre.
Données requises
Section titled “Données requises”Niveau facture
Section titled “Niveau facture”Il s’agit des remises et charges globales au niveau de la facture, via allowance_charges_attributes :
- Allowance (Remise) : (Optionnel)
{allowance_charge_indicator: "allowance"}avec soit :- percentage : pourcentage de remise appliqué à l’ensemble de la facture.
- amount : montant fixe de remise appliqué à l’ensemble de la facture.
- Charge : (Optionnel)
{allowance_charge_indicator: "charge"}avec soit :- percentage : pourcentage de charge appliqué à l’ensemble de la facture.
- amount : montant fixe de charge appliqué à l’ensemble de la facture.
Niveau ligne
Section titled “Niveau ligne”Pour chaque ligne (invoice_lines_attributes), vous devez fournir les informations suivantes :
- Quantity (
quantity) : nombre d’unités. - Price (
price) : prix pour la quantité de base d’unités indiquée. - Base Quantity (
base_quantity) : nombre d’unités auquel le prix s’applique. La valeur par défaut est1. Utilisez ce champ lorsque le prix est exprimé pour plusieurs unités (par ex. prix pour 100 pièces). - Taxes (
taxes_attributes) :- Name : nom de la taxe (par ex. VAT, IVA, IRPF).
- Category : catégorie de taxe.
- Percent : pourcentage de taxe appliqué (peut être positif ou négatif).
- Allowance (Remise) : (Optionnel) via
allowance_charges_attributes[]{allowance_charge_indicator: "allowance"}avec soit :- percentage : pourcentage de remise appliqué à la ligne.
- amount : montant fixe de remise appliqué à la ligne.
- Charge : (Optionnel) via
allowance_charges_attributes[]{allowance_charge_indicator: "charge"}avec soit :- percentage : pourcentage de charge appliqué à la ligne.
- amount : montant fixe de charge appliqué à la ligne.
- Extension Amount : (Optionnel) le montant total « net » de la ligne de facture avant application des taxes. S’il n’est pas fourni, l’API le calculera comme expliqué dans Montants nets au niveau ligne.
Calculs
Section titled “Calculs”Paramètres au niveau du compte
Section titled “Paramètres au niveau du compte”-
Rounding Method (
rounding_method) : méthode d’arrondi utilisée pour les calculs ultérieurs. Par défaut, elle est définie sur Round half up (half_up). -
Round Before Sum (
round_before_sum) : arrondir les bases taxables des lignes avant la somme. Par défaut, cette option est définie surfalse. -
Apply Taxes per Line(
apply_taxes_per_line) : si défini surtrue, calcule le montant de taxe au niveau de la facture en appliquant les taxes à chaque ligne puis en les additionnant. Sinon, additionne toutes les bases taxables des lignes et applique la taxe à la somme. Par défaut, cette option est définie surfalse.- Skip Line Taxable Base Rounding (
skip_line_taxable_base_rounding) : lorsqu’elle est activée, les bases taxables par ligne et les montants de taxe ne sont pas arrondis individuellement ; seul le total final cumulé des taxes est arrondi. Par défaut, cette option est définie surfalse.
Important : ce paramètre est destiné exclusivement aux comptes dont l’ERP utilise des totaux TVA incluse, car il s’écarte du calcul fiscal standard.
apply_taxes_per_line: truedoit être activé pour qu’il ait un effet. - Skip Line Taxable Base Rounding (
Montants nets au niveau ligne
Section titled “Montants nets au niveau ligne”Montant de base de la ligne = Quantité * Prix / Quantité de baseLorsque base_quantity vaut 1 (valeur par défaut), cela se simplifie en Quantité * Prix.
Lorsque base_quantity est supérieur à 1, cela permet d’exprimer les prix pour plusieurs unités. Par exemple, si des vis sont tarifées à 12,50 pour 100 pièces et que vous en commandez 500 :
Montant de base de la ligne = 500 * 12.50 / 100 = 62.50Si Extension Amount(extension_amount) a été fourni, il sera utilisé comme montant net de la ligne dans tous les calculs. Sinon, nous calculons le montant net de la ligne.
Ligne avec remise et charge
Section titled “Ligne avec remise et charge”Pour chaque ligne, nous calculons le montant net en appliquant la remise et la charge :
Montant net de la ligne = Montant de base de la ligne - Montant de remise de la ligne + Montant de charge de la ligneSi nos remises ou charges sont représentées en pourcentages, nous calculons leur montant comme suit :
Montant de charge de la ligne = Montant de base de la ligne * (Pourcentage de charge de la ligne / 100)Montant de remise de la ligne = Montant de base de la ligne * (Pourcentage de remise de la ligne / 100)Si les montants de remise ou de charge sont fixes, nous pouvons ignorer cette étape.
Enfin, nous calculons le montant net de la ligne en soustrayant la remise et en ajoutant la charge :
Montant net de la ligne = Montant de base de la ligne - Montant de remise de la ligne + Montant de charge de la ligneComme le montant net de la ligne doit être arrondi à deux décimales, veuillez noter que les différentes parties du calcul doivent être arrondies séparément.
Par exemple, le résultat de Montant net de la ligne = Montant de base de la ligne doit être arrondi à deux décimales, et les montants de remise/charge sont également arrondis séparément.
Si le montant de remise/charge de la ligne n’est pas fourni, il est traité comme 0.
Montant net de la ligne = Montant de base de la ligneSous-total au niveau facture
Section titled “Sous-total au niveau facture”Additionnez les montants nets de toutes les lignes pour calculer le sous-total. Ce calcul dépend du paramètre round_before_sum.
- Round Before Sum est défini sur
true: la méthode d’arrondi est appliquée à chaque montant net de ligne avant de tous les additionner.
Sous-total = ∑(rounding_method(Montant net de la ligne))- Round Before Sum est défini sur
false: la méthode d’arrondi est appliquée à la somme de tous les montants nets de ligne.
Sous-total = rounding_method(∑(Montant net de la ligne))Si des remises ou charges au niveau facture sont fournies :
Sous-total = ∑(Montants nets de ligne) - Montant de remise de facture + Montant de charge de factureSi le pourcentage est fourni pour la remise ou la charge au niveau facture, nous calculerons leurs montants de la même manière qu’au niveau ligne.
Logique de calcul des taxes
Section titled “Logique de calcul des taxes”Après avoir calculé le montant net de la ligne, appliquez les taxes (si elles sont fournies) en fonction de taxes_attributes. Un pourcentage de taxe négatif indique une retenue. Les taxes sont appliquées selon le paramètre apply_taxes_per_line.
Montant taxable de la ligne (ou base) = Montant net de la ligneApply Taxes per Line est défini sur true : les taxes seront appliquées à chaque montant taxable de ligne (ou base) puis additionnées pour obtenir le montant total des taxes de la facture.
Calcul de la taxe pour chaque ligne
Section titled “Calcul de la taxe pour chaque ligne”- Plusieurs taxes peuvent s’appliquer à chaque ligne. Chaque taxe est appliquée individuellement.
Montant de taxe de la ligne = Montant taxable de la ligne × (Pourcentage de taxe / 100)- Si le paramètre Round Before Sum est
actif, le montant taxable de chaque ligne est arrondi avant l’application du pourcentage de taxe. Sinon, il sera arrondi après l’application du pourcentage de taxe.
Montant de taxe de la ligne = rounding_method(Montant taxable de la ligne) x (Pourcentage de taxe / 100) [Actif]Montant de taxe de la ligne = rounding_method(Montant taxable de la ligne x (Pourcentage de taxe / 100)) [Inactif]Somme des montants de taxe par ligne
Le montant total de taxe de chaque ligne est la somme de toutes les taxes appliquées à cette ligne.
Calcul des taxes au niveau facture
Le calcul du montant de taxe au niveau facture est basé sur les paramètres apply_taxes_per_line et round_before_sum. Il faut donc s’attendre à 4 approches différentes selon les réglages :
apply_taxes_per_line = trueetround_before_sum = true
Montant taxable de la ligne = rounding_method(Montant net de la ligne - Montant de remise de la ligne)Montant de taxe de la ligne = rounding_method(Montant taxable de la ligne x (Pourcentage de taxe / 100))Montant de taxe de la facture = ∑(Montants de taxe de ligne)apply_taxes_per_line = trueetround_before_sum = false
Montant taxable de la ligne = Montant net de la ligne - Montant de remise de la ligneMontant de taxe de la ligne = rounding_method(Montant taxable de la ligne x (Pourcentage de taxe / 100))Montant de taxe de la facture = ∑(Montants de taxe de ligne)apply_taxes_per_line = falseetround_before_sum = true
Montant taxable de la ligne = rounding_method(Montant net de la ligne - Montant de remise de la ligne)Montant de taxe de la facture = Montants taxables de ligne x (Pourcentage de taxe / 100)apply_taxes_per_line = falseetround_before_sum = false
Montant taxable de la ligne = Montant net de la ligne - Montant de remise de la ligneMontant de taxe de la facture = Montants taxables de ligne x (Pourcentage de taxe / 100)Total de la facture :
Total = Sous-total + Montant de taxe de la factureMéthodes d’arrondi
Section titled “Méthodes d’arrondi”Principes
Section titled “Principes”Précision décimale
Toutes les valeurs sont arrondies à deux décimales (correspondant aux centimes dans la plupart des devises).
Règles d’arrondi
Le paramètre de méthode d’arrondi définit comment l’arrondi est appliqué, et il peut être configuré selon trois options différentes :
- Round half up (
half_up) : méthode d’arrondi par défaut.- Si la troisième décimale est 5 ou plus, arrondissez la deuxième décimale vers le haut.
- Si la troisième décimale est 4 ou moins, laissez la deuxième décimale inchangée.
- Bankers rounding (
bankers) : arrondit les valeurs médianes vers la valeur paire la plus proche.- Si la troisième décimale est 6 ou plus, arrondissez la deuxième décimale vers le haut.
- Si la troisième décimale est 4 ou moins, laissez la deuxième décimale vers le bas.
- Si la troisième décimale est 5, arrondissez la deuxième décimale vers la valeur paire la plus proche. Par exemple,
1.235est arrondi à1.24, tandis que1.225est arrondi à1.22.
- Truncate (
truncate) : supprime la partie décimale du nombre pour arrondir.- Les nombres
1.234et1.236seront tous deux arrondis à1.23.
- Les nombres
Comment l’arrondi est appliqué dans l’API
Section titled “Comment l’arrondi est appliqué dans l’API”- Calculs au niveau ligne : tous les montants nets des lignes sont arrondis à deux décimales avant tout autre calcul.
- Calculs des taxes : les montants de taxe sont calculés et arrondis avant d’être ajoutés au montant net de la ligne.
- Sous-total et ajustements au niveau facture : les sous-totaux sont arrondis avant l’application des ajustements au niveau facture.
Résumé
Section titled “Résumé”- Tout d’abord, appliquez l’arrondi séparément à chaque étape (remises, charges et taxes) afin d’éviter les erreurs cumulées.
- Arrondissez toujours à deux décimales avant d’utiliser la valeur dans les calculs suivants.
Exemple de flux de calcul de l’API
Section titled “Exemple de flux de calcul de l’API”Exemple 1 : tarification standard
Section titled “Exemple 1 : tarification standard”Paramètres :
- Rounding Method :
bankers - Round before sum :
true - Apply taxes per line :
true
Entrée
Section titled “Entrée”{ "invoice_lines_attributes": [ { "quantity": 3, "price": 33.275, "taxes_attributes": [ { "name": "VAT", "category": "S", "percent": 21 } ], "allowance_charges_attributes": [ { "allowance_charge_indicator": "allowance", "amount": 5 }, { "allowance_charge_indicator": "charge", "percentage": 12.777 } ] }, { "quantity": 7, "price": 5.355, "taxes_attributes": [ { "name": "VAT", "category": "S", "percent": 21 } ] } ], "allowance_charges_attributes": [ { "allowance_charge_indicator": "charge", "amount": 3 } ], "currency": "EUR"}Calcul étape par étape
Section titled “Calcul étape par étape”-
Montant net de ligne (avant taxe) :
Ligne 1 :
- Montant de base =
3 × 33.275€ = 99.825€ - Montant d’allowance (remise) = 5.00€.
- Montant de charge =
99.825€ × 12.777/100 = 12.75464€→ Arrondi à 12.75€. - Montant net de la ligne =
99.825€ - 5.00€ + 12.75€ = 107.575€→ Arrondi à 107.58€.
Ligne 2 :
- Montant de base =
7 x 5.355€ = 37.485€→ Arrondi à 37.48€.
- Montant de base =
-
Sous-total de la facture :
- Somme de tous les montants nets de ligne =
107.58€ + 37.48€ = 145.06€ - Montant de charge globale = 3€.
- Somme de tous les montants nets de ligne =
-
Calcul de la taxe (apply taxes per line = true) :
- Ligne 1 :
107.58€ × 21/100 = 22.5918€→ Arrondi à 22.59€. - Ligne 2 :
37.48€ × 21/100 = 7.8708€→ Arrondi à 7.87€. - Taxe totale =
22.59€ + 7.87€ = 30.46€
- Ligne 1 :
-
Total de la facture :
- Sous-total de la facture =
145.06€ + 3€ = 148.06€ - Total de la facture =
148.06€ + 30.46€ = 178.52€
- Sous-total de la facture =
Sortie
Section titled “Sortie”{ "subtotal": 148.06, "taxes": [ { "name": "VAT 21.00%", "base": 145.06, "amount": 30.46 } ], "total": 178.52}Exemple 2 : utilisation de la quantité de base pour une tarification en volume
Section titled “Exemple 2 : utilisation de la quantité de base pour une tarification en volume”Entrée
Section titled “Entrée”{ "invoice_lines_attributes": [ { "description": "Vis en acier M6x20", "quantity": 500, "price": 12.50, "base_quantity": 100, "unit": 1, "taxes_attributes": [{ "name": "VAT", "category": "S", "percent": 21 }] }, { "description": "Papier d'impression A4", "quantity": 5000, "price": 45.00, "base_quantity": 1000, "unit": 1, "taxes_attributes": [{ "name": "VAT", "category": "S", "percent": 21 }] } ], "currency": "EUR"}Calcul étape par étape
Section titled “Calcul étape par étape”- Ligne 1 :
500 * 12.50 / 100 = 62.50€ - Ligne 2 :
5000 * 45.00 / 1000 = 225.00€ - Sous-total :
62.50 + 225.00 = 287.50€ - TVA 21% :
287.50 × 21 / 100 = 60.375→ Arrondi à 60.38€ - Total :
287.50 + 60.38 = 347.88€
Sortie
Section titled “Sortie”{ "subtotal": 287.50, "taxes": [ { "name": "VAT 21.00%", "base": 287.50, "amount": 60.38 } ], "total": 347.88}