Přeskočit na hlavní obsah

Validace výpočtu cen na položkách - REST API

Validace v REST API, která kontroluje hodnoty nastavené v položkách dokladu

Autor: Petr Pech

Od verze 2025.6.0 kontroluje import položky dokladu, zda zadané součty odpovídají přepočtu cenaMj (jednotková cena) × mnozMj (množství). Kontrolou prochází i veškeré nastavené slevy — v hlavičce dokladu i na položce — a celkové sumy.

Rozpor se ohlásí ve dvou úrovních, podle toho, jak daleko od sebe zadané a vypočtené hodnoty jsou:

Kód

Úroveň

Kdy nastane

inputDiffComputed

Chyba — doklad se neuloží, 400

Zadanou částku nelze srovnat s tím, co Flexi z ceny a množství spočítá.

polDoklNesediSumyPoSleve

Varování — doklad se uloží, 200

Součty dokladu si odpovídají, ale cena po slevách vychází jinak, než jste zadali.

⚠️ Varování si snadno přehlédnete — odpověď má success true. Chcete-li, aby import v takovém případě neprošel, přidejte do URL parametr ?fail-on-warning=true; požadavek pak skončí 400. Vlastní import si můžete nejprve nasucho ověřit testovacím uložením ?dry-run=true.

Nejjistější je uvádět na položce cenaMj. Pokud ji neznáte, nabízí se řešení popsaná níže.


Jak vypadají chybové odpovědi

Chyba, která uložení zruší:

<error for="sumZkl" path="faktura-vydana[temporary-id=null].sumZkl" value="146.28" code="PROP" messageCode="inputDiffComputed">Zadaná hodnota [146.28] vlastnosti [sumZkl] se liší od vypočtené hodnoty [135.0] [DoklFak -1]</error>

Varování, po kterém se doklad uloží:

<warning for="cenaMj" path="faktura-vydana[temporary-id=null].polozkyFaktury" code="INVALID" messageCode="polDoklNesediSumyPoSleve">Pro položku s jednotkovou cenou [409.8] za Mj, množstvím [1.0], slevou na dokladu [10.0] a slevou na položce [5.0] vychází očekávaná cena [348.33], ale zadaná hodnota byla [348.3]. [VF1-0180/2025]</warning>


Možná řešení

Použití previousValue

Atribut previousValue použijete ve chvíli, kdy neznáte cenaMj a znáte celkovou částku — hodnotu pak Flexi přijme tak, jak ji zadáte, a nepřepočítá ji. Lze jej uvést u těchto polí:

  • sumZkl

  • sumCelkem

  • sumZklMen

  • sumCelkemMen

<faktura-vydana-polozka>
<typPolozkyK>typPolozky.obecny</typPolozkyK>
<mnozMj>1.0</mnozMj>
<sumDph>86.78</sumDph>
<sumZkl previousValue="0">413.22</sumZkl>
<text>test</text>
</faktura-vydana-polozka>

Nastavit položku jako účetní

U položky typu typPolozky.ucetni nelze použít ceník (cenik), množství (mnozMj) ani jednotkovou cenu (cenaMj) — kontrola přepočtu se jí proto netýká. Potřebujete-li tyto vlastnosti zachovat, použijte řešení výše nebo parametr níže.

<faktura-vydana-polozka>
<typPolozkyK>typPolozky.ucetni</typPolozkyK>
<sumDph>86.78</sumDph>
<sumZkl>413.22</sumZkl>
</faktura-vydana-polozka>

Nastavit pokročilý parametr paramValidateSumFak

Validaci lze vypnout pokročilým parametrem paramValidateSumFak, který je ve výchozím stavu true.

🚨 Před použitím parametru doporučujeme konzultaci s technickou podporou. Vypnutí validace může vést k neočekávanému chování — vypne totiž kontrolu, která byla přidána právě proto, že je potřebná.

<?xml version="1.0" encoding="utf-8"?>
<winstrom version="1.0">
<parametr>
<paramK>paramValidateSumFak</paramK>
<hodnota>true</hodnota>
</parametr>
</winstrom>


Příklady nevalidních XML

Chybějící cenaMj

<faktura-vydana-polozka>
<sumCelkem>177.00</sumCelkem>
<sumZkl>146.28</sumZkl>
<mnozBaleni>3.00</mnozBaleni>
<baleniId>1</baleniId>
<nazev>Test</nazev>
<cenik>code:TEST</cenik>
</faktura-vydana-polozka>

Bez jednotkové ceny Flexi spočítá základ položky jako nulu a import skončí chybou inputDiffComputed. Pokud cenaMj neznáte, řešením je právě previousValue.

Nesprávná cenaMj k sumZkl

<objednavka-prijata>
<typDokl>code:OBP</typDokl>
<firma>code:Firma</firma>
<bezPolozek>false</bezPolozek>
<polozkyDokladu>
<objednavka-prijata-polozka>
<cenik>code:Polozka</cenik>
<mnozMj>1</mnozMj>
<cenaMj>2000</cenaMj>
<typSzbDphK>typSzbDph.dphZakl</typSzbDphK>
<typCenyDphK>typCeny.bezDph</typCenyDphK>
<sumZkl>3000</sumZkl>
<sumDph>1000</sumDph>
<sumCelkem>4000</sumCelkem>
</objednavka-prijata-polozka>
</polozkyDokladu>
</objednavka-prijata>

Takto zaslaná objednávka dřív prošla bez povšimnutí a projevila se až později:

  • při realizaci (fakturaci) objednávky došlo k chybnému výpočtu,

  • při změně firmy na dokladu došlo k přepočtu nebo vynulování zadaných cen.

Řešením je zadat do cenaMj správnou hodnotu.


Související

Dostali jste odpověď na svou otázku?