GET /v1/vendors 403s on keys without the Vendors scope; import bills without
vendor links instead of failing the pull, and surface it in results.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Anything on/before buildium_gl.last_synced_date is already in the books as
buildium_gl entries; ap_cutover_date freezes that boundary so direct
buildium_bill/billpay postings never double-count history.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- public.bills.line_items + line-aware accounting mirror (one bill_item per
Buildium line with its mapped platform account)
- buildium-sync bills: strict per-line resolution through
buildium_gl_account_links (unmapped -> bill held + flagged); pulls
/bills/{id}/payments (check#, bank, date) and /bankaccounts/{id}/checks
(one-off checks become paid bill+payment pairs)
- import-mode companies get direct JEs (buildium_bill Dr expense/Cr AP,
buildium_billpay Dr AP/Cr mapped bank) + cleared register rows; sets
buildium_gl.exclude_ap so the nightly GL pull skips Bill/Bill Payment/Check
- buildium-gl-sync: exclude_ap transaction-type filter; preserve buildium_gl
config keys when advancing the watermark
- Settings: Pull Bills & Expenses card with held/unmapped reporting
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Rename the bill_approvals approver column from vendor_name to approver_name
across UI, hooks, types, and buildium-sync. Add a Chart of Accounts import
dialog (XLSX upload + column mapping + type-alias normalization) and a
"denied" status color.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Buildium bill imports left expense_account_id null on all bills because the
importer only read firstLine.GLAccountId, but the bill-line payload exposes the
GL id under GLAccount.Id (nested). chart_of_accounts.account_number already
stores the Buildium GL Id, so resolve the line's GL id from either shape before
mapping it. Re-syncing backfills existing bills via the update path.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- buildium-sync now ensures every active association has an accounting company
after syncing associations. Once it exists, the existing DB triggers flow
units -> customers, owner ledger -> A/R + income, and bills -> A/P + expense
into Accounting automatically (closing the gap where Buildium synced only the
main dashboard, not Accounting).
- New buildium-opening-balances function: fetches an association's Buildium GL
trial balance as of a cutoff (default 2025-12-31, Accrual), maps GL accounts
to accounting accounts (flagging bank accounts), rolls prior-year P&L into
Retained Earnings, writes accounting.opening_balances, and posts the opening
GL entry. Idempotent; service-role gated.
Applied to 6 Buildium associations (opening balances + 2026 activity); all
balance. New columns/data applied to the project directly.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>