Deposits no longer force the credit side through Undeposited Funds — the
structural cause of negative Undeposited balances. A deposit can now credit any
account(s): interest income, a refund, an insurance reimbursement, cash straight
to the bank, etc.
- Schema: add accounting.deposit_lines (deposit_id, company_id, account_id,
amount, memo) for the credit side, plus deposits.source_account_id as a
single-source fallback. RLS mirrors deposits (staff + company member).
- post_deposit_gl: Dr bank for the total; Cr each deposit_lines row's account
for its amount; no lines -> Cr source_account_id; neither -> Cr Undeposited
Funds (backward compatible — existing deposits stay Dr Bank / Cr Undeposited).
Remainder safety net keeps the entry balanced. New trg_acct_deposit_line_gl
re-posts when lines change (header trigger fires before lines exist).
- Make Deposit page: GL-driven submit writes the deposit header + deposit_lines
and marks selected payments deposited. Adds an "Other deposit lines" grid
(account + amount + memo) alongside the existing Undeposited selection, with a
running grand total and a soft guard against over-crediting Undeposited.
Drops the old bank/Undeposited register-transaction inserts and manual balance
pokes (never exercised in production; carried a money-in sign bug). Deposits
are GL-only, consistent with the sync-created deposits already in the DB.
Verified Dr/Cr for single-source and multi-line scenarios against the live GL.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>