Preskoči na glavno vsebino

Dobropisy

Ako dobropisovať faktúry pomocou REST API?

Avtor: Petr Pech

Dobropis sa s dobropisovanou faktúrou prepája väzbou. Cez REST API možno buď naviazať už existujúci dobropis na faktúru, alebo nechať celý dobropis vrátane väzieb vytvoriť zo zvolených položiek pôvodného dokladu. Oba postupy sú vnorené elementy importu a fungujú na evidenciách faktura-vydana a faktura-prijata.

⚠️ Doklad, do ktorého vnorené elementy uvádzate, musí byť typu dobropis. Inak import skončí chybou parovaniDobropisuNeniDobropis. Na iných evidenciách než pri vydaných a prijatých faktúrach sa elementy tichým spôsobom ignorujú a import prejde bez efektu.


Prepojenie dobropisu s faktúrou

Väzbu na existujúci dobropis vytvorí 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 sa v elemente dobropisovanyDokl uvádza podľa obvyklých pravidiel pre identifikátory. Ak faktúra nie je nájdená, import skončí chybou.

Jeden dobropis možno naviazať len na jednu faktúru. Na jednu faktúru však môže byť naviazaných viac dobropisov. Pokus o naviazanie dobropisu, ktorý je už na nejakú faktúru naviazaný, skončí chybou parovaniDobropisuLzeJenJednou — je potrebné najprv zrušiť existujúcu väzbu.

Po úspešnom prepojení sa na dobropisovanom doklade nastaví príznak dobropisovano na true a väzba sa objaví v relácii vazby oboch dokladov. V zázname väzby je dobropisovaná faktúra vo vlastnosti a a dobropis vo vlastnosti b:

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


Dôležité upozornenia

  • Služba vytvára iba väzbu — dobropisujúci doklad musí mať správne vytvorené položky.

  • Vytvorená väzba prepája len hlavičky dokladov, prepojenie položiek nerieši.

  • Nákupná cena uvedená na položkách by mala zodpovedať skladovej cene tovaru z dobropisovaného dokladu, inak nebude sedieť stav skladu.

  • Ak nie je uvedená nákupná cena, použije sa aktuálna skladová cena.

  • Ak nie je tovar skladom, použije sa nákupná cena z cenníka.

ℹ️ Ak zakladáte dobropis bežným importom, musí byť množstvo na jeho položkách záporné — inak import skončí chybou polDoklDobropisChybaZaporneMnozstvi. Naopak v službe dobropisuj popísanej nižšie sa dobropisované množstvo uvádza kladne.


Vytvorenie dobropisu vrátane väzieb

Druhou možnosťou je nechať celý dobropis vytvoriť službou dobropisuj. Vznikne plnohodnotný dobropis s väzbou aj medzi položkami. Okrem identifikátora dobropisovanej faktúry (dobropisovanyDokl) sa uvedie, ktoré položky sa majú dobropisovať (polozkyDokladu) — pri každej jej id a množstvo 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 neho import skončí chybou validace.notNull. Uvedené položky musia byť na dobropisovanom doklade a nemožno dobropisovať väčšie množstvo, než na položke zostáva; služba si teda stráži, koľko už bolo dobropisované.

Výsledkom je nový doklad so zápornými sumami, s väzbou na dobropisovanú faktúru a s príznakom dobropisovano nastaveným na pôvodnom doklade. Číslo nového dokladu nájdete v návratových hodnotách vo results.

💡 Import s parametrom ?dry-run=true vstup iba skontroluje a doklad nevytvorí — v results potom vráti id rovné -1. Oplatí sa tak overiť ID položiek a množstvo, než dobropis skutočne vznikne.

Výrobné čísla

Ak má položka evidované výrobné čísla, je potrebné zadať zodpovedajúci počet výrobných čísel v elemente 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 sád

Zadať možno aj výrobné čísla sád v elemente 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>


Vytvorenie vzájomného zápočtu

Ak sa v elemente vytvor-vazbu-dobropis uvedie vytvorZapocet s hodnotou true, vytvorí sa zároveň vzájomný zápočet, ktorým sa faktúra a dobropis uhradia. Typ dokladu zápočtu je potom povinný a uvádza sa v elemente 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 sa berie z evidencie typ-vzajemnych-zapoctu. Bez elementu typDoklZapocet skončí import chybou importXmlEmptyIdentifier.

Zápočtom vzniká dvojica dokladov v evidencii vzajemny-zapocet — jeden na strane faktúry, druhý na strane dobropisu, oba na sumu dobropisu. Pravidlá, ktorými sa zápočet riadi:

Údaj

Odkiaľ sa berie

Dátum zápočtu

Dátum z novšieho z oboch dokladov.

Číslo súhrnné

Variabilný symbol z faktúry.

Kurz pri dokladoch v cudzej mene

Stiahnutý kurz k dátumu zápočtu.

Po zápočte sa zmení stav úhrady oboch dokladov: dobropis je uhradený a faktúra je uhradená v rozsahu sumy dobropisu (pri čiastočnom dobropise teda stavUhr.castUhr).


Zrušenie väzby dobropisu

Väzbu zruší prázdny 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šiť možno iba ručne vytvorenú väzbu, teda tú, ktorá vznikla elementom vytvor-vazbu-dobropis. Väzbu, ktorú vytvorila služba dobropisuj, zrušiť nemožno — import vráti chybu parovaniDobropisuNelzeZrusit. Dobropis vytvorený službou dobropisuj preto nemožno od faktúry odpojiť a prenaviazať inam.


Chybové stavy

Všetky nižšie uvedené prípady vracajú 400 a celý import sa nevykoná:

Kód chyby

Príčina

parovaniDobropisuNeniDobropis

Doklad, do ktorého ste element vnorili, nie je typu dobropis.

parovaniDobropisuNenalezenDobropisovanyDoklad

Doklad uvedený v dobropisovanyDokl neexistuje.

parovaniDobropisuLzeJenJednou

Dobropis je už naviazaný na inú faktúru.

parovaniDobropisuNelzeZrusit

Väzba nevznikla ručne, ale službou dobropisuj — zrušiť ju nemožno.

polDoklDobropisChybaNotFound

Položka uvedená v polozkyDokladu na dobropisovanom doklade nie je.

polDoklDobropisChybaMaxReal

Dobropisované množstvo je vyššie než množstvo, ktoré na položke zostáva.

polDoklDobropisChybaZaporneMnozstvi

Položka dobropisu zakladaného bežným importom má nezáporné množstvo.

validace.notNull

V službe dobropisuj chýba povinný element polozkyDokladu.

importXmlEmptyIdentifier

Je uvedené vytvorZapocet, ale chýba typDoklZapocet.


Súvisiace

Ste s tem dobili odgovor na svoje vprašanje?