<?xml version="1.0" encoding="UTF-8"?>
<!--
    Trik-Digitalni-Cijenik 1.0
    Shema objavljenog cjenika prema Odluci NN 101/2026-1213, Odluci o dodatnoj
    cijeni NN 101/2026-1212 i Pravilniku o isticanju cijena NN 105/2026-1270.

    Shema provjerava oblik i tipove. Pravila koja ovise o vrsti stavke
    (proizvod treba marku i cijenu po jedinici mjere, usluga treba vrstu i
    opseg, akcija treba najnižu cijenu u 30 dana) ne mogu stati u XSD 1.0 jer
    traže uvjetnu obvezatnost, pa ih provjerava alati/provjeri-cjenik-format.py.

    Dokument bez pogreške u shemi zato još nije nužno usklađen; usklađen je onaj
    koji prođe i shemu i validator.
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <!-- ─────────────────────────────────────────────── jednostavni tipovi -->

    <xs:simpleType name="tipDaNe">
        <xs:annotation><xs:documentation>
            Istina i laž pišu se istom riječju u XML-u i u CSV-u, da se stupac
            može prepisati iz jedne datoteke u drugu bez prevođenja.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="da"/>
            <xs:enumeration value="ne"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipIznos">
        <xs:annotation><xs:documentation>
            Iznos u eurima, decimalna točka, uvijek dvije decimale: 12.00, 7.50.
            Bez oznake valute, bez razdjelnika tisućica, bez zareza.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{1,9}\.[0-9]{2}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipIznosIliPrazno">
        <xs:restriction base="xs:string">
            <xs:pattern value="([0-9]{1,9}\.[0-9]{2})?"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipDatum">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipDatumIliPrazno">
        <xs:restriction base="xs:string">
            <xs:pattern value="([0-9]{4}-[0-9]{2}-[0-9]{2})?"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipVrijeme">
        <xs:annotation><xs:documentation>
            Trenutak objave s pomakom zone, npr. 2026-10-01T07:30:01+02:00.
            Zona je obvezna jer poslužitelj obično radi po UTC-u, a rok je
            08:00 po hrvatskom vremenu.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([+\-][0-9]{2}:[0-9]{2}|Z)"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipOib">
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{11}"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipTekst">
        <xs:restriction base="xs:string">
            <xs:maxLength value="500"/>
        </xs:restriction>
    </xs:simpleType>

    <!--
        Opseg usluge i napomena nose tekst propisa, ne oznaku: uvjeti plaćanja,
        otkazivanja i pripadajući troškovi lako prijeđu 500 znakova. Granica od
        500 srušila je 24. 9. 2026. prvu objavu jedne stavke od 587 znakova, pa
        je za ta dva polja podignuta. Popuštanje granice ne čini nijednu raniju
        datoteku neispravnom.
    -->
    <xs:simpleType name="tipDugiTekst">
        <xs:restriction base="xs:string">
            <xs:maxLength value="2000"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipCjenika">
        <xs:restriction base="xs:string">
            <xs:enumeration value="usluge"/>
            <xs:enumeration value="proizvodi"/>
            <xs:enumeration value="mjesovito"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipPrimjene">
        <xs:annotation><xs:documentation>
            live je jedina vrijednost koja smije stajati na javnoj adresi.
            demo i test postoje da se probni podaci prepoznaju i ne uđu ni u
            jedan zakonski izračun.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="live"/>
            <xs:enumeration value="demo"/>
            <xs:enumeration value="test"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipKanala">
        <xs:annotation><xs:documentation>
            Svaka poslovnica i svaki kanal dobivaju vlastitu datoteku, pa jedna
            datoteka opisuje točno jedan kanal.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="objekt"/>
            <xs:enumeration value="webshop"/>
            <xs:enumeration value="web"/>
            <xs:enumeration value="teren"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipStavke">
        <xs:restriction base="xs:string">
            <xs:enumeration value="usluga"/>
            <xs:enumeration value="proizvod"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipDostupnosti">
        <xs:restriction base="xs:string">
            <xs:enumeration value="dostupno"/>
            <xs:enumeration value="nedostupno"/>
            <xs:enumeration value="po-narudzbi"/>
            <xs:enumeration value="rasprodano"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:simpleType name="tipBrojaPohrane">
        <xs:annotation><xs:documentation>
            Redni broj objave, šest znamenki s vodećim nulama. Raste i nikad se
            ne ponavlja, jer ulazi u naziv datoteke u arhivi.
        </xs:documentation></xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{6,}"/>
        </xs:restriction>
    </xs:simpleType>

    <!-- ───────────────────────────────────────────────── složeni dijelovi -->

    <xs:complexType name="tipCijenePoJmj">
        <xs:annotation><xs:documentation>
            Cijena po mjernoj jedinici. Kad vrijedi iznimka iz NN 105/2026-1270,
            element ostaje prazan, a razlog stoji u atributu iznimka.
        </xs:documentation></xs:annotation>
        <xs:simpleContent>
            <xs:extension base="tipIznosIliPrazno">
                <xs:attribute name="jmj" type="tipTekst"/>
                <xs:attribute name="iznimka" type="tipTekst"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="tipTroska">
        <xs:annotation><xs:documentation>
            Pripadajući trošak usluge: ugrađena roba, materijal, izlazak na
            teren. Sadržaj elementa je iznos. ukljucen="da" znači da je iznos
            već u maloprodajnoj cijeni, ukljucen="ne" da se doplaćuje.
        </xs:documentation></xs:annotation>
        <xs:simpleContent>
            <xs:extension base="tipIznos">
                <xs:attribute name="naziv" type="tipTekst" use="required"/>
                <xs:attribute name="ukljucen" type="tipDaNe" use="required"/>
                <xs:attribute name="jmj" type="tipTekst"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="tipTarifnogElementa">
        <xs:annotation><xs:documentation>
            Element od kojeg se formira cijena usluge koja se ne može unaprijed
            odrediti: sat rada, metar, izlazak. Sadržaj elementa je maloprodajna
            cijena tog elementa. Svaki element ima vlastitu dodatnu cijenu.
        </xs:documentation></xs:annotation>
        <xs:simpleContent>
            <xs:extension base="tipIznos">
                <xs:attribute name="naziv" type="tipTekst" use="required"/>
                <xs:attribute name="jmj" type="tipTekst" use="required"/>
                <xs:attribute name="dodatna_cijena" type="tipIznos" use="required"/>
                <xs:attribute name="referentni_datum" type="tipDatum" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:complexType name="tipObjekta">
        <xs:sequence>
            <xs:element name="naziv"  type="tipTekst"/>
            <xs:element name="oib"    type="tipOib"/>
            <xs:element name="adresa" type="tipTekst"/>
            <xs:element name="oznaka" type="tipTekst">
                <xs:annotation><xs:documentation>
                    Stalna oznaka poslovnice, proizvoljna ali nepromjenjiva.
                </xs:documentation></xs:annotation>
            </xs:element>
            <xs:element name="vrsta"  type="tipTekst"/>
            <xs:element name="kanal"  type="tipKanala"/>
            <xs:element name="url"    type="tipTekst" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="tipObjave">
        <xs:sequence>
            <xs:element name="broj_pohrane" type="tipBrojaPohrane"/>
            <xs:element name="vrijeme"      type="tipVrijeme"/>
            <xs:element name="vrijedi_za"   type="tipDatum">
                <xs:annotation><xs:documentation>
                    Radni dan za koji cjenik vrijedi. Objava ide do 08:00 tog dana.
                </xs:documentation></xs:annotation>
            </xs:element>
            <xs:element name="broj_stavki"  type="xs:nonNegativeInteger"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="tipStavkeCjenika">
        <xs:sequence>
            <xs:element name="sifra"      type="tipTekst"/>
            <xs:element name="naziv"      type="tipTekst"/>
            <xs:element name="kategorija" type="tipTekst" minOccurs="0"/>

            <!-- proizvod -->
            <xs:element name="marka"         type="tipTekst" minOccurs="0"/>
            <xs:element name="barkod"        type="tipTekst" minOccurs="0"/>
            <xs:element name="jmj"           type="tipTekst" minOccurs="0"/>
            <xs:element name="neto_kolicina" type="tipTekst" minOccurs="0"/>

            <!-- usluga -->
            <xs:element name="vrsta_usluge" type="tipTekst" minOccurs="0"/>
            <xs:element name="opseg"        type="tipDugiTekst" minOccurs="0"/>

            <!-- cijene -->
            <xs:element name="maloprodajna_cijena" type="tipIznosIliPrazno"/>
            <xs:element name="cijena_po_jmj"       type="tipCijenePoJmj" minOccurs="0"/>
            <xs:element name="dodatna_cijena"      type="tipIznosIliPrazno"/>
            <xs:element name="referentni_datum"    type="tipDatum"/>

            <!-- posebni oblik prodaje -->
            <xs:element name="posebni_oblik"           type="tipDaNe"/>
            <xs:element name="naziv_posebnog_oblika"   type="tipTekst" minOccurs="0"/>
            <xs:element name="posebni_oblik_od"        type="tipDatumIliPrazno" minOccurs="0"/>
            <xs:element name="posebni_oblik_do"        type="tipDatumIliPrazno" minOccurs="0"/>
            <xs:element name="najniza_cijena_30_dana"  type="tipIznosIliPrazno" minOccurs="0"/>

            <xs:element name="dostupnost" type="tipDostupnosti"/>

            <xs:element name="troskovi" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="trosak" type="tipTroska" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:element name="tarifni_elementi" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="element" type="tipTarifnogElementa" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>

            <xs:element name="napomena" type="tipDugiTekst" minOccurs="0"/>
        </xs:sequence>

        <xs:attribute name="vrsta" type="tipStavke" use="required"/>
        <xs:attribute name="cijena_varijabilna" type="tipDaNe" default="ne"/>
    </xs:complexType>

    <!-- ──────────────────────────────────────────────────────── dokument -->

    <xs:element name="cjenik">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="objekt" type="tipObjekta"/>
                <xs:element name="objava" type="tipObjave"/>
                <xs:element name="stavke">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="stavka" type="tipStavkeCjenika"
                                        minOccurs="1" maxOccurs="unbounded"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>

            <xs:attribute name="standard" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="trik-digitalni-cijenik"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="verzija" use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:pattern value="1\.[0-9]+"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="tip"      type="tipCjenika"  use="required"/>
            <xs:attribute name="valuta"   use="required">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="EUR"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="primjena" type="tipPrimjene" use="required"/>
        </xs:complexType>

        <xs:unique name="sifraJedinstvena">
            <xs:selector xpath="stavke/stavka"/>
            <xs:field xpath="sifra"/>
        </xs:unique>
    </xs:element>

</xs:schema>
