17. Importy (Pohoda XML, ISDOC, PDF/A-3, iDoklad API, Fakturoid API)

Pokud máš historické vystavené faktury v jiném systému (Pohoda, iDoklad, Fakturoid, Superfaktura nebo jiný fakturační software podporující ISDOC), můžeš je do MyInvoice naimportovat — nemusíš je opisovat ručně.

Existují dvě cesty:

  1. Soubor upload (Pohoda XML, ISDOC, PDF/A-3 s embedded ISDOC) — sekce 17.1–17.7
  2. Přímý API import z iDoklad / Fakturoid (OAuth2 credentials + background job) — sekce 17.8–17.9

Importují se jen tvoje vystavené faktury (ne přijaté, ne nákupní doklady jiné firmy). Dodavatel ve vstupním souboru se musí shodovat s aktuálně zvoleným dodavatelem v aplikaci.

17.1 Obrazovka importů

V hlavním menu Systém → Importy.

Formulář:

17.2 Co se založí

Pro každou fakturu v souboru:

EntitaLogika
KlientLookup po IČO. Pokud neexistuje, načteme adresu z ARES (preferenčně), fallback na adresu z XML. Vznikne nový klient.
ZakázkaKdyž má faktura číslo zakázky (ISDOC OrderReference/ID, Pohoda numberOrder), přiřadí se k zakázce s tím číslem (vytvoří se, pokud chybí). Pokud nemá číslo zakázky, ale klient má v importovaném balíku více různých e-mailů, vytvoří se per-email zakázka s názvem {Firma} – {email}. Jinak bez zakázky.
FakturaPřepíše se do invoices se zachovaným původním varsymbolem. Položky, sazby DPH, kurz, měna se převezmou. Snapshoty (klient/dodavatel/banka) se zafixují z aktuálních dat.

17.3 Stav (paid vs issued) — pravidlo 30 dní

Aby ses nemusel po importu zabývat starými fakturami:

17.4 Co se přeskočí

17.5 Report

Po importu vidíš tabulku:

SloupecVýznam
SouborCesta v balíku (název ZIPu / interní cesta)
Stavvytvořeno / přeskočeno / chyba
Var. symbolZ faktury
DetailLink na vytvořenou fakturu, badge paid/issued, štítky + klient / + zakázka (pokud něco vzniklo). U přeskočených/chybných: důvod.

17.6 PDF/A-3 import (embedded ISDOC)

Většina českých fakturačních systémů (iDoklad, Fakturoid, Superfaktura, Pohoda, MyInvoice) dnes vkládá ISDOC XML přímo do PDF dokumentu jako přílohu — viz standard PDF/A-3 + ISDOC spec. Pokud máš v ruce jen PDF faktury (typicky to, co ti přišlo emailem od dodavatele), můžeš ho importovat přímo — MyInvoice z něj vytáhne embedded *.isdoc přílohu a importuje stejně, jako kdybys nahrál samostatný .isdoc soubor.

Jak to poznáš, jestli PDF má embedded ISDOC?

Co když PDF přílohu nemá?

Pak ho nelze automaticky importovat — pure PDF nemá strukturovaná data faktury, jen vizuální layout. Import vyhodí čitelnou chybu „PDF neobsahuje ISDOC přílohu". V tom případě:

Co se podporuje:

Limity:

17.7 Tipy

17.8 API import z iDoklad

Alternativa k file uploadu: přímé volání iDoklad API v3 (OAuth2 Client Credentials). Vhodné pro většinu dat — táhne kontakty + vystavené faktury + dobropisy + přijaté faktury najednou, po sekcích a rocích, s dry-run preview a background jobem.

17.8.1 Získání API credentials

  1. Přihlas se do iDokladu.
  2. Nastavení → API přístup (nebo Uživatelský účet → API).
  3. Vytvořit nový API klíč → typ Client Credentials.
  4. Zkopíruj:

17.8.2 Nastavení v MyInvoice

Systém → Externí integrace → iDoklad (admin only):

PolePopis
Client IDVložit z iDokladu
Client SecretVložit z iDokladu (uloží se šifrovaně AES-256-GCM per supplier)

Klikni Uložit → MyInvoice si otestuje connection (token endpoint + ping na první sekci). Pokud OAuth2 selže (401), zkontroluj copy-paste (typicky se přidá whitespace).

17.8.3 Spuštění importu

Na téže stránce, sekce Spustit import:

PolePopis
RokyRange (např. 2020-2025); můžeš zvolit i jen aktuální + minulý rok
SekceZaškrtnout: contacts / invoices / credit-notes / purchases
Dry-run (jen náhled)Default ON pro první běh — nepíše nic do DB, jen vypíše co BY udělal

Klikni Spustit import.

17.8.4 Co se importuje

SekceCo se vytvoří
contactsclients rows (IČ, name, address, DIČ, email, phone). ARES NEvolá — důvěřuje datům z iDokladu.
invoicesinvoices + invoice_items + VAT classification. Status: paid nebo issued per pravidlo 30 dní (viz § 17.3).
credit-notesinvoices se invoice_type='credit_note' + parent link na původní fakturu (přes parent_invoice_id).
purchasespurchase_invoices + purchase_invoice_items (od v3.6.0). Klient → clients s is_vendor=true.

