Přeskočit na hlavní obsah

Dobropisy

Jak dobropisovat faktury pomocí REST API?

Autor: Petr Pech

Dobropis se s dobropisovanou fakturou provazuje vazbou. Přes REST API lze buď navázat už existující dobropis na fakturu, nebo nechat celý dobropis včetně vazeb vytvořit ze zvolených položek původního dokladu. Oba postupy jsou vnořené elementy importu a fungují na evidencích faktura-vydana a faktura-prijata.

⚠️ Doklad, do kterého vnořené elementy uvádíte, musí být typu dobropis. Jinak import skončí chybou parovaniDobropisuNeniDobropis. Na jiných evidencích než u vydaných a přijatých faktur se elementy tiše ignorují a import projde bez efektu.


Provázání dobropisu s fakturou

Vazbu na existující dobropis vytvoří element vytvor-vazbu-dobropis:

<?xml version="1.0"?>
<winstrom version="1.0">
<faktura-vydana>
<!-- dobropis; může být i "faktura-prijata" -->
<id>code:DOBROPIS1</id>
<!-- lze normálně uvést další vlastnosti dokladu jako při běžném importu -->
<vytvor-vazbu-dobropis>
<dobropisovanyDokl>code:FAKTURA1</dobropisovanyDokl>
<!-- identifikátor dobropisovaného dokladu -->
</vytvor-vazbu-dobropis>
</faktura-vydana>
</winstrom>

Dobropisovaný doklad se v elementu dobropisovanyDokl uvádí podle obvyklých pravidel pro identifikátory. Pokud faktura není nalezena, import skončí chybou.

Jeden dobropis lze navázat jen na jednu fakturu. Na jednu fakturu ale může být navázáno více dobropisů. Pokus o navázání dobropisu, který už na nějakou fakturu navázaný je, skončí chybou parovaniDobropisuLzeJenJednou — je nutné nejdřív zrušit stávající vazbu.

Po úspěšném provázání se na dobropisovaném dokladu nastaví příznak dobropisovano na true a vazba se objeví v relaci vazby obou dokladů. V záznamu vazby je dobropisovaná faktura ve vlastnosti a a dobropis ve vlastnosti b:

GET https://demo.flexibee.eu/c/demo/faktura-vydana/DOBROPIS1.json?relations=vazby


Důležitá upozornění

  • Služba vytváří pouze vazbu — dobropisující doklad musí mít správně vytvořené položky.

  • Vytvořená vazba propojuje jen hlavičky dokladů, propojení položek neřeší.

  • Nákupní cena uvedená na položkách by měla odpovídat skladové ceně zboží z dobropisovaného dokladu, jinak nebude sedět stav skladu.

  • Pokud není uvedena nákupní cena, použije se aktuální skladová cena.

  • Pokud není zboží skladem, použije se nákupní cena z ceníku.

ℹ️ Zakládáte-li dobropis běžným importem, musí být množství na jeho položkách záporné — jinak import skončí chybou polDoklDobropisChybaZaporneMnozstvi. Naopak ve službě dobropisuj popsané níže se dobropisované množství uvádí kladně.


Vytvoření dobropisu včetně vazeb

Druhou možností je nechat celý dobropis vytvořit službě dobropisuj. Vznikne plnohodnotný dobropis s vazbou i mezi položkami. Kromě identifikátoru dobropisované faktury (dobropisovanyDokl) se uvede, které položky se mají dobropisovat (polozkyDokladu) — u každé její id a množství mnozMj:

<winstrom version="1.0">
<faktura-vydana>
<typDokl>code:DOBROPIS</typDokl>
<!-- lze uvést další vlastnosti dokladu jako při běžném importu -->
<dobropisuj>
<dobropisovanyDokl>code:VF1-0001/2021</dobropisovanyDokl>
<polozkyDokladu>
<polozka>
<id>123</id>
<mnozMj>1</mnozMj>
</polozka>
</polozkyDokladu>
</dobropisuj>
</faktura-vydana>
</winstrom>

Element polozkyDokladu je povinný — bez něj import skončí chybou validace.notNull. Uvedené položky musí ležet na dobropisovaném dokladu a nelze dobropisovat větší množství, než na položce zbývá; služba si tedy hlídá, kolik už bylo dobropisováno.

Výsledkem je nový doklad se zápornými částkami, s vazbou na dobropisovanou fakturu a s příznakem dobropisovano nastaveným na původním dokladu. Číslo nového dokladu najdete v návratových hodnotách ve results.

💡 Import s parametrem ?dry-run=true vstup jen zkontroluje a doklad nevytvoří — v results pak vrátí id rovné -1. Vyplatí se tak ověřit ID položek a množství, než dobropis skutečně vznikne.

Výrobní čísla

Má-li položka evidovaná výrobní čísla, je třeba zadat odpovídající počet výrobních čísel v elementu vyrobniCislaId:

