QuellCode/CentronERP war nur als Gitlink (Submodul-Referenz auf 79c1142) getrackt, ohne .gitmodules und ohne erreichbares Remote. Der Untersuchungsgegenstand der Versuchsreihe war damit nicht reproduzierbar gesichert: Ein Klon haette ein leeres Verzeichnis erhalten, und die Belege der 3.287 Anforderungen waeren nicht ueberpruefbar gewesen. Umstellung: - Historie nach c:\DEV\CentronERP_git_snapshot_79c1142 ausgelagert (vollstaendig lesbar, enthaelt 79c1142 und Vorgaenger 89ccfd6) - Gitlink aus dem Index entfernt - Dateiinhalt aufgenommen: 24.557 Dateien, rund 333 MB Die verschachtelte .gitignore der Codebasis gilt weiter, Build-Artefakte bleiben ausgeschlossen. Details in Versuche/Versuch_01/_Codebasis-Nachweis.md
24 KiB
ZUGFeRD XML Field Mapping
This document describes the complete mapping between ZUGFeRD XML nodes and c-entron database fields/entities.
Overview
The ZUGFeRD XML generation is implemented in InvoiceZugferdBL.cs and supports multiple ZUGFeRD versions:
- ZUGFeRD 1.0 (legacy)
- ZUGFeRD 2.0 / XRechnung 1.2
- ZUGFeRD 2.1 / XRechnung 2.0, 2.2, 2.3.1
- ZUGFeRD 2.1 / XRechnung 3.0.1 (current)
The main data flow is:
- Load receipt data from
BookKeepingExportBL.LoadReceipt()→ returnsIBookKeepingReceipt - Convert to
ZugferdExportIteminGetZugferdExportItem() - Generate XML document with
DoGenerateZugferdXRechnungXmlDocument()
Document Context & Header
ExchangedDocumentContext
XML structure related to document context and format identification.
| XML Node | c-entron Source | Description |
|---|---|---|
rsm:GuidelineSpecifiedDocumentContextParameter/ram:ID |
Derived from ZugferdKind enum |
Format identifier (e.g., "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0") |
ram:BusinessProcessSpecifiedDocumentContextParameter/ram:ID |
Static value | For v3.0.1: "urn:fdc:peppol.eu:2017:poacc:billing:01:1.0" |
ExchangedDocument
Basic invoice/credit voucher information.
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ID |
Number |
IBookKeepingReceipt |
Invoice/receipt number |
ram:TypeCode |
Derived from Type |
IBookKeepingReceipt |
"380" = Invoice, "381" = Credit voucher |
ram:IssueDateTime/udt:DateTimeString |
Date |
IBookKeepingReceipt |
Receipt date (format: yyyyMMdd) |
ram:IncludedNote |
PaymentConditionsText |
IBookKeepingReceipt |
Payment text/notes |
ram:IncludedNote[@SubjectCode="REG"] |
Composed string | Multiple sources | Seller information text (Name, address, CEO, HRB) |
ram:IncludedNote[@SubjectCode="ABT"] |
PayeeAssignmentNotice |
Bank info via settings | Assignment notice for bank transfer |
Seller Trade Party (Own Company)
The seller represents the own company (Mandator) or branch.
| XML Node | c-entron Field | Table/Entity | Path in Code |
|---|---|---|---|
ram:SellerTradeParty/ram:ID |
OwnSupplierNumber |
IBookKeepingReceipt |
Customer's supplier number for own company |
ram:SellerTradeParty/ram:Name |
Name or Name |
Branch or Mandator |
Branch name (or Mandator if setting/no branch) |
ram:SellerTradeParty/ram:SpecifiedLegalOrganization/ram:ID |
HRB |
Mandator |
Commercial register number |
ram:SellerTradeParty/ram:DefinedTradeContact/ram:PersonName |
CEO |
Mandator |
Managing director name |
ram:SellerTradeParty/ram:DefinedTradeContact/ram:DepartmentName |
Department.Department |
ContactPerson via Branch or Mandator |
Department name |
ram:SellerTradeParty/ram:DefinedTradeContact/ram:TelephoneUniversalCommunication/ram:CompleteNumber |
PhoneNumber or Phone |
Branch or Mandator |
Phone number |
ram:SellerTradeParty/ram:DefinedTradeContact/ram:EmailURIUniversalCommunication/ram:URIID |
EMail |
Branch or Mandator |
Email address |
ram:SellerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode |
ZipCode or PostCode |
Branch or Mandator |
ZIP code |
ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineOne |
Street |
Branch or Mandator |
Street address |
ram:SellerTradeParty/ram:PostalTradeAddress/ram:CityName |
City |
Branch or Mandator |
City |
ram:SellerTradeParty/ram:PostalTradeAddress/ram:CountryID |
CountryCode |
Country |
Country code (ISO 2-letter) |
ram:SellerTradeParty/ram:URIUniversalCommunication/ram:URIID[@schemeID="EM"] |
EMail |
Branch or Mandator |
Email (duplicate for compatibility) |
ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"] |
TaxIDNumber |
Mandator |
Tax identification number |
Internal Fields (not exported to XML):
OwnCountryCode: Country code of seller (used for trade type determination: inland/EU/export)
Data Sources:
- If
BranchI3Dis set: Load fromBranchtable - Otherwise: Load from
Mandatortable (default mandator) - Country: From
Branch.CountryI3DorMandator.Countryor default country (default: "DE")
Buyer Trade Party (Customer)
The buyer represents the customer/recipient.
| XML Node | c-entron Field | Table/Entity | Path in Code |
|---|---|---|---|
ram:BuyerTradeParty/ram:ID |
AddressNumber |
IBookKeepingReceipt |
Customer number |
ram:BuyerTradeParty/ram:Name |
CompanyName or fallback to AddressName |
ReceiptReceiver or IBookKeepingReceipt |
Recipient name |
ram:BuyerTradeParty/ram:DefinedTradeContact/ram:PersonName |
ContactName |
ReceiptReceiver |
Contact person name |
ram:BuyerTradeParty/ram:DefinedTradeContact/ram:DepartmentName |
ContactDepartment |
ReceiptReceiver |
Contact department |
ram:BuyerTradeParty/ram:DefinedTradeContact/ram:TelephoneUniversalCommunication/ram:CompleteNumber |
ContactPhone |
IBookKeepingReceipt |
Phone number |
ram:BuyerTradeParty/ram:DefinedTradeContact/ram:EmailURIUniversalCommunication/ram:URIID |
ContactEMail |
IBookKeepingReceipt |
Email address |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode |
Zip |
ReceiptReceiver |
ZIP code |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineOne |
Structured from ReceiptReceiver |
ReceiptReceiver |
First address line (see below) |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineTwo |
Structured from ReceiptReceiver |
ReceiptReceiver |
Second address line (see below) |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:LineThree |
Structured from ReceiptReceiver |
ReceiptReceiver |
Third address line (see below) |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CityName |
City |
ReceiptReceiver |
City |
ram:BuyerTradeParty/ram:PostalTradeAddress/ram:CountryID |
CountryCode |
Country via ReceiptReceiver.CountryI3D |
Country code (ISO 2-letter) |
ram:BuyerTradeParty/ram:URIUniversalCommunication/ram:URIID[@schemeID="EM"] |
ContactEMail |
IBookKeepingReceipt |
Email (duplicate for compatibility) |
ram:BuyerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"] |
SalesTaxIdentificationNumber |
IBookKeepingReceipt |
VAT identification number |
Internal Fields (not exported to XML):
OwnCountryCode: Country code of buyer (used for trade type determination: inland/EU/export)IsEUTrade: Flag indicating if buyer country is EU member
Structured Address Line Building:
The system intelligently builds address lines from ReceiptReceiver with a maximum of 3 lines:
- CompanyName - Company name (first priority if available)
- AdditionalAddressSupplement - Additional address supplement
- Department/ContactDepartment - Department information (order configurable via
ReceiverContactDepartmentFirstsetting) - ContactName - Contact person name
- Street/HouseNumber or PostOfficeBox - Either street address or P.O. Box (formatted as shown in PostOfficeBox)
The first item becomes the Name, subsequent items fill AddressLine1, AddressLine2, and AddressLine3 (maximum 3 lines).
Special Handling:
- Post office box: If
HasPostOfficeBoxis true, usesPostOfficeBoxinstead of street address - Street formatting: Combines
StreetandHouseNumberwith proper trimming - Department order: Configurable via
ReceiverContactDepartmentFirstsetting (ApplicationSettingID 10370) - Invoice address: If alternative invoice address is used (
UsedAlternativeInvoiceAddress), name is loaded fromKundentable - Fallback: If
ReceiptReceiveris null, falls back to legacyIBookKeepingReceiptfields
Header Trade Agreement
Purchase order and party references.
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ApplicableHeaderTradeAgreement/ram:BuyerReference |
ExternalPurchaseOrderNumber or leitwegID parameter |
IBookKeepingReceipt |
Leitweg-ID for XRechnung, otherwise purchase order number |
ram:ApplicableHeaderTradeAgreement/ram:BuyerOrderReferencedDocument/ram:IssuerAssignedID |
ExternalPurchaseOrderNumber |
IBookKeepingReceipt |
Purchase order number (only if not XInvoice) |
Header Trade Delivery
Delivery information.
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ApplicableHeaderTradeDelivery/ram:ActualDeliverySupplyChainEvent/ram:OccurrenceDateTime/udt:DateTimeString |
DeliveryDate or Date |
IBookKeepingReceipt |
Delivery date (fallback to receipt date if not set) |
Header Trade Settlement
Payment, banking, and monetary information.
Banking & SEPA
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ApplicableHeaderTradeSettlement/ram:CreditorReferenceID |
SepaIdentificationNumber |
Mandator |
SEPA creditor reference ID (only for direct debit) |
ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode |
CurrencyISOCode |
IBookKeepingReceipt |
Currency code (e.g., "EUR") |
ram:SpecifiedTradeSettlementPaymentMeans/ram:TypeCode |
Untdid4461 or "ZZZ" |
IBookKeepingReceipt |
Payment means type code (UN/EDIFACT 4461) |
ram:SpecifiedTradeSettlementPaymentMeans/ram:Information |
PaymentConditionsText |
IBookKeepingReceipt |
Payment information text |
ram:SpecifiedTradeSettlementPaymentMeans/ram:PayerPartyDebtorFinancialAccount/ram:IBANID |
Iban |
BankAccount via BankAccountI3D |
Debtor IBAN (for direct debit) |
ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:IBANID |
Selected bank IBAN | Mandator bank info (Bank1-4) |
Creditor IBAN (for bank transfer) |
ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeePartyCreditorFinancialAccount/ram:AccountName |
Selected bank holder or Name |
Mandator bank info or Mandator |
Account holder name |
ram:SpecifiedTradeSettlementPaymentMeans/ram:PayeeSpecifiedCreditorFinancialInstitution/ram:BICID |
Selected bank BIC | Mandator bank info (Bank1-4) |
Bank BIC code |
Bank Selection Logic:
- Check
ReceiptInvoiceSettings.UseMandatorBankForInvoice(1-4) - For customer receipts, check
AccountCustomer.MandatorBankoverride - Load bank details from
Mandator(Bank1Iban/Bic, Bank2Iban/Bic, Bank3Iban/Bic, Bank4Iban/Bic)
Tax Information
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ApplicableTradeTax/ram:CalculatedAmount |
Calculated from positions | BookKeepingReceiptItem |
Tax amount per tax rate |
ram:ApplicableTradeTax/ram:TypeCode |
Static "VAT" | - | Tax type |
ram:ApplicableTradeTax/ram:ExemptionReason |
Derived from tax scenario | Logic | Tax exemption reason text |
ram:ApplicableTradeTax/ram:BasisAmount |
Calculated from positions | BookKeepingReceiptItem |
Net basis amount for tax |
ram:ApplicableTradeTax/ram:CategoryCode |
Derived from tax scenario | Logic | Tax category (S, E, K, G, AE) |
ram:ApplicableTradeTax/ram:RateApplicablePercent |
Grouped tax rates | BookKeepingReceiptItem.TaxRate |
VAT percentage |
Tax Category Codes:
S(Standard): Normal VAT rateE(Exempt): 0% VAT for domestic tax-free transactionsK(Intra-community): 0% VAT for EU intra-community supplyG(Export): 0% VAT for export outside EUAE(Reverse charge): Reverse charge scenario (IsReverseCharge = true)
Tax Exemption Reasons:
- Reverse charge: "Steuerschuldnerschaft des Leistungsempfängers gem. §13B Abs 2 Nr. 10 UStG."
- Tax-free domestic: "Steuerfrei"
- Intra-community: "Kein Ausweis der Umsatzsteuer bei innergemeinschaftlichen Lieferungen"
- Export: "Steuer nicht erhoben aufgrund von Export außerhalb der EU"
Billing Period
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:BillingSpecifiedPeriod/ram:StartDateTime/udt:DateTimeString |
Min of position billing periods | ContractBillingInfo |
Earliest billing start date |
ram:BillingSpecifiedPeriod/ram:EndDateTime/udt:DateTimeString |
Max of position billing periods | ContractBillingInfo |
Latest billing end date |
Payment Terms
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:SpecifiedTradePaymentTerms/ram:Description |
PaymentConditionFull + Skonto info |
IBookKeepingReceipt + derived |
Full payment condition text with line breaks |
ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString |
DueDate or Date |
IBookKeepingReceipt |
Payment due date |
ram:SpecifiedTradePaymentTerms/ram:DirectDebitMandateID |
AuthorizationNumber |
BankAccount via BankAccountI3D |
SEPA mandate ID (only for direct debit) |
Skonto Information (BR-DE-18):
- Generated via
AssetConditionBL.GetPaymentConditionSkontoInBR_DE_18Format() - Appended to description with proper XML line breaks (

)
Monetary Summation
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:LineTotalAmount |
NetPriceFCComplete |
IBookKeepingReceipt |
Total net amount |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:ChargeTotalAmount |
Static 0 | - | Total charges |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:AllowanceTotalAmount |
Static 0 | - | Total allowances |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxBasisTotalAmount |
NetPriceFCComplete |
IBookKeepingReceipt |
Tax basis total |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount[@currencyID] |
TaxPriceFCComplete |
IBookKeepingReceipt |
Total tax amount |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount |
Net + Tax | Calculated | Gross total |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TotalPrepaidAmount |
Static 0 | - | Prepaid amount |
ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:DuePayableAmount |
Net + Tax | Calculated | Due payable amount |
Validation:
- System validates that sum of position net prices equals header net price (tolerance: ±3.00)
- System validates that sum of position gross prices equals header gross price (tolerance: ±3.00)
- Warnings are logged if differences are within tolerance, errors if exceeding
Invoice Referenced Document (Credit Vouchers Only)
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:InvoiceReferencedDocument/ram:IssuerAssignedID |
Number |
ReceiptInvoice (origin) |
Original invoice number |
ram:InvoiceReferencedDocument/ram:FormattedIssueDateTime/qdt:DateTimeString |
Date |
ReceiptInvoice (origin) |
Original invoice date |
Logic:
- Only for credit vouchers (
Type = CreditVoucher) - Only if exactly one origin invoice exists
- Loaded via
ReceiptItem.OriginReceiptI3DwhereOriginKind = Invoice
Line Items (Positions)
Each invoice/credit voucher position.
Line Item Document
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:AssociatedDocumentLineDocument/ram:LineID |
Sequential counter | Generated | Position number (1, 2, 3, ...) |
Trade Product
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:SpecifiedTradeProduct/ram:GlobalID[@schemeID="0160"] |
EANCode |
BookKeepingReceiptItem |
EAN/GTIN barcode (if not disabled in settings) |
ram:SpecifiedTradeProduct/ram:SellerAssignedID |
Articlecode |
BookKeepingReceiptItem |
Article code (if not disabled in settings) |
ram:SpecifiedTradeProduct/ram:Name |
Text |
BookKeepingReceiptItem (via compact entity) |
Position text/description |
ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic/ram:Description |
Static "Seriennummer {index}" | Generated | Serial number label (1, 2, 3, ...) |
ram:SpecifiedTradeProduct/ram:ApplicableProductCharacteristic/ram:Value |
Barcodes[i] |
IReceiptItemWithBarcodes |
Barcode value (serial number) |
Barcode Handling:
- Barcodes are loaded from receipt items that implement
IReceiptItemWithBarcodes - Multiple barcodes per position are supported (indexed sequentially)
- For title positions, barcodes from child items are aggregated into the parent position
- Each barcode is exported as a separate
ApplicableProductCharacteristicnode - Code reference:
InvoiceZugferdBL.cs:625-626(loading),InvoiceZugferdBL.cs:648-651(title aggregation),InvoiceZugferdBL.cs:881-898(XML export)
Settings Flags:
ReceiptInvoiceSettings.ZugferdExportDontExportEanCode: Suppresses EAN exportReceiptInvoiceSettings.ZugferdExportDontExportArticleCode: Suppresses article code export
Line Trade Agreement
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:NetPriceProductTradePrice/ram:ChargeAmount |
NetPrice |
InvoiceItemCompact or CreditVoucherItemCompact |
Unit net price (always positive) |
Note: If NetPrice is negative, the price is made positive and quantity is negated.
Line Trade Delivery
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:BilledQuantity[@unitCode] |
QuantityComplete |
InvoiceItemCompact or CreditVoucherItemCompact |
Quantity (negated if price was negative) |
@unitCode |
UNECECode |
Article.ArticleUnit |
UN/ECE unit code (default: "C62" = piece) |
UN/ECE Code Logic:
- Only for article items (
Kind = ArticleandArticleI3Dis set) - Loaded from
Article.ArticleUnit.UNECECode - Fallback: "C62" (one/piece)
Line Trade Settlement
| XML Node | c-entron Field | Table/Entity | Description |
|---|---|---|---|
ram:ApplicableTradeTax/ram:TypeCode |
Static "VAT" | - | Tax type |
ram:ApplicableTradeTax/ram:CategoryCode |
Derived from tax scenario | Logic | Tax category code (see header tax) |
ram:ApplicableTradeTax/ram:RateApplicablePercent |
TaxRate or 0 |
InvoiceItemCompact/CreditVoucherItemCompact |
VAT percentage (0 if ExclusiveOfVAT) |
ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount |
NetPriceTotalFCComplete |
BookKeepingReceiptItem |
Line net total amount |
Title Position Handling:
- Title positions (
Kind = TitlePosition,Expanded = false) are exported as collapsed items - Child items (
Visible != VisibleorIndent > 0) are aggregated into parent title position - Title position quantity is always 1
- Title position net price equals net total
- Mixed tax rates in title positions cause error
Item Filtering:
- Only exports:
Article,CustomerDiscount, or collapsedTitlePositionitems - Must be
Visible = VisibleorIndent = 0 - Ordered by
InternalPosition
Data Sources Summary
Primary Tables
| Table/Entity | Purpose | Key Fields |
|---|---|---|
IBookKeepingReceipt |
Receipt header | Number, Date, AddressNumber, DueDate, CurrencyISOCode, NetPriceFCComplete, TaxPriceFCComplete |
ReceiptReceiver |
Structured receiver address | CompanyName, AdditionalAddressSupplement, Department, ContactDepartment, ContactName, Street, HouseNumber, PostOfficeBox, Zip, City, CountryI3D |
BookKeepingReceiptItem |
Receipt line items | Position, Text, Articlecode, EANCode, NetPrice, QuantityComplete, TaxRate |
InvoiceItemCompact |
Invoice item details | NetPrice, NetPriceTotalFCComplete, TaxPriceTotalFCComplete, VATRate, QuantityComplete |
CreditVoucherItemCompact |
Credit voucher item details | NetPrice, NetPriceTotalFC, TaxPriceTotalFC, VATRate, QuantityComplete |
Mandator |
Own company | Name, CEO, TaxIDNumber, HRB, Street, City, PostCode, Phone, EMail, SepaIdentificationNumber |
Branch |
Own branch | Name, Street, City, ZipCode, PhoneNumber, EMail, CountryI3D |
Country |
Country data | CountryCode, EUMember |
BankAccount |
Bank account | Iban, AuthorizationNumber |
Article |
Article master data | ArticleUnit (for UN/ECE code) |
ReceiptInvoice |
Invoice entity | For credit voucher references |
ReceiptCreditVoucher |
Credit voucher entity | For origin tracking |
Derived/Calculated Fields
| Concept | Calculation | Source |
|---|---|---|
| Tax category codes | Based on tax rate, reverse charge, country flags | Logic in GetTaxCategoryCode() |
| Tax exemption reasons | Based on tax scenario | Logic in GetTaxExemptionReason() |
| Structured address lines | Intelligent building from ReceiptReceiver | Logic in receiver address building (max 3 lines) |
| OwnCountryCode | Country code for trade type | Loaded from Country via CountryI3D (default: "DE") |
| Billing period | Min/Max from contract billing info | ContractBL.GetContractBillingPeriodForInvoiceItem() |
| Bank selection | Settings + customer override | ReceiptInvoiceSettings.UseMandatorBankForInvoice + AccountCustomer.MandatorBank |
| Skonto text | Payment condition formatting | AssetConditionBL.GetPaymentConditionSkontoInBR_DE_18Format() |
| UN/ECE code | Article unit lookup | Article.ArticleUnit.UNECECode |
Special Cases & Business Logic
Structured Receiver Address
The system uses the structured ReceiptReceiver entity to build multi-line addresses:
- Maximum 3 lines for Name and AddressLine1-3
- Intelligent building based on available fields (CompanyName, AdditionalAddressSupplement, Department, ContactDepartment, ContactName, Street)
- Configurable department order via
ReceiverContactDepartmentFirstsetting - Post office box handling with
HasPostOfficeBoxflag - Fallback support to legacy
IBookKeepingReceiptfields ifReceiptReceiveris null
Negative Prices
ZUGFeRD does not support negative prices. The system:
- Makes
NetPricepositive - Negates
Quantityinstead - Maintains correct calculation
Title Positions
- Collapsed title positions are exported with aggregated child item values
- Expanded title positions are not supported (error)
- Mixed tax rates in title positions are not supported (error)
- Default tax rate for title positions without items: 19%
- Barcodes from child items are aggregated into the parent title position
Payment Condition
Determined by SEPA active status:
IsSepaActive = true→DirectDebit(BG-19)IsSepaActive = false→BankTransfer(BG-17)
Country Trade Flags
Used for tax category determination:
IsInlandTrade: Buyer country = Seller countryIsEUTrade: Buyer country is EU member
Validation Tolerances
- Net price difference tolerance: ±3.00 (between header and sum of positions)
- Gross price difference tolerance: ±3.00
- Within tolerance: Warning logged, value corrected
- Exceeding tolerance: Error, export fails
Implementation Notes
File Encoding
- XML files are generated with UTF-8 encoding
- BOM (Byte Order Mark) is removed from export (first 3 bytes stripped)
Date Formats
- Standard date:
yyyyMMdd(format code "102") - Long date:
yyyy-MM-ddThh:mm:ss
Amount Formatting
- All amounts use "F2" format (2 decimal places)
- Culture: en-US (decimal separator: dot)
Namespace Prefixes
rsm: CrossIndustryInvoiceram: ReusableAggregateBusinessInformationEntityudt: UnqualifiedDataTypeqdt: QualifiedDataType
Code References
- Main generator:
InvoiceZugferdBL.cs:117-158(GenerateZugferdFile) - Export item builder:
InvoiceZugferdBL.cs:237-434(GetZugferdExportItem) - XML document generator:
InvoiceZugferdBL.cs:727-750(DoGenerateZugferdXRechnungXmlDocument) - Tax logic:
InvoiceZugferdBL.cs:1369-1400(GetTaxCategoryCode, GetTaxExemptionReason)
Version History
| Version | Notes |
|---|---|
| 1.2 | Added: Structured ReceiptReceiver support for buyer address, OwnCountryCode for trade type determination |
| 1.1 | Added: Barcode/serial number export in line items via ApplicableProductCharacteristic |
| 1.0 | Initial documentation covering XRechnung 3.0.1 implementation |