E-fakturace v EU: EN 16931, UBL, Peppol a ViDA

Strukturovaná elektronická faktura je datový dokument pro automatické zpracování. EN 16931 popisuje význam dat, UBL a CII jejich zápis a Peppol také pravidla interoperability a doručení.

Autor: Aktualizováno

Standard, syntaxe a přenos

VrstvaÚčel
EN 16931sémantický model faktury a obchodní pravidla
UBL / CIIXML syntaxe, do které se model mapuje
Peppol BIS Billingprofil, pravidla a identifikátory pro interoperabilní fakturaci
Peppol síťdoručování přes přístupové body; jiná vrstva než XML
ViDAevropská reforma DPH a digitálního vykazování

PDF s obrázkem faktury není samo o sobě strukturovaná e-faktura. Český ISDOC a evropské profily mají odlišná schémata a požadavky; společná přípona XML nezaručuje kompatibilitu.

Evropská komise uvádí pro mapování EN 16931 syntaxe UBL 2.1 Invoice a UN/CEFACT CII. Konkrétní profil může výběr omezit a přidat pravidla.

Identifikace profilu v UBL

Pouze ilustrační fragment, nikoli úplná platná faktura
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
 xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2">
  <cbc:CustomizationID>urn:cen.eu:en16931:2017#compliant#urn:fdc:peppol.eu:2017:poacc:billing:3.0</cbc:CustomizationID>
  <cbc:ProfileID>urn:fdc:peppol.eu:2017:poacc:billing:01:1.0</cbc:ProfileID>
  <cbc:ID>2026-117</cbc:ID>
  <cbc:IssueDate>2026-10-01</cbc:IssueDate>
</Invoice>

CustomizationID a ProfileID určují očekávaný profil a proces. Úplný dokument potřebuje další údaje dodavatele, odběratele, řádků, daně a součtů. Nekopíruj fragment jako hotovou fakturu. Pro reprodukovatelnou integraci použij příklad z konkrétního vydání profilu a jeho validační artefakty.

Jak fakturu validovat

  1. Ověř dobře formované XML a správné jmenné prostory.
  2. Ověř strukturu pomocí XSD správné syntaxe.
  3. Spusť obchodní pravidla EN 16931 a pravidla profilu, obvykle Schematron.
  4. Ověř kódy, identifikátory, součty a pravidla příjemce.
  5. Otestuj doručení a potvrzení v dohodnutém prostředí.

Peppol BIS Billing 3.0 poskytuje pravidla, příklady a Schematron soubory. K 1. 10. 2026 odkazuje publikovaná dokumentace na vydání květen 2026. Připni verzi artefaktů v projektu; pravidla se průběžně mění.

ViDA: ověřený evropský stav

Podle Evropské komise byl balíček ViDA přijat 11. 3. 2025 a zavádí se postupně. Od 1. 7. 2030 mají začít digitální vykazovací požadavky pro vymezené přeshraniční B2B transakce; sjednocování některých domácích systémů pokračuje do roku 2035.

To samo neznamená jednu plošnou povinnost pro všechny české faktury už dnes. Pro právní rozsah vycházej z směrnice (EU) 2025/516 a aktuální české transpozice. Český termín plošné domácí povinnosti zde nestanovujeme: je potřeba ověřit účinnou úpravu a konkrétní typ transakce.

Časté integrační chyby

  • XML projde XSD, ale nesedí součty nebo daňové kategorie.
  • Profilové ID neodpovídá obsahu a pravidlům příjemce.
  • Chybí správné identifikační schéma elektronické adresy.
  • Účetní aplikace zaměňuje dokument, vizualizaci a způsob přenosu.

Do logů ukládej kód pravidla, verzi validátoru a bezpečný popis chyby. S fakturou pracuj jako s citlivými daty.

Úplný oficiální vzorek a jeho částky

  1. Na stránce vydání Peppol BIS Billing stáhni Example files. Při tomto ověření 2. 10. 2026 jde o vydání květen 2026.
  2. Rozbal BIS-Billing3-Examples.zip a vyber rules/examples/base-example.xml. Obsahuje celou fakturu včetně stran, řádků, daní a součtů.
  3. Najdi Invoice/ID, DocumentCurrencyCode, AccountingSupplierParty, AccountingCustomerParty, TaxTotal, LegalMonetaryTotal a oba InvoiceLine. Při XPath navaž prefixy UBL, cac a cbc podle jejich URI.
  4. Uchovej původní soubor i verzi artefaktů; negativní zkoušku dělej na kopii.
