Appearance
Rolling reserve release
Trigger: pg_cron daily (pick a UTC hour; Tonder uses 02:00).
Flow
For each business: resolve the release-day window in the business timezone, find PAYMENT journals with expected_reserve_release_date in window, settlement_id null, rr_amount > 0, and post a ROLLING_RESERVE_RELEASE journal per source journal (linked via related_journal_id).
Postgres timezone math
(date_local::timestamp at time zone tz) at time zone 'UTC' replaces the Luxon window calc. The "release uses NOW as process_date" rule carries over — the release is a new accounting event in current time. No separate processor Lambda; the cron job calls the same posting function.
The hold percentage and period come from the matched fee rule. The released amounts feed back into settlements (positive net category) and the force_decrease treasury control. Operators can trigger a manual release and review reconciliation from the System Control Panel.