Root cause: multiple issues with balance computation across the system.
Accounts list:
- findAll() was doing SELECT * FROM accounts, returning the stale
denormalized `balance` column (always 0). Now computes balances from
journal entries using proper double-entry logic (debit-credit for
assets/expenses, credit-debit for liabilities/equity/income).
Dashboard KPIs:
- Total Cash filtered by name LIKE '%Cash%' which missed accounts not
named "Cash". Now queries ALL asset accounts regardless of name.
- Reserve Fund queried the legacy reserve_components.current_fund_balance
column. Now computes from journal entries on reserve asset accounts.
Opening balance journal entries:
- On blank tenants, equity offset accounts (3000/3100) don't exist, so
the balancing journal entry line was silently skipped, leaving entries
unbalanced. Now auto-creates Operating Fund Balance (3000) and Reserve
Fund Balance (3100) equity accounts when needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Fix account creation initial balance bug: the INSERT RETURNING result
was not being unwrapped correctly from TypeORM's array response, causing
account.id to be undefined and journal entry lines to have $0 amounts.
Now uses findOne() after insert for reliable ID retrieval.
- Add missing balancing equity entry line (debit/credit to account 3000/3100)
so opening balance journal entries are proper double-entry
- Fix account update to use findOne() instead of RETURNING * for consistent
response format
- Add investment account creation to Accounts page: account type dropdown now
shows a separator followed by investment types (CD, Money Market, Treasury,
Savings, Brokerage). Selecting an investment type expands the modal to show
investment-specific fields (institution, principal, interest rate, purchase
date, maturity date, account last 4, notes) and posts to /investment-accounts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Unify reserve_components + capital_projects into single projects model with
full CRUD backend and new Projects page frontend
- Rewrite Capital Planning to read from unified projects/planning endpoint;
add empty state directing users to Projects page when no planning items exist
- Add default designation to assessment groups with auto-set on first creation;
units now require an assessment group (pre-populated with default)
- Add primary account designation (one per fund type) and balance adjustment
via journal entries against equity offset accounts (3000/3100)
- Add computed investment fields (interest earned, maturity value, days remaining)
with PostgreSQL date arithmetic fix for DATE - DATE integer result
- Restructure sidebar: investments in Accounts tab, Year-End under Reports,
Planning section with Projects and Capital Planning
- Fix new tenant creation seeding unwanted default chart of accounts —
new tenants now start with a blank slate
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Admin panel: create tenants with org + first user, manage org status
(active/suspended/archived), contract number and plan level fields
- Units: delete with invoice check, assessment group dropdown binding
- Assessment groups: frequency field (monthly/quarterly/annual) with
income calculations normalized to monthly equivalents
- Sidebar: grouped nav sections (Financials, Assessments, Transactions,
Planning, Reports, Admin), renamed Chart of Accounts to Accounts
- Header: replaced text with SVG logo
- Capital projects: Kanban as default view, table-only PDF export,
Future category (beyond 5-year plan)
- Auth: block login for suspended/archived organizations
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add hierarchical roles: SuperUser Admin (is_superadmin flag), Tenant Admin,
Tenant User with separate /admin route and admin panel
- Add Assessment Groups module for property type-based assessment rates
(SFHs, Condos, Estate Lots with different regular/special rates)
- Enhance Chart of Accounts: initial balance on create (with journal entry),
archive/restore accounts, edit all fields including account number & fund type
- Add Budget CSV import with downloadable template and account mapping
- Add Capital Projects Kanban board with drag-and-drop between year columns,
table/kanban view toggle, and PDF export via browser print
- Update seed data with assessment groups, second test user, superadmin flag
- Create repeatable reseed.sh script for clean database population
- Fix AgingReportPage Mantine v7 Table prop compatibility
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Rename app from "HOA Financial Platform" to "HOA LedgerIQ" across all
frontend pages, backend API docs, package.json files, and seed data
- Add Cash Flow Statement report (GET /reports/cash-flow) with operating
and reserve fund activity breakdown, beginning/ending cash balances
- Add Aging Report (GET /reports/aging) with per-unit aging buckets
(current, 1-30, 31-60, 61-90, 90+ days), expandable invoice details
- Add Year-End Package (GET /reports/year-end) with income statement
summary, collection stats, 1099-NEC vendor report, reserve fund status
- Add Settings page showing org info, user profile, and system details
- Replace all PlaceholderPage references with real implementations
- Bump auth store version to 3 for localStorage migration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>