10. Přijaté faktury (nákupy)

Přidáno v3.5.0 jako součást fáze 1 integrace forku myinvoiceDph (Martin Říha).

Přijaté faktury jsou doklady, které dostáváš od svých dodavatelů — peníze odcházejí z firmy. Oproti vystaveným fakturám:

Vystavené (faktura)Přijaté (purchase invoice)
Směr penězKlient → my (příjem)My → dodavatel (výdaj)
ProtistranaZákazník (is_customer=1)Dodavatel (is_vendor=1) — stejná tabulka klientů, jiný flag
DPH roleSbíráme od klientů (výstupní DPH)Odečítáme z dodavatelských (vstupní DPH)
ČíslováníNaše 2605001Číslo dodavatele (na originálu) + naše interní PF2605001 (dle daňového typu, viz 10.2.4)
Status flowdraft → issued → sent → paiddraft → received → booked → paid
Schvalování / odesíláníAno, klient potvrdíNe, doklad jen evidujeme

V hlavním menu Přijaté faktury.

10.1 Stavy přijaté faktury

StavVýznamCo lze
Koncept (draft)Rozpracovaný — ještě jsi nepotvrdil že to je platná fakturaUpravit, smazat, přejít na Přijatá
Přijatá (received)Doklad potvrzený jako platný — visí na nezaplacenýchOznačit jako zaúčtovaná, uhrazená, stornovat
Zaúčtovaná (booked)Předala se účetní / poslala do účetnictvíOznačit jako uhrazená, stornovat
Uhrazená (paid)Zaplaceno (manuálně nebo automaticky z bankovního výpisu)— (terminal)
Stornovaná (cancelled)Stornovaný doklad — necháváme pro audit— (terminal)

Smazat jde jen koncept. Pro pozdější stavy použij Stornovat (zachová auditní stopu).

10.2 Nová přijatá faktura

V seznamu klikni + Nová přijatá faktura. Otevře se formulář.

10.2.1 Drag & drop PDF

Nad formulářem je drag & drop zóna. Pokud máš PDF od dodavatele:

