Národní standard pro elektronickou fakturaci 6
Verze 6.0.1 z 26. 5. 2014
- 1. Úvod
- 2. Shoda se standardem
- 3. Reprezentace dokumentu
- 4. Pravidla
- 5. Digitální podpisy
- 6. Časové razítko
- A. Schémata pro jednotlivé typy dokumentů
- B. Schéma pro kontrolu vybraných pravidel – isdoc-6.0.1.sch
- C. Změny oproti předchozím verzím
- D. Možné změny pro další verze
- Reference
1. Úvod
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.
1.1. Konvence
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# |
2. Shoda se standardem
Standard ISDOC definuje shodu pro dokumenty, konzumenty a producenty.
2.1. Typy dokumentů ISDOC
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.
2.2. Dokument ISDOC
Dokument ISDOC musí splňovat následující požadavky:
- 1. Musí být reprezentován v souladu s požadavky definovanými v části 3 – „Reprezentace dokumentu“.
- 2. 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.
- 3. Musí splňovat pravidla definovaná v části 4 – „Pravidla“.
- 4. Pokud je dokument opatřen digitálním podpisem, musí splňovat požadavky definované v části 5 – „Digitální podpisy“.
- 5. Pokud je dokument opatřen časovým razítkem, musí splňovat požadavky definované v části 6 – „Časové razítko“.
2.3. Konzument ISDOC
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.
2.4. Producent ISDOC
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.
3. Reprezentace dokumentu
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
.
Poznámka
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.
3.1. Dokument XML
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.
3.2. Archiv
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.
3.2.1. 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.
Příklad 1. Manifest archivu – soubor manifest.xml
<?xml version="1.0"?>
<manifest xmlns="http://isdoc.cz/namespace/2013/manifest">
<maindocument filename="FV2013-042.isdoc"/>
</manifest>
Poznámka
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
.
4. Pravidla
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“.
4.1. Pravidla pro typ dokumentu daňový doklad
4.1.1. Vazba na původní doklad
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ý.
4.1.2. Konzistentní uvádění cizí měny
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
.
4.1.3. Konzistentní uvádění tuzemské měny
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.
4.1.4. Tuzemská a zahraniční měna musí být rozdílná
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
.
4.1.5. Správce číselníku podrobnějšího typu dokumentu
Element SubDocumentTypeOrigin
musí obsahovat pouze hodnoty uvedené v tabulce 1 – „Přípustné hodnoty pro element SubDocumentTypeOrigin“.
Tabulka 1. Přípustné hodnoty pro element SubDocumentTypeOrigin
Hodnota | Popis | Definice číselníku | Přidáno |
---|---|---|---|
CBA | Česká bankovní asociace | viz [ČBA-STD-29] | 1. ledna 2014 |
4.2. Pravidla pro typ dokumentu neplatební dokument
4.2.1. Správce číselníku podrobnějšího typu dokumentu
Element SubDocumentTypeOrigin
musí obsahovat pouze hodnoty uvedené v tabulce 1 – „Přípustné hodnoty pro element SubDocumentTypeOrigin“.
5. Digitální podpisy
5.1. Požadavky na digitální podpis v dokumentu ISDOC
- 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 prostoruhttp://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)
.
Příklad 2. Použití transformace XPath v digitálním podpisu
<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]
Příklad 3. Přiřazení unikátního identifikátoru podpisu
<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].
5.2. Požadavky na vícenásobný podpis dokumentu ISDOC
- 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).
- První podpis používá filtr
5.3. Ověření vícenásobného podpisu ve starších verzích formátu
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
elementuSignature
. -
Č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 pravidlemTimeStampResp
dle [RFC3161]. Časové razítko musí vždy obsahovat položkutimeStampToken
.[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>
- 1. Digitální podpis výstavce dokumentu. Podepsán je původní obsah faktury.
- 2. 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 ❼).
- 3. 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á.
- 4. Element
SignedInfo
obsahuje informace o podepisovaných datech, způsobu jejich kanonizace a metodě výpočtu podpisu.
- 5. Element
Reference
určuje data pro podepsání. AtributURI=""
říká, že se bude podepisovat celý stávající dokument (v našem případě původní faktura a podpis výstavce).
- 6. Element
Reference
musí mít přiřazen identifikátor, aby se na něj bylo možné odkázat z elementuDataObjectFormat
(viz ⓲).
- 7. Element
Reference
určuje data pro podepsání. AtributURI="#Signature-2-SignedProperties"
říká, že se bude podepisovat element, který má identifikátorSignature-2-SignedProperties
. V našem případě se jedná o elementSignedProperties
obsahující čas podepisování, otisk podpisového certifikátu (viz ⓯) a další informace. Zahrnutí těchto údajů do podpisu vyžaduje XAdES-BES.
- 8. Odkaz na podepisovaná data, v tomto případě na element
SignedProperties
(viz ⓭) obsahující zejména otisk podpisového certifikátu.
- 9. Element
KeyInfo
obsahuje podpisový certifikát. XAdES-BES vyžaduje, aby byl tento certifikát přítomen a byl podepsán jeho otisk v elementuSigningCertificate
.
- 10. Element
Object
slouží jako kontejner, do kterého je možné přidat doplňující informace pro digitální podpis včetně časového razítka XAdES-T.
- 11. Element
QualifyingProperties
obaluje všechny informace XAdES.
- 12. Atribut
Target
obsahuje odkaz na digitální podpis, kterého se týká časové razítko.
- 13. Element
SignedProperties
obaluje veškeré přídavné vlastnosti, které se podepisují. Zejména otisk podpisového certifikátu.
- 14. Čas UTC podepisování dokumentu. Čas musí vyhovovat datovému typu
dateTime
W3C XML schémat.
- 15. Informace o podpisovém certifikátu. Element
SigningCertificate
nesmí obsahovat atributId
(viz [2011/130/EU]) – odpovídající certifikát v elementuKeyInfo
(viz ❾) je nalezen na základě shody otisku certifikátu (viz ⓰).
- 16. 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
DigestMethod
.
- 17. Element
IssuerSerial
a jeho podlementy identifikují certifikační autoritu, která vystavila podpisový certifikát.
- 18. Element
DataObjectFormat
se pomocí atributuObjectReference
odkazuje na elementReference
(viz ❺), který do podpisu zahrnuje celý dokument ISDOC. Musí obsahovat podelementMimeType
určující MIME typ odkazovaných dat. V případě formátu ISDOC, který používá syntaxi XML, je MIME typ vždyapplication/xml
.
- 19. Element
EncapsulatedTimeStamp
obsahuje samotné časové razítko ve formátu ASN.1/DER zakódované pomocí base64.
A. Schémata pro jednotlivé typy dokumentů
- Přehledný grafický diagram schématu (zip, 2 MB; nutno uložit na disk, rozbalit a spustit)
- isdoc-invoice-6.0.1 (xsd, 137 kB)
A.2. Schéma pro neplatební dokument
- isdoc-commondocument-6.0.1 (xsd, 36 kB)
- isdoc-manifest-6.0.1 (xsd, 2 kB)
B. Schéma pro kontrolu vybraných pravidel
(isdoc-6_0_1 (sch, 18 kB))
<?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
C. Změny oproti předchozím verzím
C.1. Změny oproti verzi 5.3.1 z 30.12.2011
- 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
aElectronicPossibilityAgreementReference
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 vOriginalDocumentReferences
.
- Přidán element
ClientBankAccount
pro velké výstavce B2C faktur.
- Přidány elementy
SubDocumentType
aSubDocumentTypeOrigin
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ý atributpartialPayment
, 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
).
D. Možné změny pro další verze
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í.
Reference
[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.