<!-- md-source: ebef39a98e5a FactoorSharpWeb/Views/Service/ForeignCurrencyInvoice.cshtml -->
<!-- md-source: 1dedec62cb8f FactoorSharpWeb/Views/Shared/_ForeignCurrencyInvoiceSamples.cshtml -->

# Rechnung in Fremdwährung

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

Eine Rechnung in GBP, deren Steuerbetrag zusätzlich in EUR ausgewiesen wird – samt
Umrechnungskurs und Kursdatum. Dazu Steuervertreter, abweichender Zahlungsempfänger,
Abrechnungszeitraum, Anzahlung und Abschläge auf Positionsebene.

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

Was dieses Beispiel zeigt:

- Zwei Währungen: Rechnungswährung GBP (BT-5), Buchungswährung EUR (BT-6)
- Steuerbetrag doppelt – einmal je Währung (BT-110 und BT-111) – plus Umrechnungskurs (BG-X-41)
- Steuervertreter des Verkäufers (BG-11) und abweichender Zahlungsempfänger (BG-10)
- Abschläge auf *Positions*ebene als `SpecifiedTradeAllowanceCharge`
- Abrechnungszeitraum (BT-73/BT-74) und Anzahlung (BT-113)

## 1. Rechnungskopf und die zwei Währungen

Alle Beträge im Beleg stehen in der Rechnungswährung BT-5, hier GBP; die Buchungswährung
BT-6 betrifft ausschließlich den zusätzlich ausgewiesenen Steuerbetrag.

```csharp
// BT-5 Rechnungswährung ist GBP – in DIESER Währung stehen alle Beträge.
FacturXInvoice invoice = FacturXInvoice.CreateInvoice(
    invoiceNo: "47110815",
    invoiceDate: new DateTime(2025, 12, 1),
    currency: CurrencyCodes.GBP);

invoice.Type = InvoiceType.Invoice;
invoice.Name = "RECHNUNG";                              // BT-X-2
invoice.BusinessProcess = "Beispielgeschäftsprozess";   // BT-23

// BT-6: Buchungswährung. Sobald sie gesetzt ist und sich von BT-5 unterscheidet,
// erwartet die EN 16931 den Steuerbetrag zusätzlich in dieser Währung.
invoice.TaxCurrency = CurrencyCodes.EUR;
```

## 2. Freitexte

Der Code `TXD` (steuerliche Information) erklärt dem menschlichen Leser, warum zwei
Währungen im Dokument auftauchen.

Zeilenumbrüche und Einrückungen innerhalb einer Notiz sind im XML **signifikant**. Die
Tabulatoren im ersten Aufruf stammen zeichengenau aus der Referenzdatei; ohne sie meldet
die Gegenprobe einen Unterschied.

```csharp
invoice.AddNote("Mitglieder der Geschäftsleitung\n\t\t\t\tH. Meier Geschäftsführer"
                + "\n\t\t\t\tT. Müller Prokurist\n\t\t\t\tHRB Braunschweig 12345",
                subjectCode: SubjectCodes.REG);

invoice.AddNote("Vom 17. Dezember 2025 bis 6. Januar 2026 haben wir Betriebsferien.",
                subjectCode: SubjectCodes.AAI);

// TXD = steuerliche Information.
invoice.AddNote("Aus konzern-internen Gründen wird der Steuerbetrag sowohl in der "
                + "Rechungswährung (EUR) als auch in der Buchwährung (GBP) ausgegeben.",
                subjectCode: SubjectCodes.TXD);

invoice.AddNote("ZUGFeRD vers 2.5.0 (Extended)", subjectCode: SubjectCodes.ACB);
invoice.AddNote("Dies ist ein Beispiel zur empfohlenen Darstellung von Fremdwährungsrechnungen",
                subjectCode: SubjectCodes.ACB);
```

## 3. Verkäufer und Steuervertreter

Der Steuervertreter (BG-11) ist eine eigenständige Partei mit eigener USt-IdNr. –
typisch, wenn ein ausländischer Lieferant im Inland durch einen Fiskalvertreter auftritt.

```csharp
// Verkäufer (BG-4) – ohne Ansprechpartner und ohne GLN.
invoice.SetSeller(
    name: "Rohstoff AG Salzgitter",
    postcode: "38226",
    city: "Salzgitter",
    street: "Marktstr. 153",
    country: CountryCodes.DE,
    id: "12345676");

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

invoice.SellerTaxRepresentative = new Party()
{
    Name     = "Global Supplies Financial Services",
    Postcode = "12345",
    Street   = "Friedrichstraße 165",
    City     = "Berlin",
    Country  = CountryCodes.DE
};
invoice.AddSellerTaxRepresentativeTaxRegistration("DE136695976", TaxRegistrationSchemeID.VA);
```

