<!-- md-source: 6357ef2ad743 FactoorSharpWeb/wwwroot/de/Service/CorrectionInvoice.md -->

# Facture rectificative

> Version Markdown de <https://www.factoorsharp.de/fr/Service/CorrectionInvoice> destinée aux agents IA.
> Langues : [Deutsch](https://www.factoorsharp.de/de/Service/CorrectionInvoice.md) ·
> [English](https://www.factoorsharp.de/en/Service/CorrectionInvoice.md) ·
> [Français](https://www.factoorsharp.de/fr/Service/CorrectionInvoice.md)

La rectification d'une livraison de marchandises surfacturée : type de document 384, tous
les montants négatifs, les prix unitaires positifs.

La base est la facture d'exemple officielle `X14_01_Rechnungskorrektur` issue de la
documentation Factur-X / ZUGFeRD (jeu d'exemples FeRD, ZUGFeRD 2.5.0, profil EXTENDED).
Le code produit exactement ce document, champ par champ et dans le même ordre.

Les textes des notes, les noms de produits et les motifs de remise restent en allemand :
ce sont les données de la facture de référence officielle, et les traduire romprait la
comparaison avec elle.

## Rectification ou avoir ?

Les deux types de document réduisent une créance, mais de manière opposée.

| | Facture rectificative (384) | Avoir (381) |
|---|---|---|
| FactoorSharp | `InvoiceType.Correction` | `InvoiceType.CreditNote` |
| Quantités (BT-129) | **négatives** | positives |
| Prix unitaires (BT-146 / BT-148) | positifs | positifs |
| Totaux, taxes, remises | **négatifs** | positifs |
| Lecture | rectifie la facture d'origine d'un montant de différence | reflète la facture d'origine dans son ensemble |

Le signe appartient à la **quantité**, pas au prix. Un prix unitaire négatif associé à une
quantité positive donne arithmétiquement le même total de ligne, mais c'est incorrect sur
le plan métier.

## 1. En-tête de facture

```csharp
FacturXInvoice invoice = FacturXInvoice.CreateInvoice(
    invoiceNo: "RK21012345",
    invoiceDate: new DateTime(2025, 10, 1),
    currency: CurrencyCodes.EUR);

// BT-3 : 384 = facture rectificative. La différence décisive avec 381 (avoir).
invoice.Type = InvoiceType.Correction;

invoice.Name = "RECHNUNGS-KORREKTUR";   // BT-X-2, EXTENDED uniquement
invoice.IsTest = true;                  // ram:TestIndicator, EXTENDED uniquement

// BT-23 : processus métier → ram:BusinessProcessSpecifiedDocumentContextParameter
invoice.BusinessProcess = "Beispielgeschäftsprozess";
```

## 2. Notes en texte libre

Dans cette référence, la note `AAK` avec son code de contenu vient en premier. Comme le
contrôle croisé compare aussi l'ordre, c'est une exigence et non un détail.

```csharp
invoice.AddNote("Es bestehen Rabatt- oder Bonusvereinbarungen.",
                subjectCode: SubjectCodes.AAK,
                contentCode: ContentCodes.ST3);

invoice.AddNote("Geschäftsführer: Herr Geschäftsführer , Muster Maschinenbau GmbH etc. ",
                subjectCode: SubjectCodes.REG);

invoice.AddNote("Es bestehen Vereinbarungen, aus denen sich Minderungen des Entgelts ergeben können.",
                subjectCode: SubjectCodes.AAI);

invoice.AddNote("ZUGFeRD vers 2.5.0 (Extended)", subjectCode: SubjectCodes.ACB);
invoice.AddNote("Dies ist eine Beispiel-für eine Korrektur einer Rechnung (Type 384)",
                subjectCode: SubjectCodes.ACB);
```

## 3. Vendeur et acheteur

Inchangés par rapport à une facture normale – une rectification n'inverse pas les rôles.
Contrairement à la facture de marchandises, sans adresse électronique.

```csharp
invoice.SetSeller(
    name: "MUSTERLIEFERANT GMBH",
    postcode: "98765",
    city: "MUSTERHAUSEN",
    street: "BAHNHOFSTRASSE 99",
    country: CountryCodes.DE,
    id: "549910",
    globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4333741000005"));

invoice.SetSellerContact(
    emailAddress: "max.mustermann@musterlieferant.de",
    phoneno: "+49 932 431 500");

invoice.AddSellerTaxRegistration("DE123456788", TaxRegistrationSchemeID.VA);

invoice.SetBuyer(
    name: "MUSTER-KUNDE GMBH",
    postcode: "12345",
    city: "KUNDENDORF",
    street: "KUNDENWEG 88",
    country: CountryCodes.DE,
    id: "009420",
    globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"));
```

## 4. Références de documents

Deux références de documents supplémentaires (BT-18 / BG-24) portant le code de type 130
contiennent le dossier de réclamation et le numéro de la facture d'origine. L'ordre des
appels détermine l'ordre dans le XML.

```csharp
invoice.SetBuyerOrderReferenceDocument("B123456789");   // BT-13

invoice.AddAdditionalReferencedDocument(
    id: "REKLA-2018-235",
    typeCode: AdditionalReferencedDocumentTypeCode.InvoiceDataSheet);
invoice.AddAdditionalReferencedDocument(
    id: "R87654321012345",
    typeCode: AdditionalReferencedDocumentTypeCode.InvoiceDataSheet);

invoice.SetDeliveryNoteReferenceDocument("L87654321012345");   // BT-16
invoice.ActualDeliveryDate = new DateTime(2025, 10, 1);        // BT-72
```

Pour le renvoi à la facture rectifiée, il existe aussi un élément spécialisé,
`ram:InvoiceReferencedDocument` (BT-25/BT-26). La référence FeRD ne l'utilise pas ici.

## 5. Destinataire des marchandises et de la facture

```csharp
invoice.ShipTo = new Party()
{
    GlobalID = new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171088093"),
    Name     = "MUSTER-MARKT",
    Postcode = "54321",
    Street   = "HAUPTSTRASSE 44",
    City     = "LIEFERSTADT",
    Country  = CountryCodes.DE
};

// ram:DefinedTradeContact/ram:DepartmentName – OrgUnit correspond exactement à ce champ.
invoice.ShipToContact = new Contact() { OrgUnit = "8211" };

// BG-X-36, EXTENDED uniquement
invoice.Invoicee = new Party()
{
    ID       = new GlobalID(null, "009420"),
    GlobalID = new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"),
    Name     = "MUSTER-KUNDE GMBH",
    Postcode = "123456",
    Street   = "KUNDENWEG 88",
    City     = "KUNDENDORF",
    Country  = CountryCodes.DE
};
```

## 6. Lignes de facture

Cinq bouteilles et deux paquets repartent. Les prix unitaires restent positifs, les
quantités deviennent négatives. Les remises sur article de la facture d'origine (BT-147)
restent elles aussi **positives** – elles font partie du prix, ce ne sont pas des montants
portés sur la facture : 1,50 − 0,03 − 0,02 = 1,45.

```csharp
// −5 × 1,00 = −5,00, 19 %
TradeLineItem line1 = invoice.AddTradeLineItem(
    lineID: "1",
    name: "Zitronensäure 100ml",
    netUnitPrice: 1.00m,          // positif !
    grossUnitPrice: 1.00m,        // positif !
    unitCode: QuantityCodes.H87,
    billedQuantity: -5m,          // négatif !
    lineTotalAmount: -5.00m,
    taxType: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S,
    taxPercent: 19m,
    sellerAssignedID: "ZS997",
    id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000014"));

line1.PackageQuantity = 1m;
line1.PackageUnitCode = QuantityCodes.XBO;   // XBO = bouteille

// −2 × 1,45 = −2,90, 7 %
TradeLineItem line2 = invoice.AddTradeLineItem(
    lineID: "2",
    name: "Gelierzucker Extra 250g",
    netUnitPrice: 1.45m,
    grossUnitPrice: 1.50m,
    unitCode: QuantityCodes.H87,
    billedQuantity: -2m,
    lineTotalAmount: -2.90m,
    taxType: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S,
    taxPercent: 7m,
    sellerAssignedID: "GZ250",
    id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000021"));

line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount: null, actualAmount: 0.03m, reason: "Artikelrabatt 1");
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount: null, actualAmount: 0.02m, reason: "Artikelrabatt 2");

line2.PackageQuantity = 1m;
line2.PackageUnitCode = QuantityCodes.XCT;   // XCT = carton
```

## 7. Remises au niveau du document

Une remise sur une contre-passation est une reprise : la base de calcul et le montant sont
négatifs. Comme dans toute facture à taux de TVA mixtes, chaque remise a besoin de sa
propre entrée par taux – deux remises donnent quatre appels.

```csharp
// Remise sur facture 1 – en pourcentage, 2 % (BT-94 CalculationPercent + BT-93 BasisAmount).
invoice.AddTradeAllowance(
    basisAmount: -5.00m, currency: CurrencyCodes.EUR, actualAmount: -0.10m,
    chargePercentage: 2.00m, reason: "Rechnungsrabatt 1",
    taxTypeCode: TaxTypes.VAT, taxCategoryCode: TaxCategoryCodes.S, taxPercent: 19m);

invoice.AddTradeAllowance(
    basisAmount: -2.90m, currency: CurrencyCodes.EUR, actualAmount: -0.06m,
    chargePercentage: 2.00m, reason: "Rechnungsrabatt 1",
    taxTypeCode: TaxTypes.VAT, taxCategoryCode: TaxCategoryCodes.S, taxPercent: 7m);

// Remise sur facture 2 – montant fixe, donc sans chargePercentage.
invoice.AddTradeAllowance(
    basisAmount: -5.00m, currency: CurrencyCodes.EUR, actualAmount: -0.05m,
    reason: "Rechnungsrabatt 2",
    taxTypeCode: TaxTypes.VAT, taxCategoryCode: TaxCategoryCodes.S, taxPercent: 19m);

invoice.AddTradeAllowance(
    basisAmount: -2.90m, currency: CurrencyCodes.EUR, actualAmount: -0.02m,
    reason: "Rechnungsrabatt 2",
    taxTypeCode: TaxTypes.VAT, taxCategoryCode: TaxCategoryCodes.S, taxPercent: 7m);
```

## 8. Ventilation de la TVA

Une remise *négative* augmente à nouveau la base d'imposition, c'est pourquoi
`allowanceChargeBasisAmount` est ici positif.

| Champ | 19 % (ligne 1) | 7 % (ligne 2) |
|---|---|---|
| `lineTotalBasisAmount` | −5,00 | −2,90 |
| `allowanceChargeBasisAmount` | −(−0,10) − (−0,05) = **+0,15** | −(−0,06) − (−0,02) = **+0,08** |
| `basisAmount` | −5,00 + 0,15 = **−4,85** | −2,90 + 0,08 = **−2,82** |
| `taxAmount` | −4,85 × 19 % = −0,9215 → **−0,92** | −2,82 × 7 % = −0,1974 → **−0,20** |

```csharp
invoice.AddApplicableTradeTax(
    basisAmount: -4.85m, percent: 19m, taxAmount: -0.92m,
    typeCode: TaxTypes.VAT, categoryCode: TaxCategoryCodes.S,
    allowanceChargeBasisAmount: 0.15m,   // positif, car les remises sont négatives
    lineTotalBasisAmount: -5.00m);

invoice.AddApplicableTradeTax(
    basisAmount: -2.82m, percent: 7m, taxAmount: -0.20m,
    typeCode: TaxTypes.VAT, categoryCode: TaxCategoryCodes.S,
    allowanceChargeBasisAmount: 0.08m,
    lineTotalBasisAmount: -2.90m);
```

## 9. Totaux du document

| Code BT | Paramètre | Calcul |
|---|---|---|
| BT-106 | `lineTotalAmount` | −5,00 + (−2,90) = **−7,90** |
| BT-107 | `allowanceTotalAmount` | −0,10 − 0,06 − 0,05 − 0,02 = **−0,23** |
| BT-109 | `taxBasisAmount` | −7,90 − (−0,23) = **−7,67** |
| BT-110 | `taxTotalAmount` | −0,92 + (−0,20) = **−1,12** |
| BT-112 | `grandTotalAmount` | −7,67 + (−1,12) = **−8,79** |
| BT-115 | `duePayableAmount` | **−8,79** – le montant revient au client |

```csharp
invoice.SetTotals(
    lineTotalAmount: -7.90m,       // BT-106
    chargeTotalAmount: 0.00m,      // BT-108
    allowanceTotalAmount: -0.23m,  // BT-107
    taxBasisAmount: -7.67m,        // BT-109
    taxTotalAmount: -1.12m,        // BT-110
    grandTotalAmount: -8.79m,      // BT-112
    totalPrepaidAmount: 0.00m,     // BT-113
    duePayableAmount: -8.79m);     // BT-115
```

## 10. Enregistrement et contrôle

```csharp
invoice.Save("X14_01_Rechnungskorrektur.xml",
             ZUGFeRDVersion.Version25,
             Profile.Extended,
             ZUGFeRDFormats.CII);
```

Le résultat doit présenter la même structure arborescente que
`X14_01_Rechnungskorrektur.xml` du jeu d'exemples FeRD. Le validateur et le visualiseur,
ainsi que leur documentation détaillée, se trouvent dans l'espace client sous
<https://www.factoorsharp.de/support/>.

## Pages liées

- [Facture de marchandises étendue](https://www.factoorsharp.de/fr/Service/GoodsInvoice.md) : six lignes, deux taux de TVA, remises et escompte dans le profil EXTENDED.
- [Facture en devise étrangère](https://www.factoorsharp.de/fr/Service/ForeignCurrencyInvoice.md) : GBP avec montant de TVA également en EUR et taux de change.
- [Pour commencer](https://www.factoorsharp.de/fr/Home/GettingStarted.md) : installation, clé de licence et première facture.
- [Référence Factur-X](https://www.factoorsharp.de/fr/Service/Documentation) : éléments XML et numéros BT/BG à consulter.
