Invocie

Tech

UBL 2.1 bằng ngôn ngữ giản đơn: chuẩn XML phía sau e-invoicing hiện đại

Hầu hết mọi quy định e-invoicing lớn trên thế giới đều xuất ra UBL 2.1 ở tầng dưới. Đây là tour không jargon qua các phần bạn thực sự cần hiểu.

Invocie Team · 21 tháng 1, 2026 · 5 phút đọc


UBL — Universal Business Language — is the OASIS standard underpinning Peppol BIS, EN 16931, ZATCA Phase-2, the UAE's PINT profile, India's IRP/e-invoice schema (with extensions), and several LATAM regimes. If your e-invoicing strategy doesn't make peace with UBL 2.1, you're going to be re-implementing the same XML over and over.

The shape of an UBL invoice

An UBL invoice is an XML document with three main namespaces: cbc (Common Basic Components — primitive types like ID and Amount), cac (Common Aggregate Components — complex types like Party and TaxTotal), and the document namespace itself. Every UBL document follows the same pattern:

<Invoice
    xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
    xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
    xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  <cbc:CustomizationID>urn:cen.eu:en16931:2017</cbc:CustomizationID>
  <cbc:ID>INV-2026-0001</cbc:ID>
  <cbc:IssueDate>2026-01-15</cbc:IssueDate>
  <cbc:DocumentCurrencyCode>EUR</cbc:DocumentCurrencyCode>
  <cac:AccountingSupplierParty>...</cac:AccountingSupplierParty>
  <cac:AccountingCustomerParty>...</cac:AccountingCustomerParty>
  <cac:TaxTotal>...</cac:TaxTotal>
  <cac:LegalMonetaryTotal>...</cac:LegalMonetaryTotal>
  <cac:InvoiceLine>...</cac:InvoiceLine>
</Invoice>

Five concepts that are almost always wrong

  1. TaxTotal vs. LegalMonetaryTotal. The former breaks tax down by rate. The latter is the consolidated payable amount. Don't confuse them.
  2. AllowanceCharge can be either a discount or a surcharge — controlled by ChargeIndicator (false = allowance, true = charge). Wrong indicator → wrong total.
  3. Endpoint IDs need a scheme attribute (schemeID="0088" etc.). Without it, validators give cryptic errors about missing identifiers.
  4. Quantities use a unit code from UN/CEFACT (EA = each, KGM = kilogram, HUR = hour). "piece" is not a valid value.
  5. TaxCategory codes are UNCL5305: S = standard rate, Z = zero rate, E = exempt, AE = reverse charge. Don't invent new codes.

Invocie's EUStrategy emits UBL 2.1 conforming to BIS Billing 3.0 — same XML works for Peppol APs, the UAE PINT profile, and any system that consumes EN 16931.


Đọc liên quan

Hash Chain cho audit trail chống giả mạo

ZATCA bắt buộc dùng chúng, kiểm toán viên EU yêu thích chúng và triển khai khá rẻ. Đây là cách SHA-256 chuỗi biến sổ hóa đơn thành thứ bạn có thể chứng minh được tính toàn vẹn.

Thiết kế API e-invoicing đa khu vực: bài học từ chiến hào

Nếu bạn đang xây hạ tầng phục vụ cả nước clearance lẫn post-audit, bạn chỉ có một cơ hội để dựng abstraction cho đúng. Đây là điều chúng tôi học được theo cách khó nhằn.

Integrating UAE E-Invoicing With Your ERP: A Technical Guide

A technical walkthrough for the Head of IT and ERP transformation lead: how UAE PINT maps onto SAP, Oracle, Microsoft Dynamics, and custom ERPs, the data you must clean first, and the integration patterns that survive production.

Phát hành hóa đơn tuân thủ ở mọi thị trường

ZATCA, FTA, Peppol và post-audit toàn cầu — một API.

Trao đổi với đội ngũ