# Validácia

URL: https://postman.slovakodata.com/developers/validacia/
Aktualizované: 2026-09-02

Päť validačných vrstiev od XML po slovenské pravidlá.

Päť vrstiev. Prvá fatálna chyba zastaví ďalšie a dokument sa neodošle.

| Vrstva | Čo kontroluje | Pri chybe |
|---|---|---|
| `L1` | Správne utvorené XML | <span class="status-pill s-danger">FATAL</span> |
| `L2` | Schéma UBL 2.1 (XSD) | <span class="status-pill s-danger">FATAL</span> |
| `L3` | EN 16931 (CEN Schematron) | <span class="status-pill s-danger">FATAL</span> alebo <span class="status-pill s-warn">WARNING</span> |
| `L4` | Peppol BIS Billing 3.0 (Schematron) | <span class="status-pill s-danger">FATAL</span> |
| `L5` | Slovenské pravidlá podľa transpozície BIS | <span class="status-pill s-danger">FATAL</span> alebo <span class="status-pill s-warn">WARNING</span> |

### Každá vrstva hlási vlastný výsledok

Vrstvy `L2`, `L3` a `L4` bežia ako jeden reťazec, takže sa **pravidlá nespúšťajú dvakrát**.
Napriek tomu má každá vlastný výsledok — nález sa priradí podľa toho, ktorá sada pravidiel
ho vyrobila.

Hodnota vrstvy je <span class="status-pill s-ok">OK</span>,
<span class="status-pill s-warn">WARNING</span>, <span class="status-pill s-danger">FATAL</span>
alebo <span class="status-pill s-warn">SKIPPED</span>.

**`SKIPPED` neznamená „prešlo".** Znamená, že vrstva vôbec nebežala, lebo reťazec sa zastavil
skôr: chyba XSD zastaví `L3` aj `L4`, fatálna chyba na `L1` zastaví všetko ostatné. „Neoverené"
a „v poriadku" sa nikdy nezlejú do jednej hodnoty.

Vrstva `L5` môže navyše vrátiť `ERROR` — slovenskú sadu pravidiel sa nepodarilo spustiť.
Dokument to nezastaví, ale do upozornení pribudne nález s `rule_id` `SK_ENGINE`, aby bolo
z odpovede zrejmé, že slovenské pravidlá overené neboli.

### Čo kontroluje slovenská vrstva

Vrstva `L5` sa spúšťa, keď je dodávateľ slovenský subjekt. Rozlišuje dve
závažnosti — fatálna chyba dokument zastaví, upozornenie ho len označí a pošle
ďalej.

- **Fatálne:** chýbajúca schéma `0245` pri identifikátoroch, neúplná adresa dodávateľa alebo odberateľa.
- **Upozornenie:** podozrivý formát DIČ alebo IČO, chýbajúca právna forma, nezrovnalosti pri daňovom zástupcovi.

### Výsledok validácie cez API

```http
GET /api/v1/invoices/{id}/validation
X-Api-Key: …
Accept-Language: sk
```

Vracia **posledný** verdikt uložený k faktúre. Výsledky sú append-only — opakovaná validácia
po oprave pridá nový záznam a starý zostáva v histórii.

| Stav | Kedy |
|---|---|
| `200` | verdikt existuje |
| `202` | faktúra je ešte `PENDING` alebo `VALIDATING`; `retry_after` aj hlavička `Retry-After` hovoria, o koľko sekúnd skúsiť znova |
| `404` | faktúra neexistuje — alebo je z čias pred zavedením zápisu výsledkov a verdikt už nedostane |

Nálezy majú **rovnaký tvar ako v [predbežnej validácii](/developers/predbezna-validacia/)**:
`title`, `explanation` a `fix` sú lokalizované podľa hlavičky `Accept-Language` (`sk` alebo
`en`, bez hlavičky `en`; použitý jazyk vraciame v `Content-Language`), `raw_message` a
`raw_location` sú originálny text Schematronu a XPath. Jeden model nálezu vám preto stačí pre
oba endpointy.

```json
{
  "id": "5a0c…",
  "invoice_id": "7104dd91-…",
  "created_at": "2026-09-01T09:41:10Z",
  "valid": false,
  "overall_severity": "FATAL",
  "validation_levels": {
    "L1_xml": "OK", "L2_xsd": "OK", "L3_en16931": "OK",
    "L4_peppol": "FATAL", "L5_sk": "SKIPPED"
  },
  "errors": [{
    "rule_id": "PEPPOL-EN16931-R001",
    "rule_set": "PEPPOL",
    "level": 4,
    "severity": "FATAL",
    "raw_message": "Business process MUST be provided.",
    "raw_location": "/Invoice[1]/cbc:ProfileID",
    "title": "Chýba identifikátor obchodného procesu",
    "explanation": "Peppol vyžaduje, aby faktúra deklarovala…",
    "fix": "Doplňte element cbc:ProfileID s hodnotou…",
    "location": "/Invoice[1]/cbc:ProfileID",
    "localized": true
  }],
  "warnings": [],
  "truncated": false,
  "total_findings": 1,
  "duration_ms": 1840
}
```

Príklad je skrátený — odpoveď nesie aj zastarané polia opísané nižšie. `id` rozlišuje beh
validácie, ktorý verdikt vyrobil.

Ak pravidlo v katalógu ešte nemáme, `localized` je `false` a `title` obsahuje originálnu
anglickú správu. Pri viac než 500 nálezoch je zoznam skrátený (`truncated`), skutočný počet
je v `total_findings`; chyby majú prednosť pred upozorneniami.

#### Zastarané polia — odstránia sa v 2.0.0

Do verzie 2.0.0 odpoveď obsahuje aj pôvodné polia s rovnakou hodnotou, aby existujúce
integrácie fungovali bez zmeny. V OpenAPI sú označené `deprecated: true`.

| Zastarané | Použite namiesto toho |
|---|---|
| `overallSeverity` | `overall_severity` |
| `validationLevels` | `validation_levels` |
| `durationMs` | `duration_ms` |
| `invoiceId` | `invoice_id` |
| `createdAt` | `created_at` |
| `organizationId` | bez náhrady — je to organizácia volajúceho |
| nález: `ruleId` | `rule_id` |
| nález: `ruleSet` | `rule_set` |
| nález: `message` | `raw_message` (originál) alebo `title` (lokalizované) |
| nález: `location` | `raw_location` — do 2.0.0 nesie `location` XPath, potom bude čitateľnou pozíciou ako v predbežnej validácii |
