Skip to content

2.8.3

Released: TBD

Highlights

  • Acted on the Accounting Placeholder Audit: re-verified all 42 findings against HEAD, fixed two real data-integrity bugs, removed dead code, and confirmed two suspected bugs were actually safe by design.

Added

  • None.

Changed

  • Removed dead/unused accounting code with no schema impact: the orphaned pac_transactions bytecode tree, the never-mapped SupplierDefault / client_defaults models and AgeInvoice enum, the orphan validate_supplier_defaults_accounts validator, the uncalled BankReconciliationRepository.last_closed, the never-traversed LedgerEntry.reversal_of / reversed_by ORM relationships (the scalar FK columns are retained), and the dead RecurringInvoiceRunStatus enum.

Fixed

  • Depreciation double-posting (audit #27). FixedAssetService.run_period now refuses to post a period that already has a posted depreciation run, preventing doubled expense and accumulated depreciation when a month is run twice.
  • Account balances always showed zero (audit #11). The accounts landing page (AccountQueryRepository.paginated_stmt) now computes each account's real posted general-ledger balance on its natural side instead of a hardcoded 0.

Migrations

  • None. No schema changes — no alembic revisions, no GraphQL surface changes.

Frontend impact

  • The accounts list now returns a real balance per account instead of 0; no contract change. Everything else is internal cleanup. A set of larger audit items (bank-reconciliation settlement, supplier-credit application, ledger is_posted drafts, project/office budget scoping, dead-enum cleanup) remain deferred pending product review.

Versioning notes

  • PATCH bump (uv run python scripts/bump_version.py 2.8.3 --changelog-stub): bug fixes plus dead-code removal, no breaking or additive schema changes.