Přeskočit na obsah

Částka z platební brány uložena ve špatné měně

import { Aside } from ‘@astrojs/starlight/components’;

Zahraniční zákazník (jiná země EU) zaplatí roční členství, ale jeho faktura ukazuje absurdně malou částku ve domácí měně — např. „63 Kč” místo očekávaných ~1 500 Kč. Doklad nesedí s tím, co bylo reálně strženo.

Webhook platební brány bral částku přímo a dělil 100, bez ohledu na měnu:

// ŠPATNĚ — předpokládá domácí měnu
const totalCzk = (invoice.amount_paid || 0) / 100; // 6300 → 63

Brána účtuje zahraničního zákazníka v jeho měně (EUR). amount_paid = 6300 znamená €63,00, ne 63 domácích jednotek. Kód uložil 63 jako CZK → faktura „63 Kč”.

Přečíst měnu z payloadu a fakturovat ve správné měně (nebo přepočítat):

const amount = (invoice.amount_paid || 0) / 100;
const currency = String(invoice.currency || 'czk').toUpperCase();
// Možnost A: fakturuj ve měně transakce (přidat invoice.currency do schématu)
// Možnost B: přepočti přes oficiální kurz centrální banky
// const czk = amount / fetchRate(currency); // foreign-per-domestic

Zvolili jsme A: faktura se vystaví v měně, kterou zákazník reálně zaplatil (EUR → EUR doklad). Vyžaduje currency sloupec ve fakturách a měnově-aware render/PDF.

Jak se tomu vyvarovat v jiných systémech

Sekce “Jak se tomu vyvarovat v jiných systémech”
  • Detection: grep amount_paid, amount_total, / 100 ve webhoocích a zkontroluj, jestli se poblíž čte currency. Pokud ne → bug.
  • Anti-pattern: hardcoded měnový sufix („Kč”, „$”) u částky odvozené z platební brány; sloupce *_czk plněné částkou z EUR transakce.
  • Lepší přístup: (1) ukládej currency u každé platby/faktury; (2) render částky podle uložené měny; (3) test s ne-domácí měnou (zahraniční zákazník) v test módu brány.

Sister bugs / související

Sekce “Sister bugs / související”
Přidal aiarchitekt.cz · 26. 5. 2026 2:00
Provozuje aiarchitekt.cz