Skip to content

CII Reader / Writer ​

Read and write documents in UN/CEFACT Cross-Industry Invoice (CII) format, as used by ZUGFeRD and XRechnung.

Reader ​

ruby
reader = Zugpferd::CII::Reader.new
invoice = reader.read(xml_string)

read(xml_string) → BillingDocument ​

Parses a CII D16B XML string and returns the appropriate model class based on the type code (e.g. CreditNote for 381, CorrectedInvoice for 384). Falls back to Invoice for type code 380 and unknown codes.

Parameters:

  • xml_string (String) — Valid CII CrossIndustryInvoice XML

Returns: Zugpferd::Model::Invoice, Zugpferd::Model::CreditNote, or other BillingDocument subtype

Raises: Nokogiri::XML::SyntaxError if the XML is malformed

Writer ​

ruby
writer = Zugpferd::CII::Writer.new
xml_string = writer.write(invoice)

write(invoice) → String ​

Serializes a billing document to a CII CrossIndustryInvoice XML string.

Parameters:

  • invoice (Zugpferd::Model::BillingDocument) — The document to serialize

Returns: String — UTF-8 encoded XML

CII Namespaces ​

PrefixURI
rsmurn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100
ramurn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100
udturn:un:unece:uncefact:data:standard:UnqualifiedDataType:100
qdturn:un:unece:uncefact:data:standard:QualifiedDataType:100

CII-Specific Notes ​

  • Dates use format code 102 (YYYYMMDD), e.g. 20240115
  • The creditor reference identifier (BT-90) is at the settlement level as ram:CreditorReferenceID
  • The mandate reference (BT-89) is inside ram:SpecifiedTradePaymentTerms/ram:DirectDebitMandateID
  • Tax information on line items is in ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax, not in ram:SpecifiedTradeProduct
  • The charge indicator uses udt:Indicator with string values "true" / "false"