Součet účetních dokladů není peněžní plnění — dvojí započtení přes zálohový řetěz
import { Aside } from ‘@astrojs/starlight/components’;
Symptom
Sekce “Symptom”Výpočet odvozený od „zaplacených dokladů” (provizní základ, obratové statistiky) vychází výrazně vyšší než skutečně přijaté peníze. V našem případě by naivní součet dokladů dal 160 % reálného plnění.
Root cause
Sekce “Root cause”Český zálohový flow vytváří k JEDNÉ platbě víc dokladů:
ZF (zálohová faktura) → přijde platba → Payment řádek NA ZFDD (daňový doklad) → generuje se K TÉŽE platbě — vlastní platbu NEMÁ NIKDYVF (vyúčtování) → odpočet zálohy + vlastní platba jen za DOPLATEKKdo sčítá SUM(doklad.total WHERE status='PAID'), započítá zálohu dvakrát
(ZF i DD) a při vyúčtování potřetí. V produkci: 125 ze 125 daňových dokladů
nemělo jediný Payment řádek — peníze nesly výhradně ZF/VF.
Druhá vrstva téhož: stav PAID lze nastavit ručně bez záznamu platby,
takže ani status='PAID' není důkaz peněz.
Fix
Sekce “Fix”unikátní plnění = Σ Payment řádků (ZF + VF + koncové faktury) − skutečné ekonomické dobropisyDD se nezapočítává NIKDY (daňový stín platby).Fallbacky jen s provenancí a autoritou:
payment_ledger— existují-li Payment řádky, platí výhradně jejich součet (cap na hodnotu dokladu); ruční PAID je nepovyšuje.audited_manual_paid— PAID bez ledgeru, ale s auditovanou mark-paid operací (aktér + čas) → počítá se, s labelem.legacy_unverified— PAID bez ledgeru i auditu → základ 0 + anomálie k ručnímu ověření; nikdy automatický dopočet.
Pozor na dokladové opravy: dobropis + náhradní daňový doklad ke stejné platbě nemění ani nárok, ani peníze — klasifikace výhradně explicitní vazbou (parent doklad + correction operation id), nikdy heuristikou „stejný den a částka”. Model drž ve dvou hodnotách: účetní netto nárok (doklady − ekonomické dobropisy) vs. peněžní vypořádání (platby − vratky).
Jak se tomu vyvarovat v jiných systémech
Sekce “Jak se tomu vyvarovat v jiných systémech”- Detection: spočítej
Σ dokladů PAIDvs.Σ payment ledgerper zakázka — poměr nad 100 % = dvojí započtení; doklady typu „daňový doklad k platbě” s vlastními platbami = podezřelé. - Anti-pattern:
hasPaidDocument = status === 'PAID'; párování dobropisu podle částky/dne; ruční mark-paid, který nezapíše platbu. - Lepší přístup: každá „zaplaceno” mutace vytváří settlement záznam s provenancí; dobropis má povinnou vazbu na konkrétní původní doklad.