<!-- md-source: 82e9e8f13223 FactoorSharpWeb/Views/Service/CorrectionInvoice.cshtml -->
<!-- md-source: 13464e70a673 FactoorSharpWeb/Views/Shared/_CorrectionInvoiceSamples.cshtml -->

# Rechnungskorrektur

> Markdown-Fassung von <https://www.factoorsharp.de/de/Service/CorrectionInvoice> für KI-Agenten.
> Sprachen: [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)

Die Korrektur einer zu viel berechneten Warenlieferung: Dokumenttyp 384, alle Beträge
negativ, die Stückpreise dagegen positiv.

Grundlage ist die offizielle Beispielrechnung `X14_01_Rechnungskorrektur` aus der
Factur-X-/ZUGFeRD-Dokumentation (FeRD-Beispielpaket, ZUGFeRD 2.5.0, Profil EXTENDED).
Der Code erzeugt genau diesen Beleg, Feld für Feld und in derselben Reihenfolge.

## Korrektur oder Gutschrift?

Beide Belegarten reduzieren eine Forderung, aber auf entgegengesetzte Weise.

| | Rechnungskorrektur (384) | Gutschrift (381) |
|---|---|---|
| FactoorSharp | `InvoiceType.Correction` | `InvoiceType.CreditNote` |
| Mengen (BT-129) | **negativ** | positiv |
| Stückpreise (BT-146 / BT-148) | positiv | positiv |
| Summen, Steuern, Rabatte | **negativ** | positiv |
| Lesart | korrigiert die ursprüngliche Rechnung um einen Differenzbetrag | spiegelt als Ganzes die ursprüngliche Rechnung |

Das Vorzeichen steckt in der **Menge**, nicht im Preis. Ein negativer Stückpreis bei
positiver Menge ergibt rechnerisch dieselbe Positionssumme, ist fachlich aber unsauber.

## 1. Rechnungskopf

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

// BT-3: 384 = Rechnungskorrektur. Der entscheidende Unterschied zu 381 (Gutschrift).
invoice.Type = InvoiceType.Correction;

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

// BT-23: Geschäftsprozess → ram:BusinessProcessSpecifiedDocumentContextParameter
invoice.BusinessProcess = "Beispielgeschäftsprozess";
```

## 2. Freitexte

Die `AAK`-Notiz mit ContentCode steht in dieser Referenz ganz vorn. Da die Gegenprobe
auch die Reihenfolge prüft, ist das Vorgabe und kein Detail.

```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. Verkäufer und Käufer

Unverändert gegenüber einer normalen Rechnung – eine Korrektur wechselt die Rollen nicht.
Anders als in der Warenrechnung ohne elektronische Adresse.

```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. Belegverweise

Zwei zusätzliche Dokumentenreferenzen (BT-18 / BG-24) mit TypeCode 130 tragen den
Reklamationsvorgang und die ursprüngliche Rechnungsnummer. Die Reihenfolge der Aufrufe
bestimmt die Reihenfolge im 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
```

Für den Verweis auf die korrigierte Rechnung gibt es mit `ram:InvoiceReferencedDocument`
(BT-25/BT-26) auch ein spezialisiertes Element. Die FeRD-Referenz nutzt es hier nicht.

## 5. Waren- und Rechnungsempfänger

```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 ist genau dieses Feld.
invoice.ShipToContact = new Contact() { OrgUnit = "8211" };

// BG-X-36, nur EXTENDED
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. Positionen

Fünf Flaschen und zwei Packungen gehen zurück. Die Stückpreise bleiben positiv, die
Mengen werden negativ. Die Artikelrabatte aus der Originalrechnung (BT-147) bleiben
ebenfalls **positiv** – sie sind Bestandteil des Preises, nicht ein Betrag auf der
Rechnung: 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,          // positiv!
    grossUnitPrice: 1.00m,        // positiv!
    unitCode: QuantityCodes.H87,
    billedQuantity: -5m,          // negativ!
    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 = Flasche

// −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 = Karton
```

## 7. Rechnungsrabatte auf Dokumentenebene

Ein Rabatt auf eine Rückabwicklung ist eine Rückforderung: Bemessungsgrundlage und
Betrag sind negativ. Wie in jeder Rechnung mit gemischten Steuersätzen braucht jeder
Rabatt eine eigene Zeile je Satz – aus zwei Rabatten werden vier Aufrufe.

```csharp
// Rechnungsrabatt 1 – prozentual, 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);

// Rechnungsrabatt 2 – absoluter Betrag, deshalb ohne 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. Umsatzsteueraufstellung

Ein *negativer* Rabatt erhöht die Bemessungsgrundlage wieder, deshalb ist
`allowanceChargeBasisAmount` hier positiv.

| Feld | 19 % (Pos. 1) | 7 % (Pos. 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,   // positiv, weil die Rabatte negativ sind
    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. Gesamtsummen

| BT-Code | Parameter | Rechenweg |
|---|---|---|
| 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** – der Betrag geht an den Kunden zurück |

```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. Speichern und prüfen

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

Das Ergebnis muss dieselbe Baumstruktur haben wie `X14_01_Rechnungskorrektur.xml` aus
dem FeRD-Beispielpaket. Validator und Visualizer sowie die ausführliche Dokumentation
dazu liegen im Kunden-Bereich unter <https://www.factoorsharp.de/support/>.

## Verwandte Seiten

- [Erweiterte Warenrechnung](https://www.factoorsharp.de/de/Service/GoodsInvoice.md): sechs Positionen, zwei Steuersätze, Rabatte und Skonto im Profil EXTENDED.
- [Rechnung in Fremdwährung](https://www.factoorsharp.de/de/Service/ForeignCurrencyInvoice.md): GBP mit Steuerbetrag zusätzlich in EUR samt Umrechnungskurs.
- [Los geht's](https://www.factoorsharp.de/de/Home/GettingStarted.md): Installation, Lizenzschlüssel und erste Rechnung.
- [Factur-X-Referenz](https://www.factoorsharp.de/de/Service/Documentation): XML-Elemente und BT-/BG-Nummern zum Nachschlagen.
