<!-- md-source: bb2e04f6a52c FactoorSharpWeb/Views/Service/SelfBilledInvoice.cshtml -->
<!-- md-source: 54c112b20fdc FactoorSharpWeb/Views/Shared/_SelfBilledInvoiceSamples.cshtml -->

# Gutschrift (Selbstabrechnung)

> Markdown-Fassung von <https://www.factoorsharp.de/de/Service/SelfBilledInvoice> für KI-Agenten.
> Sprachen: [Deutsch](https://www.factoorsharp.de/de/Service/SelfBilledInvoice.md) ·
> [English](https://www.factoorsharp.de/en/Service/SelfBilledInvoice.md) ·
> [Français](https://www.factoorsharp.de/fr/Service/SelfBilledInvoice.md)

Das Gutschriftverfahren nach § 14 Abs. 2 UStG: Der Leistungsempfänger rechnet ab, nicht
der Lieferant. Zwei Positionen, zwei Steuersätze, keine Zu- und Abschläge – und als
einziger Unterschied zu einer gewöhnlichen Handelsrechnung der Dokumenttyp 389.

Grundlage ist die offizielle Beispielrechnung `E10_01_Gutschrift` aus der
Factur-X-/ZUGFeRD-Dokumentation (FeRD-Beispielpaket, ZUGFeRD 2.5.0).

## Zwei Dinge, die „Gutschrift" heißen

Das deutsche Wort trägt zwei völlig verschiedene Bedeutungen, und die Verwechslung ist
der häufigste Fehler in diesem Bereich.

| | Gutschriftverfahren (389) | Gutschrift im Sinne einer Stornierung (381) |
|---|---|---|
| FactoorSharp | `InvoiceType.SelfBilledInvoice` | `InvoiceType.CreditNote` |
| Wer stellt aus? | **Der Leistungsempfänger** rechnet für den Lieferanten ab | Der Lieferant selbst |
| Beträge | **positiv** – der Beleg sieht aus wie eine Rechnung | positiv, das Dokument spiegelt die Rechnung als Ganzes |
| Rechtsgrundlage | § 14 Abs. 2 UStG (self-billed invoice) | Korrektur einer Forderung |
| Diese Seite | **behandelt diesen Fall** | siehe [Rechnungskorrektur](https://www.factoorsharp.de/de/Service/CorrectionInvoice.md) (Typ 384) für die Abgrenzung |

Beim Gutschriftverfahren bleiben **alle Beträge positiv**. Wer hier negative Mengen setzt,
weil „Gutschrift" nach Rückabwicklung klingt, baut einen fachlich falschen Beleg.

## Profil COMFORT statt EXTENDED

Anders als die übrigen Beispiele liegt dieser Beleg im Profil `Profile.Comfort` – der
Guideline-ID `urn:cen.eu:en16931:2017`, also dem reinen EN 16931-Profil ohne Erweiterung.
Das ist keine Nachlässigkeit der Referenz, sondern die Aussage, dass dieser
Geschäftsvorfall ohne EXTENDED-Felder auskommt.

Folgerichtig fehlen alle Felder, die die
[Erweiterte Warenrechnung](https://www.factoorsharp.de/de/Service/GoodsInvoice.md)
vorführt: Dokumentenname (BT-X-2), Testkennzeichen, Verpackungsangaben (BT-X-9) und die
erweiterten Steuerbasen. Sie zu setzen wäre kein Fehler – der Writer würde sie im Profil
COMFORT stillschweigend verwerfen.

## 1. Belegkopf

```csharp
// BT-1 Belegnummer, BT-2 Belegdatum, BT-5 Währung
FacturXInvoice invoice = FacturXInvoice.CreateInvoice(
    invoiceNo: "471102",
    invoiceDate: new DateTime(2026, 3, 5),
    currency: CurrencyCodes.EUR);

// BT-3: 389 = Gutschrift (Selbstabrechnung). Der einzige Unterschied zu einer
// gewöhnlichen Handelsrechnung (380) im gesamten Beleg – alle Beträge bleiben positiv.
invoice.Type = InvoiceType.SelfBilledInvoice;
```

## 2. Freitexte

Vier Notizen in `ram:IncludedNote` (BG-1). Die erste kommt ohne `subjectCode` aus, zwei
tragen `REG` für regulatorische Angaben, die letzte `ACB` für die Formatkennzeichnung.

```csharp
// Notiz ohne subjectCode: reiner Freitext, hier der Bezug auf die Bestellung.
invoice.AddNote("Rechnung gemäß Bestellung vom 01.03.2026.");

// REG = Regulatorische Angaben. Das Beispiel nutzt zwei davon: handelsrechtliche
// Vertretung und Handelsregisternummer.
invoice.AddNote("Geschäftsführer: Hans Muster",
                subjectCode: SubjectCodes.REG);

invoice.AddNote("Handelsregisternummer: H A 123",
                subjectCode: SubjectCodes.REG);

// ACB = zusätzliche Information, hier die Formatkennzeichnung.
invoice.AddNote("ZUGFeRD vers 2.5.0 EN16931 (Comfort)",
                subjectCode: SubjectCodes.ACB);
```

## 3. Verkäufer mit zwei Steuerregistrierungen

`AddSellerTaxRegistration` lässt sich mehrfach aufrufen. Hier steht zuerst die nationale
Steuernummer (`FC`, BT-32), dann die USt-IdNr. (`VA`, BT-31). Die Reihenfolge im XML folgt
der Aufrufreihenfolge.

```csharp
// id       → ram:ID       (BT-29)   interne Lieferantennummer
// globalID → ram:GlobalID (BT-29-0) mit schemeID "0088" = GLN
invoice.SetSeller(
    name: "Lieferant GmbH",
    postcode: "80333",
    city: "München",
    street: "Lieferantenstraße 20",
    country: CountryCodes.DE,
    id: "549910",
    globalID: new GlobalID(GlobalIDSchemeIdentifiers.GLN, "4000001123452"));

//   FC = nationale Steuernummer (BT-32)
//   VA = USt-IdNr.               (BT-31)
invoice.AddSellerTaxRegistration("201/113/40209", TaxRegistrationSchemeID.FC);
invoice.AddSellerTaxRegistration("DE136695976", TaxRegistrationSchemeID.VA);
```

## 4. Käufer – mit eigener Steuernummer

Hier zeigt sich das Gutschriftverfahren im Datenmodell: Weil der Leistungsempfänger
abrechnet, trägt auch *er* eine USt-IdNr. im Beleg (BT-48). Bei einer gewöhnlichen
Handelsrechnung bleibt dieses Feld meist leer.

```csharp
// Hier nur eine interne Kundennummer, keine GLN.
invoice.SetBuyer(
    name: "Kunden AG Mitte",
    postcode: "69876",
    city: "Frankfurt",
    street: "Kundenstraße 15",
    country: CountryCodes.DE,
    id: "GE2020211");

// BT-48: USt-IdNr. des Käufers.
invoice.AddBuyerTaxRegistration("DE136695976", TaxRegistrationSchemeID.VA);

// BT-72: tatsächliches Lieferdatum → ram:ActualDeliverySupplyChainEvent
invoice.ActualDeliveryDate = new DateTime(2026, 3, 3);
```

## 5. Belegpositionen

Zwei Positionen (BG-25) ohne jeden Artikelrabatt. Brutto- und Nettopreis sind deshalb
identisch – die Referenz schreibt trotzdem beide Elemente aus. Beide Positionen liegen in
derselben Steuerkategorie `S` und unterscheiden sich nur im Satz.

```csharp
// Position 1: 20 Stück Trennblätter zu 9,90 € = 198,00 €, 19 % USt
invoice.AddTradeLineItem(
    lineID: "1",
    name: "Trennblätter A4",
    netUnitPrice: 9.90m,
    grossUnitPrice: 9.90m,
    unitCode: QuantityCodes.H87,       // H87 = Stück
    billedQuantity: 20m,
    lineTotalAmount: 198.00m,
    taxType: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S,  // S = Regelsteuersatz
    taxPercent: 19m,
    sellerAssignedID: "TB100A4",
    id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4012345001235"));

// Position 2: 50 Stück Joghurt zu 5,50 € = 275,00 €, 7 % USt.
// Lebensmittel, deshalb der ermäßigte Satz – innerhalb derselben Steuerkategorie S.
invoice.AddTradeLineItem(
    lineID: "2",
    name: "Joghurt Banane",
    netUnitPrice: 5.50m,
    grossUnitPrice: 5.50m,
    unitCode: QuantityCodes.H87,
    billedQuantity: 50m,
    lineTotalAmount: 275.00m,
    taxType: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S,
    taxPercent: 7m,
    sellerAssignedID: "ARNR2",
    id: new GlobalID(GlobalIDSchemeIdentifiers.EAN, "4000050986428"));
```

## 6. Zahlungsweg

```csharp
// BG-16 ram:SpecifiedTradeSettlementPaymentMeans, TypeCode 58 = SEPA-Überweisung.
invoice.SetPaymentMeans(PaymentMeansTypeCodes.SEPACreditTransfer);

// BG-17: Konto des Zahlungsempfängers. BIC bleibt leer – bei einer SEPA-Überweisung
// innerhalb Deutschlands genügt die IBAN. AccountName (BT-85) ist der Kontoinhaber.
invoice.AddCreditorFinancialAccount(
    iban: "DE89370400440532013000",
    bic: null,
    name: "Lieferant GmbH");
```

## 7. Umsatzsteueraufstellung

Ohne Zu- und Abschläge auf Dokumentenebene ist die Bemessungsgrundlage schlicht die Summe
der zugehörigen Positionen – kein `allowanceChargeBasisAmount`, keine Korrekturrechnung.

| Feld | 7 % (Pos. 2) | 19 % (Pos. 1) |
|---|---|---|
| `basisAmount` | 275,00 | 198,00 |
| `taxAmount` | 275,00 × 7 % = **19,25** | 198,00 × 19 % = **37,62** |

Die Spaltenfolge ist kein Versehen: Die Referenz führt **7 % vor 19 %** auf, also nicht in
der Reihenfolge der Positionen. FactoorSharp gibt die Steuergruppen in der Reihenfolge der
`AddApplicableTradeTax`-Aufrufe aus und sortiert nicht nach.

```csharp
invoice.AddApplicableTradeTax(
    basisAmount: 275.00m,
    percent: 7m,
    taxAmount: 19.25m,
    typeCode: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S);

invoice.AddApplicableTradeTax(
    basisAmount: 198.00m,
    percent: 19m,
    taxAmount: 37.62m,
    typeCode: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S);
```

## 8. Zahlungsbedingung

Nur ein Fälligkeitsdatum, kein Skonto. Dass `description` hier `null` ist, ist Absicht:
Der Writer gibt `ram:Description` dann gar nicht erst aus, statt ein leeres Element zu
schreiben.

```csharp
invoice.AddTradePaymentTerms(
    description: null,
    dueDate: new DateTime(2026, 4, 5));
```

## 9. Gesamtsummen

| BT-Code | Parameter | Rechenweg |
|---|---|---|
| BT-106 | `lineTotalAmount` | 198,00 + 275,00 = **473,00** |
| BT-107 / BT-108 | `allowanceTotalAmount` / `chargeTotalAmount` | 0,00 – keine Zu- oder Abschläge |
| BT-109 | `taxBasisAmount` | **473,00** |
| BT-110 | `taxTotalAmount` | 19,25 + 37,62 = **56,87** |
| BT-112 | `grandTotalAmount` | 473,00 + 56,87 = **529,87** |
| BT-115 | `duePayableAmount` | 529,87 − 0,00 = **529,87** |

```csharp
invoice.SetTotals(
    lineTotalAmount: 473.00m,      // BT-106
    chargeTotalAmount: 0.00m,      // BT-108
    allowanceTotalAmount: 0.00m,   // BT-107
    taxBasisAmount: 473.00m,       // BT-109
    taxTotalAmount: 56.87m,        // BT-110
    grandTotalAmount: 529.87m,     // BT-112
    totalPrepaidAmount: 0.00m,     // BT-113
    duePayableAmount: 529.87m);    // BT-115
```

## 10. Speichern

Hier steht `Profile.Comfort` statt `Profile.Extended` – der einzige Unterschied zu den
übrigen Beispielen an dieser Stelle.

```csharp
// Version25 + Profile.Comfort + CII ergibt die Profilkennung
// "urn:cen.eu:en16931:2017" – das reine EN 16931-Profil ohne Erweiterung.
invoice.Save("E10_01_Gutschrift.xml",
             ZUGFeRDVersion.Version25,
             Profile.Comfort,
             ZUGFeRDFormats.CII);
```

## 11. Gegenprobe

Die erzeugte Datei muss dieselbe Baumstruktur haben wie `E10_01_Gutschrift.xml` aus dem
FeRD-Beispielpaket. Zahlen vergleicht man numerisch, damit `9.90` und `9.9000` als gleich
gelten.

```csharp
// Lesefassung für Menschen – kein Rechtsdokument und kein hybrides ZUGFeRD-PDF.
// Gerendert wird aus dem Objekt, nicht aus der XML-Datei.
InvoiceVisualizer.RenderPdf(invoice, "E10_01_Gutschrift.pdf");
InvoiceVisualizer.RenderHtml(invoice, "E10_01_Gutschrift.html");
```

Validator, Visualizer und 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.
- [Rechnungskorrektur](https://www.factoorsharp.de/de/Service/CorrectionInvoice.md): Typ 384 mit negativen Beträgen – die andere Bedeutung von „Gutschrift".
- [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.