<winstrom version="1.0">
<faktura-vydana>
<typDokl>code:DOBROPIS</typDokl>
<dobropisuj>
<dobropisovanyDokl>code:VF1-0001/2021</dobropisovanyDokl>
<polozkyDokladu>
<polozka>
<id>123</id>
<mnozMj>1</mnozMj>
<vyrobniCislaId>
<vyrobniCisloId>456</vyrobniCisloId>
</vyrobniCislaId>
</polozka>
</polozkyDokladu>
</dobropisuj>
</faktura-vydana>
</winstrom>

Výrobní čísla sad

Zadat lze i výrobní čísla sad v elementu vyrobniCislaSad:

<winstrom version="1.0">
<faktura-vydana>
<typDokl>code:DOBROPIS</typDokl>
<dobropisuj>
<dobropisovanyDokl>code:VF1-0001/2021</dobropisovanyDokl>
<polozkyDokladu>
<polozka>
<id>123</id>
<mnozMj>1</mnozMj>
<vyrobniCislaSad>
<vyrobniCislaSady>
<sadaId>789</sadaId>
<vyrobniCislaId>
<vyrobniCisloId>456</vyrobniCisloId>
</vyrobniCislaId>
</vyrobniCislaSady>
</vyrobniCislaSad>
</polozka>
</polozkyDokladu>
</dobropisuj>
</faktura-vydana>
</winstrom>


Vytvoření vzájemného zápočtu

Pokud se v elementu vytvor-vazbu-dobropis uvede vytvorZapocet s hodnotou true, vytvoří se zároveň vzájemný zápočet, kterým se faktura a dobropis uhradí. Typ dokladu zápočtu je pak povinný a uvádí se v elementu typDoklZapocet:

<winstrom version="1.0">
<faktura-vydana>
<!-- dobropis; může být i "faktura-prijata" -->
<id>code:DOBROPIS1</id>
<vytvor-vazbu-dobropis>
<dobropisovanyDokl>code:FAKTURA1</dobropisovanyDokl>
<vytvorZapocet>true</vytvorZapocet>
<typDoklZapocet>code:ZAPOCET</typDoklZapocet>
</vytvor-vazbu-dobropis>
</faktura-vydana>
</winstrom>

Typ dokladu se bere z evidence typ-vzajemnych-zapoctu. Bez elementu typDoklZapocet skončí import chybou importXmlEmptyIdentifier.

Zápočtem vzniká dvojice dokladů v evidenci vzajemny-zapocet — jeden na straně faktury, druhý na straně dobropisu, oba na částku dobropisu. Pravidla, kterými se zápočet řídí:

Údaj

Odkud se bere

Datum zápočtu

Datum z novějšího z obou dokladů.

Číslo souhrnné

Variabilní symbol z faktury.

Kurz u dokladů v cizí měně

Stažený kurz k datu zápočtu.

Po zápočtu se změní stav úhrady obou dokladů: dobropis je uhrazený a faktura je uhrazená v rozsahu částky dobropisu (u částečného dobropisu tedy stavUhr.castUhr).


Zrušení vazby dobropisu

Vazbu zruší prázdný element zrus-vazbu-dobropis:

<?xml version="1.0"?>
<winstrom version="1.0">
<faktura-vydana>
<!-- dobropis; může být i "faktura-prijata" -->
<id>code:DOBROPIS1</id>
<zrus-vazbu-dobropis/>
</faktura-vydana>
</winstrom>

🚨 Zrušit lze pouze ručně vytvořenou vazbu, tedy tu, která vznikla elementem vytvor-vazbu-dobropis. Vazbu, kterou vytvořila služba dobropisuj, zrušit nelze — import vrátí chybu parovaniDobropisuNelzeZrusit. Dobropis vytvořený službou dobropisuj proto nelze od faktury odpojit a přenavázat jinam.


Chybové stavy

Všechny níže uvedené případy vracejí 400 a celý import se neprovede:

Kód chyby

Příčina

parovaniDobropisuNeniDobropis

Doklad, do kterého jste element vnořili, není typu dobropis.

parovaniDobropisuNenalezenDobropisovanyDoklad

Doklad uvedený v dobropisovanyDokl neexistuje.

parovaniDobropisuLzeJenJednou

Dobropis už je navázaný na jinou fakturu.

parovaniDobropisuNelzeZrusit

Vazba nevznikla ručně, ale službou dobropisuj — zrušit ji nelze.

polDoklDobropisChybaNotFound

Položka uvedená v polozkyDokladu na dobropisovaném dokladu není.

polDoklDobropisChybaMaxReal

Dobropisované množství je vyšší než množství, které na položce zbývá.

polDoklDobropisChybaZaporneMnozstvi

Položka dobropisu zakládaného běžným importem má nezáporné množství.

validace.notNull

Ve službě dobropisuj chybí povinný element polozkyDokladu.

importXmlEmptyIdentifier

Je uvedeno vytvorZapocet, ale chybí typDoklZapocet.


Související

Dostali jste odpověď na svou otázku?