Standard, syntaxe a přenos
| Vrstva | Účel |
|---|---|
| EN 16931 | sémantický model faktury a obchodní pravidla |
| UBL / CII | XML syntaxe, do které se model mapuje |
| Peppol BIS Billing | profil, pravidla a identifikátory pro interoperabilní fakturaci |
| Peppol síť | doručování přes přístupové body; jiná vrstva než XML |
| ViDA | evropská 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
<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
- Ověř dobře formované XML a správné jmenné prostory.
- Ověř strukturu pomocí XSD správné syntaxe.
- Spusť obchodní pravidla EN 16931 a pravidla profilu, obvykle Schematron.
- Ověř kódy, identifikátory, součty a pravidla příjemce.
- 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
- 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.
- Rozbal BIS-Billing3-Examples.zip a vyber
rules/examples/base-example.xml. Obsahuje celou fakturu včetně stran, řádků, daní a součtů. - Najdi Invoice/ID, DocumentCurrencyCode, AccountingSupplierParty, AccountingCustomerParty, TaxTotal, LegalMonetaryTotal a oba InvoiceLine. Při XPath navaž prefixy UBL, cac a cbc podle jejich URI.
- Uchovej původní soubor i verzi artefaktů; negativní zkoušku dělej na kopii.
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í.
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 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.