Elektronická fakturace  

Přejdi na

Elektronická fakturace  


Rychlé linky: Mapa serveru Textová verze Rozšířené vyhledávání


 

Hlavní menu

 

 

Národní standard pro elektronickou fakturaci 6

Verze 6.0.1 z 26. 5. 2014 

 

 

 

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:

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:

  1. Soubory uložené v archivu musí být nekomprimované nebo musí používat kompresní metodu „deflate“ popsanou v [RFC1951].
  2. Archiv nesmí používat šifrování.
  3. Archiv nesmí používat digitální podpisy.
  4. Archiv nesmí používat funkci „patch data“.
  5. Archiv nesmí být rozdělen do více souborů.
  6. 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).
  7. 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

  1. Digitální podpis musí být v souladu s doporučením [XMLDSig-Core].
     
  2. 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.
     
  3. 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>
     
  4. 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>
     
  5. 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

  1. Podpis musí být v souladu s požadavky definovanými v 5.1 – „Požadavky na digitální podpis v dokumentu ISDOC“.
  2. Musí být použita transformace XPath a to následujícím způsobem:
    1. První podpis používá filtr not(ancestor-or-self::dsig:Signature).
    2. 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).

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ě:

  1. Pokud dokument obsahuje alespoň jeden digitální podpis, ověří se poslední digitální podpis.
  2. Poslední digitální podpis (element Signature) se z dokumentu odstraní a s takto upraveným dokumentem se opakuje krok 1.


 

6. Časové razítko

6.1. Požadavky na časové razítko v dokumentu ISDOC

  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].

  2. Digitální podpis, který je předmětem časového razítka, musí obsahovat unikátní identifikátor uvnitř atributu Id elementu Signature.

  3. Časové razítko musí být ve formě XAdES-T v souladu se specifikací [XAdES].

  4. 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]

  5. 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]

  6. Č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]

Příklad 4. ISDOC s digitálnímy podpisy výstavce, příjemce a časovým razítkem
<?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í. Atribut URI="" ří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 elementu DataObjectFormat (viz ⓲).
     
  • 7. Element Reference určuje data pro podepsání. Atribut URI="#Signature-2-SignedProperties" říká, že se bude podepisovat element, který má identifikátor Signature-2-SignedProperties. V našem případě se jedná o element SignedProperties 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 elementu SigningCertificate.
     
  • 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 atribut Id (viz [2011/130/EU]) – odpovídající certifikát v elementu KeyInfo (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í atributu ObjectReference odkazuje na element Reference (viz ❺), který do podpisu zahrnuje celý dokument ISDOC. Musí obsahovat podelement MimeType určující MIME typ odkazovaných dat. V případě formátu ISDOC, který používá syntaxi XML, je MIME typ vždy application/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ů

A.1. Schéma pro daňový doklad

A.2. Schéma pro neplatební dokument

A.3. Schéma pro manifest

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 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).

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.

vytisknout  e-mailem