Ověřené údaje z base-example.xml, vydání květen 2026
ID: Snippet1
Měna: EUR
Počet InvoiceLine: 2
Součet řádků: 1300
Částka bez daně: 1325
Částka včetně daně: 1656.25
Částka k úhradě: 1656.25

Součet řádků se zde liší od částky bez daně o poplatek 25. Jeden řádek má záporné množství; čtečka proto nesmí automaticky odmítnout každou zápornou hodnotu bez pravidla profilu. Příklad slouží ke čtení a validaci, nikoli jako návrh daňového zacházení pro tvoji firmu. Pro úplný obsah použij oficiální balíček příkladů, nikoli úvodní fragment na této stránce.

Spuštění obchodních pravidel a kontrola SVRL

Z téhož vydání stáhni CEN-EN16931-UBL.sch a PEPPOL-EN16931-UBL.sch. Oba používají queryBinding xslt2, potřebují tedy odpovídající procesor. Online XSLT 1.0 tester XML.cz tento postup nenahrazuje. Níže je ověřený postup se Saxon-HE 12.9 a ISO Skeleton.

Z oficiálního ISO Skeleton repozitáře vezmi iso_svrl_for_xslt2.xsl a iso_schematron_skeleton_for_saxon.xsl do stejného adresáře. Do lib vlož Saxon-HE a jeho runtime závislosti; například Maven artefakt net.sf.saxon:Saxon-HE:12.9 a dependency:copy-dependencies. Zkopíruj tam také fakturu jako base-example.xml a oba sch soubory. Tyto dvě konkrétní sady pravidel jsou samostatné; obecný Schematron s include či abstraktními patterns může potřebovat další předzpracování.

Pracovní adresář s pravidly, procesorem a fakturou; Windows používá stejnou lib/* classpath
java -cp "lib/*" net.sf.saxon.Transform -s:CEN-EN16931-UBL.sch -xsl:iso_svrl_for_xslt2.xsl -o:cen.xsl
java -cp "lib/*" net.sf.saxon.Transform -s:PEPPOL-EN16931-UBL.sch -xsl:iso_svrl_for_xslt2.xsl -o:peppol.xsl
java -cp "lib/*" net.sf.saxon.Transform -s:base-example.xml -xsl:cen.xsl -o:cen-report.xml
java -cp "lib/*" net.sf.saxon.Transform -s:base-example.xml -xsl:peppol.xsl -o:peppol-report.xml
python3 read-svrl.py cen-report.xml peppol-report.xml
read-svrl.py — vlastní reporty z důvěryhodných pravidel
import sys
import xml.etree.ElementTree as ET
NS = "{http://purl.oclc.org/dsdl/svrl}"
if len(sys.argv) < 2:
    raise SystemExit("Použití: python3 read-svrl.py report.xml [další.xml]")
errors = 0
for filename in sys.argv[1:]:
    root = ET.parse(filename).getroot()  # vlastní report z místního validátoru
    if root.tag != NS + "schematron-output":
        raise ValueError("Očekáván SVRL report")
    failures = root.findall(".//" + NS + "failed-assert")
    for item in failures:
        flag = item.get("flag", "error")
        print(filename, item.get("id"), flag, item.get("location"))
        print(" ".join(item.findtext(NS + "text", default="").split()))
        if flag not in ("warning", "info"):
            errors += 1
print("Chybová pravidla:", errors)
raise SystemExit(1 if errors else 0)

U ověřeného vzorku oba reporty neobsahují failed-assert a skript vypíše Chybová pravidla: 0. Úspěšný návrat XSLT procesu sám nestačí: report může obsahovat fatální pravidla. Skript rozlišuje warning/info od chyby a při chybě končí nenulovým kódem.

V kopii změň pouze LegalMonetaryTotal/PayableAmount z 1656.25 na 1657.25 a spusť CEN kontrolu znovu. XML zůstane dobře formované, ale v reportu se objeví BR-CO-16 s flag fatal: částka k úhradě neodpovídá výpočtu z celkových částek, zaplacené částky a zaokrouhlení. Vrať původní hodnotu a ověř znovu. Správná oprava vychází z účetního modelu, ne z vypnutí pravidla.

Tento postup ověřuje obchodní pravidla obou sad. XSD validace UBL struktury je samostatný první krok; doručení přes Peppol a přijetí účetním systémem další kroky. Pro vlastní fakturu nevynechávej žádnou vrstvu. Přesná pravidla profilu a jejich identifikátory jsou v EN 16931 pravidlech a Peppol pravidlech.