# PEPPOL-EN16931-R046 Le prix net de l’article doit être égal au prix brut diminué de la remise sur prix

Selon la règle Peppol PEPPOL-EN16931-R046, lorsqu’une ligne de facture indique un prix brut dans BT-148 (GrossPrice) et une remise sur prix dans BT-147 (PriceAllowance), le prix net dans BT-146 (PriceAmount) doit respecter l’égalité exacte: PrixNet = PrixBrut - RemiseSurPrix. Les moteurs Peppol appliquent une tolérance stricte pour éviter tout écart d’arrondi.

## Description du problème

Selon la règle Peppol PEPPOL-EN16931-R046, lorsqu’une ligne de facture indique un prix brut dans BT-148 (GrossPrice) et une remise sur prix dans BT-147 (PriceAllowance), le prix net dans BT-146 (PriceAmount) doit respecter l’égalité exacte: PrixNet = PrixBrut - RemiseSurPrix. Les moteurs Peppol appliquent une tolérance stricte pour éviter tout écart d’arrondi.

> **ERREUR**: XRechnung 3.0

## Contexte et importance

Tout écart entre prix brut, remise unitaire et prix net déclenche PEPPOL-EN16931-R046. Le calcul de la remise sur prix doit être mathématiquement exact.

## Solution

Dans le calcul de prix de votre ERP, assurez-vous que le prix net unitaire est égal au prix brut déduction faite de la remise unitaire. En UBL 2.1, dans <cac:Price>, vérifiez que <cbc:PriceAmount> correspond au prix brut diminué de <cac:AllowanceCharge><cbc:Amount>. En CII, appliquez la même soustraction dans les structures NetPrice et GrossPrice.

- validate
- convert

## Exemples valides

- Prix brut BT-148 = 100.00 EUR, Remise sur prix BT-147 = 20.00 EUR, Prix net BT-146 = 80.00 EUR
- Prix brut BT-148 = 50.00 EUR, Remise sur prix BT-147 = 5.00 EUR, Prix net BT-146 = 45.00 EUR

## Exemples invalides

- Prix brut 100.00 EUR moins remise 20.00 EUR exporté avec Prix net = 85.00 EUR (Erreur de calcul)
- Remise déclarée à 10.00 EUR mais le Prix net est égal au Prix brut sans déduction

## Exemples de code

### XML valide
```
<cac:Price>
  <cbc:PriceAmount currencyID="EUR">80.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="EUR">20.00</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">100.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

### XML invalide
```
<cac:Price>
  <!-- 100.00 - 20.00 must equal 80.00, not 85.00 -->
  <cbc:PriceAmount currencyID="EUR">85.00</cbc:PriceAmount>
  <cac:AllowanceCharge>
    <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
    <cbc:Amount currencyID="EUR">20.00</cbc:Amount>
    <cbc:BaseAmount currencyID="EUR">100.00</cbc:BaseAmount>
  </cac:AllowanceCharge>
</cac:Price>
```

## Champs concernés

- [BT-146 Prix net de l’article](/resources/xrechnung/bt-146-item-net-price)
- [BT-148 Prix brut de l’article](/resources/xrechnung/bt-148-item-gross-price)
- [BT-147 Remise sur le prix de l’article](/resources/xrechnung/bt-147-item-price-discount)
- [BG-29 Détails du prix](/resources/xrechnung)

## Règles associées

- [BR-24](/resources/kosit-validator-errors/br-24-invoice-line-net-amount-must-be-present)
- [PEPPOL-EN16931-R120](/resources/kosit-validator-errors/peppol-en16931-r120-line-net-amount-formula)

## Outils de validation

- [Validateur KoSIT officiel](https://erechnungsvalidator.service-bw.de/): Validez vos fichiers XRechnung par rapport à toutes les règles BR-DE.
- [Convertir un PDF en XRechnung](/pdf-to-xrechnung): Correction automatique des erreurs de validation lors de la conversion.

## Ressources associées

- [Spécification officielle](https://xeinkauf.de/xrechnung/)
- [Suite de tests](https://github.com/itplr-kosit/xrechnung-testsuite)
- [Liste complète des erreurs](/resources/kosit-validator-errors): Aperçu de toutes les règles de validation XRechnung en Allemagne.
