25. AI extrakce faktur
Přijaté i vydané faktury lze importovat z PDF pomocí AI extrakce. Extrakci provádí jeden ze čtyř podporovaných poskytovatelů AI (Anthropic Claude, Azure OpenAI, OpenAI nebo Google Gemini) — volbu a přihlašovací údaje nastavíš v § 25.7 Multi-provider AI brána. Tato kapitola dále popisuje kontrolu výsledků extrakce a automatiky, které doklad daňově připraví.
Při AI extrakci z PDF se po importu automaticky spustí sanity check: sečtou se řádky bez DPH a porovnají s celkovým základem daně, který AI přečetla z PDF „K úhradě". Pokud se hodnoty liší o víc než 2 %, faktura získá flag „Ke kontrole" a uživatel by měl řádky před zaúčtováním ověřit.
Indikátory v UI
- Žluté zvýraznění řádku + ikona ⚠ vedle čísla faktury v seznamu přijatých faktur (
/purchase-invoices). - Filtr „Ke kontrole" v topbaru seznamu — zobrazí jen faktury, kde je flag aktivní.
- Žlutý warning banner v detailu i editoru faktury s diagnostickým textem (např. *„součet řádků bez DPH (XX) je vyšší než AI-vrácený základ daně bez DPH (YY) — rozdíl Z %"*).
Jak zrušit warning
- Tlačítko Beru na vědomí v banneru — pošle POST
/api/purchase-invoices/{id}/dismiss-extraction-warninga flag se smaže. - Automaticky při přechodu z draftu na další stav (received / booked / paid) — uživatel posunul stav = ověřil data.
Auto-upgrade modelu
Pokud levnější model (Haiku 4.5) vrátí slabý výsledek (vendor se shoduje s tenantem nebo součet řádků se výrazně liší od totalu), extractor automaticky zkusí znovu se silnějším modelem (Sonnet 4.6, ~4× dráž za extract). Pokud máš Sonnet/Opus jako default, retry se přeskočí.
Katastrofální mismatch — placeholder
Když ani silnější model nezvládne rozparsovat řádky (typicky komplexní multi-column servisní faktury) a součet řádků se liší od totalu o víc než 50 %, extractor:
- Zachová popisy řádků z AI extraktu (jsou obvykle správně)
- Vynuluje jejich qty a unit_price (0)
- Přidá první řádek KOREKCE s AI totalem z „K úhradě", aby seděl celkový součet faktury
Uživatel pak postupně doplní qty/cenu k jednotlivým řádkům a nakonec smaže korekční řádek.
Backfill existujících faktur
CLI skript php api/bin/recheck-ai-extracted-invoices.php projde přijaté faktury s PDF přílohou, re-spustí AI extrakci a porovná AI total s aktuálním DB totalem. Při rozdílu nad práh (default 2 %) zapíše varování:
php api/bin/recheck-ai-extracted-invoices.php # dry-run
php api/bin/recheck-ai-extracted-invoices.php --apply # zápis
php api/bin/recheck-ai-extracted-invoices.php --supplier-id=1
php api/bin/recheck-ai-extracted-invoices.php --threshold=0.05
Dodavatel neplátce DPH
Při AI importu se ověří plátcovství dodavatele (ARES/VIES, případně signál z dokladu „DIČ: Neplátce DPH"). U neplátce se automaticky nastaví Bez nároku na odpočet, vynulují sazby a doplní varování — aby se neoprávněný odpočet nedostal do přiznání. Detail viz § 23.2.4.
Reverse charge ze zahraničí — automatika
Když extraktor detekuje reverse charge (zahraniční dodavatel + všechny řádky bez DPH), doklad automaticky daňově připraví:
- AI klasifikuje povahu plnění (zboží / služba) přímo z dokladu (VIN a vozidlo → zboží; SaaS, licence, API → služba).
- Položky dostanou tuzemskou sazbu 21 % a klasifikační kód: 23 (zboží z EU → ř. 3 + ř. 43, KH A.2), 24 (služba), 25 (zboží ze 3. země). Částka k úhradě se nemění — daň zůstává na dokladu nulová, samovyměří se až ve výkazech.
- U pořízení zboží z EU se dopočítá zákonné DUZP dle § 25 (15. den měsíce po dodání, pokud doklad nebyl vystaven dříve) a k němu se naváže kurz ČNB — pozdě vystavená faktura tak spadne do správného DPH období.
- Do dokladu se zapíše informační varování s rekapitulací, co se nastavilo — zkontroluj hlavně zboží vs. služba a případně změň kód (23 ↔ 24).
Detail daňové logiky viz § 23.2.6.
25.7 Multi-provider AI brána (výběr poskytovatele)
AI extrakce neběží natvrdo nad jedním modelem — MyÚčto.cz nabízí AI bránu se čtyřmi poskytovateli, mezi kterými si každý dodavatel (tenant) vybere podle toho, co už používá, kde chce mít API klíč a jaké má požadavky na rezidenci dat:
- Anthropic Claude — BYOK (vlastní klíč z
console.anthropic.com), modelyclaude-haiku-4-5/claude-sonnet-4-6/claude-opus-4-7. Původní a výchozí volba, na kterou je AI extrakce v celém manuálu (viz výše) primárně odladěná — umí nativně číst PDF jako dokument (ne jen text/obrázek), takže má nejlepší přesnost na vícesloupcových a naskenovaných fakturách. - Azure OpenAI — vlastní Azure resource (
endpoint+deployment+api_version), hodí se, pokud firma už má Azure OpenAI smlouvu nebo potřebuje EU rezidenci dat se smluvním zajištěním od Microsoftu. - OpenAI (přímé API) — BYOK klíč z platformy OpenAI, modely řady GPT (
gpt-5,gpt-4.1,gpt-4oa jejichminivarianty). - Google Gemini — BYOK klíč z Google AI Studio, modely
gemini-3-pro/gemini-3-flash/gemini-2.5-pro/gemini-2.5-flash/gemini-2.0-flash.
Nastavení je per dodavatel (celá firma/tenant sdílí jednoho aktivního poskytovatele a jeho přihlašovací údaje, ne po jednotlivých uživatelích).
25.7.1 Kde se to nastavuje
Admin otevře Firma → AI nastavení (položka menu je viditelná jen adminům; vede na /admin/integrations?tab=ai). Pokud AI přihlašovací údaje ještě nejsou nastavené, sekce Nastavení AI extrakční brány je automaticky rozbalená; jakmile je aktivní poskytovatel nakonfigurovaný, sbalí se a nahoře zůstane jen zelené ✓ s jeho jménem (a případně štítek EU data residency).
V sekci nastavíš:
- Poskytovatele AI — přepínač se čtyřmi tlačítky (Anthropic / Azure OpenAI / OpenAI / Gemini), zelené ✓ u tlačítka znamená, že ten poskytovatel má už uložené přihlašovací údaje. Klik na tlačítko jen přepne, které přihlašovací údaje a model se dole zobrazí/upravují — neuloží to ještě aktivní volbu.
- Vynutit EU rezidenci dat (checkbox) a Region dat (EU/US) — viz § 25.7.2.
- Tlačítko Uložit nastavení brány — teprve tím se aktivní poskytovatel a EU volba zapíší k dodavateli a od té chvíle je používá i "Import přijatých" / drag&drop PDF na této stránce i AI import v Přijatých fakturách.
Pod tím je formulář Přihlašovací údaje — {poskytovatel}:
- Anthropic / OpenAI / Gemini — jen pole API klíč (BYOK, write-only — po uložení se nikdy nezobrazí zpátky, jen placeholder "uloženo") a volitelně Model (výběr z povoleného whitelistu daného poskytovatele; prázdné = použije se výchozí model poskytovatele).
- Azure OpenAI — navíc Azure endpoint, Deployment (název nasazeného modelu v Azure resource) a API verze.
- Tlačítko Test připojení ověří klíč/endpoint reálným voláním a nahlásí, jaký model odpověděl (nebo chybu). Klíč se validuje i po formátu už na frontendu (Anthropic musí začínat
sk-ant-, OpenAIsk-, GeminiAIza) — ušetří to zbytečný test s očividně špatně vloženým klíčem. - Tlačítko koš u nastaveného poskytovatele smaže jeho uložené přihlašovací údaje (po potvrzení) — pokud byl zrovna aktivní, extrakce přestane fungovat, dokud nenastavíš jiného poskytovatele nebo klíč nevložíš znovu.
U nakonfigurovaného poskytovatele vidíš i počet dosud provedených extrakcí (počítadlo per poskytovatel, nezávislé na tom, jestli je zrovna aktivní) a jeho štítek rezidence (např. *„EU (Azure OpenAI)"*).
Pokud brána ještě není pro dodavatele vůbec nakonfigurovaná a uživatel se pokusí o AI import v Import přijatých, zobrazí se upozornění s odkazem přímo sem („→ AI nastavení").
25.7.2 EU rezidence dat — co to znamená a jak se vynucuje
Checkbox Vynutit EU rezidenci dat říká systému: *„tento dodavatel smí AI extrakci posílat jen na servery fyzicky v EU, nikdy do USA."* Hodí se pro firmy se zpřísněnými požadavky na GDPR/rezidenci dat (např. veřejná správa, citlivější obory, interní compliance politika).
Ne každý poskytovatel to ale umí stejně:
| Poskytovatel | EU-schopný? | Jak se region určí |
|---|---|---|
| Azure OpenAI | Ano | Podle hostname Azure endpointu — pokud obsahuje token EU regionu (westeurope, swedencentral, germanywestcentral, northeurope, francecentral, norwayeast, switzerlandnorth, polandcentral, italynorth, spaincentral, uksouth, ukwest…), region = EU. Jinak platí deklarovaný region dodavatele, ale jen pro ověřený Azure host — neplatný/cizí host padá fail-closed na US. |
| OpenAI | Ano | Jen když je Base URL nastaveno přesně na https://eu.api.openai.com (OpenAI project data residency). Cokoli jiného (včetně prázdného pole = výchozí api.openai.com) = US. |
| Anthropic Claude | Ne (v1) | Přímé API v1 nabízí jen US region. |
| Google Gemini | Ne (v1) | Přímé API (AI Studio) je jen US; EU by šlo jen přes Vertex AI regionální endpoint, což zatím nepodporujeme. |
Pokud zaškrtneš Vynutit EU rezidenci dat u poskytovatele, který EU neumí (Anthropic, Gemini, nebo Azure/OpenAI se špatně nastaveným endpointem), tlačítko poskytovatele se v přepínači znepřístupní a pod přepínačem se zobrazí červené upozornění *„Vybraný poskytovatel/konfigurace nepodporuje EU rezidenci…"*. Volba Region dat: US je navíc v selectu zamčená, dokud je vynucení EU zapnuté.
Tohle není jen kosmetika ve formuláři. Server vynucuje stejné pravidlo fail-closed i nezávisle na UI — každé volání extrakce (i test připojení, i automatický upgrade na silnější model) si znovu ověří skutečný region podle konfigurace poskytovatele. Pokud by se dostal EU-required dodavatel přesto na non-EU endpoint, volání skončí chybou residency_conflict, žádná data se neodešlou a žádný cross-provider ani cross-tenant fallback se nekoná — buď proběhne extrakce ve správném regionu, nebo neproběhne vůbec.
25.7.3 Výběr modelu a chování shodné napříč poskytovateli
Ať zvolíš kteréhokoli poskytovatele, chování zbytku extrakce zůstává stejné — funkce popsané výše v této kapitole (sanity check, flag „Ke kontrole", auto- upgrade modelu, katastrofální mismatch/placeholder, kontrola plátcovství DPH, reverse charge automatika) fungují nad výsledkem libovolného aktivního poskytovatele, ne jen nad Anthropic:
- Výchozí model (pole *Model* ve formuláři přihlašovacích údajů) se použije, pokud u konkrétního importu nezvolíš jiný. Whitelist modelů je uzavřený — nelze zapsat libovolný řetězec, jen jeden z nabízených.
- Auto-upgrade z „Auto-upgrade modelu" platí analogicky u všech poskytovatelů (Anthropic haiku→sonnet, OpenAI/Azure
*-mini→plný model, Gemini flash→pro) a upgrade nikdy nepřeskočí do jiného regionu — zůstává u stejného poskytovatele a stejné rezidence dat. - Výsledek extrakce nese provenance badge — u naimportované faktury vidíš, který poskytovatel a jaký region data zpracoval (užitečné pro audit/kontrolu, zvlášť když je zapnuté vynucení EU rezidence).
- Maximální velikost PDF k extrakci se liší poskytovatel od poskytovatele (Anthropic 32 MB, ostatní 20 MB) — u větších souborů extrakce vrátí chybu.
25.7.4 Omezení a tipy
- Aktivní poskytovatel je nastavení celého dodavatele, ne uživatele — změna se projeví pro všechny uživatele firmy okamžitě po uložení.
- API klíč je write-only: jakmile ho jednou uložíš, systém ho už nikdy nezobrazí zpět (ani adminovi) — jen potvrdí, že je nastavený. Pro změnu klíče ho zadej znovu celý, prázdné pole = zachovat stávající.
- Než přepneš poskytovatele naostro, použij Test připojení — ověří klíč i to, že vrácený model odpovídá whitelistu.
- Privacy: obsah nahraného PDF (položky, IČ/DIČ dodavatele, vlastní data) jde přes HTTPS na servery zvoleného poskytovatele. Pro obzvlášť citlivé doklady zvaž ISDOC import (data zůstanou lokálně, AI se vůbec nevolá).
Nejsi si jistý, kterého poskytovatele zvolit? Anthropic Claude je výchozí a nejodladěnější volba (nativní čtení PDF, nejlepší přesnost na komplexních fakturách). Azure OpenAI zvol, pokud firma potřebuje EU rezidenci dat se smluvním zajištěním nebo už Azure OpenAI používá pro jiné účely.
25.8 AI import vydaných faktur
Cesta: Prodej → AI import. Položku vidí uživatel, který smí vytvářet vydané faktury.
Stránka přijímá PDF, obrázek, ISDOC nebo ISDOCX a vždy vytváří jen koncept vydané faktury. Pokud soubor obsahuje platný ISDOC, systém použije jeho strukturovaná data a AI vůbec nevolá. Teprve když strukturovaná data chybí, použije aktivního poskytovatele a model z § 25.7.
Z jednoho souboru systém vytěží odběratele, data dokladu, měnu, platební údaje a položky. Odběratele vyhledá nebo založí, vytvoří koncept stejnou interní cestou jako ruční editor a přepočítá jeho součty. Číslo z dokladu převezme jen tehdy, pokud v aktuální firmě nekoliduje; jinak dostane koncept nové číslo až při vystavení. U ISDOC navíc ověří, že dodavatelem je aktuálně zvolená firma. Existující ISDOC se stejným variabilním symbolem vrátí jako duplicita místo založení druhé faktury.
Po úspěchu klikni na odkaz do editoru a ověř zejména odběratele, typ dokladu, DUZP, splatnost, režim cen s/bez DPH, sazby a text položek. Import sám fakturu nevystaví, neodešle a nezaúčtuje.
Při přetažení více souborů vznikne dávka. Zpracovává se postupně po jednom, aby nepřetížila limit poskytovatele; u každého řádku je samostatný výsledek a odkaz na vytvořený koncept. Pro jednotlivý import i dávku lze dočasně vybrat jiný model z whitelistu aktivního poskytovatele. Maximální velikost jednoho uploadu je 32 MiB; konkrétní poskytovatel může mít nižší limit uvedený v § 25.7.3.
Výsledek nese zdroj (ISDOC, AI nebo duplicita), poskytovatele, model, region a případně spotřebu tokenů. Tyto údaje se spolu s názvem a velikostí souboru zapisují do activity logu; samotné přihlašovací údaje ani obsah dokladu se do něj nezapisují.