[Unreleased]
Bug Fixes
- Qualify history columns against the joined users row by @John710
recurring_history and users both have id and created_at, so the unqualified
select list raised "column reference is ambiguous" and the endpoint answered
500. CI's blackbox run caught it; the unit suite cannot, because its stub
never executes SQL.
Documentation
- Warn that Shoutrrr webhook tokens leak over plain HTTP by @John710
The last open item from the v1.2.4 audit. Also records why a dead refresh
token reloads the whole SPA instead of surfacing an in-app error.
Features
- Anchor-based recurring cron with reminders and overdue alerts by @John710
The hourly job drove generation from next_date + INTERVAL, which ratchets a
31st-of-month anchor backwards and can only emit one occurrence per run, so a
rule that fell behind stayed behind for weeks.
Occurrence dates now come from the schedule service: the cron asks for the
dates owed up to today (bounded catch-up, rewound ones recorded as skipped in
history) and writes them through one transaction per rule with
FOR UPDATE SKIP LOCKED, so a crash rolls back cleanly and two instances cannot
double-book. Balance moves use numeric strings, notifications fire only after
COMMIT, and the legacy frequency column stays in sync so the image can roll
back. Adds daily due-soon and overdue reminders, deduplicated per rule. - Anchor-based schedule API with pay/skip and history by @John710
The recurring endpoints only stored next_date and a fixed frequency, so the
list could not show what a rule will actually ask for, and PUT rebound every
column (currency included) whether the client sent it or not.
Adds PATCH with a column whitelist built by the schedule service, an occurrence
projection window, per-occurrence pay/unpay and skip, run-now, and a change
history read — all with dates cast to text so the container timezone cannot move
a calendar day. PUT stays for one release behind a Deprecation header.
Editing an auto-transaction onto a date its rule already paid now hits the new
(recurring_rule_id, date) unique index; the route maps that conflict to a
localized 400 instead of a 500. - Recurring schedule fields, occurrence integrity, history and exceptions by @John710
Schedules need real state: interval + anchor fields so the next date is derived
instead of nudged, a FK and a partial unique index so one occurrence can only
ever be one transaction, and tables for skips and price/schedule changes.
frequency stays populated so the container can roll back to finapp:1.3.2. - Recurring schedule service with anchor-based occurrence math by @John710
Testing
- Cover recurring projection, pay/skip cycle and run-now in blackbox by @John710
Runs against a live container, so it pins what the unit suites cannot: the
server-side date casting, the partial unique index and the balance effects.
Appended after the net-worth section on purpose — it writes transactions and
that assertion expects exact balances. Fixtures start in 2027 so the expected
occurrence dates do not follow the container clock.
Full Changelog: v1.3.2...