pitFM Add-on - XRechnung (pitFM_XRechnung.dll)
Verwendete Pakete
ZUGFeRD-csharp
Steht unter Apache 2.0 Lizenz zur Verfügung.
https://github.com/stephanstapel/ZUGFeRD-csharp/
Weitere Informationen zu elektronischen Rechnungen im Wiki
Technisches
Code-Respository: https://dev.azure.com/pit-cup/pitFM_Addons/_git/pitFM_XRechnung
Releaseverzeichnisse:
- X:\FM\AddOns\XRechnung
- pitftp.de/pitFM_AddOns/XRechnung
TODOs
- Dokumentation nach Rechnungsarten / Zahlarten aufgliedern
- GetCurrentInstanceForTest() Methode entfernen und mit Reflection ersetzen
WICHTIG
Folgendes muss beachtet werden, wenn pitFM nicht als strong named Variante verwendet wird.
Die CliDefines.dll im pit-bin-Verzeichnis muss durch die strong named Variante ersetzt werden.
Die notwendige strong named CliDefines.dll ist unter X:\FM\AddOns_CliDefines_strong_named zu finden.
Diese ist kompatibel mit pitFM v21 - v26.
Release Notes
Version 1.3.3
- Die Lieferadresse wurde hinzugefügt
- BG-13: BT-70, BT-75, BT-76, BT-77, BT-78, BT-79, BT-80 und BT-165
Version 1.3.2
- Das Hinzufügen von rechnungsbegründenden Unterlagen (AdditionalReferencedDocuments)
- BG-24: BT-122, BT-123, BT-125
Version 1.3.1
- Es wurden weitere notwendige Felder für die Erstellung einer XRechnung hinzugefügt.
- BT-11, BT-12, BT-14, BT-73, BT-74, BT-134 und BT-135
Version 1.3.0
- Korrekturrechnung und weitere Rechnungsarten erstellen.
Version 1.2.2
- Unterscheidung strong name oder nicht ist in der DLL unter Details/Dateibeschreibung ersichtlich.
- XRechnung Add-on wird als strong named und ohne strong name zur Verfügung gestellt.
- Buildpipelines für Release build und Testvaldierung erstellt.
- auf ZUGFeRD 16.1.0 aktualisiert
Version 1.2.0
- Die DLL ist jetzt eine Strong-Named-DLL.
Version 1.1.1
- HOTFIX: Validierungsfehler bei Gebühren auf einzelne Rechnungspositionen behoben.
Version 1.1.0
- Es wird vorerst nur noch XRechnung im CII Format unterstützt, weil die Rabatte im UBL-Format noch nicht im Export funktionieren.
- Rabatte und Gebühren auf einzelne Rechnungspositionen.
- Rabatte und Gebühren auf die Gesamtrechnung.
Spezialfälle abbilden
Eine Korrekturrechnung erstellen
- Der Rechnungstyp BT-3 muss gesetzt werden. InvoiceTypeCode="384"
- Die Referenz zur vorausgegangenen Rechnung BT-25 angeben.
- Falls die Nummer der vorausgegangenen Rechnung nicht eindeutig ist, muss das Datum der vorausgegangenen Rechnung BT-26 angegeben werden.
- Es ist zu beachten, dass alle Korrekturpositionen als negative Beträge übergeben werden müssen. Bsp.: Eine 100€ Gutschrift müss als -100€ übergeben werden.
- Optional kann der Payment Means Code BT-81 auf 97 gesetzt werden. z.B. für Verrechnung mit offenen Posten
Dokumentation
Fehlerbehandlung
Wenn bei einer Funktion ein Fehler auftritt, wird dieser mit dem ReturnCode false angezeigt. Der Fehler kann danach mit folgenden Befehlen abgefragt werden.
/// <summary>
/// Liefert den letzten aufgetretenen Fehler zurück.
/// </summary>
/// <returns>Fehlermeldung als Text.</returns>
public static string XRechnungGetLastError();
Es kann auch eine Fehlerhistorie abgefragt werden. Diese enthält alle Fehler die seit der Initialisierung mit XRechnungInitializeInvoice() bzw. seit Aufruf von XRechnungResetInvoice()
/// <summary>
/// Liefert alle aufgetretenen Fehler seit der Initialisierung zurück.
/// </summary>
/// <returns>Die Fehlermeldungen sind zeilenweise enthalten. Trenner ist "\r\n".</returns>
public static string XRechnungGetErrorHistory()
Initialisieren und zurücksetzen der XRechnung
/// <summary>
/// Initialisiert eine neue Rechnungsinstanz.
/// </summary>
/// <param name="invoiceNo">BT-1
/// Eine eindeutige Kennung der Rechnung, die diese im System des Verkäufers identifiziert.
/// Anmerkung: Es ist kein „identification scheme“ zu verwenden.
/// </param>
/// <param name="invoiceDate">BT-2
/// Das Datum, an dem die Rechnung ausgestellt wurde.</param>
/// <param name="invoiceTypeCode">BT-3
/// Der Code, der den Rechnungstyp angibt.
/// Anmerkung: Der Rechnungstyp muss gemäß UNTDID 1001, spezifiziert werden.
/// Folgende Codes aus der Codeliste sollen verwendet werden:
/// 326 (Partial invoice)
/// 380 (Commercial invoice)
/// 384 (Corrected invoice)
/// 389 (Self-billed invoice)
/// 381 (Credit note)
/// 875 (Partial construction invoice)
/// 876 (Partial final construction invoice)
/// 877 (Final construction invoice)
/// </param>
/// <param name="currencyCode">BT-5
/// Die Währung, in der alle Rechnungsbeträge angegeben werden, ausgenommen ist der Umsatzsteuer-Gesamtbetrag,
/// der in der Abrechnungswährung anzugeben ist.
///
/// Anmerkung: Nur eine Währung ist in der Rechnung zu verwenden, der "Invoice total VAT amount in accounting
/// currency" (BT-111) ist in der Abrechnungswährung auszuweisen. Die gültigen Währungen sind bei der ISO 4217
/// „Codes for the representation of currencies and funds“ registriert.
/// Nur die Alpha-3-Darstellung darf verwendet werden.</param>
/// <param name="invoiceNoAsReference">Optional: BT-83
/// Ein Textwert, der zur Verknüpfung der Zahlung mit der vom Verkäufer ausgestellten Rechnung verwendet wird.
///
/// Anmerkung: Die Angabe eines Verwendungszwecks hilft dem Verkäufer bei der Zuweisung einer eingehenden
/// Zahlung zum jeweiligen Zahlungsprozess. Wenn Remittance information in der Rechnung übermittelt wurde,
/// sollte diese daher bei der Zahlung genutzt werden.</param>
public static bool XRechnungInitializeInvoice(
string invoiceNo,
DateTime invoiceDate,
string currencyCode,
string invoiceTypeCode = null,
string invoiceNoAsReference = null);
/// <summary>
/// Setzt die Rechnung und Fehlermeldungen zurück.
/// </summary>
public static void XRechnungResetInvoice();
Verkäufer setzen
/// <summary>
/// Eine Gruppe von Informationselementen, die Informationen über den Verkäufer enthalten. BG-4.
/// </summary>
/// <param name="name">BT-27 - Der vollständige Name, unter dem der Verkäufer im nationalen Register für
/// juristische Personen oder als steuerpflichtige Person eingetragen ist oder anderweitig als
/// Person(en) handelt (Firma).</param>
/// <param name="city">BT-37 - Die Bezeichnung der Stadt oder Gemeinde, in der sich die Verkäuferanschrift befindet.</param>
/// <param name="postCode">BT-38 - Die Postleitzahl.</param>
/// <param name="countryCode">BT-40 - Der Code, mit dem das Land bezeichnet wird. Deutschland = DE
/// Nur die Alpha-2-Darstellung aus der ISO 3166-1 darf verwendet werden.</param>
/// <param name="street">Optional: BT-35 - Die Hauptzeile in einer Anschrift. Üblicherweise ist dies entweder
/// Strasse und Hausnummer oder der Text „Postfach“ gefolgt von der Postfachnumme</param>
/// <param name="identifier">Optional: BT-29 - Eine (i. d. R. vom Erwerber vergebene) Kennung des Verkäufers,
/// wie z. B. die Kreditorennummer für das Mittelbewirtschaftungsverfahren oder die Lieferantennummer für das Bestellsystem.</param>
/// <param name="legalOrganization">Optional: Nur CII. SpecifiedLegalOrganization</param>
/// <param name="globalId">Optional: BT-30 - Eine von einer offiziellen Registrierstelle ausgegebene Kennung,
/// die den Verkäufer als Rechtsträger oder juristische Person identifiziert.</param>
/// <param name="globalIdSchemaCode">Optional: BT-30. Wenn globalId verwendet wird, ist der Eintrag aus der von
/// der ISO/IEC 6523 maintenance agency veröffentlichten Liste zu wählen.</param>
public static bool XRechnungSetSeller(
string name,
string city,
string postCode,
string countryCode,
string street = null,
string identifier = null,
string legalOrganization = "",
string globalId = "",
string globalIdSchemaCode = "");
/// <summary>
/// Eine Gruppe von Informationselementen, die Kontaktinformationen des Verkäufers enthalten. BG-6.
/// </summary>
/// <param name="name">BT-41 - Angaben zu Ansprechpartner oder Kontaktstelle
/// (wie z. B. Name einer Person, Abteilungs- oder Bürobezeichnung).</param>
/// <param name="phoneNo">BT-42 - Telefonnummer des Ansprechpartners oder der Kontaktstelle.</param>
/// <param name="emailAddress">BT-43 - Eine E-Mail-Adresse des Ansprechpartners oder der Kontaktstelle.</param>
/// <param name="departmentName">Optional: BT-41-0 - Nur CII. DepartmentName</param>
public static bool XRechnungSetSellerContact(
string name,
string phoneNo,
string emailAddress,
string departmentName = null);
/// <summary>
/// Fügt eine Steuerregistrierung für den Verkäufer hinzu. Teil von BG-5.
/// </summary>
/// <param name="number">BT-31
/// Die Umsatzsteuer-Identifikationsnummer des Verkäufers. Verfügt der Verkäufer über eine solche, ist sie hier
/// anzugeben, sofern nicht Angaben zum "SELLER TAX REPRESENTATIVE PARTY" (BG-11) gemacht werden.
///
/// Anmerkung: Die Umsatzsteuer-Identifikationsnummer mit vorangestelltem Präfix gem. EN ISO 3166-1 "Codes for
/// the representation of names of countries and their subdivisions"</param>
/// <param name="taxRegistrationScheme">BT-31
/// FC|VA|unknown</param>
public static bool XRechnungAddSellerTaxRegistration(string number, string taxRegistrationScheme);
/// <summary>
/// Gibt die elektronische Adresse des Verkäufers an, an die die Antwort der Anwendungsebene auf eine Rechnung
/// gesendet werden kann. Teil von BG-5.
/// </summary>
/// <param name="address">BT-34</param>
/// <param name="electronicAddressSchemeNumber">
/// Das Bildungsschema für "Seller electronic address" (BT-34).
/// Es ist die Codeliste Electronic Address Scheme code list (EAS) zu verwenden. Die Codeliste wird von der
/// Connecting Europe Facility gepflegt und herausgegeben.
/// https://docs.peppol.eu/poacc/billing/3.0/codelist/eas/</param>
public static bool XRechnungSetSellerElectronicAddress(string address, int electronicAddressSchemeNumber);
Käufer und Kontaktperson setzen
/// <summary>
/// Eine Gruppe von Informationselementen, die Informationen über den Erwerber enthalten. BG-7 + BG-8.
/// </summary>
/// <param name="name">BT-44 - Der vollständige Name des Erwerbers.</param>
/// <param name="city">BT-52 - Die Bezeichnung der Stadt oder Gemeinde, in der sich die Erwerberanschrift befindet.</param>
/// <param name="postCode">BT-53 - Postleitzahl.</param>
/// <param name="countryCode">BT-55 - Der Code, mit dem das Land bezeichnet wird. Deutschland = DE
/// Nur die Alpha-2-Darstellung aus der ISO 3166-1 darf verwendet werden.</param>
/// <param name="street">Optional: BT-50.
/// Die Hauptzeile einer Anschrift. Üblicherweise ist dies entweder Strasse und Hausnummer oder der Text
/// „Postfach“ gefolgt von der Postfachnummer.
/// IN UBL wird der Wert in PostalAddress.StreetName(Line 1) geschrieben.
/// In CII wird der Wert in PostalTradeAddress.LineTwo geschrieben.</param>
/// <param name="identifier">Optional: BT-46.
/// Eine (i. d. R. vom Verkäufer vergebene) Kennung des Erwerbers, wie z. B. die Debitorennummer für
/// die Buchhaltung oder die Kundennnummer für die Auftragsverwaltung.
/// Anmerkung: Für die Bildung des Buyer Identifier ist kein einheitliches Schema erforderlich.
/// </param>
/// <param name="receiverName">Optional: BT-X-59 - Nur CII. PostalTradeAddress.LineOne</param>
/// <param name="orderNo">Optional: BT-13 - Eine vom Erwerber ausgegebene Kennung für eine referenzierte Bestellung.</param>
/// <param name="orderDate">Optional: BT-X-147 - Nur CII. BuyerOrderReferencedDocument.FormattedIssueDateTime.DateTimeString </param>
/// <param name="globalId">Optional: BT-47 - Ein von einer offiziellen Registrierstelle ausgegebener Bezeichner,
/// der den Erwerber als Rechtsträger oder juristische Person identifiziert. Z. B. Handelsregister-Eintrag, Vereinsregister etc</param>
/// <param name="globalIdSchemaCode">Optional: BT-47. Wenn globalId verwendet wird, ist der Eintrag aus der von
/// der ISO/IEC 6523 maintenance agency veröffentlichten Liste zu wählen.</param>
public static bool XRechnungSetBuyer(
string name,
string city,
string postCode,
string countryCode,
string street = null,
string identifier = null,
string receiverName = null,
string orderNo = null,
DateTime orderDate = default,
string globalId = "",
string globalIdSchemaCode = "");
/// <summary>
/// Eine Gruppe von Informationselementen, die Angaben zum Ansprechpartner
/// oder der Kontaktstelle beim Erwerber enthalten. BG-9.
///
/// Hinweise:
/// Kontaktinformationen sollen nicht zum Zweck der Weiterleitung der empfangenen Rechnung
/// durch die rechnungsempfangende Stelle verwendet werden; für diesen Zweck
/// soll die "Buyer reference" (BT-10) verwendet werden
/// </summary>
/// <param name="name">BT-56 - Ansprechpartner oder Kontaktstelle beim Erwerber (wie z. B. Name einer Person,
/// Abteilungs- oder Bürobezeichnung).</param>
/// <param name="phoneNo">Optional: BT-57 - Eine Telefonnummer der Kontaktstelle.</param>
/// <param name="emailAddress">Optional: BT-58. Eine E-Mail-Adresse der Kontaktstelle.</param>
/// <param name="departmentName">Optional: BT-56-0 - Nur CII. DepartmentName</param>
public static bool XRechnungSetBuyerContact(
string name,
string phoneNo = "",
string emailAddress = "",
string departmentName = "");
/// <summary>
/// Fügt eine Steuerregistrierung für den Käufer hinzu. Teil von BG-8.
/// </summary>
/// <param name="number">BT-48
/// Die Umsatzsteuer-Identifikationsnummer des Erwerbers.
///
/// Anmerkung: Die Umsatzsteuer-Identifikationsnummer mit vorangestelltem Präfix gem. EN ISO 3166-1 "Codes for
/// the representation of names of countries and their subdivisions</param>
/// <param name="taxRegistrationScheme">BT-48
/// FC|VA|unknown</param>
public static bool XRechnungAddBuyerTaxRegistration(string number, string taxRegistrationScheme);
/// <summary>
/// Gibt eine elektronische Adresse des Erwerbers an, an die eine Rechnung gesendet werden sollte. Teil von BG-8.
/// </summary>
/// <param name="address">BT-49</param>
/// <param name="electronicAddressSchemeNumber">
/// Das Bildungsmuster für "Buyer electronic address" (BT-49).
/// Es ist die Codeliste Electronic Address Scheme code list (EAS) zu verwenden. Die Codeliste wird von der
/// Connecting Europe Facility gepflegt und herausgegeben.
/// https://docs.peppol.eu/poacc/billing/3.0/codelist/eas/</param>
public static bool XRechnungSetBuyerElectronicAddress(string address, int electronicAddressSchemeNumber);
Lieferadresse und Lieferdatum setzen
/// <summary>
/// Setzt die Lieferanschrift BG-13.
/// Anmerkung: optional. Wird nur benötigt, wenn die Lieferadresse von der Rechnungsadresse abweicht.
/// </summary>
/// <param name="countryCode">BT-80 - Der Code, mit dem das Land bezeichnet wird. Deutschland = DE
/// Nur die Alpha-2-Darstellung aus der ISO 3166-1 darf verwendet werden.</param>
/// <param name="name">Optional: BT-70 - Der Name des Empfängers, an den die Waren geliefert bzw. für den die Dienstleistungen erbracht werden.</param>
/// <param name="postcode">Optional: BT-78 - Postleitzahl der Lieferanschrift</param>
/// <param name="addressLine1">Optional: BT-75 - Die Hauptzeile einer Anschrift. Üblicherweise ist dies entweder Strasse
/// und Hausnummer oder der Text „Postfach“ gefolgt von der Postfachnummer.</param>
/// <param name="addressLine2">Optional: BT-76 - Eine zusätzliche Adresszeile in einer Anschrift, die verwendet werden kann,
/// um weitere Einzelheiten in Ergänzung zur Hauptzeile anzugeben.</param>
/// <param name="addressLine3">Optional: BT-165 - Eine zusätzliche Adresszeile in einer Anschrift, die verwendet werden kann,
/// um weitere Einzelheiten in Ergänzung zur Hauptzeile anzugeben.</param>
/// <param name="cityName">Optional: BT-77 - Die Bezeichnung der Stadt oder Gemeinde, in der sich die Erwerberanschrift befindet.</param>
/// <param name="countrySubdivisionName">Optional: BT-79 - Die Unterteilung eines Landes (wie Region, Bundesland, Provinz etc.)</param>
public static bool XRechnungSetDeliveryAddress(
string countryCode,
string name,
string postcode,
string addressLine1,
string addressLine2,
string addressLine3,
string cityName,
string countrySubdivisionName);
/// <summary>
/// Optional: BT-72. Tatsächliches Lieferdatum
/// </summary>
/// <param name="actualDeliveryDate">BT-72 - Lieferdatum</param>
public static bool XRechnungSetActualDeliveryDate(DateTime actualDeliveryDate);
Dokumente anhängen
/// <summary>
/// Fügt ein AdditionalReferencedDocument hinzu. BG-24.
/// ANMERKUNG: Es werden keine Dokumente via URL unterstützt (BT-124).
/// </summary>
/// <param name="issuerAssignedId">BT-122 - Eine Kennung der rechnungsbegründenden Unterlage.</param>
/// <param name="description">Optional: BT-123 - Beschreibung der rechnungsbegründenden Unterlage.</param>
/// <param name="fileName">BT-125-2 - Der Dateiname.</param>
/// <param name="filePath">BT-125 - Dateipfad zum Anhangsdokument.</param>
public static bool XRechnungAddAdditionalReferencedDocument(
string issuerAssignedId,
string description,
string fileName,
string filePath);
Erzeugen der XRechnung
/// <summary>
/// Exportiert die XRechnung in die angegeben Datei. XRechnung wird im CII-Format geschrieben.
/// </summary>
/// <param name="filename">Dateiname sollte mit .xml enden.</param>
/// <returns>
/// Liefert true, wenn erfolgreich exportiert werden konnte. Bei Fehler wird false geliefert.
/// Der genaue Fehler kann mit XRechnungGetLastError() und XRechnungGetErrorHistory() abgerufen werden.
/// </returns>
public static bool XRechnungSaveCii(string filename);
Der "Business process type" muss für ein XRechnungsdokument gesetzt sein. Dieser Typ ist standardmäßig auf den Wert "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" gesetzt. Die Methode muss also nur verwendet werden, wenn man einen anderen Prozesstyp setzen muss.
/// <summary>
/// Pflichtfeld: Dieser Wert wird beim Erstellen der Rechnung mit einem gültigen Defaultwert belegt,
/// wenn diese Methode nicht gerufen wird. BG-2.
///
/// Identifiziert den Kontext des Geschäftsprozesses, in dem die Transaktion erfolgt.
/// Er ermöglicht es dem Erwerber, die Rechnung in angemessener Weise zu verarbeiten.
///
/// Anmerkung: Die mit diesem Informationselement zu übermittelnde Angabe wird vom Erwerber spezifiziert.
/// Wenn diese Methode nicht gerufen wird, wird der Wert "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" gesetzt.
/// </summary>
/// <param name="businessProcess">BT-23 - Business process type</param>
public static bool XRechnungSetBusinessProcess(string businessProcess);
Weitere Methoden
/// <summary>
/// Pflichtfeld:
/// Ein vom Erwerber zugewiesener und für interne Lenkungszwecke benutzter Bezeichner.
/// In Frankreich muss 999 gesetzt werden, wenn kein Zweck vorhanden.
///
/// Anmerkung: Im Rahmen des Steuerungsprojekts eRechnung ist mit der so genannten Leitweg-ID eine
/// Zuordnungsmöglichkeit entwickelt worden, deren verbindliche Nutzung von Bund und mehreren Ländern
/// vorgegeben wird. Die Leitweg-ID ist prinzipiell für Bund, Länder und Kommunen einsetzbar (B2G, G2G).
/// Für die Darstellung der Leitweg-ID wird das in XRechnung verpflichtende Feld Buyer Reference benutzt.
/// </summary>
/// <param name="referenceOrderNo">BT-10 - Leitweg-ID</param>
public static bool XRechnungSetReferenceOrderNo(string referenceOrderNo);
/// <summary>
/// Optional: Fügt den Abrechnungszeitraum für diese Rechnung hinzu.
/// </summary>
/// <param name="startDate">Optional: BT-73 - Das Datum, an dem der Abrechnungszeitraum beginnt.</param>
/// <param name="endDate">Optional: BT-74 - Das Datum, an dem der Abrechnungszeitraum endet.</param>
public static bool XRechnungSetBillingPeriod(DateTime startDate = default, DateTime endDate = default);
/// <summary>
/// Optional: Die Kennung eines Projektes, auf das sich die Rechnung bezieht.
/// </summary>
/// <param name="projectReference">BT-11 - Projektreferenz</param>
/// <param name="name">BT-11-0 - Nur CII. Projektname</param>
public static bool XRechnungSetSpecifiedProcuringProject(string projectReference, string name);
/// <summary>
/// Eine eindeutige Bezeichnung des Vertrages (z. B. Vertragsnummer).
/// </summary>
/// <param name="contractReference">BT-12 - Vertragsreferenz/Vertragsnummer.</param>
public static bool XRechnungSetContractReferencedDocument(string contractReference);
/// <summary>
/// Eine vom Verkäufer ausgegebene Kennung für einen referenzierten Auftrag.
/// </summary>
/// <param name="salesOrderReference">BT-14 - Verkaufsauftragsreferenz.</param>
public static bool XRechnungSellerOrderReferencedDocument(string salesOrderReference);
/// <summary>
/// Eine Gruppe von Informationselementen, die Informationen über eine oder mehrere vorausgegangene Rechnungen enthalten. BG-3.
/// ACHTUNG: CII unterstützt nur einen Eintrag. Daher überschreibt jeder weitere Eintrag den vorherigen.
///
/// Zu verwenden falls:
/// — eine vorausgegangene Rechnung korrigiert wird;
/// — aus einer Schlussrechnung auf vorausgegangene Teilrechnungen Bezug genommen wird;
/// — aus einer Schlussrechnung auf vorausgegangene Rechnungen für Vorauszahlungen Bezug genommen wird.
/// </summary>
/// <param name="precedingInvoiceNumber">BT-25 - Die vorangegangene Rechnungsnummer, auf welche Bezug genommen wird.</param>
/// <param name="precedingInvoiceDate">BT-26.
/// Das Datum, zu dem die vorausgegangene Rechnung ausgestellt wurde.
/// Anmerkung: Für den Fall, dass die Nummer der vorausgegangenen Rechnung 'Preceding invoice identifier' BT-25 nicht
/// eindeutig ist, soll das Datum der vorausgegangenen Rechnung 'Preceding Invoice issue date' BT-26 angegeben werden.</param>
public static void XRechnungAddPrecedingInvoice(string precedingInvoiceNumber, DateTime precedingInvoiceDate = default)
/// <summary>
/// Eine Gruppe von Informationselementen für rechnungsrelevante Erläuterungen mit
/// Hinweisen auf den Rechnungsbetreff. BG-1.
/// </summary>
/// <param name="note">BT-22.
/// Ein Textvermerk, der unstrukturierte Informationen enthält, die für die Rechnung als
/// Ganzes maßgeblich sind. Erforderlichenfalls können Angaben zur Aufbewahrungspflicht gem.
/// § 14 Abs. 4 Nr. 9 UStG hier aufgenommen werden.
/// Anmerkung: Im Falle einer bereits fakturierten Rechnung kann hier z. B. der Grund der Korrektur angegeben werden.
/// </param>
/// <param name="subjectCode">BT-21 - Invoice note subject code.
/// Wenn der Code nicht angegeben wird, dann wird Unknown als Wert gesetzt.
/// Die Auswahl erfolgt aus UNTDID 4451.
/// </param>
public static bool XRechnungAddNote(string note, string subjectCode = null);
/// <summary>
/// Setzt summierten Werte über alle Rechnungspositionen. BG-22.
/// </summary>
/// <param name="lineTotalAmount">BT-106 - Gesamtbetrag der Positionen
/// Summe aller "Invoice line net amount" (BT-131) der Rechnung.</param>
/// <param name="taxBasisAmount">BT-109 - Basisbetrag der Steuerberechnung. (Netto)</param>
/// <param name="grandTotalAmount">BT-112 - Der Gesamtbetrag der Rechnung mit Umsatzsteuer.</param>
/// <param name="duePayableAmount">BT-115 - Zahlbetrag. Der ausstehende Betrag, der zu zahlen ist.</param>
/// <param name="allowanceTotalAmount">Optional: BT-107 - Gesamtbetrag der Abschläge.
/// Summe aller in der Rechnung enthaltenen "Document level allowance amount" (BT-92)</param>
/// <param name="chargeTotalAmount">Optional: BT-108 - Gesamtbetrag der Zuschläge
/// Summe aller in der Rechnung enthaltenen "Document level charge amount" (BT-99).</param>
/// <param name="taxTotalAmount">Optional: BT-110 - Steuergesamtbetrag</param>
/// <param name="totalPrepaidAmount">Optional: BT-113 - Summe bereits gezahlter Beträge.</param>
public static bool XRechnungSetTotals(
decimal lineTotalAmount,
decimal taxBasisAmount,
decimal grandTotalAmount,
decimal duePayableAmount,
decimal allowanceTotalAmount = 0.0m, // ist eigentlich decimal? = null
decimal chargeTotalAmount = 0.0m, // ist eigentlich decimal? = null
decimal taxTotalAmount = 0.0m, // ist eigentlich decimal? = null
decimal totalPrepaidAmount = 0.0m); // ist eigentlich decimal? = null
/// <summary>
/// Hier werden die verwendeten Steuersätze aus den angegebenen Rechnungspositionen hinzufügt. BG-23.
/// Pro Steuersatz muss die Summe über aller Rechnungspositionen angegeben werden.
/// Es dürfen nur die Steuersätze hinzugefügt werden, welche auch in den Rechnungspositionen verwendet wurden.
/// </summary>
/// <param name="basisAmount">BT-116 - Summe alle Beträge mit diesem Umsatzsteuersatz.</param>
/// <param name="taxAmount">BT-117 - Summe alle Umsatzsteuerbeträge mit diesem Umsatzsteuersatz.</param>
/// <param name="taxRate">BT-119 - Umsatzsteuersatz für den in Rechnung gestellten Artikel.</param>
/// <param name="taxTypeCode">BT-118-0 - Nur CII. Bei NULL wird 'VAT' automatisch gesetzt.</param>
/// <param name="taxCategoryCode">BT-118 - Umsatzsteuerkategorie.
/// Der Code der für den in Rechnung gestellten Posten geltenden Umsatzsteuerkategorie.
/// Anmerkung: Folgende Codes aus der Codeliste UNTDID 5305 müssen verwendet werden:
/// S (Standard rate) -> Wird bei NULL automatisch gesetzt.
/// Z (Zero rated goods)
/// E (Exempt from tax)
/// AE (VAT Reverse Charge)
/// K (VAT exempt for EEA intra-community supply of goods and services)
/// G (Free export item, tax not charged)
/// O (Services outside scope of tax)
/// L (Canary Islands general indirect tax)
/// M (Tax for production, services and importation in Ceuta and Melilla
/// </param>
public static bool XRechnungAddApplicableTradeTax(
decimal basisAmount,
decimal taxAmount,
decimal taxRate,
string taxTypeCode = null,
string taxCategoryCode = null);
/// <summary>
/// Optional: BT-X-2 - Dokumentenart (Freitext). Nur CII.
/// </summary>
/// <param name="name">Dokumentenart (Freitext)</param>
public static bool XRechnungSetName(string name);
Rechnungsposition erzeugen
/// <summary>
/// Fügt der Rechnung eine neue Zeile hinzu. Die Zeilen-ID wird automatisch generiert.
///
/// Diese Methode gibt die lineId zurück über welche man Rabatte und weitere Optionen setzen kann.
/// </summary>
/// <param name="lineId">BT-126 - Eindeutige Bezeichnung für die betreffende Rechnungsposition.
/// Die lineId kann leer oder mit NULL übergeben werden. Dann wird automatisch eine fortlaufende Nummer vergeben.</param>
/// <param name="lineName">BT-153 - Name des Postens.</param>
/// <param name="description">Optional: BT-154 - Eine Beschreibung des Postens.
/// Anmerkung: Hier kann der Posten detaillierter beschrieben werden als im Namen</param>
/// <param name="unitQuantityCode">BT-130 - Die für die "Invoiced quantity" (BT-129) geltende Maßeinheit.
/// Die Maßeinheit muss unter Anwendung der in UN/ECE Rec No 20 Intro 2.a) beschriebenen Methode aus den Listen
/// UN/ECE Recommendation No. 20 „Codes for Units of Measure Used in International Trade“ und
/// UN/ECE Recommendation No 21 „Codes for Passengers, Types of Cargo, Packages and Packaging Materials
/// (with Complementary Codes for Package Names)“ ausgewählt werden.
/// https://docs.peppol.eu/poacc/billing/3.0/codelist/UNECERec20/
///
/// In den meisten Fällen ist es nicht erforderlich, dass Verkäufer und Erwerber diese Listen vollständig in
/// ihren Anwendungen implementieren. Verkäufer müssen nur die erforderlichen Einheiten für ihre Güter und
/// Dienstleistungen unterstützen. Erwerber überprüfen lediglich, ob die in der Rechnung verwendeten Einheiten
/// mit denen in anderen Dokumenten zum Erwerb (wie z. B. Vertrag, Katalog, Bestellung oder Lieferschein) identisch sind</param>
/// <param name="billedQuantity">BT-129 - Die Menge der Ware oder Dienstleistung, die mit diesem Posten abgerechnet wird.</param>
/// <param name="quantity">Optional: BT-149 - Die Anzahl von Einheiten, für die der Postenpreis gilt.</param>
/// <param name="netUnitPrice">BT-146 - Der Preis dieses Postens, ohne Umsatzsteuer, nach Abzug des Rabatts.
/// Anmerkung: "Item net price" (BT-146) muss gleich "Item gross price" (BT-148) abzüglich "Item price discount"
/// (BT-147) sein</param>
/// <param name="grossUnitPrice">Optional: BT-148 - Der Postenpreis ohne Umsatzsteuer vor Abzug des Postenpreisrabatts.</param>
/// <param name="totalAmount">BT-131 - Der Gesamtbetrag der Rechnungsposition.
/// Dies ist der Betrag ohne Umsatzsteuer, aber einschließlich aller für die Rechnungsposition geltenden
/// Nachlässe und Abgaben sowie sonstiger anfallender Steuern.</param>
/// <param name="taxRate">BT-152 - Der für den in Rechnung gestellten Posten geltende und als Prozentsatz angegebene Umsatzsteuersatz.</param>
/// <param name="taxTypeCode">BT-151-0 - Nur CII. Bei NULL wird 'VAT' automatisch gesetzt.</param>
/// <param name="taxCategoryCode">BT-151 - Umsatzsteuerkategorie.
/// Der Code der für den in Rechnung gestellten Posten geltenden Umsatzsteuerkategorie.
/// Anmerkung: Folgende Codes aus der Codeliste UNTDID 5305 müssen verwendet werden:
/// S (Standard rate) -> Wird bei NULL automatisch gesetzt.
/// Z (Zero rated goods)
/// E (Exempt from tax)
/// AE (VAT Reverse Charge)
/// K (VAT exempt for EEA intra-community supply of goods and services)
/// G (Free export item, tax not charged)
/// O (Services outside scope of tax)
/// L (Canary Islands general indirect tax)
/// M (Tax for production, services and importation in Ceuta and Melilla</param>
/// <returns>Es wird die lineId zurückgegeben. Bei Fehler wird ein leerer String zurückgegeben.</returns>
public static string XRechnungAddTradeLineItem(
string lineId,
string lineName,
string description,
string unitQuantityCode,
decimal billedQuantity,
decimal quantity, // ist eigentlich decimal? ohne default wert
decimal netUnitPrice,
decimal grossUnitPrice,
decimal totalAmount,
decimal taxRate,
string taxTypeCode = null,
string taxCategoryCode = null);
/// <summary>
/// Optional: Fügt den maßgeblichen Abrechnungszeitraum für eine Rechnungsposition hinzu. BG-26.
/// </summary>
/// <param name="lineId">LineId der Rechnungsposition für die Gebühr.
/// Die lineId wird beim Hinzufügen der Rechnungsposition zurückgeben.</param>
/// <param name="startDate">Optional: BT-134 - Das Datum, an dem der Abrechnungszeitraum der betreffenden Rechnungsposition beginnt.</param>
/// <param name="endDate">Optional: BT-135 - Das Datum, an dem der Abrechnungszeitraum der betreffenden Rechnungsposition endet.</param>
public static bool XRechnungSetBillingPeriodToTradeLine(
string lineId,
DateTime startDate = default,
DateTime endDate = default);
Rabatte und Gebühren für Rechnungspositionen
/// <summary>
/// Fügt eine(n) Zulage/Nachlass/Rabatt für eine Rechnungsposition hinzu. BG-27.
/// </summary>
/// <param name="lineId">LineId der Rechnungsposition für den Rabatt.
/// Die lineId wird beim Hinzufügen der Rechnungsposition zurückgeben.</param>
/// <param name="basisAmount">Optional*: BT-137 - Der Einheitspreis ohne Umsatzsteuer vor Abzug des Rabatts auf den Artikelpreis.
/// *Bei Verwendung von CII: Falls chargePercentage gesetzt wird muss auch dieser Wert gesetzt werden.</param>
/// <param name="actualAmount">BT-136 - Rabatt auf den Artikelpreis.
/// Gilt nur, wenn der Rabatt je Einheit gegeben wird und nicht im Bruttopreis enthalten ist.</param>
/// <param name="reason">BT-139 - Der in Textform angegebene Grund für den Rabatt auf die Rechnungsposition.</param>
/// <param name="chargePercentage">Optional: BT-138 - Rabatt in Prozent</param>
public static bool XRechnungAddDiscountToTradeLine(
string lineId,
decimal basisAmount, // ist eigentlich decimal? ohne default wert
decimal actualAmount,
string reason,
decimal chargePercentage); // ist eigentlich decimal? ohne default wert
/// <summary>
/// Fügt eine(n) Gebühr/Aufschlag für eine Rechnungsposition hinzu. BG-28.
/// </summary>
/// <param name="lineId">LineId der Rechnungsposition für die Gebühr.
/// Die lineId wird beim Hinzufügen der Rechnungsposition zurückgeben.</param>
/// <param name="basisAmount">Optional*:BT-142 - Der Einheitspreis ohne Umsatzsteuer vor Abzug der Gebühr auf den Artikelpreis.
/// *Bei Verwendung von CII: Falls chargePercentage gesetzt wird muss auch dieser Wert gesetzt werden.</param>
/// <param name="actualAmount">BT-141 - Gebühr auf den Artikelpreis.
/// Gilt nur, wenn die Gebühr je Einheit gegeben wird und nicht im Bruttopreis enthalten ist.</param>
/// <param name="reason">BT-144 - Der in Textform angegebene Grund für die Gebühr auf die Rechnungsposition.</param>
/// <param name="chargePercentage">Optional: BT-143 - Gebühr in Prozent</param>
public static bool XRechnungAddChargeToTradeLine(
string lineId,
decimal basisAmount, // ist eigentlich decimal? ohne default wert
decimal actualAmount,
string reason,
decimal chargePercentage); // ist eigentlich decimal? ohne default wert
Rabatte und Gebühren auf die Gesamtrechnung
/// <summary>
/// Fügt einen Nachlass/Rabatt auf Dokumentenebene hinzu. BG-20.
/// </summary>
/// <param name="basisAmount">Optional: BT-93 - Nachlassbetrag ohne Umsatzsteuer.</param>
/// <param name="actualAmount">BT-92 - Der Grundbetrag, der in Verbindung mit der
/// "Document level allowance percentage" (BT-94) zur Berechnung des "Document level allowance amount" (BT-92) verwendet werden kann</param>
/// <param name="reason">Optional: BT-97 - Der in Textform angegebene Grund für den Nachlass auf der Dokumentenebene.</param>
/// <param name="chargePercentage">Optional: BT-94 - Der Prozentsatz, der in Verbindung mit dem
/// "Document level charge base amount" (BT-100) zur Berechnung des "Document level charge amount" (BT-99) verwendet werden kann.</param>
/// <param name="taxRate">Optional: BT-96 - Steuersatz für den Nachlass.</param>
/// <param name="taxTypeCode">BT-95-0 - Nur CII. Bei NULL wird 'VAT' automatisch gesetzt.</param>
/// <param name="taxCategoryCode">BT-95 - Umsatzsteuerkategorie.
/// Ein Code für das Umsatzsteuermerkmal, das auf den "Document level allowance amount" (BT-92) anzuwenden ist.
/// Anmerkung: Folgende Codes aus der Codeliste UNTDID 5305 müssen verwendet werden:
/// S (Standard rate) -> Wird bei NULL automatisch gesetzt.
/// Z (Zero rated goods)
/// E (Exempt from tax)
/// AE (VAT Reverse Charge)
/// K (VAT exempt for EEA intra-community supply of goods and services)
/// G (Free export item, tax not charged)
/// O (Services outside scope of tax)
/// L (Canary Islands general indirect tax)
/// M (Tax for production, services and importation in Ceuta and Melilla</param>
public static bool XRechnungAddTradeDiscount(
decimal basisAmount, // ist eigentlich decimal? ohne default wert
decimal actualAmount,
string reason,
decimal chargePercentage, // ist eigentlich decimal? ohne default wert
decimal taxRate,
string taxTypeCode = null,
string taxCategoryCode = null);
/// <summary>
/// Fügt eine(n) Gebühr/Aufschlag auf Dokumentenebene hinzu. BG-21.
/// </summary>
/// <param name="basisAmount">Optional: BT-100 - Gebühr ohne Umsatzsteuer.</param>
/// <param name="actualAmount">BT-99 - Der Grundbetrag, der in Verbindung mit der
/// "Document level allowance percentage" (BT-94) zur Berechnung des "Document level allowance amount" (BT-92) verwendet werden kann</param>
/// <param name="reason">Optional: BT-104 - Der in Textform angegebene Grund für die Gebühr auf der Dokumentenebene.</param>
/// <param name="chargePercentage">Optional: BT-101 - Der Prozentsatz, der in Verbindung mit dem
/// "Document level charge base amount" (BT-100) zur Berechnung des "Document level charge amount" (BT-99) verwendet werden kann.</param>
/// <param name="taxRate">Optional: BT-103 - Steuersatz für die Gebühr.</param>
/// <param name="taxTypeCode">BT-95-0 - Nur CII. Bei NULL wird 'VAT' automatisch gesetzt.</param>
/// <param name="taxCategoryCode">BT-102 - Umsatzsteuerkategorie.
/// Ein Code für das Umsatzsteuermerkmal, das auf den "Document level allowance amount" (BT-92) anzuwenden ist.
/// Anmerkung: Folgende Codes aus der Codeliste UNTDID 5305 müssen verwendet werden:
/// S (Standard rate) -> Wird bei NULL automatisch gesetzt.
/// Z (Zero rated goods)
/// E (Exempt from tax)
/// AE (VAT Reverse Charge)
/// K (VAT exempt for EEA intra-community supply of goods and services)
/// G (Free export item, tax not charged)
/// O (Services outside scope of tax)
/// L (Canary Islands general indirect tax)
/// M (Tax for production, services and importation in Ceuta and Melilla</param>
public static bool XRechnungAddTradeCharge(
decimal basisAmount, // ist eigentlich decimal? ohne default wert
decimal actualAmount,
string reason,
decimal chargePercentage, // ist eigentlich decimal? ohne default wert
decimal taxRate,
string taxTypeCode = null,
string taxCategoryCode = null);
Zahlungsmethoden und Konten
/// <summary>
/// Zahlungsmethode festlegen. mittels paymentCode. BG-16.
/// </summary>
/// <param name="paymentCode">BT-81.
/// mögliche Codes: In 'UNTDID 4461' ist die vollständige Liste von Code aufgeführt.
/// 58 - SEPA credit transfer
/// (59 - SEPA direct debit) -> Lastschrift -> XRechnungSetPaymentMeansSepaDirectDebit() verwenden
/// 57 - Standing agreement
/// 30 - Credit transfer (non-SEPA)
/// (49 - Direct debit (non-SEPA)) -> Lastschrift -> XRechnungSetPaymentMeansSepaDirectDebit() verwenden
/// (48 - Bank card) -> XRechnungSetPaymentMeansFinancialCard() verwenden
/// 97 - Clearing between partners -> Verwenden bei Verrechnung mit offenen Posten oder Guthaben.
/// </param>
/// <param name="identifier">BT-84 - Die Kennung des Kontos, auf das die Zahlung erfolgen soll:
/// IBAN für Zahlungen im SEPA-Raum, Kontonummer oder IBAN im Falle von Auslandszahlungen.</param>
/// <param name="mandateReference">Optional: BT-85 - Name des Kontos bei einem Zahlungsdienstleister,
/// auf das die Zahlung erfolgen soll. (z. B. Kontoinhaber).</param>
public static bool XRechnungSetPaymentMeans(int paymentCode, string identifier = null, string mandateReference = null);
/// <summary>
/// Zahlungsmethode als SEPA Lastschrift setzen. (SEPA DirectDebit) BG-19.
/// </summary>
/// <param name="sepaCreditorIdentifier">BT-90 - Die eindeutige Kennung des Verkäufers (Seller) oder
/// des Zahlungsempfängers (Payee), um am SEPA-Lastschriftverfahren teilnehmen zu können (Gläubiger-ID).</param>
/// <param name="sepaMandateReference">BT-89 - Eindeutige Kennung, die vom Zahlungsempfänger zur Referenzierung
/// der Einzugsermächtigung zugewiesen wird (Mandatsreferenznummer).</param>
/// <param name="iban">BT-91 - Die Kennung des Kontos, von dem die Lastschrift erfolgen soll:
/// IBAN für Zahlungen im SEPA-Raum, Kontonummer oder IBAN im Falle von Auslandszahlungen.</param>
public static bool XRechnungSetPaymentMeansSepaDirectDebit(string sepaCreditorIdentifier, string sepaMandateReference, string iban);
/// <summary>
/// Zahlungsmethode auf mit Bankkarte setzen. (via bank card) BG-18.
/// </summary>
/// <param name="cardId">BT-87 - Die Nummer der Kreditkarte, die für die Zahlung genutzt wurde.
/// Anmerkung: In Übereinstimmung mit den für Kreditkarten geltenden Sicherheitsstandards darf eine Rechnung
/// nicht die vollständige Kartennummer enthalten.</param>
/// <param name="cardholder">Optional: BT-88 - Name des Karteninhabers.</param>
public static bool XRechnungSetPaymentMeansBankCard(string cardId, string cardholder = null);
/// <summary>
/// Fügt ein Bankkonto des Gläubigers. BG-19.
/// </summary>
/// <param name="iban">BT-84 - Die Kennung des Kontos, auf das die Zahlung erfolgen soll:
/// IBAN für Zahlungen im SEPA-Raum, Kontonummer oder IBAN im Falle von Auslandszahlungen</param>
/// <param name="bic">Optional: BT-86.
/// Die Kennung des Konto führenden Zahlungsdienstleisters. Diese Kennung ergibt sich bei Zahlungen im
/// SEPA-Raum im Regelfall aus der IBAN.
///
/// Für alle Auslandszahlungen,
/// - außerhalb des SEPA-Raumes wird der Bank Identifier Code (BIC) benötigt. Dies wird durch
/// Code 30 (Credit transfer (non-SEPA) in "Payment means type code" (BT-81) gekennzeichnet.
/// - innerhalb des SEPA-Raumes wird der Bank Identifier Code (BIC) nicht benötigt. Es reicht die Angabe
/// der IBAN. Dies wird durch Code 58 „SCT“ in "Payment means type code" (BT-81) gekennzeichnet.
/// Ausgenommen sind Zahlungen an Bankverbindungen z. B. in San Marino, Monaco, Schweiz, Saint Pierre
/// und Miquelon: Hier ist die Angabe des BIC zwingend erforderlich.
/// </param>
/// <param name="name">Optional: BT-85 - Name des Kontos bei einem Zahlungsdienstleister, auf das die
/// Zahlung erfolgen soll. (z. B. Kontoinhaber)</param>
/// <param name="id">Optional:BT-84-0 - Nur CII. Nationale Kontonummer (nicht für SEPA)</param>
public static bool XRechnungAddCreditorFinancialAccount(string iban, string bic = null, string name = null, string id = null);
/// <summary>
/// Fügt ein Bankkonto des Schuldners hinzu für das Lastschriftverfahren. BG-19.
///
/// Wenn Lastschrift mit XRechnungSetPaymentMeansSepaDirectDebit() definiert wurde,
/// muss die IBAN hier nicht eingetragen werden.
/// </summary>
/// <param name="iban">BT-91 - Die Kennung des Kontos, von dem die Lastschrift erfolgen soll:
/// IBAN für Zahlungen im SEPA-Raum, Kontonummer oder IBAN im Falle von Auslandszahlungen.</param>
public static bool XRechnungAddDebitorBankAccount(string iban);
Zahlungsbedingungen
/// <summary>Optional: BT-20 - Payment terms.
/// Eine Textbeschreibung der Zahlungsbedingungen, die für den fälligen Zahlungsbetrag gelten (einschließlich
/// Beschreibung möglicher Skontobedingungen). Dieses Informationselement kann mehrere Zeilen und mehrere
/// Angaben zu Zahlungsbedingungen beinhalten und sowohl unstrukturierten als strukturierten Text enthalten.
/// Der unstrukturierte Text darf dabei keine # enthalten.
///
/// Anmerkung: Das Fälligkeitsdatum (BT-10) stellt das Fälligkeitsdatum der Nettozahlung dar. Für Teilzahlungen
/// ist dies der Zeitpunkt der ersten Zahlung. Die zugehörige Beschreibung von komplexeren Zahlungsbedingungen
/// kann im Element "Payment terms" (BT-20) übergeben werden.
/// </summary>
/// <param name="description">BT-20 - Payment terms</param>
/// <param name="dueDate">Optional: BT-10 - Das Datum, an dem die Zahlung fällig ist.</param>
public static bool XRechnungAddTradePaymentTerms(string description, DateTime dueDate = default);
/// <summary>Optional: BT-20 - Payment terms.
/// Eine Textbeschreibung der Zahlungsbedingungen, die für den fälligen Zahlungsbetrag gelten (einschließlich
/// Beschreibung möglicher Skontobedingungen). Dieses Informationselement kann mehrere Zeilen und mehrere
/// Angaben zu Zahlungsbedingungen beinhalten und sowohl unstrukturierten als strukturierten Text enthalten.
/// Der unstrukturierte Text darf dabei keine # enthalten.
///
/// Anmerkung: Das Fälligkeitsdatum (BT-10) stellt das Fälligkeitsdatum der Nettozahlung dar. Für Teilzahlungen
/// ist dies der Zeitpunkt der ersten Zahlung. Die zugehörige Beschreibung von komplexeren Zahlungsbedingungen
/// kann im Element "Payment terms" (BT-20) übergeben werden.
/// </summary>
/// <param name="description">BT-20 - Payment terms</param>
/// <param name="dueDate">Optional: BT-10 - Das Datum, an dem die Zahlung fällig ist.</param>
/// <param name="dueDays">Anzahl der Tage wie lange das Skonto gilt.</param>
/// <param name="percentage">Skonto in Prozent.</param>
/// <param name="baseAmount">Basisbetrag für das Skonto.</param>
public static bool XRechnungAddTradePaymentTermsSkonto(
string description,
DateTime dueDate = default,
int dueDays = 0, // ist eigentlich decimal? = null
decimal percentage = 0.0m, // ist eigentlich decimal? = null
decimal baseAmount = 0.0m); // ist eigentlich decimal? = null