Copyright © 2014 ICT UNIE o.s.
26. května 2014
Tento dokument definuje formáty pro elektronickou fakturaci souhrně označované zkratkou
ISDOC. Formát byl definován a je nadále rozvíjen pracovní skupinou pro elektronické standardy
výměny dat ICT Unie o.s.. Veškeré připomínky a
dotazy k formátu a jeho specifikaci zasílejte na adresu info@isdoc.cz
.
V současné verzi ISDOC definuje formát pro fakturu a neplatební dokument, v dalších verzích může být přidána podpora pro další formáty.
Pokud se v textu nebo v příkladech objevují prefixy jmenných prostorů, platí pro ně následující mapování na jmenný prostor.
Prefix | Jmenný prostor |
---|---|
isdoc |
http://isdoc.cz/namespace/2013 |
manifest |
http://isdoc.cz/namespace/2013/manifest |
dsig |
http://www.w3.org/2000/09/xmldsig# |
xades |
http://uri.etsi.org/01903/v1.3.2# |
Standard ISDOC definuje shodu pro dokumenty, konzumenty a producenty.
Standard ISDOC definuje následující typy dokumentů:
daňový doklad – souhrně označuje fakturu, opravný daňový doklad (dobropis), opravný daňový doklad (vrubopis), zálohovou fakturu (nedaňový zálohový list), daňový doklad při přijetí platby (daňový zálohový list), opravný daňový doklad při přijetí platby (dobropis daňového zálohového listu)a zjednodušený daňový doklad;
neplatební dokument.
Dokument ISDOC musí splňovat následující požadavky:
Musí být reprezentován v souladu s požadavky definovanými v části 3 – „Reprezentace dokumentu“.
Musí být jedním z typů dokumentů definovaných v tomto standardu:
Pokud se jedná o daňový doklad, musí být validní vůči schématu uvedenému v části
A.1 – „Schéma pro daňový doklad – isdoc-invoice-6.0.1.xsd
“ a jako kořenový element musí být použit element
Invoice
.
Pokud se jedná o neplatební dokument, musí být validní vůči schématu uvedenému v části
A.2 – „Schéma pro neplatební dokument – isdoc-commondocument-6.0.1.xsd
“ a jako kořenový element musí být použit element
CommonDocument
.
Musí splňovat pravidla definovaná v části 4 – „Pravidla“.
Pokud je dokument opatřen digitálním podpisem, musí splňovat požadavky definované v části 5 – „Digitální podpisy“.
Pokud je dokument opatřen časovým razítkem, musí splňovat požadavky definované v části 6 – „Časové razítko“.
Konzument ISDOC je program, který načítá a zpracovává dokument ISDOC v souladu se sémantikou definovanou v tomto standardu. Konzument musí být schopen načíst a zpracovat alespoň jeden typ dokumentů ISDOC.
Konzument ISDOC musí být opatřen dokumentací, která vyjmenovává jaké typy dokumentů ISDOC a jaké verze standardu ISDOC jsou podporovány.
Producent ISDOC je program, který generuje dokument ISDOC v souladu se sémantikou definovanou v tomto standardu. Producent musí být schopen generovat alespoň jeden typ dokumentů ISDOC.
Producent ISDOC musí být opatřen dokumentací, která vyjmenovává jaké typy dokumentů ISDOC a jaké verze standardu ISDOC jsou podporovány.
Dokument ISDOC musí být reprezentován jako samostatný dokument XML nebo jako archiv. Pro
samostatné dokumenty je doporučeno používat příponu .isdoc
a pro archivy
.isdocx
.
Samostatný dokument je preferovaná forma pro výměnu dokumentů ISDOC. Je vhodná například při komunikace pomocí webových služeb či pro zasílání dokumentů pomocí elektronické pošty nebo datových schránek. Reprezentace pomocí archivu je vhodná v případech, kdy chceme kromě samotného dokladu přenášet i další související přílohy jako jeden celek.
ISDOC musí být well-formed dokument XML tak jak definuje specifikace [XML] a musí být uložen v kódování UTF-8.
Archiv obsahující dokument ISDOC musí používat formát ZIP tak jak jej definuje specifikace [APPNOTE] a navíc musí dodržet všechny následující požadavky:
Soubory uložené v archivu musí být nekomprimované nebo musí používat kompresní metodu „deflate“ popsanou v [RFC1951].
Archiv nesmí používat šifrování.
Archiv nesmí používat digitální podpisy.
Archiv nesmí používat funkci „patch data“.
Archiv nesmí být rozdělen do více souborů.
Jména souborů musí být uložena v kódování UTF-8 a musí být nastaven příznak „Language encoding flag“ (bit 11).
Archiv musí v kořenovém adresáři obsahovat soubor manifest.xml
obsahující manifest.
Manifest je jednoduchý dokument XML, který slouží k snadnému a rychlému nalezení
dokumentu ISDOC v archivu. Elementy uvnitř manifestu musí být ve jmenném prostoru
http://isdoc.cz/namespace/2013/manifest
. Manifest musí obsahovat kořenový
element manifest
a ten musí obsahovat právě jeden element
maindocument
, který v atributu filename
určuje
umístění dokumentu ISDOC uvnitř archivu.
manifest.xml
<?xml version="1.0"?> <manifest xmlns="http://isdoc.cz/namespace/2013/manifest"> <maindocument filename="FV2013-042.isdoc"/> </manifest>
Starší verze formátu ISDOC nepodporovaly manifest (do verze 5.x včetně). Pro
zajištění zpětné kompatibility je doporučeno, aby aplikace v případě chybějícího
manifestu za hlavní dokument ISDOC v archivu považovala soubor v hlavním adresářu
archivu, který má příponu .isdoc
.
Jednotlivé typy dokumentů ISDOC musí splňovat následující pravidla. Některá z následujících pravidel lze
kontrolovat strojově pomocí schématu v jazyce Schematron. Odpovídající schéma je v příloze B – „Schéma pro kontrolu vybraných pravidel – isdoc-6.0.1.sch
“.
Pro typ dokladu 2, 3 a 6 musí existovat vazba na původní doklad. Konkrétně tedy pro DocumentType
= 2, 3, 6 musí existovat element OriginalDocumentReference
a musí byt neprázdný.
Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode
, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr
.
Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode
, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr
. Položky s kursem (CurrRate
i RefCurrRate
) musí být rovny hodnotě 1.
U dokladu v zahraniční měně nesmí být měna lokální a zahraniční shodné. Konkrétně hodnota povinné položky LocalCurrencyCode
se nesmí rovnat hodnotě nepovinné položky ForeignCurrencyCode
.
Element SubDocumentTypeOrigin
musí obsahovat pouze hodnoty uvedené v tabulce 1 – „Přípustné hodnoty pro element SubDocumentTypeOrigin
“.
SubDocumentTypeOrigin
Hodnota | Popis | Definice číselníku | Přidáno |
---|---|---|---|
CBA |
Česká bankovní asociace | viz [ČBA-STD-29] | 1. ledna 2014 |
Element SubDocumentTypeOrigin
musí obsahovat pouze hodnoty uvedené v tabulce 1 – „Přípustné hodnoty pro element SubDocumentTypeOrigin
“.
Digitální podpis musí být v souladu s doporučením [XMLDSig-Core].
Digitální podpis musí používat transformaci Enveloped
Signature a být uložen v elementu Signature
ze jmenného prostoru
http://www.w3.org/2000/09/xmldsig#
, který je vždy posledním elementem
uvnitř kořenového elementu dokument ISDOC.
Je doporučeno, aby kromě transformace Enveloped
Signature byla použita i transformace XPath, která umožní
pozdější přidání dalších podpisů tím, že podpisy samotné se vynechají z podepisování
pomocí XPath filtru not(ancestor-or-self::dsig:Signature)
.
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" Id="Signature-1"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> <XPath>not(ancestor-or-self::dsig:Signature)</XPath> </Transform> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>GRhVFHn8P5AoMcL0y1RJ4ICVRQZKdW+hcxo3gz8gvCc=</DigestValue> </Reference> </SignedInfo> <SignatureValue>...</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>...</X509Certificate> </X509Data> </KeyInfo> </Signature>
Je doporučeno, aby každý připojený digitální podpis obsahoval unikátní identifikátor
uvnitř atributu Id
. Hodnota identifikátoru musí odpovídat
produkčnímu pravidlu Name
tak, jak jej definuje specifikace [XML].[1]
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"
xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"
Id="Signature-1">
...
</Signature>
Jako algoritmus pro výpočet otisku dokumentu se musí používat algoritmus z rodiny SHA-2. Algoritmus musí být identifikován v souladu s [RFC4051].
Podpis musí být v souladu s požadavky definovanými v 5.1 – „Požadavky na digitální podpis v dokumentu ISDOC“.
Musí být použita transformace XPath a to následujícím způsobem:
První podpis používá filtr
not(ancestor-or-self::dsig:Signature)
.
Další podpisy používají filtr not(ancestor-or-self::dsig:Signature) or
not(ancestor-or-self::dsig:Signature/preceding-sibling::dsig:Signature[N-1])
,
kde N je pořadí přidávaného podpisu (číslované od
jedna).
Do verze ISDOC 5.3.x mohly aplikace produkovat vícenásobné „enveloped“ podpisy bez použití transformace XPath. Selže-li jejich ověření standardním postupem, postupuje se následovně:
Pokud dokument obsahuje alespoň jeden digitální podpis, ověří se poslední digitální podpis.
Poslední digitální podpis (element Signature
) se z dokumentu odstraní a s takto upraveným dokumentem se opakuje krok 1.
Dokument ISDOC musí obsahovat digitální podpis v souladu s 5.1 – „Požadavky na digitální podpis v dokumentu ISDOC“ a rozhodnutím komise [2011/130/EU].
Digitální podpis, který je předmětem časového razítka, musí obsahovat unikátní
identifikátor uvnitř atributu Id
elementu
Signature
.
Časové razítko musí být ve formě XAdES-T v souladu se specifikací [XAdES].
Digitální podpis, který je předmětem časového razítka, musí obsahovat podpisový
certifikát uvnitř elementu KeyInfo
(viz sekce 4.4.1 [XAdES]) a otisk podpisového certifikátu musí být součástí podepisovaných dat.[2]
Autoritě časového razítka se posílá otisk hodnoty digitálního podpisu z elementu
SignatureValue
.[3] Pro výpočet otisku musí být použit algoritmus z rodiny SHA-2.[4]
Časové razítko obdržené od autority časového razítka musí být uloženo v elementu
EncapsulatedTimeStamp
ve formátu ASN.1 zakódaném v DER a následně pomocí
base64. Časové razítko musí vyhovovat formátu definovanému produkčním pravidlem
TimeStampResp
dle [RFC3161]. Časové razítko musí
vždy obsahovat položku timeStampToken
.[5]
<?xml version="1.0" encoding="utf-8"?> <Invoice xmlns="http://isdoc.cz/namespace/2013" version="5.2.2"> <DocumentType>1</DocumentType> ... samotný obsah faktury ve formátu ISDOC ... <Signature❶ xmlns="http://www.w3.org/2000/09/xmldsig#" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> <XPath>not(ancestor-or-self::dsig:Signature)</XPath> </Transform> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>GRhVFHn8P5AoMcL0y1RJ4ICVRQZKdW+hcxo3gz8gvCc=</DigestValue> </Reference> </SignedInfo> <SignatureValue>w6sA... samotný digitální podpis zakódovaný pomocí base64 ...45pg==</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIE... X.509 v3 certifikát ve formátu ASN.1/DER zakódovaný pomocí base64 ...RQkP</X509Certificate> </X509Data> </KeyInfo> </Signature> <Signature❷ xmlns="http://www.w3.org/2000/09/xmldsig#" Id❸="Signature-2" xmlns:dsig="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo❹> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference❺ Id❻="Signature-2-Document-Reference" URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116"> <XPath>not(ancestor-or-self::dsig:Signature) or not(ancestor-or-self::dsig:Signature/preceding-sibling::dsig:Signature[1])</XPath> </Transform> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>yHcv2564yvtGgJZcG4+1dm/jsmlX0qKGjGWUfu5cGpg=</DigestValue> </Reference> <Reference❼ URI❽="#Signature-2-SignedProperties"> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>iEy8FDlFUlbctpiVrwTf4cuTBKoBBXY5LDJIyuAG2KM=</DigestValue> </Reference> </SignedInfo> <SignatureValue>OcLa... samotný digitální podpis zakódovaný pomocí base64 ...t+jA==</SignatureValue> <KeyInfo❾> <X509Data> <X509Certificate>MIIE... X.509 v3 certifikát ve formátu ASN.1/DER zakódovaný pomocí base64 ...I2si0=</X509Certificate> </X509Data> </KeyInfo> <Object❿> <xades:QualifyingProperties⓫ xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target⓬="#Signature-2"> <xades:SignedProperties⓭ Id="Signature-2-SignedProperties"> <xades:SignedSignatureProperties> <xades:SigningTime⓮>2011-08-16T08:25:48.0724613Z</xades:SigningTime> <xades:SigningCertificate⓯> <xades:Cert> <xades:CertDigest> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue⓰>2w6LNdUhsrbRSWpoZhYKGo5BO1GmVzDuhZ7QOE5NgFg=</DigestValue> </xades:CertDigest> <xades:IssuerSerial⓱> <X509IssuerName>C=CZ, O="Česká pošta, s.p. [IČ 47114983]", CN=DEMO PostSignum Qualified CA 2</X509IssuerName> <X509SerialNumber>07B4E9</X509SerialNumber> </xades:IssuerSerial> </xades:Cert> </xades:SigningCertificate> </xades:SignedSignatureProperties> <xades:SignedDataObjectProperties> <xades:DataObjectFormat⓲ ObjectReference="#Signature-2-Document-Reference"> <xades:MimeType>application/xml</xades:MimeType> </xades:DataObjectFormat> </xades:SignedDataObjectProperties> </xades:SignedProperties> <xades:UnsignedProperties> <xades:UnsignedSignatureProperties> <xades:SignatureTimeStamp> <xades:EncapsulatedTimeStamp⓳ Encoding="http://uri.etsi.org/01903/v1.2.2#DER">MIIOB... Časové razítko zakódované v ASN.1/DER a následně base64 ...qp8=</xades:EncapsulatedTimeStamp> </xades:SignatureTimeStamp> </xades:UnsignedSignatureProperties> </xades:UnsignedProperties> </xades:QualifyingProperties> </Object> </Signature> </Invoice>
Digitální podpis výstavce dokumentu. Podepsán je původní obsah faktury. |
|
Digitální podpis příjemce dokumentu. Podepsán je celý předcházející dokument – tedy jak původní obsah faktury tak podpis výstavce. Navíc je kvůli požadavkům na shodu s XAdES-BES podepsán i podpisový certifikát příjemce (viz ❼). |
|
Digitální podpis, který chceme opatřit časovým razítkem, musí mít unikátní identifikátor. Časové razítko pomocí odkazu na identifikátor indikuje, kterého podpisu se týká. |
|
Element |
|
Element |
|
Element |
|
Element |
|
Odkaz na podepisovaná data, v tomto případě na element |
|
Element |
|
Element |
|
Element |
|
Atribut |
|
Element |
|
Čas UTC podepisování dokumentu. Čas musí vyhovovat datovému typu
|
|
Informace o podpisovém certifikátu. Element |
|
Hodnota otisku podpisového certifikátu zakódovaná pomocí base64. Otisk se počítá nad
certifikátem ve formátu ASN.1/DER. Algoritmus pro výpočet otisku je určen předcházejícím
elementem |
|
Element |
|
Element |
|
Element |
isdoc-invoice-6.0.1.xsd
Přehledný grafický diagram schématu je dostupný na adrese http://isdoc.cz/6.0.1/doc-cs/isdoc-invoice-6.0.1.html.
isdoc-commondocument-6.0.1.xsd
Přehledný grafický diagram schématu je dostupný na adrese http://isdoc.cz/6.0.1/doc-cs/isdoc-commondocument-6.0.1.html.
isdoc-manifest-6.0.1.xsd
isdoc-6.0.1.sch
<?xml version="1.0" encoding="UTF-8"?> <sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> <sch:title>Kontrola vybraných pravidel ISDOC</sch:title> <sch:ns uri="http://isdoc.cz/namespace/2013" prefix="isdoc"/> <sch:pattern> <sch:title>Vazba na původní doklad</sch:title> <sch:rule context="isdoc:Invoice[isdoc:DocumentType = (2,3,6)]"> <sch:assert test="isdoc:OriginalDocumentReferences/*">Pro typ dokladu 2, 3 a 6 musí existovat vazba na původní doklad. Konkrétně tedy pro DocumentType = 2, 3, 6 musí existovat element OriginalDocumentReference a musí byt neprázdný.</sch:assert> </sch:rule> </sch:pattern> <sch:pattern> <sch:title>Konzistentní uvádění cizí měny</sch:title> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:LineExtensionAmount]"> <sch:assert test="isdoc:LineExtensionAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:LineExtensionAmountTaxInclusive]"> <sch:assert test="isdoc:LineExtensionAmountTaxInclusiveCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:DepositAmount]"> <sch:assert test="isdoc:DepositAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxableDepositAmount]"> <sch:assert test="isdoc:TaxableDepositAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxInclusiveDepositAmount]"> <sch:assert test="isdoc:TaxInclusiveDepositAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxAmount]"> <sch:assert test="isdoc:TaxAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxableAmount]"> <sch:assert test="isdoc:TaxableAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxInclusiveAmount]"> <sch:assert test="isdoc:TaxInclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> <sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:AlreadyClaimedTaxableAmount]"> <sch:assert test="isdoc:AlreadyClaimedTaxableAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:AlreadyClaimedTaxAmount]"> <sch:assert test="isdoc:AlreadyClaimedTaxAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:AlreadyClaimedTaxInclusiveAmount]"> <sch:assert test="isdoc:AlreadyClaimedTaxInclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:DifferenceTaxableAmount]"> <sch:assert test="isdoc:DifferenceTaxableAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:DifferenceTaxAmount]"> <sch:assert test="isdoc:DifferenceTaxAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:DifferenceTaxInclusiveAmount]"> <sch:assert test="isdoc:DifferenceTaxInclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:TaxExclusiveAmount]"> <sch:assert test="isdoc:TaxExclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:AlreadyClaimedTaxExclusiveAmount]"> <sch:assert test="isdoc:AlreadyClaimedTaxExclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:DifferenceTaxExclusiveAmount]"> <sch:assert test="isdoc:DifferenceTaxExclusiveAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:PayableRoundingAmount]"> <sch:assert test="isdoc:PayableRoundingAmountCurr">Doklad vystavený v cizí měně musíobsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:PaidDepositsAmount]"> <sch:assert test="isdoc:PaidDepositsAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]//*[isdoc:PayableAmount]"> <sch:assert test="isdoc:PayableAmountCurr">Doklad vystavený v cizí měně musí obsahovat v cizí měně i všechny finanční elementy. Konkrétně: pokud existuje element ForeignCurrencyCode, pak musí existovat všechny elementy s částkami pro cizí měnu tj. ty končící na Curr.</sch:assert> </sch:rule> </sch:pattern> <sch:pattern> <sch:title>Konzistentní uvádění tuzemské měny</sch:title> <sch:rule context="isdoc:Invoice[not(isdoc:ForeignCurrencyCode)]"> <sch:assert test="isdoc:CurrRate = 1">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="isdoc:RefCurrRate = 1">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> </sch:rule> <sch:rule context="isdoc:Invoice[not(isdoc:ForeignCurrencyCode)]"> <sch:assert test="not(.//isdoc:LineExtensionAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:LineExtensionAmountTaxInclusiveCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:DepositAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxableDepositAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxInclusiveDepositAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxableAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxInclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:AlreadyClaimedTaxableAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:AlreadyClaimedTaxAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:AlreadyClaimedTaxInclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:DifferenceTaxableAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:DifferenceTaxAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:DifferenceTaxInclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:TaxExclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:AlreadyClaimedTaxExclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:DifferenceTaxExclusiveAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:PayableRoundingAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí eistovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:PaidDepositsAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> <sch:assert test="not(.//isdoc:PayableAmountCurr)">Doklad vystavený v tuzemské měně nesmí obsahovat žádný element v cizí měně. Pokud neexistuje element ForeignCurrencyCode, pak nesmí existovat žádný element pro cizí měnu, tj. element končící na Curr. Položky s kursem (CurrRate i RefCurrRate) musí být rovny hodnotě 1.</sch:assert> </sch:rule> </sch:pattern> <sch:pattern> <sch:title>Tuzemská a zahraniční měna musí být rozdílná</sch:title> <sch:rule context="isdoc:Invoice[isdoc:ForeignCurrencyCode]"> <sch:assert test="isdoc:ForeignCurrencyCode != isdoc:LocalCurrencyCode">U dokladu v zahraniční měně nesmí být měna lokální a zahraniční shodné. Konkrétně hodnota povinné položky LocalCurrencyCode se nesmí rovnat hodnotě nepovinné položky ForeignCurrencyCode.</sch:assert> </sch:rule> </sch:pattern> </sch:schema
Změněn jmenný prostor na http://isdoc.cz/namespace/2013
Odkazy na objednávky (OrderReference
), dodací listy (DeliveryNoteReference
) a
původní doklady (OriginalDocumentReference
) se uvádějí jen globálně pro celou fakturu. U řádky může již být jen odkaz, který pomocí atributu ref směřuje na existující
globální
odkaz identifikovaný pomocí atributu id. Nad hodnotami v atributech id a ref schéma
kontroluje referenční integritu.
Elementy VATApplicable
a ElectronicPossibilityAgreementReference
jsou ve schématu povinné
(povinné jsou již od verze 5.3, povinnost však nebyla formálně popsána ve schématu).
Upraveno pořadí podelementů uvnitř elementu TaxSubTotal
tak, aby bylo konzistentní.
Element OriginalDocumentReference
musí být vždy obalen v OriginalDocumentReferences
.
Přidán element ClientBankAccount
pro velké výstavce B2C faktur.
Přidány elementy SubDocumentType
a SubDocumentTypeOrigin
pro jemnější klasifikaci dokumentů.
Přidány elementy EgovFlag
, FileReference
, ReferenceNumber
, ISDS_ID
,
EgovClassifiers
, EgovClassifier
, ContractReferences
, ContractReference
,
LastValidDate
, LastValidDateUnbounded
, ExternalOrderIssueDate
, ParagraphID
,
SealSeriesID
.
K elementu Payment
byl přidán nový atribut partialPayment, který může být použit k zakázání částečných plateb.
Pořadí elementů uvnitř elementu Invoice
bylo upraveno.
Element PartyTaxScheme
se může opakovat a u subjektu lze zadat více jeho identifikátorů (např. zároveň DIČ a IČ DPH pro slovenské společnosti).
Do archivu (.isdocx
) byla přidána povinnost používat
manifest. Manifest je soubor určující, který soubor ISDOC z mnoha v archivu
existujících je hlavní. Všechny ostatní jsou pak jen v pozici přílohy.
Přidán nový typ dokumentu neplatební dokument (element CommonDocument
).
Následující seznam obsahuje navrhované změny a rozšíření pro některou z dalších verzí ISDOC.
Další verze ISDOC bude podporovat další typy dokumentů objednávka a potvrzení objednávky.
Zvažujeme přidání nového typu dokumentu, který bude sloužit jako kontejner pro uložení a přenos více dokumentů najednou, například při dávkovém zpracování.
[APPNOTE] APPNOTE.TXT – .ZIP File Format Specification. September 2007. PKWARE Inc. Dostupné na URL: http://www.pkware.com/documents/APPNOTE/APPNOTE-6.3.2.TXT
[RFC4051] Additional XML Security Uniform Resource Identifiers (URIs). April 2005. IETF. Dostupné na URL: http://www.ietf.org/rfc/rfc4051.txt
[XML] Extensible Markup Language (XML) 1.0 (Fifth Edition). W3C Recommendation. 26 November 2008. W3C. Dostupné na URL: http://www.w3.org/TR/REC-xml/
[XAdES] ETSI TS 101 903 V1.4.1: XML Advanced Electronic Signatures (XAdES) Technical Specification. June 2009. ETSI. Dostupné na URL: http://uri.etsi.org/01903/v1.4.1/ts_101903v010401p.pdf
[2011/130/EU] COMMISSION DECISION of 25 February 2011 establishing minimum requirements for the cross-border processing of documents signed electronically by competent authorities under Directive 2006/123/EC of the European Parliament and of the Council on services in the internal market. Dostupné na URL: http://eur-lex.europa.eu/LexUriServ/LexUriServ.do?uri=OJ:L:2011:053:0066:0072:EN:PDF[6]
[ČBA-STD-29] Standard elektronické fakturace – Popis rozhraní pro zasílání e-faktur a e-dokumentů koncovým spotřebitelům do aplikací elektronického bankovnictví. 2014. Česká bankovní asociace.
[RFC1951] DEFLATE Compressed Data Format Specification version 1.3 May 1996. IETF. Dostupné na URL: http://www.ietf.org/rfc/rfc1951.txt
[RFC3161] Internet X.509 Public Key Infrastructure Time-Stamp Protocol (TSP) August 2001. IETF. Dostupné na URL: http://www.ietf.org/rfc/rfc3161.txt
[XMLDSig-Core] XML Signature Syntax and Processing (Second Edition). W3C Recommendation. 10 June 2008. W3C. Dostupné na URL: http://www.w3.org/TR/xmldsig-core/
[1] Například nesmí začínat číslem, nesmí obsahovat mezery atd.
[2] Povinnost zahrnout podpisový certifikát do podpisu definuje forma XAdES-BES. Časové razítko ve formě XAdES-T musí splňovat i všechny požadavky na nižší formu XAdES-BES (resp. XAdES-EPES).
[3] Otisk se přitom počítá z binární reprezentace hodnoty digitálního podpisu nikoli z textového obsahu elementu, který binární data obsahuje až po zakódování metodou base64.
[4] V současné době většina autorit časového razítka v ČR podporuje pouze algoritmus SHA-256.
[5] Položka timeStampToken
je vyžadována, protože ve své části
messageImprint
obsahuje položku hashAlgorithm
identifikující algoritmus použitý pro výpočet otisku. Znalost tohoto algoritmu je
důležitá při následném ověřování časového razítka.
[6] Kvůli chybám v českém překladu doporučujeme vycházet z anglické verze rozhodnutí komise.