## 4. Käufer

`street2` füllt `ram:LineTwo`, also die zweite Adresszeile. Die elektronische Adresse des
Käufers (BT-49) nimmt hier eine Leitweg-ID auf.

```csharp
invoice.SetBuyer(
    name: "Metallbau Leipzig GmbH & Co. KG",
    postcode: "12345",
    city: "Leipzig",
    street: "Pappelallee 15",
    street2: "Hof 3",
    country: CountryCodes.DE,
    id: "75969813");

invoice.SetBuyerElectronicAddress("04011000-1234512345-35",
                                  ElectronicAddressSchemeIdentifiers.LeitwegId);
```

## 5. Lieferung und Abrechnungszeitraum

Auch der Warenempfänger trägt eine elektronische Adresse. Anders als bei Verkäufer und
Käufer gibt es dafür keine `Set…`-Methode: Das Feld `ElectronicAddress` hängt direkt an
der Partei und wird nur im EXTENDED-Profil geschrieben.

```csharp
invoice.ShipTo = new Party()
{
    ID       = new GlobalID(null, "75969815"),
    Name     = "Metallbau Leipzig GmbH & Co. KG",
    Postcode = "12347",
    Street   = "Eichenpromenade 37",
    Street2  = "Tor 1",
    City     = "Metallstadt",
    Country  = CountryCodes.DE,

    // BT-X-160: elektronische Adresse des Warenempfängers, hier eine D-U-N-S-Nummer
    // unter Schema 0060.
    ElectronicAddress = new ElectronicAddress()
    {
        Address                   = "999999999",
        ElectronicAddressSchemeID = ElectronicAddressSchemeIdentifiers.DunsNumber
    }
};

invoice.ActualDeliveryDate = new DateTime(2025, 11, 25);   // BT-72

// BT-73 / BT-74: Abrechnungszeitraum des gesamten Belegs
invoice.SetBillingPeriod(new DateTime(2025, 11, 1), new DateTime(2025, 11, 30));
```

## 6. Zahlungsempfänger und Bankverbindung

```csharp
// Zahlungsempfänger (BG-10): bezahlt wird nicht an den Verkäufer, sondern an dessen
// Finanzdienstleister. Schema 0060 = D-U-N-S-Nummer.
invoice.Payee = new Party()
{
    GlobalID = new GlobalID(GlobalIDSchemeIdentifiers.DUNS, "432156789"),
    Name     = "Global Supplies Financial Services",
    Postcode = "12345",
    Street   = "Friedrichstraße 165",
    City     = "Berlin",
    Country  = CountryCodes.DE
};

// Kein Informationstext und kein BIC – die Referenz gibt beides nicht aus.
invoice.SetPaymentMeans(PaymentMeansTypeCodes.SEPACreditTransfer);
invoice.AddCreditorFinancialAccount(
    iban: "DE77 3707 0060 0321 9870 00",
    bic: null,
    name: "Global Supplies Financial Services");
```

## 7. Position mit Abschlägen

Zwei verschiedene Rabattarten auf Positionsebene, die in der Praxis am häufigsten
verwechselt werden:

| Methode | XML-Element | Wirkung |
|---|---|---|
| `AddTradeAllowance` | `ram:AppliedTradeAllowanceCharge` (innerhalb des Bruttopreises) | Betrag **pro Einheit**. Senkt den Nettopreis. So arbeitet die Warenrechnung. |
| `AddSpecifiedTradeAllowance` | `ram:SpecifiedTradeAllowanceCharge` (im Positions-Settlement) | Betrag für die **gesamte Position**. Senkt die Positionssumme, der Preis bleibt unverändert. Dieser Weg wird hier genutzt. |

Konkret: Der Stückpreis bleibt bei 100 GBP, die Positionssumme fällt durch die beiden
Abschläge von 1.000 auf 850 GBP.