Sleva *(od v4.3.0)* — sleva z iDokladu se přenáší: sleva na úrovni dokladu (DiscountType=OnDocument) se u vydaných faktur uloží jako procentuální sleva (viz § 11.4.1), u přijatých jako záporná položka „Sleva X %" po sazbách DPH; položková sleva se zapečetí do jednotkové ceny. Importovaná částka tak odpovídá iDokladu (dřív se sleva ignorovala a faktura se importovala za plnou cenu).

Idempotence: každý záznam má v DB sloupec idoklad_id, který se uloží při prvním importu. Druhý import téhož období záznamy přeskočí (žádné duplicity, žádný update existujících — import je čistě additivní).

17.9 API import z Fakturoid

Stejný flow jako iDoklad, jen jiný provider. Od v4.1.0 podporujeme dvě auth metody — legacy email + API token i nový OAuth2 Client Credentials (issue #31).

17.9.1 Získání API credentials

Nově založené účty (po 2024) — OAuth2:

  1. Přihlas se do Fakturoidu.
  2. Nastavení → API v3 přístupové údaje.
  3. Přidat aplikaci → zkopíruj Client ID + Client Secret.
  4. Zjisti slug účtu — část URL: https://app.fakturoid.cz/{slug}/..., např. jannovak.

Starší účty (před 2024) — legacy:

  1. Nastavení → API přístup → Osobní API token.
  2. Zkopíruj email + API token.
  3. Zjisti slug (stejný postup).

17.9.2 Nastavení v MyInvoice

Systém → Externí integrace → Fakturoid:

Přepínač Typ autentizace:

TypPole
OAuth2 (Client Credentials) — pro nové účtySlug + Client ID + Client Secret
Email + API token (legacy) — pro starší účtySlug + Email + API token

Oba způsoby koexistují per-supplier. Pokud má supplier vyplněné oba bloky, OAuth2 má prioritu (Bearer token).

OAuth2 token MyInvoice cachuje šifrovaně (AES-256-GCM v supplier.fakturoid_access_token_enc) s TTL ~2h. Při HTTP 401 se token vyhodí a obnoví automaticky — uživatel to nemusí řešit.

17.9.3 Spuštění importu

Identické s iDoklad (viz § 17.8.3) — vyber roky, sekce, dry-run.

17.9.4 Co se importuje

SekceCo se vytvoří
contacts (Fakturoid subjects)clients
invoicesinvoices + invoice_items + DPH klasifikace
credit-notesinvoices s invoice_type='credit_note'
purchases (Fakturoid expenses)purchase_invoices

Fakturoid stránkuje po 40 záznamech — MyInvoice automaticky tahá všechny stránky za vybrané roky.

Idempotence přes fakturoid_id stejně jako u iDokladu.

17.10 Dry-run mód

Společný pro iDoklad i Fakturoid. Po zaškrtnutí Jen náhled (dry-run) se import provede synchronně (vrátí výsledek najednou) a nezapisuje do DB. Slouží k validaci credentials + náhledu dat.

Příklad výstupu:

[contacts]    Nalezeno 45 kontaktů — 40 by se vytvořilo, 5 přeskočeno (duplicita)
[invoices]    Nalezeno 120 faktur — 115 nových, 5 přeskočeno (varsymbol existuje)
[purchases]   Nalezeno 30 přijatých faktur — 30 nových

Pokud výstup vypadá rozumně, odzaškrtni dry-run a spusť ostrý import.

17.11 Background job (ostrý import)

Ostrý import (bez dry-run) běží jako background worker přes PHP CLI proces (api/bin/import-worker.php). Aplikace vrátí job_id okamžitě a UI sleduje průběh:

  1. Progress bar se aktualizuje pollingem GET /api/admin/import-jobs/{id} (každé 2 sekundy, viz import_jobs migrace 0029).
  2. Detailní log každého záznamu (sekce, akce, ID v DB / důvod přeskočení).
  3. Tlačítko Zrušit import — worker bezpečně dokončí aktuální batch a zastaví se. Status v DB se nastaví na cancelled.

Prevence duplicitních jobů: stejné parametry (provider + sekce + roky) nelze spustit znovu, dokud běží — UI vrátí 409 Conflict s odkazem na běžící job.

17.12 Časté problémy API importu

„Neplatné credentials" / 401 Unauthorized → Whitespace v copy-pastu Client Secret / API tokenu. Vygeneruj credentials znovu a vlož pečlivě (bez okolních mezer / newlines). Test connection v Nastavení by měl projít zelený.

„Slug Fakturoid — kde ho najdu?" → Z URL po přihlášení: https://app.fakturoid.cz/jannovak/invoices → slug je jannovak. Slug je tvoje subdoména, ne company name.

Import se zasekl / „neodpovídá" → V UI klikni Zrušit import. Pokud nepomůže, restartuj backend kontejner (docker compose restart app) a spusť znovu. Workers nejsou supervised — po restartu spadnou tichá.

Faktury se importují, ale chybí DPH klasifikace → V iDoklad/Fakturoid musí mít položky vyplněné členění DPH. Pokud chybí, MyInvoice použije auto-default podle sazby (VatClassificationDefaulter): 21 % → 1 (sales) / 40 (purchase), 12 % → 2/41, 0 % → 3/42.

Kontakty z iDoklad/Fakturoid nemají emaily → Originální systém je nemá vyplněné. Doplň ručně v Klienti po importu — jinak nebudou fungovat upomínky.