Treziqo v1.7 — Vyzkoušej zdarma, plánuj přesně, potvrzuj rychle
Sedmé vydání mění tři věci, které se denně dotýkají rutiny: registrace dostává 14denní trial bez platebních údajů, splátkový kalendář pohledávek umí refixaci a per-diem výpočet první splátky (přesnost vůči bance < 1 %), a pravidelné platby v módu „Pouze připomenout" se sbírají v novém inboxu s rychlým potvrzením a možností upravit reálné datum a částku.
✨ 14 dní zdarma — registrace bez platebních údajů
Cenotvorba pro nové uživatele se mění:
| Tarif |
CZK |
EUR |
USD |
| Trial (prvních 14 dní) |
zdarma |
zdarma |
zdarma |
| Basic |
69 Kč / měs |
2,99 € / měs |
3,49 $ / měs |
| Pro |
149 Kč / měs |
5,99 € / měs |
6,99 $ / měs |
- Po registraci dostáváš 14 dní zdarma — žádná karta, žádný PayPal. Jen klikneš a můžeš všechno.
- Předčasná aktivace — kdykoli během trialu klikneš v dashboardu „Aktivovat tarif" a potvrdíš PayPal. Neztratíš zbývající dny zdarma — PayPal trial cycle navíc běží 14 dní, takže prvních ~28 dní u nás můžeš mít zaplaceno bez stržení.
- Po vypršení trialu bez aktivace — účet je pozastavený (data zůstávají), aplikace tě vyzve potvrdit platbu. Po aktivaci hned pokračuješ tam, kde jsi přestal.
- Existující předplatitelé zůstávají na původní ceně (49/99 Kč). Loyalty bonus.
V administraci /admin/users u každého uživatele vidíš stav trialu (zbývající dny / vypršel / má PayPal subscription / bez trialu) jako mikro-badge pod plan badge.
📅 Splátkový kalendář pohledávek — přesnost a flexibilita
Už ve v1.6 jsme zavedli amortizační plán. v1.7 ho dotáhne do výrobní kvality:
Per-diem výpočet první splátky
Banky obvykle účtují úrok od dne čerpání (drawdown), ne od podpisu smlouvy — a první období bývá kratší než plný měsíc. Standardní anuita to přepočítává na 1/12 roku, což znamená systematickou odchylku stovek korun u úvěrů sjednaných uprostřed měsíce.
Nové pole v editu pohledávky:
- Datum čerpání — den, kdy peníze fyzicky doteklý (typicky 1–3 dny po sjednání). Pokud necháš prázdné, fallback na datum sjednání.
- Day-count konvence —
act/365 (default, většina CZ úvěrů) / act/360 / 30/360. Najdeš ve smlouvě v sekci „úročení".
Algoritmus pro úplně první splátku spočítá úrok = balance × rate × dny / N, druhá+ splátky standardní anuita. Při přegenerování plánu (existují paid řádky) se per-diem neaplikuje znovu — balance je už po předchozích splátkách.
Příklad: ČSOB úvěr 1 M @ 4,99 % p.a., sjednání 19. 3., první splátka 14. 4.
- Před fixem: úrok 4 158 Kč (od reality −805 Kč)
- Po fixu: úrok 3 418 Kč (od reality −64 Kč) — chyba klesla o 92 %
Změny úrokové sazby (refixace, refinancování)
Hypotéky s fixací po skončení období typicky mění sazbu i splátku. Místo regenerace celého plánu s novými parametry teď přidáš rate change s effective_from datem:
V detailu pohledávky sekce „Změny úrokové sazby":
- Tabulka existujících změn (datum + sazba + nová splátka + poznámka, delete)
- Add form: datum platnosti, nová sazba (% p.a.), nová měsíční splátka, volitelná poznámka
Algoritmus pak pro každou splátku v plánu zvolí nejvyšší rate change s effective_from ≤ due_date, jinak default z editu pohledávky. Po přidání klikneš „Přegenerovat budoucí splátky" — splátky před effective_from běží na staré sazbě, od ní pak na nové.
Plán od počátku + označit minulé jako uhrazené
U pohledávky, kterou už nějakou dobu splácíš a chceš to dohnat zpětně:
- „Plán od počátku…" → modal s checkboxem „Označit minulé splátky jako uhrazené"
- Pokud zaškrtneš (a pohledávka má napárovaný účet) → pro každou minulou splátku se vytvoří reálná platba (Transfer + Transaction), peníze se odečtou z účtu, zbývající jistina se sníží
- Pokud nezaškrtneš → minulé splátky zůstanou jako planned/overdue (červeně), zaplatíš je ručně přes „Zaplatit"
Race-safe: pre-check existujících plateb proběhne uvnitř DB transakce s lockForUpdate na pohledávku — double-submit z browseru nevytvoří duplikátní platby.
Edit jednotlivého řádku v plánu
Pro každý řádek v kalendáři (kromě skipped) je teď edit ikona. Klik otevře modal:
- Datum splatnosti
- Jistina (jediný editovatelný amount)
- Úrok = read-only auto-derived
total − jistina − poplatek
- Poplatek
- Total = read-only (banka strhne deterministickou splátku, mění se jen vnitřní rozdělení)
Pro paid řádky se synchronizuje linkovaný LiabilityPayment, Transaction.transaction_date/amount, current_principal o rozdíl jistin, auto status PAID_OFF ⇄ ACTIVE.
Auto-vytvoření pravidelné platby
Po vygenerování splátkového kalendáře se automaticky vytvoří RecurringItem s target_kind=liability_payment:
- Frekvence měsíčně, den splátky =
installment_day pohledávky, anchor = první planned řádek
- Amount = monthly_installment, source = liability.account_id
- Mode default
remind_only (user potvrdí přes inbox)
Při generování occurrence se hledá matching planned installment v kalendáři (±3 dny + amount ±0,5 Kč) — pokud match, použije se přesný anuitní split (jistina/úrok/poplatek), označí installment paid, current_principal klesá jen o jistinu (ne celý amount). Fallback (no match): custom platba mimo plán.
✅ Inbox čekajících potvrzení (/recurring/inbox)
Pravidelné platby v módu „Pouze připomenout" generují PLANNED occurrences, čekající na potvrzení reality. Místo procházení každého recurring itemu samostatně máš teď centrální inbox:
- Topbar badge (vedle dark mode toggle) zobrazí počet čekajících. Klik → /recurring/inbox.
- Tlačítko „Potvrdit čekající" s count badge na
/recurring.
- Grid karet seřazený podle due_date (overdue nahoře, červené):
- Per target_kind tint (investice zelená, pohledávka červená, převod modrý)
- Item ikona + name + account(y se šipkou pro převod)
- Expected amount vpravo
- Klik na „Potvrdit" rozbalí inline form: skutečné datum (default = due_date), skutečná částka (default = expected), volitelná poznámka
- Submit vytvoří Transaction přes service.executeCycle (respektuje target_kind), označí occurrence CONFIRMED
- Skip akce vedle Confirm pro cykly, které neproběhnou (refinancování, jednorázové výjimky)
🔁 Pravidelné platby — nový typ a vizuální rozlišení
Internal transfer (převod mezi vlastními účty)
Nový target_kind=internal_transfer pro typický scénář „mzda z firmy na osobní" nebo „automatické spoření z běžného na spořící". Místo dvou recurring items (expense + income) jeden Transfer záznam s from_account + to_account + amount.
V kartě v /recurring se zobrazí oba účty se šipkou a 2-column amount grid — −amount na zdrojovém účtu, +amount na cílovém. Vizuálně jasné, kam peníze putují.
V1 only same-currency. Cross-currency (CZK → EUR mezi vlastními účty) odložený do V2 — vyžaduje denní kurzový lookup.
Vizuální rozlišení karet
Karty v /recurring mají lehké barevné podbarvení podle target_kind:
- 🟢 Investice (vklad) — emerald tint
- 🔴 Pohledávka (splátka) — rose tint
- 🔵 Převod mezi účty — blue tint
- ⚪ Běžný výdaj/příjem — bez tintu
Dark mode varianty drží subtilní opacity (900/20 → 30 hover) místo light (50/60 → 100), aby tint byl rozeznatelný, ale nedominoval na slate-950 pozadí.
📰 News feed a logo branding
- Veřejný news feed na
/news — všechny published novinky seskupené po měsících, plný body, bez auth. Plus 8 nejnovějších v login sidebar carouselu.
- Admin CRUD pro novinky v
/admin/news — správa textů s CS+EN per-row content, draft / publish toggle, pořadí přes sort_order.
- Logo z admin uploadu všude:
- Hlavičky transakčních emailů dostanou logo 48×48 (z
/admin/general upload)
- PWA install ikona (Android Chrome / iOS „Add to Home Screen") přes dynamický
/manifest.json endpoint
- Favicon + apple-touch-icon ve všech layoutech (login, register, news, landing, dashboard) přes
<link rel="icon" href="logoUrl()">
- Změna loga v
/admin/general se promítne do hodiny (Cache-Control 1h) — žádný redeploy
🗑️ Bezpečnější mazání transakcí z koše
V /transactions/trash je nově hromadné označení (checkbox v každé řádce + select-all) a sticky toolbar s tlačítkem „Smazat vybrané". Klik neudělá smazání rovnou — místo toho:
- Backend vytvoří one-time token (SHA-256 hash, expirace 15 min), plaintext odešle emailem
- Klikneš v emailu na confirm link → server zkonzumuje token, smaže transakce atomicky (vč. Transfer-pair handling)
Hodí se, když si chceš vyčistit koš a zároveň mít e-mail audit trail. Jednorázové použití + 15min expirace + scoped na user_id (token v cizím emailu nefunguje).
🔧 Drobnosti
- Pořadí účtů ve formuláři transakce —
/transactions/new desktop teď respektuje user-defined sort_order z /accounts (mobile už respektoval, sjednoceno)
- Default ceny dynamicky — všechna pricing místa (landing, register, admin user-plan picker) čtou z
plan_prices tabulky. Single source of truth = /admin/plans. Změna ceny adminem se okamžitě promítne do UI bez redeploy.
- PayPal webhook: 400 Bad Request pro nevalidní signature / chybějící hlavičky (předtím 202). Sémantika kódů čistá: 200 ok, 202 benign probe, 400 klientská chyba (no retry), 500 naše chyba (retry).
- Logout 419 fix — když user nechá tab otevřený přes session lifetime a klikne logout, místo „Page Expired" hladký redirect na
/login.
- Nová podkategorie „Škola" pod Děti — pro výdaje spojené s docházkou (poplatky, pomůcky, obědy, exkurze) odděleně od „Školky" (preschool).
⚠️ Změny a upgrade
Co je kde dostupné
| Funkce |
FREE |
BASIC |
PRO |
| 14 dní zdarma trial |
✅ |
✅ |
✅ |
| Splátkový kalendář (per-diem, refixace, edit) |
— |
— |
✅ |
| Inbox čekajících potvrzení |
✅ |
✅ |
✅ |
| Internal transfer recurring |
✅ |
✅ |
✅ |
| Bulk delete s email confirm |
✅ |
✅ |
✅ |
| News feed na /login + /news |
✅ |
✅ |
✅ |
Co dělat po upgrade
Nic. Žádné migrační úkoly pro stávající uživatele:
- Pokud máš pohledávku se splátkovým kalendářem, můžeš si přidat datum čerpání a day-count konvenci v editu pohledávky → klikneš „Přegenerovat" → plán se přepočítá per-diem.
- Pokud chceš auto-vytvořenou pravidelnou splátku, vygeneruj plán pohledávky znovu — RecurringItem se vytvoří automaticky (idempotentně, neklonuje existující).
- Pokud máš recurring v módu remind_only, najdeš PLANNED occurrences v
/recurring/inbox.
Pro existující předplatitele
Pokud jsi se zaregistroval před v1.7 a máš aktivní PayPal subscription, platíš dál původní cenu (49/99 Kč). PayPal subscription je vázán na původní billing plan — nezvýší ji bez tvého explicitního přechodu na nový plán.
🛠 Pod kapotou
- Datový model: nové sloupce
users.trial_ends_at, liabilities.{drawdown_date, day_count_convention}, recurring_items.{to_account_id, to_account_currency_id}. Nové tabulky liability_rate_changes, pending_bulk_actions, news_posts.
- Race condition fix v
LiabilityAmortizationService::generate(mode=full + markPastAsPaid) — pre-check existing payments uvnitř DB::transaction s lockForUpdate na liability row. Předtím dva paralelní requesty oba viděly 0 payments před commit toho prvního a vytvořily duplicitní simulované platby.
- Single source of truth pro ceny — View Composer
PlanPrice::activeKeyedByPlanAndCurrency() injectuje $planPrices do landing, register, checkout, admin.user-plan views. UserPlan::priceCzk() deprecated.
- PayPal billing plans — admin v PayPal Business vytvořil 6 nových plans (Basic/Pro × CZK/USD/EUR), všechny s 14d trial cycle. Migrace
set_v17_paypal_plan_ids zapíše IDs do plan_prices.
- Defense-in-depth security audit (2026-04-25) —
Rule::in($accessibleAcIds) na from_account_currency_id v LiabilityController storePayment + storeDrawdown. Žádné CRITICAL/HIGH zranitelnosti.
- Laravel 11 gotcha — base
Controller nemá middleware() metodu (přesun do HasMiddleware interface). Defense-in-depth fix v Admin\NewsPostController::__construct hodil 500; odstraněno, route-level admin groupa stačí.
- Idempotentní migrace všude — v1.7 přidává 9 nových migrací (trial_ends_at, drawdown_date, day_count_convention, rate_changes, pending_bulk_actions, force_update_translations, set_paypal_ids, to_account_id na recurring, news_posts). Všechny
hasTable/hasColumn guarded.
Díky, že Treziqo používáte. Chyby a nápady pište na info@treziqo.com.