```csharp
TradeLineItem coil = invoice.AddTradeLineItem(
    lineID: "1",
    name: "Stahlcoil",
    netUnitPrice: 100m,
    grossUnitPrice: 100m,
    unitCode: QuantityCodes.H87,
    unitQuantity: 1m,
    billedQuantity: 10m,
    lineTotalAmount: 850m,       // nach Abzug der beiden Abschläge unten
    taxType: TaxTypes.VAT,
    categoryCode: TaxCategoryCodes.S,
    taxPercent: 19m,
    sellerAssignedID: "CO-123/V2A",
    buyerAssignedID: "Toolbox 0815");

coil.GrossQuantity = 1m;                    // ram:BasisQuantity im Bruttopreis
coil.OriginTradeCountry = CountryCodes.DE;  // BT-159 Ursprungsland

// Positionsnotiz ohne SubjectCode, wieder mit der Einrückung aus der Referenz.
coil.AddNote("Materialzertifikat X-234 gem ISO XYZ.\n\t\t\t\t\t\tWare bleibt bis zur "
             + "vollständigen Bezahlung unser Eigentum.\n\t\t\t\t\t");

// Bestellbezug mit Bestellposition, aber ohne Datum
coil.SetBuyerOrderReferencedDocument("ORDER84359", orderReferencedDate: null,
                                     orderReferencedLineId: "1");

// Abschlag 1: prozentual, 10 % von 1.000. ReasonCode 64 = besondere Vereinbarung.
coil.AddSpecifiedTradeAllowance(
    currency: CurrencyCodes.GBP, basisAmount: 1000m, actualAmount: 100m,
    chargePercentage: 10m, reason: "Lagerware",
    reasonCode: AllowanceReasonCodes.SpecialAgreement);

// Abschlag 2: fester Betrag. ReasonCode 70 = Incoterm-Rabatt.
coil.AddSpecifiedTradeAllowance(
    currency: CurrencyCodes.GBP, basisAmount: 1000m, actualAmount: 50m,
    reason: "Direktbelieferung",
    reasonCode: AllowanceReasonCodes.IncotermDiscount);
```

## 8. Zu- und Abschläge auf Dokumentenebene

Beide teilen sich im XML dasselbe Element `ram:SpecifiedTradeAllowanceCharge` und werden
nur über `ram:ChargeIndicator` unterschieden. Der Writer schreibt sie in der Reihenfolge,
in der sie hinzugefügt werden – deshalb steht der Zuschlag im Code zuerst.

```csharp
invoice.AddTradeCharge(
    basisAmount: null,        // die Referenz gibt hier keine Bemessungsgrundlage aus
    currency: CurrencyCodes.GBP,
    actualAmount: 30m,
    reason: "Einwegverpackung",
    taxTypeCode: TaxTypes.VAT,
    taxCategoryCode: TaxCategoryCodes.S,
    taxPercent: 19m,
    reasonCode: ChargeReasonCodes.Miscellaneous);   // ABK

invoice.AddTradeAllowance(
    basisAmount: 850m,
    currency: CurrencyCodes.GBP,
    actualAmount: 21.25m,
    chargePercentage: 2.5m,
    reason: "Stammkundenrabatt",
    taxTypeCode: TaxTypes.VAT,
    taxCategoryCode: TaxCategoryCodes.S,
    taxPercent: 19m,
    reasonCode: AllowanceReasonCodes.FixedLongTerm);   // 102
```

## 9. Umsatzsteuer in Rechnungswährung

850,00 + 30,00 − 21,25 = 858,75, davon 19 % = 163,1625 → **163,16 GBP**.

```csharp
// BT-110: Steuerbetrag in Rechnungswährung (GBP).
invoice.AddApplicableTradeTax(
    basisAmount: 858.75m, percent: 19m, taxAmount: 163.16m,
    typeCode: TaxTypes.VAT, categoryCode: TaxCategoryCodes.S,
    allowanceChargeBasisAmount: 8.75m,   // +30,00 − 21,25
    lineTotalBasisAmount: 850m);
```

## 10. Steuerbetrag in Buchungswährung und Umrechnungskurs

Für die Umsatzsteuer-Meldung reicht der Steuerbetrag in Fremdwährung nicht: Art. 230 der
EU-Mehrwertsteuer-Systemrichtlinie (2006/112/EG) verlangt den Betrag zusätzlich in der
Landeswährung des Verkäufers. Dafür gibt es drei zusammengehörige Angaben:

| Code | Feld | Bedeutung |
|---|---|---|
| BT-6 | `TaxCurrency` | Die Buchungswährung selbst, hier EUR |
| BT-111 | `TaxTotalAmountInAccountingCurrency` | Derselbe Steuerbetrag, in BT-6 umgerechnet: 183,14 EUR |
| *BG-X-41* | *TaxCurrencyExchange (Gruppe)* | Der Kurs, mit dem umgerechnet wurde |
| BT-X-258 | `SourceCurrency` | Rechnungswährung, also BT-5 (GBP). Leitet FactoorSharp automatisch ab |
| BT-X-259 | `TargetCurrency` | Buchungswährung, also BT-6 (EUR) |
| BT-X-260 | `ConversionRate` | Der eigentliche Kurs, hier 1,12244 |
| BT-X-261 | `ConversionRateTimestamp` | Kursdatum, optional. Hier der Tag der Lieferung, 25.11.2025 |

Ohne BG-X-41 stünde nur das Ergebnis im Beleg, nicht der Weg dorthin.

