Money

Accounting

Double-entry GL, multi-currency reporting, budgets, period close. Built so every dollar (or shilling) reconciles.

Chart of Accounts

Every organization starts with a seeded CoA following standard 4-digit codes: 1xxx Assets, 2xxx Liabilities, 3xxx Equity, 4xxx Revenue, 5xxx Expenses. Edit names, deactivate unused accounts, or add sub-accounts under Accounting → Chart of Accounts.

Required system accounts the engine will look up by code:

  • 1100 Cash
  • 1200 Accounts Receivable
  • 2400 Withholding Tax Payable
  • 3300 Retained Earnings (used by period close)
  • 4100 Rent Revenue
  • 4200 Late Fee Income

GL entries

Every financial event — rent payment, expense, journal entry — posts a pair of GLEntry rows. Each row records:

  • Account, debit / credit, transaction currency, period.
  • A base-currency snapshot (baseDebit, baseCredit, exchangeRate) computed at posting time.
  • Reference type + id pointing back to the originating record (RentPayment, Expense, JournalEntry).

You never edit a GL entry directly — reverse it through a journal entry or by opening the source transaction.

Manual journal entries

Use Accounting → Journal Entries → New for adjusting entries (depreciation, accruals, FX revaluation, opening balances). Lines must balance both in entry currency and in base currency. If you post lines in a foreign currency, the system looks up the rate from the Exchange Rate table effective on the posting date — or you can override the rate per line.

Statuses: DRAFT (no GL impact) → POSTED (GL rows created). Mark an entry as REVERSING and the system auto-creates the inverse in the next period at posting time.

Multi-currency consolidation

Every report (P&L, TB, BS) has two modes:

  • Consolidated (default) — sums base-currency snapshots across all GL entries. Numbers are always in the org's reporting currency.
  • Currency-specific — pass a currency filter; the report drills into entry-currency amounts only. Useful for "what's our USD-denominated revenue in isolation".

Each consolidated report includes a per-currency breakdown card showing the raw mix that fed the totals — so a UGX + USD mix is visible at a glance even though the headline number is one currency.

Reports

  • Profit & Loss — revenue / expenses / net income per period range.
  • Trial Balance — every account's debits and credits for one period.
  • Balance Sheet — assets / liabilities / equity as of a chosen period.
  • AR Aging — overdue receivables bucketed by days overdue.
  • Cash Flow Forecast — 12-month projection driven by lease end-dates + scheduled bills.
  • Budget vs Actuals — per-budget variance with month range filter. Categories link to GL accounts so actuals come from the ledger, not just Expense rows.

All reports export to CSV / Excel / PDF. The PDF embeds your org branding and reporting-currency note.

Bank accounts & reconciliation

Accounting → Bank Accounts. Each account has a currency, current balance (auto-maintained via atomic increments), and a transactions ledger. Bank reconciliation lets you:

  1. Import a bank statement (CSV / OFX).
  2. The matcher suggests pairings against your recorded payments.
  3. You approve or override each match.
  4. Unmatched bank lines become candidate journal entries.

Period lock vs period close

  • Lock — prevents new GL entries from posting to a period. Reversible by admin.
  • Close — generates a CLOSING journal entry that zeros revenue + expense accounts to retained earnings (3300), then locks the period. Idempotent. Use at month-end after books are tied out.