💡 *Od v4.9.0:* doklad jde nahrát už při zakládání nové faktury (po přetažení se ukáže kartička „soubor připraven, nahraje se po uložení") i z detailu faktury, která zatím doklad nemá — dřív to šlo jen v editaci. Kromě PDF lze přetáhnout i fotku (JPG/PNG/WEBP/HEIC), systém ji převede na PDF.

Limity:

10.2.2 Povinná pole

PoleVýznam
DodavatelVyber z dropdownu (autocomplete). Pokud chybí, klikni „+ Vytvořit nového dodavatele" — využije ARES lookup podle IČO.
Číslo dokladu dodavateleTak jak je vytištěno na originálu (např. FA-2026-001). Max 50 znaků. Unique per (dodavatel, datum vystavení) — nelze importovat 2× stejnou.
Naše interní čísloVolitelné. Pokud necháš prázdné, vygeneruje se automaticky podle šablony při přechodu na stav Přijatá. Výchozí šablona je {PP}{YY}{MM}{CCC} (např. PF2602001), prefix {PP} odpovídá daňovému typu (viz 10.2.4): PF/PN plný nárok (uznatelný/ne), KU/KN krácený, NU/NN bez nároku. Počítadlo je per měsíc (přeteče na 4+ místa nad 999 dokladů). Šablonu lze změnit v Nastavení → Číslování faktur → Šablona pro přijatou fakturu (např. legacy PF-{YYYY}{MM}-{CCCC}PF-202605-0001). Při ručním zadání čísla systém hlídá kolize (nepovolí duplicitu) a auto-generátor obsazená čísla přeskakuje.
Typ dokladuFaktura / Doklad o úhradě / Dobropis / Záloha (pro filtrování v seznamu).
Datum vystaveníZ faktury.
DUZP (datum uskutečnění zdanitelného plnění)Klíčové pro DPH období. Default = datum vystavení. U reverse charge se doklad zařazuje do DPH období právě podle DUZP (povinnost přiznat daň vzniká bez ohledu na doručení dokladu); u pořízení zboží z EU je DUZP dle § 25 ZDPH 15. den měsíce následujícího po dodání, pokud doklad nebyl vystaven dříve — editor to připomene hintem.
SplatnostZ platebních podmínek dodavatele.
Datum přijetíKdy jsi to fyzicky / e-mailem dostal. Default = dnes.
Měna fakturyMěna, ve které je doklad vystaven (USD, EUR, CZK…).
Kurz k DUZPPokud je měna ≠ CZK, musíš zafixovat kurz. Tlačítko „Načíst z ČNB" stáhne aktuální nebo poslední dostupný denní kurz.
Reverse chargeZaškrtni, pokud je doklad B2B s přenesenou daňovou povinností (pořízení zboží z EU, služby z EU/3. země, tuzemský §92a). Položkám nastav tuzemskou sazbu (typicky 21 %) a odpovídající klasifikační kód — daň na dokladu zůstane 0 (dodavatel ji neúčtuje), samovyměření i zrcadlový odpočet dopočítají výkazy DPH. Viz § 10.2.6.

10.2.3 Položky

Tlačítkem + Přidat položku přidej řádek. Per řádek:

Souhrn dole se přepočítá automaticky po každé změně.

💡 Ceny „s DPH" (brutto režim) *(od v4.7.0)* — přepínačem Ceny zadávám s DPH (u DPH v hlavičce) lze zadat položky včetně DPH (typicky účtenka / paragon), takže celková částka sedí na haléř. DPH se pak počítá „shora" koeficientovou metodou (§37 ZDP). Zadání ceny do sloupce „Celkem s DPH" respektuje aktuální režim (nepřepíná ho); jednotková cena se v detailu i PDF zobrazuje jako netto. Funguje stejně jako u vystavených faktur — viz § 11.2.6. AI import účtenek režim nastaví sám.

10.2.4 Daňová uznatelnost a nárok na odpočet

V boxu Klasifikace jsou dva nezávislé příznaky řídící, jak faktura vstupuje do daňových výkazů:

PříznakMožnostiCo ovlivňuje
Nárok na odpočet DPHPlný / Bez nároku / KrácenýDPH evidenci
Daňově uznatelný nákladano / nedaň z příjmů (DPFO/DPPO)

Oba příznaky jsou vidět i v detailu přijaté faktury (box Měna/DPH).

💡 Interní číslo se řídí daňovým typem. Prefix automaticky generovaného interního čísla (viz 10.2.2) odpovídá těmto dvěma příznakům — PF/PN plný nárok (uznatelný/ne), KU/KN krácený §75, NU/NN bez nároku. Když u už očíslované faktury daňové uplatnění změníš, přepíše se jen prefix (PF2602001NN2602001); číselná řada {YYMM}{CCC} i ručně zadaná čísla zůstanou. Počítadlo je sdílené per dodavatel a měsíc napříč všemi prefixy, takže čísla jsou v rámci měsíce souvislá bez ohledu na daňový typ; případné mezery po smazaných konceptech jsou u interního označení neškodné (na rozdíl od vystavených faktur se u přijatých dokladů souvislá řada nevyžaduje).

Rekapitulace DPH dle dokladu (§ 73 ZDPH)

Přidáno ve v4.9.0.

Pod položkami je box Rekapitulace DPH se základem a daní za každou sazbu. Hodnoty se dopočítají ze řádků, ale pokud doklad dodavatele uvádí kvůli zaokrouhlení jiný základ nebo DPH, můžeš je přepsat přesně podle dokladu. Důvod je daňový: nárok na odpočet je svázaný s částkou daně uvedenou na dokladu (§ 73 odst. 6 ZDPH), proto je primární shoda s dokladem, ne náš přepočet.

Dodavatel neplátce DPH → bez nároku na odpočet

Přidáno v4.7.0.

Pokud je dodavatel neplátce DPH, na jeho dokladu žádná DPH není a není co odpočítat — uplatnit odpočet by byla daňová chyba (neoprávněný odpočet v ř. 40 přiznání / sekci B kontrolního hlášení). MyInvoice proto plátcovství dodavatele sleduje a vynucuje:

Plátcovství dodavatele je vidět i ve výpisu klientů/dodavatelů jako badge *Plátce DPH* (viz § 7.1).

🛠️ Zpětná oprava existujících dodavatelů — po upgradu na v4.7.0 jednorázově spusť php api/bin/backfill-vendor-vat-payer.php. Skript podle ARES/VIES doplní příznak plátcovství a u neplátců opraví už zaevidované přijaté faktury (zakáže odpočet, sazby na 0 %, celková částka beze změny). Výchozí běh je dry-run (jen náhled); zápis až s --apply.

10.2.5 Platba v jiné měně (multi-currency)

Klikni na „Platba v jiné měně než měna faktury" pokud máš tento scénář:

Faktura je v USD ($1000), ale platíš ji z CZK účtu (banka konvertuje na ~24 500 Kč s 1–2% spread / poplatkem).

V tomto bloku zadáš:

Systém automaticky vypočte:

10.2.6 Reverse charge z EU — pořízení zboží vs. služba

Od v4.16.0 (issues #116, #117).

Typický případ: nákup zboží od EU dodavatele (např. auto z Německa) — doklad je vystaven bez DPH (osvobozené intrakomunitární dodání) a daň si samovyměříš v ČR. Správné zaevidování:

CoZboží z EU (pořízení z JČS)Služba z EU/3. země
Sazba na řádcíchtuzemská 21 % (případně 12 %)tuzemská 21 %
Klasifikační kód23 „Pořízení zboží z JČS"24 „Přijetí služby"
DPH přiznáníř. 3 (samovyměření) + ř. 43 (odpočet); u majetku navíc ř. 47ř. 5/12 + ř. 43
Kontrolní hlášenísekce A.2
DUZP§ 25: 15. den měsíce po dodání, pokud doklad nebyl vystaven dříveden uskutečnění služby

Klíčové principy:

⚠️ U vybraných osobních automobilů pohlídej limit odpočtu dle § 72 (strop základu 2 000 000 Kč / DPH 420 000 Kč) — aplikace ho nehlídá.

10.3 Detail přijaté faktury

Po uložení / přechodu na detail:

10.3.1 Propojení zálohy s vyúčtovací fakturou (proti dvojímu započtení)

Přidáno v4.3.11.

Když ti dodavatel pošle nejdřív zálohovou fakturu (typ dokladu *Záloha* / proforma) a po zaplacení samostatnou vyúčtovací (finální) fakturu, máš v systému dva doklady na tentýž náklad. Bez propojení by se náklad počítal dvakrát (Náklady, CRM, daň z příjmů). Proto je lze spárovat.

Jak na to — v detailu finální faktury je box Zálohová faktura:

Jedna záloha může být navázaná jen na jednu finální fakturu.

Co propojení (a zaplacení) ovlivní:

OblastChování zálohy
Náklady, CRM statistikySpárovaná nebo zaplacená záloha se nepočítá (náklad nese vyúčtovací faktura). Nezaplacená a nespárovaná záloha se počítá jako očekávaný náklad.
Daň z příjmů (DPFO/DPPO)Záloha nikdy není uznatelný náklad (není daňový doklad) — bez ohledu na zaplacení/párování.
Výkazy DPH (Kniha DPH, DPHDP3, KH, souhrnné hlášení)Záloha do nich nevstupuje vůbec (není daňový doklad; tím je až vyúčtovací faktura).
Závazky / cashflowNezaplacená záloha zůstává jako reálný závazek k úhradě.

AI návrh propojení — když naimportuješ vyúčtovací fakturu přes AI extrakci z PDF (viz 10.7) a ta odkazuje na zálohu (text typu *„zaplaceno zálohou č. X"*), systém zkusí najít odpovídající zálohu a v detailu nabídne návrh propojení. Stačí ho Potvrdit (nebo Zamítnout) — nic se nepáruje automaticky.

10.4 Scan inbox — automatický import z adresáře

Pokud máš dodavatele kteří ti posílají PDF e-mailem nebo máš složku sdílených dokladů, nakonfiguruj inbox adresář v cfg.php:

'purchase_invoice' => [
    'inbox_dir'         => 'C:/inetpub/wwwroot/myinvoice.cz/inbox',
    'inbox_recursive'   => true,
    'allowed_exts'      => ['pdf', 'isdoc', 'xml'],
    'archive_storage'   => __DIR__ . '/storage/purchase-invoices',
],

V seznamu Přijaté faktury klikni 📥 Nascanovat inbox:

Modal po skončení zobrazí přehled: vytvořeno / přeskočeno / chyby + per-soubor detail.

Bezpečnost: soubory mimo configured inbox_dir jsou odmítnuty (path traversal guard přes realpath()). Maximum 500 souborů per běh (DoS protection na velké adresáře).

10.5 Klienti vs. dodavatelé

V tabulce klientů jsme zavedli dva flagy:

Některé firmy jsou současně zákazník i dodavatel (např. partnerská IT firma, kterou fakturuješ za development a od níž kupuješ hosting) — jedna entita = jedna řádka, oba flagy = 1. ARES synchronizace, kontakty, historie jsou sdílené.

V hlavním menu Klienti vidíš defaultně jen is_customer=1. V budoucí verzi přidáme oddělený view Dodavatelé pro is_vendor=1.

10.6 Export přijaté faktury (naše PDF / ISDOC / Pohoda)

V detailu přijaté faktury najdeš tlačítko „Exporty" s dropdown menu:

Naše PDF (rekonstrukce)

Vygeneruje naši vlastní PDF kopii ze strukturovaných dat. Užitečné když:

PDF obsahuje hlavičku s dodavatelem, položky, totals, poznámky. Footer poznámka: *„Naše rekonstrukce přijaté faktury z dat v MyInvoice.cz. Originál od dodavatele je referenční dokument."*

ISDOC XML

Export do ISDOC 6.0 standardu — kompatibilní s Pohoda, Money S3, iDoklad a dalšími. Strategie: role inversion — v ISDOC pro přijatou fakturu je *dodavatel* = původní vendor, *zákazník* = naše firma (opak vystavené).

Pohoda XML

Pohoda dataPack XML pro import do účetního software Pohoda. Direction = purchase (<pur:purchase> místo <inv:invoice>).

Hromadný export za měsíc

V hlavním menu Přijaté faktury → Exporty vyber měsíc + formát:

„Datum dle" volí, podle kterého data se faktura zařadí do měsíce: DUZP (tax), datum vystavení (issue, default) nebo datum přijetí (received).

10.7 AI extrakce — kontrola výsledků

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

Jak zrušit warning

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:

  1. Zachová popisy řádků z AI extraktu (jsou obvykle správně)
  2. Vynuluje jejich qty a unit_price (0)
  3. 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řidáno v4.7.0.

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 § 10.2.4.

Reverse charge ze zahraničí — automatika

Od v4.16.0 (issue #116).

Když extraktor detekuje reverse charge (zahraniční dodavatel + všechny řádky bez DPH), doklad automaticky daňově připraví:

Detail daňové logiky viz § 10.2.6.

10.8 Audit log

Akce s přijatými fakturami jsou logované v aktivním logu (Systém → Log):

10.9 REST API

Všechny operace jsou dostupné i přes REST API (/api/v1/purchase-invoices/*) — viz Swagger UI nebo Redoc. PAT token musí mít scope read_write pro mutace.

10.10 Status integrace forku

Všechny fáze plánu jsou dokončeny:

Detail viz source/09-fork-integration-plan.md.