**Warum eine Methode für drei Business Terms?** Weil die EN 16931-Geschäftsregel
**BR-53** fordert: Ist BT-6 vorhanden, muss BT-111 mitgeliefert werden. Und der Kurs in
BG-X-41 ist die Rechtfertigung für den Wert in BT-111. Getrennte Setter hätten es
erlaubt, einen Steuerbetrag in Buchungswährung zu setzen, ohne je zu sagen, mit welchem
Kurs er entstanden ist.

```csharp
// Ein Aufruf schreibt BT-111, BT-6 und die komplette Gruppe BG-X-41:
//   163,16 GBP × 1,12244 = 183,14 EUR
// Die Quellwährung leitet die Methode automatisch von invoice.Currency (BT-5) ab.
invoice.SetTaxCurrencyExchange(
    taxTotalInAccountingCurrency: 183.14m,
    accountingCurrency: CurrencyCodes.EUR,
    conversionRate: 1.12244m,
    conversionRateTimestamp: new DateTime(2025, 11, 25));
```

Die frühere Methode `SetTaxTotalInAccountingCurrency` setzte nur BT-111 und BT-6, ohne
Kurs. Sie wurde mit Version 20.0 entfernt; verwenden Sie `SetTaxCurrencyExchange`.

BT-X-260 ist im Schema als reines `xs:decimal` ohne Stellenbegrenzung definiert, und die
FeRD-Referenz schreibt fünf Nachkommastellen. Der Writer rundet deshalb adaptiv – auf
zwei Stellen, wenn das verlustfrei möglich ist, sonst auf bis zu fünf – und gibt 1,12244
exakt wieder. Das Kursdatum steht im UN/CEFACT-Format 102 (JJJJMMTT).

BG-X-41 gibt es nur im Profil EXTENDED und ausschließlich CII-seitig. UBL kennt mit
`cac:TaxExchangeRate` zwar ein strukturell vergleichbares Element, das liegt aber
außerhalb der EN 16931-CIUS und wird von FactoorSharp nicht bedient.

## 11. Zahlungsbedingungen

Zwei Stufen, hier bewusst als reiner Freitext mit Datum.

```csharp
// Zwei Stufen als reiner Freitext plus Datum – ohne PaymentTermsType.Skonto, also
// ohne maschinell auswertbaren Skonto-Block.
invoice.AddTradePaymentTerms("Zahlbar ohne Abschlag bis ", new DateTime(2025, 12, 31));
invoice.AddTradePaymentTerms("Zahlbar mit 2% Skonto bis", new DateTime(2025, 12, 14));
```

## 12. Gesamtsummen

Alle Summen stehen in GBP. Neu gegenüber den anderen Beispielen ist die Anzahlung
(BT-113), die vom Bruttobetrag abgezogen wird.

| BT-Code | Parameter | Rechenweg (GBP) |
|---|---|---|
| BT-106 | `lineTotalAmount` | 850,00 (Positionssumme nach den beiden Abschlägen) |
| BT-108 | `chargeTotalAmount` | 30,00 (Einwegverpackung) |
| BT-107 | `allowanceTotalAmount` | 21,25 (Stammkundenrabatt) |
| BT-109 | `taxBasisAmount` | 850,00 + 30,00 − 21,25 = **858,75** |
| BT-110 | `taxTotalAmount` | 858,75 × 19 % = **163,16** |
| BT-112 | `grandTotalAmount` | 858,75 + 163,16 = **1.021,91** |
| BT-113 | `totalPrepaidAmount` | 500,00 |
| BT-115 | `duePayableAmount` | 1.021,91 − 500,00 = **521,91** |

```csharp
// Alle Werte in GBP, der Rechnungswährung – auch der Steuerbetrag.
invoice.SetTotals(
    lineTotalAmount: 850m,         // BT-106
    chargeTotalAmount: 30m,        // BT-108
    allowanceTotalAmount: 21.25m,  // BT-107
    taxBasisAmount: 858.75m,       // BT-109
    taxTotalAmount: 163.16m,       // BT-110
    grandTotalAmount: 1021.91m,    // BT-112
    totalPrepaidAmount: 500m,      // BT-113 Anzahlung
    duePayableAmount: 521.91m);    // BT-115
```

## 13. Speichern und prüfen

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

Das Ergebnis muss dieselbe Baumstruktur haben wie `X07_01_Fremdwaehrung.xml` aus dem
FeRD-Beispielpaket.

Ein Validierungsbefund ist dabei erwartbar und stammt nicht aus dem Nachbau: Die
FeRD-Referenz trägt als Leitweg-ID `04011000-1234512345-35`, und deren Prüfziffer ist
falsch. Der Wert ist zeichengenau aus der Vorlage übernommen, der Befund trifft die
Vorlage also genauso. Wer die Rechnung als eigenen Beleg verwendet, setzt an dieser
Stelle eine gültige Leitweg-ID ein.

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, abgegrenzt gegen die Gutschrift.
- [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.
