Rechnungskorrektur
Die Korrektur einer zu viel berechneten Warenlieferung: Dokumenttyp 384, alle Beträge negativ, die Stückpreise dagegen positiv. Schritt für Schritt aufgebaut, mit dem Blick auf die Stellen, an denen sich eine Korrektur von einer Gutschrift unterscheidet.
Grundlage ist die offizielle Beispielrechnung
X14_01_Rechnungskorrektur aus der Factur-X-/ZUGFeRD-Dokumentation
(FeRD-Beispielpaket, ZUGFeRD 2.5.0, Profil EXTENDED). Der Code unten
erzeugt genau diesen Beleg, Feld für Feld und in derselben Reihenfolge.
Korrektur oder Gutschrift?
Das ist die Frage, an der die meiste Zeit hängen bleibt, und sie entscheidet über jedes Vorzeichen im Dokument. Beide Belegarten reduzieren eine Forderung, aber sie tun es 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 | Der Beleg korrigiert die ursprüngliche Rechnung um einen Differenzbetrag. | Der Beleg 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 und fällt bei vielen Empfängern auf. Die Referenz macht es umgekehrt, und diese Seite ebenfalls.
Die folgenden Abschnitte bauen aufeinander auf und gehören zu einem Programm. Wer FactoorSharp noch gar nicht kennt, fängt besser bei Los geht’s an – hier liegt der Schwerpunkt auf dem, was die Korrektur besonders macht. Zu jeder BT- und BG-Nummer finden Sie das zugehörige XML-Element in der Factur-X-Referenz.
1. Rechnungskopf
Neben Nummer, Datum und Währung fallen zwei Dinge auf: der Dokumenttyp und der Geschäftsprozess (BT-23), den dieses Beispiel im Gegensatz zur Warenrechnung setzt.
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";
Dim invoice As FacturXInvoice = 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
Dieselben Notizarten wie in der Warenrechnung, aber in anderer Reihenfolge: die
AAK-Notiz mit ContentCode steht hier vorn. Da die Gegenprobe gegen
die Referenz auch die Reihenfolge prüft, ist das kein Detail, sondern Vorgabe.
// Die AAK-Notiz mit ContentCode steht in dieser Referenz ganz vorn.
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);
' Die AAK-Notiz mit ContentCode steht in dieser Referenz ganz vorn.
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. Verkäufer bleibt Verkäufer, auch wenn Geld zurückfließt.
// Verkäufer (BG-4). Anders als in der Warenrechnung ohne elektronische Adresse –
// die Referenz gibt kein ram:URIUniversalCommunication aus, also auch kein
// SetSellerElectronicAddress().
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);
// Käufer (BG-7)
invoice.SetBuyer(
name: "MUSTER-KUNDE GMBH",
postcode: "12345",
city: "KUNDENDORF",
street: "KUNDENWEG 88",
country: CountryCodes.DE,
id: "009420",
globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"));
' Verkäufer (BG-4). Anders als in der Warenrechnung ohne elektronische Adresse –
' die Referenz gibt kein ram:URIUniversalCommunication aus, also auch kein
' SetSellerElectronicAddress().
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)
' Käufer (BG-7)
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
Hier zeigt sich, worauf sich die Korrektur bezieht. Zwei zusätzliche Dokumentenreferenzen (BT-18 / BG-24) mit TypeCode 130 tragen den Reklamationsvorgang und die ursprüngliche Rechnungsnummer.
invoice.SetBuyerOrderReferenceDocument("B123456789"); // BT-13
// Zwei zusätzliche Dokumentenreferenzen mit TypeCode 130: einmal der
// Reklamationsvorgang, einmal die ursprüngliche Rechnung, die korrigiert wird.
// Die Reihenfolge der Aufrufe bestimmt die Reihenfolge im XML.
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
invoice.SetBuyerOrderReferenceDocument("B123456789") ' BT-13
' Zwei zusätzliche Dokumentenreferenzen mit TypeCode 130: einmal der
' Reklamationsvorgang, einmal die ursprüngliche Rechnung, die korrigiert wird.
' Die Reihenfolge der Aufrufe bestimmt die Reihenfolge im XML.
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 an dieser Stelle nicht,
deshalb steht es hier ebenfalls nicht im Code – wer sich nicht an die
Vorlage binden muss, ist damit aber präziser unterwegs.
5. Waren- und Rechnungsempfänger
Auch die abweichenden Empfänger bleiben, wie sie in der Originalrechnung standen.
// Abweichender Warenempfänger (BG-13)
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" };
// Abweichender Rechnungsempfänger (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
};
' Abweichender Warenempfänger (BG-13)
invoice.ShipTo = New Party() With
{
.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() With {.OrgUnit = "8211"}
' Abweichender Rechnungsempfänger (BG-X-36, nur EXTENDED)
invoice.Invoicee = New Party() With
{
.ID = New GlobalID(Nothing, "009420"),
.GlobalID = New GlobalID(GlobalIDSchemeIdentifiers.GLN, "4304171000002"),
.Name = "MUSTER-KUNDE GMBH",
.Postcode = "123456",
.Street = "KUNDENWEG 88",
.City = "KUNDENDORF",
.Country = CountryCodes.DE
}
6. Positionen
Hier steckt die eigentliche Korrektur: fünf Flaschen und zwei Packungen gehen zurück. Die Stückpreise bleiben unverändert positiv, die Mengen werden negativ, und daraus ergeben sich die negativen Positionssummen.
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, und erst die negative Menge dreht das Ergebnis.
// Position 1: 5 Flaschen Zitronensäure zurück → −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
// Position 2: 2 Packungen Gelierzucker zurück. Die Artikelrabatte aus der
// Originalrechnung gelten weiterhin und bleiben POSITIV – sie sind Preisbestandteil,
// nicht Betrag: 1,50 − 0,03 − 0,02 = 1,45; −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
' Position 1: 5 Flaschen Zitronensäure zurück → −5 × 1,00 = −5,00, 19 %.
Dim line1 As TradeLineItem = invoice.AddTradeLineItem(
lineID:="1",
name:="Zitronensäure 100ml",
netUnitPrice:=1.0D, ' positiv!
grossUnitPrice:=1.0D, ' positiv!
unitCode:=QuantityCodes.H87,
billedQuantity:=-5D, ' negativ!
lineTotalAmount:=-5.0D,
taxType:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
taxPercent:=19D,
sellerAssignedID:="ZS997",
id:=New GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000014"))
line1.PackageQuantity = 1D
line1.PackageUnitCode = QuantityCodes.XBO ' XBO = Flasche
' Position 2: 2 Packungen Gelierzucker zurück. Die Artikelrabatte aus der
' Originalrechnung gelten weiterhin und bleiben POSITIV – sie sind Preisbestandteil,
' nicht Betrag: 1,50 − 0,03 − 0,02 = 1,45; −2 × 1,45 = −2,90, 7 %.
Dim line2 As TradeLineItem = invoice.AddTradeLineItem(
lineID:="2",
name:="Gelierzucker Extra 250g",
netUnitPrice:=1.45D,
grossUnitPrice:=1.5D,
unitCode:=QuantityCodes.H87,
billedQuantity:=-2D,
lineTotalAmount:=-2.9D,
taxType:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
taxPercent:=7D,
sellerAssignedID:="GZ250",
id:=New GlobalID(GlobalIDSchemeIdentifiers.EAN, "4123456000021"))
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount:=Nothing, actualAmount:=0.03D, reason:="Artikelrabatt 1")
line2.AddTradeAllowance(CurrencyCodes.EUR, basisAmount:=Nothing, actualAmount:=0.02D, reason:="Artikelrabatt 2")
line2.PackageQuantity = 1D
line2.PackageUnitCode = QuantityCodes.XCT ' XCT = Karton
7. Rechnungsrabatte auf Dokumentenebene
Die Rabatte drehen sich mit: ein Rabatt auf eine Rückabwicklung ist eine Rückforderung, also sind Bemessungsgrundlage und Betrag negativ. Wie in jeder Rechnung mit gemischten Steuersätzen braucht jeder Rabatt eine eigene Zeile je Satz – aus zwei Rabatten werden vier Aufrufe.
// Rechnungsrabatt 1 – prozentual, 2 %.
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);
' Rechnungsrabatt 1 – prozentual, 2 %.
invoice.AddTradeAllowance(
basisAmount:=-5D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.1D,
chargePercentage:=2D,
reason:="Rechnungsrabatt 1",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=19D)
invoice.AddTradeAllowance(
basisAmount:=-2.9D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.06D,
chargePercentage:=2D,
reason:="Rechnungsrabatt 1",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=7D)
' Rechnungsrabatt 2 – absoluter Betrag, deshalb ohne chargePercentage.
invoice.AddTradeAllowance(
basisAmount:=-5D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.05D,
reason:="Rechnungsrabatt 2",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=19D)
invoice.AddTradeAllowance(
basisAmount:=-2.9D,
currency:=CurrencyCodes.EUR,
actualAmount:=-0.02D,
reason:="Rechnungsrabatt 2",
taxTypeCode:=TaxTypes.VAT,
taxCategoryCode:=TaxCategoryCodes.S,
taxPercent:=7D)
8. Umsatzsteueraufstellung
Die Rechenwege sind dieselben wie in jeder Rechnung, nur mit umgekehrten
Vorzeichen. Der eine Punkt, der beim Lesen stolpern lässt: 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 |
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);
invoice.AddApplicableTradeTax(
basisAmount:=-4.85D,
percent:=19D,
taxAmount:=-0.92D,
typeCode:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
allowanceChargeBasisAmount:=0.15D, ' positiv, weil die Rabatte negativ sind
lineTotalBasisAmount:=-5D)
invoice.AddApplicableTradeTax(
basisAmount:=-2.82D,
percent:=7D,
taxAmount:=-0.2D,
typeCode:=TaxTypes.VAT,
categoryCode:=TaxCategoryCodes.S,
allowanceChargeBasisAmount:=0.08D,
lineTotalBasisAmount:=-2.9D)
9. Gesamtsummen
Am Ende steht ein negativer Zahlbetrag – das ist das Kennzeichen einer Korrektur, und für den Empfänger die Aussage, dass Geld zurückfließt.
| 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 |
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 – der Betrag geht an den Kunden zurück
invoice.SetTotals(
lineTotalAmount:=-7.9D, ' BT-106
chargeTotalAmount:=0D, ' BT-108
allowanceTotalAmount:=-0.23D, ' BT-107
taxBasisAmount:=-7.67D, ' BT-109
taxTotalAmount:=-1.12D, ' BT-110
grandTotalAmount:=-8.79D, ' BT-112
totalPrepaidAmount:=0D, ' BT-113
duePayableAmount:=-8.79D) ' BT-115 – der Betrag geht an den Kunden zurück
10. Speichern und prüfen
Gespeichert wird wie jeder EXTENDED-Beleg – Version, Profil und Syntax gehören zusammen:
invoice.Save("X14_01_Rechnungskorrektur.xml",
ZUGFeRDVersion.Version25,
Profile.Extended,
ZUGFeRDFormats.CII);
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.
Ob der Beleg darüber hinaus dem Regelwerk entspricht, prüft der Validator – im Browser oder direkt aus Ihrem Code heraus. Eine Lesefassung für Menschen erzeugt der Visualizer. Beides sowie die ausführliche Dokumentation dazu finden Sie im Kunden-Bereich; wie Sie dorthin kommen, steht unter Los geht’s.