Skip to content

changelog

All notable changes to this product are documented here. The format is based on Keep a Changelog, and this product adheres to Semantic Versioning.

  • “Manual Journals” renamed to “Journal Entries”. Per stakeholder feedback (Osita Onyekwere) that “manual journal” is Zoho jargon and reads unclearly, the Accountant menu item, page title, breadcrumb and Bulk-Update module option are now Journal Entries, and the create/edit form is New Entry / Edit Entry (button “+ New Entry”). The accountantActive nav-highlight keys were updated in lockstep so the sidebar active state still resolves. The underlying object, Journal# voucher numbers and the double-entry line semantics are unchanged.
  • All date fields are now native date pickers, defaulted to today. Every “DD Mon YYYY” text input across the app — Invoice (date/due), Estimate (date/expiry), Bill (date/due), Credit Note, Expense, Journal, Payment (received/made), Vendor Credit, all four Recurring forms (start + ends), the bulk-expense grid, and the Bulk Update From/To filters — became <input type="date"> pre-filled with today (optional “Ends On” fields stay blank). Dates round-trip cleanly: shared isoToDisp/dispToIso helpers convert the picker’s ISO value to the app’s “DD Mon YYYY” display on save and back when editing, so all stored/displayed dates stay consistent.
  • Bank accounts now span multiple currencies + company-scale amounts. Two accounts were re-denominated to show the multi-currency model on the banking page, dashboard tiles and account detail: Mercury · USD Domiciliary ($180,000) and JPMorgan · GBP Reserve (£64,000) alongside the NGN accounts (GTBank ₦148.6M, Sterling ₦38.2M, Petty Cash ₦2.4M, Corporate Card −₦3.8M); foreign tiles show the ≈ NGN equivalent and consolidate into the Naira totals. Every amount across the app was scaled to realistic company size (thousands→millions): the dashboard KPIs (Receivables ₦372.58M · Payables ₦168.42M · Cash in hand ₦591.1M · Inflow ₦892.5M), the cash-flow panel/axis, Income-&-Expense and Top-Expenses charts, the banking summary tiles, and — via a one-time runtime scaler (×1000, monetary values only, FX rate table and quantities/percentages left intact) — all invoice/bill/expense/journal/COA/contact seed data, so lists, details and reports read at company scale.
  • Bulk-categorized transactions keep per-line visibility. When several uncategorized bank statement lines are bulk-categorized together, they now post as one bundled transaction whose detail (opened by clicking the categorized row, which shows a “N lines” badge) preserves every underlying line — mirroring Zoho. The detail has a Transaction Details tab (a Statement Line Information (N) table listing each line with date/description/amount + Total, plus a Display Journal showing the double-entry Dr/Cr in base currency NGN, and a receipts drop zone) and a Comments & History tab, with Edit · Print · Uncategorize actions (Uncategorize returns the lines to the feed). Feedback from Phebe Idowu.
  • Dark mode. A theme toggle (moon/sun) in the topbar switches the whole app between light and dark, persisted to localStorage and re-applied on load. Implemented by overriding the design tokens under a body.dark scope, so every component that uses var(--*) adapts automatically — surfaces, text (1/2/3), borders, brand/semantic dims, and shadows are all re-tuned for dark with accessible contrast (light text on #181B21 cards over a #0F1116 page; lightened green/blue/amber/red/purple for legibility on dark). color-scheme:dark is set so native date pickers and scrollbars render dark. Following a full audit for dark-mode inconsistencies, the hardcoded colors that don’t live on tokens were tokenized or given dark overrides: form inputs/selects/textareas and the modal panel now use var(--input-bg) / var(--surface) (so they’re white in light, dark in dark); the brand-green buttons (.btn-pri, .ds-btn-primary) use a fixed dark #111 text/icon in both themes (per the brand rule — no more white-on-green in dark); the table header (.tbl th) uses var(--grey2); all five toast variants, all tooltips (sidebar, chart, income-bar), and the matched/reconciled badge greens get dark-appropriate colors. Verified across dashboard, forms, modals, settings, and data tables — buttons, inputs, status badges and KPIs all keep good contrast; light mode is unchanged.
  • Multi-currency on a Naira base (Batch 1). Base currency is now NGN (₦) throughout (every KPI, card, table, register, chart and form, replacing USD). Bank accounts can be opened in any currency (the Add-Account form gained a full currency selector — NGN · USD · GBP · EUR · ZAR · GHS · KES · CAD · CNY), but all balances consolidate to Naira at live rates. Helpers added: money(n,cur) / toNGN(n,cur) / curSym / CUR_NAMES / FX_TO_NGN. Also fixed five leftover $ symbols in the banking JS (closing-balance series, save-transaction, categorize/match running balance, reconcile) that the bulk USD→₦ pass had missed.
  • Bank categorization + FX (Batch 2). On a bank account’s Uncategorized tab you can now multi-select lines (per-row checkboxes + select-all) and bulk Categorize (one category applied to all) or bulk Exclude. The bulk-categorize modal renders the full per-category field set that swaps with the “Categorize as” dropdown — the same fields as the single-line panel (e.g. Expense → Date · Vendor · Expense Account · Itemize · Amount · Tax · Reference# · Customer · Description · Attach Receipt; Vendor Advance → Vendor · Amount · Date · Reference# · Paid Via · Deposit To · Description) — with the Amount prefilled (read-only) to the combined total of the selected lines, mirroring Zoho’s “Categorize Manually” panel. Categorizing a single line renders that category’s own fields — the “Categorize as” dropdown now drives a live field set (feedCatFields → txnFieldList(category)) so Expense shows Expense Account/Tax/Itemize, Vendor Payment shows Vendor/Paid Via, Transfer shows To/From Account, etc., with the line’s amount pre-filled. The Expense transaction gained an Itemize toggle (multi-line Account · Notes · Amount · Tax) on both the bank Add-Transaction modal and the standalone Purchases ▸ Expenses form. When a transaction’s currency is changed away from NGN, a live editable Exchange Rate appears (prefilled from the rate table, “1 USD = ₦1,600 · editable”) with a running “Equivalent in base currency · ₦X” readout; the account balance consolidates in NGN. Teardown: docs/bank-categorize-teardown.md.
  • Line-item Tax picker + inline New-Tax (all document forms). The per-line Tax % text input on Invoice / Estimate / Bill / Credit Note / Recurring Invoice / Vendor Credit is now a tax dropdown (Non-Taxable · VAT [7.5%] · WHT [5%] · WHT [10%] · + New Tax…) cloning the demo. “+ New Tax…” opens a New-Tax modal (Tax Name · Rate % · Tax Agency · value-added/compound checkboxes) that adds the tax to every picker and selects it. The option value carries the numeric rate, so all recalc/save logic is unchanged.
  • + New Tax on EVERY tax dropdown. The inline “+ New Tax…” affordance now appears on all tax selects, not just line items — the add-transaction / categorize Expense Tax, the bulk-categorize Tax, the standalone Expense Tax, both Expense itemize tables, the Recurring Expense Tax, and the manual + recurring Journal line Tax. Two shared helpers back this: a rate-valued picker (taxSelById, value = numeric rate) and a label-valued picker (taxSelLabelById/taxSelLabelHTML, value = tax name, for journals/recurring-expense that store the label). Saving a new tax updates all open dropdowns of both kinds and the Settings ▸ Taxes list, since everything reads the single TAXES array.
  • File attachments on documents (Invoice / Estimate / Expense / Vendor Credit forms + Vendor Documents), matching the demo’s “Attach File(s)” — form control → persisted on the record → rendered on the detail page.
  • Bulk Add Expenses (Purchases › Expenses) — a Record Expense / Bulk Add Expenses toggle opens a grid (Date · Expense Account · Amount · Paid Through · Vendor · Customer · Projects · Billable) with Add-More + Save-all, mirroring the demo.
  • Bulk expense CSV upload (Batch 5). The Bulk Add Expenses grid gained an Upload CSV control plus a Download CSV template that autopopulate the grid: the file is parsed client-side (FileReader, quoted-field aware), vendor/customer names are matched to records, Billable Yes/No maps to the checkbox, and a trailing empty row is kept so you can keep adding. Review then Save creates the expenses.
  • Settings flows — Roles & permissions, Locations, Taxes, Journal Approvals (Batch 7). The Settings area gained four working flows captured from the live product:
    • Users & Roles (replaces the toast-only Team tab) — a Users tab (Invite User modal with a role dropdown; Change role; Remove) and a Roles tab (New Role / Edit modal with a module-permission matrix — Banking · Sales · Purchases · Accountant · Reports · Settings · Documents, each Full Access / View Only / No Access). Roles you create immediately appear in the Invite dropdown, so you create roles separately and invite users into them (system roles Admin/Staff are view-only).
    • Taxes — manage the shared TAXES rate table (New / Edit / Delete with Name · Rate · Agency · Compound), in sync with the line-item tax picker.
    • Locations — branches/depots (New / Edit, Make primary, Delete; Name · Code · Address · primary).
    • Journal Approvals — the Accountant ▸ Journal Approvals preference: No Approval / Simple Approval / Multi-Level Approval, with Multi-Level revealing per-level approver pickers. Captured from /settings/preferences/accountant/manual-journal-approval.
  • Recurring Journals (Accountant · Batch 6). A new Recurring Journals area under the Accountant menu (after Manual Journals), mirroring Recurring Bills/Expenses: list (Profile · Reference# · Frequency · Last/Next Journal · Status · Amount) with view filters / search / sort / bulk Stop·Resume·Delete, a detail page (journal-entry lines, generated-journals table, schedule, notes, balanced check), and a New/Edit form (Profile · Repeat Every · Start · Ends On [Never expires] · Reference# · journal entry lines · Notes) with full Stop/Resume/Clone/Delete. Wired into the sidebar, breadcrumbs, and active-state.
  • Per-row currency + Transaction Type on journal entries (Batch 6). Each manual-journal and recurring-journal line now has its own Currency selector (was a single header-level currency), so a journal can mix currencies line by line. Added the Transaction Type column (Select a Type · Sales · Purchase) between Contact and Tax, matching Zoho’s journal grid (used for tax reporting), captured on save for both forms. Column widths were given min-width floors and the line table scrolls horizontally when dense, so currency codes and type labels no longer clip; the Description cell flexes to fill any slack (no empty gap). Scoped the shared journal form helpers (jrAddLine/jrFormRecalc/save) to the active screen so the manual and recurring forms — which share line markup — don’t collide.
  • Invoice clone + account fields on Invoice & Credit Note (Batch 4). Cloning an invoice now opens an editable pre-filled draft form (was dumping straight to the read-only detail) — the proper Zoho clone flow. Invoice creation gained an Accounts Receivable account selector (Accounts Receivable · Trade Debtors · Unbilled Receivables) plus a Subject field, matching the live form; the chosen AR account drives the invoice’s GL posting and shows on the detail. Credit Note creation gained the same Accounts Receivable + Subject header fields and a per-line Account column (income account: Sales · Other Income · Interest Income · Consulting Income), exactly as captured from the demo (Item Details · Account · Qty · Rate · Disc · Tax · Amount). Also swept the remaining (USD) price-list / revaluation labels to (NGN) (the genuine “1 USD =” foreign-rate labels were left intact).
  • Reconciliation reworked to match Zoho (Batch 3). The old “tick the cleared lines” model was wrong — Zoho lists the period’s transactions (you don’t select them) and you clear the gap between the statement Closing Balance and the book Cleared Balance by adding transactions until the Difference reaches ₦0. The reconcile worksheet now shows three live tiles (Cleared · Closing · Difference), an amber hint that names the difference and the direction to clear it (“add the missing withdrawal(s)…”), a non-selectable Deposits/Withdrawals table of the period transactions, and a + Add Transaction inline form that matches Zoho’s reconcile Add-Transaction modal — Apply To (Payments/Refunds · Charges) · Date (+ “Use today’s date”) · Account · Amount · Reference#, with a tip showing the exact amount that clears it — that appends rows and recomputes. Reconcile stays disabled until the difference is ₦0, then the tile turns green. Captured from the live /reconciliations/.../new flow.
  • Bill form completed — added the missing Order Number and Price List fields (the demo + Caesar’s own invoice form have them); Order# shows on the bill document.
  • Vendor Credit lines gained the Tax column (was missing) — wired to the tax picker, with Sub Total / Tax / Total in the form, detail table, and save; added vcTax/vcTotal.
  • Reports: custom date range + drill-down. Added a Custom period option with From/To inputs (Apply re-renders), and every report row whose label is a known account / customer / vendor is now clickable to its detail (Trial Balance/Balance Sheet/GL/P&L → COA register, Sales-by-Customer/AR-aging/balances → customer, AP/vendor reports → vendor).
  • Banking overview polish — the four stat tiles now use the --grey1 card background (matching the Account Summary tab); the “All Accounts” header and “Cash flow” divider strokes are inset to the card’s 20px padding instead of running edge-to-edge.
  • Recurring Expenses module (Purchases) — replaces the dead “Requisitions” sidebar item. Captured the Zoho demo’s Recurring Expenses deeply (list / detail / form / menu) and built a dedicated, demo-faithful area: a single expense-account model (not a bill line-item table). List columns match the demo exactly — Profile Name · Expense Account · Vendor Name · Frequency · Last Expense · Next Expense · Status · Amount; detail shows Expense details (Amount/Repeats/Account/Paid Through/Tax/Start/Ends/Last/Next) + Other details (Vendor/Customer/Notes) + a clickable generated-expenses table; the form carries Profile · Repeat Every · Start · Ends On · Expense Account · Amount · Tax · Paid Through · Vendor · Customer · Notes. Full interactivity (row/kebab Edit·Stop·Resume·Delete, bulk actions, sort/filter/search, Clone, New). Wired into the sidebar (after Expenses, matching the demo), Quick-Create, breadcrumbs, active-state and the dashboard “View more”. Recurring Bills is now bills-only (the two expense profiles migrated to Recurring Expenses; the Bill-vs-Expense Type column / view filters / form select were removed) so the two areas are disjoint, mirroring the demo. Teardown: docs/recurring-expenses-teardown.md.
  • Document references are now clickable and routed everywhere they appear. A generic docLink(num) / docOpen(num) router (resolves any INV/BILL/PAY/PMT/EXP/EST/CN/VC number to its record) plus a linkifyDocs(text) helper for free-text were applied across the app so any invoice/bill/payment/etc. number opens its detail in one click: banking account Transactions Reference# column, COA account-register Details, Bulk-Update results, Documents “Associated With”, dashboard Recent-Transactions, payment-receipt/payment-made applied-doc tables, credit-note→invoice and vendor-credit→bill links (detail + list), customer/vendor Statement rows, and inline doc numbers in comments + Notes. Journal-detail account names now link to their COA register; the dashboard’s three Bank/Cash/Card tiles open their account. A general parallel cross-reference (6 module finders + adversarial verify, 14 confirmed findings, all fixed) drove this pass. Also: estimate “View Invoice” now opens the actual linked invoice (was dumping to the Invoices list); the vendor Statement period filter now actually filters by date (was a no-op); archived customer-transaction stubs toast instead of navigating to an unrelated list. Verified across all 20 screens with zero console errors.
  • Sidebar: expanding the collapsed rail now reveals the active section’s submenu in one click. When you’re two levels deep (e.g. a Payment receipt) the rail auto-collapses; expanding it — whether via the crumb toggle or by clicking the active section’s icon — now opens that section with its submenu shown and the current page highlighted, so you can switch to a sibling page (Invoices, Credit Notes, …) without a second click to open the menu. Fixes a bug where clicking the active section’s rail icon expanded the sidebar but immediately re-collapsed its (preserved-but-hidden) submenu. Clicking a different section while expanded still switches the accordion as before.
  • Customer + Vendor detail section tabs now use the segmented (.seg) tab style from the bank details page (Overview / Comments / Transactions / Statement) instead of the underline style. Track tinted with --hover so the pill reads on the grey detail page (the bank’s .seg only shows its track because it sits on a white card).
  • Head-to-toe demo cross-reference remediation (65 findings, 63 fixed · 2 intentionally out of scope). Ran a deep parallel cross-reference of the whole app against the captured demo teardowns (17 High · 25 Medium · 23 Low), then fixed every functional gap and verified each batch in preview with zero console errors. The dominant theme was “looks right but does nothing” — bulk bars, clones, status toggles, and payment flows that only toasted instead of mutating the in-memory data.
    • Topbar global search (H1) — the previously-dead search input now searches across CUSTOMERS / VENDORS / INVOICES / BILLS / ESTIMATES / BANK accounts, renders a grouped results dropdown (Contacts · Transactions · Accounts) with icons + amounts, routes each result via the real open*() openers, supports /-to-focus and arrow/enter keyboard nav, and closes on outside-click/Esc.
    • Notifications (M2) — each notification routes to its record (bill → Bills, uncategorised → GTBank, period-close → Settings) and “Mark all read” clears the unread dots + bell indicator.
    • Data-mutating actions (H2–H17) — banking KPIs / running balances / categorize-match recompute from feed.length and write real transactions; all list bulk bars (customers, invoices, expenses, recurring bills, vendor credits, payments) mutate the arrays; clones produce valid records in the right status; mark-inactive / approve / write-off toggle real status; bill Record-Payment creates a linked Payment Made; deleting an applied payment reverses the bill balance; estimate Send advances Draft→Sent; credit-note Refund uses a modal; the three missing report bodies (General Ledger, Movement of Equity, Sales by Salesperson) render, report Export downloads real CSV, and the report date-range recomputes.
    • Parity gaps (M5–M22) — customer comment links open the referenced invoice; customer Statement date-range + Outstanding filters actually filter; estimate list kebab is status-gated (Convert to Invoice → View Invoice once Invoiced, hidden for Draft); invoice Make-Recurring seeds the recurring form from the invoice; payment-receipt GL splits Bank Charges; Comments & History panels added to payment-receipt, credit-note, and bill detail; vendor Transactions/Statement now derive from the live BILLS/PAYMENTSMADE/EXPENSES/VENDORCREDITS arrays with clickable rows; Bills gained a Pending Approval lifecycle (view filter + amber banner + Approve/Reject); Expenses list gained the Customer column; recurring-bill generated docs are clickable; Bulk-Update From/To date filters work.
    • Polish (L1–L23) — navTo clears stale sub-item highlight; Duplicate-Customers view uses a real name/email heuristic; Client Viewed added to estimate views; Expired badge → grey (terminal); Draft/Pending invoices no longer show a Journal link; Approved invoices get Send actions; void/write-off now confirm via a reusable confirmModal; write-off is a distinct Written Off status; recurring-invoice Terms & Conditions field; payment Advance/Retainer views de-overlapped; bill attachments (upload + list); Recurring-Expense quick-create presets Type = Expense; manual-journal line grid + detail gained a Tax column and the detail totals are a real column-aligned <tfoot>; parseDate now orders by year; Documents Trash count badge + folder counts refresh on move-to-trash; Bulk-Update dropped the out-of-scope Purchase Orders type. Intentionally not done: the optional “Bank Statements From Inbox” email-forwarding widget (L2 — avoids re-introducing mail UI) and adding Journal/Recurring-Expense to the customer New-Transaction menu (L4 — the curated sales-only set is by design per the teardown).
  • App-wide design / spacing pass (4px-grid clean-up). Ran a parallel design audit (10 module readers, every finding adversarially re-verified) against the Rechaj hard rules, then normalized the foundation CSS + inline styles so every padding / margin / gap lands on the 4px grid (snapping the banned 7 / 11 / 13 / 14 / 15 / 18 / 22 / 26 / 30-style values to the nearest multiple of 4; the consistent 6px / 10px sub-rhythm is kept). Canonicalized the .badge to the design-system spec (12px / 500 weight / 6px radius, was 11px / 600 / 21px) and removed a stray 10px badge override in Chart of Accounts. No card-stroke, grey-card, white-on-white, or em-dash-in-copy violations were found, confirming the structure was already sound. Two flagged “bold status word” findings were false positives (already overridden to 600 by .est-banner b / .est-meta b). Verified in preview, no console errors, no visual regressions across Dashboard, Invoice detail, Record-Payment modal, Banking, P&L, and Chart of Accounts.
  • Full interactivity sweep — every “coming soon” toast removed (was 87, now 0), verified in preview with no console errors. Re-cross-referenced the whole app from Banking down to Documents and wired every dead control to real behaviour:
    • Banking — the Add Transaction menu now carries all 20 demo transaction types (same full menu for bank/card/cash, confirmed against the demo), and clicking each type renders its captured per-type form fields; Import Statement and Attach use real file drop-zones.
    • Shared utilities (new, reused app-wide so there are no per-screen dead ends): exportCSVAuto (downloads the visible list as CSV), emailAuto / composeEmailModal (compose-email modal prefilled with the doc’s contact + subject), printDoc, importModalAuto (CSV/XLSX import modal with drop-zone + duplicate handling), viewJournalAuto / glModal (system-posted double-entry GL view for any posting doc — invoice, bill, payment, credit note, vendor credit, expense — with a balanced/unbalanced check), newTxFromContact (New Transaction menu entries open the right prefilled form with the customer/vendor selected), cloneAuto (deep-clones the open record as a new Draft), mergeModal + portalModal (customer/vendor merge + portal config).
    • Sales — customer/vendor New Transaction menus open prefilled forms (dropped out-of-scope Project/Journal/Recurring-Expense/Purchase-Order); customer/vendor Delete removes the record and returns to the list; bulk Merge validates a 2-record selection; the Transactions-tab “+ Add New” rows open the matching prefilled form; estimate Convert to Invoice now creates a real linked invoice and “View Invoice” opens it; estimate Share copies a portal link; invoice Create Credit Note opens a prefilled credit note; invoice/bill Make Recurring open the recurring form.
    • Purchases — billable expense Convert to Invoice creates a real linked invoice from the expense; vendor flows mirror the customer side.
    • Reports/Documents — Custom Report opens a report builder modal; report Export downloads CSV; Upload, New Folder, and file Preview open real modals (upload adds to the list); journal attachment download wired.
    • Genuinely out-of-scope sidebar / quick-create destinations now show a neutral “not in this prototype” note instead of a dead click.
  • Reports Center + Documents COMPLETE.
    • Reports (#/reports) — a Reports Center with a left category nav (Business Overview · Sales · Receivables · Payables · Purchases & Expenses · Taxes · Banking · Accountant) and categorized report links. Rendered financial reports computed live from the COA + data: Profit and Loss (Income → COGS → Gross Profit → Operating Expenses → Net Profit, the finance headline), Balance Sheet (Assets / Liabilities / Equity, balanced via Current-Year-Earnings), Trial Balance (debits = credits), AR / AP Aging Summary, Sales by Customer, Customer/Vendor Balances, Purchases by Vendor, Expenses by Category, VAT / WHT Summary, Bank Account Summary, Cash Flow Statement. Each opens a clean report sheet with date-range + Export/Print.
    • Documents (#/documents) — a single place listing every file uploaded or posted (Name · Type · Associated With · Uploaded By · Date · Size), with a left folder nav (All Documents · Files · Bank Statements · Folders · Trash), search, type-colored file icons, upload, and move-to-trash. Seeded from the attachments created across the build (journal supporting docs, bill/invoice PDFs, bank statements, VAT filing).
  • Accountant module COMPLETE — built all four sub-menus (deep-cross-referenced against the demo, no console errors):
    • Chart of Accounts (#/accountant/chartofaccounts) — 24-account COA incl. MocX-specific accounts (VAT Payable, WHT Receivable/Payable, Rider’s Loan, Solar Panel Sales); list with type badges grouped by Asset/Liability/Equity/Income/Expense, type/active view filters, sort, search; per-account register detail (info + closing balance + transactions); New/Edit account modal with grouped type select.
    • Manual Journals (#/accountant/journals) — the finance “very key” one: double-entry line editor (Account · Description · Contact · Debit · Credit) with a live balance check that blocks publishing until debits = credits; detail shows the journal entries, Notes, Attachments, and a prominent Audit Trail (who created/edited/published, when, and what changed); Save as Draft / Save and Publish.
    • Bulk Update (#/accountant/bulkupdateaccounts) — accountant tool with a risk banner: filter transactions by type + current account + date, select, and re-account in bulk to a new account (actually updates the rows).
    • Currency Adjustments (#/accountant/bcyadjustment/list) — FX revaluation at the CBN rate (per the finance team): list of past adjustments with gain/loss, and a New Adjustment modal that fetches the CBN rate, revalues the foreign-currency accounts, and computes the net gain/loss live as the rate changes.
  • Purchases module COMPLETE — built all six sub-menus (each: list + detail + form, fully dynamic, deep-cross-referenced where the demo was reachable, no console errors):
    • Vendors (#/vendors) — mirror of Customers on the payables side: list (Name · Company · Email · Work Phone · Payables · Unused Credits), detail with Overview · Comments · Transactions · Statement tabs (Spend chart, Bills/Payments-Made/Expenses/Vendor-Credits sections, vendor statement), New Transaction (Purchases) menu, and the full new/edit form.
    • Bills (#/bills) — posting doc mirroring Invoices with a per-line Account column (expense account), Bill-From/Bill-To document, Record Payment → Payments Made, Journal link, Balance Due, Make Recurring.
    • Payments Made (#/paymentsmade) — Payment Voucher detail (amount-in-words), apply-to-open-bills form with Pay-in-full that reduces bill balances.
    • Expenses (#/expenses) — list (Date · Account · Reference# · Vendor · Paid Through · Status · Amount), expense detail with a debit/credit Posting card + Convert-to-Invoice for billable, form that sets Billable when a customer is attached.
    • Recurring Bills / Expenses (#/recbills) — recurring purchase profiles with a Type (Bill/Expense) column + filter, Schedule/Vendor cards, generated-documents list, Stop/Resume, line items with Account.
    • Vendor Credits (#/vendorcredits) — mirror of Credit Notes on the vendor side with an Apply to Bills modal (reduces bill balance, closes the credit when fully used), Refund, Journal link.
    • Note: the demo’s JS bridge was intermittently timing out during this batch; Expenses was built from Zoho’s established structure (columns confirmed earlier from the vendor Expenses section) and will be re-verified against the live demo. All other Purchases sub-menus were cross-referenced against the demo.
  • Sales module COMPLETE — added the remaining three sub-menus (each: captured from the live demo by clicking everything, built list+detail+form dynamically, deep cross-referenced, revalidated, no console errors):
    • Payments Received (#/paymentsreceived) — list (Date · Payment# · Type · Reference# · Customer · Invoice# · Mode · Amount · Unused; views All/Invoice/Retainer/Customer-Advance); Payment Receipt detail (amount-in-words, applied-invoices table, Journal link); form with an apply-to-open-invoices table + “Pay in full” that recalcs live and reduces invoice balances on save.
    • Recurring Invoices (#/recurringinvoices) — list (Customer · Profile · Frequency · Last/Next Invoice · Status · Amount; views All/Active/Stopped/Expired); detail with Schedule + Customer cards, line-item doc, generated-invoices list, and status-dependent Stop/Resume; form (Profile · Repeat Every · Start/Ends + Never-expires · Terms · line items, live total).
    • Credit Notes (#/creditnotes) — list (Date · Credit Note# · Reference# · Customer · Invoice# · Status · Amount · Balance; views All/Draft/Open/Closed/Void); CREDIT NOTE detail with Credits-Remaining, Journal link, and an Apply to Invoices modal that applies the credit to open invoices (reduces invoice balance, closes the note when fully used); form (Save as Draft / Save as Open).
  • Sales · Invoices (batch 3 of Sales) — captured end-to-end from the demo (route #/invoices) + Zoho API/Help, recorded in docs/sales-teardown.md, and built in the shell (#scr-invoices / #scr-invoice / #scr-invoice-form), wired to sidebar Sales → Invoices, breadcrumb Sales › Invoices › {num}. The first posting sales doc:
    • List: Date · Invoice# · Order Number · Customer Name · Status · Due Date · Amount · Balance Due; view dropdown (All · Draft · Pending Approval · Approved · Sent · Partially Paid · Overdue · Paid · Void) that filters; sortable columns incl. Due Date + Balance Due; list hamburger; bulk bar; full status colors (Draft grey · Sent blue · Partially Paid amber · Overdue red · Paid green · Void grey).
    • Detail: PDF-style invoice document (org · INVOICE · Invoice/Due dates · Terms · Bill To · line items · totals incl. Payment Made + Balance Due), status-contextual banner, header actions Comments & History · Edit · Send · PDF/Print · Journal (GL link, since invoices post) · Record Payment + status-dependent primary (Draft → Send Invoice/Mark as Sent; Sent/Overdue/Partially Paid → Record Payment) + More (Clone · Create Credit Note · Write Off · Void · Delete). Comments & History timeline.
    • Record Payment modal (amount, date, mode, deposit account) that actually applies — reduces Balance Due and flips status to Partially Paid / Paid. Write Off and Void update status live.
    • Form: Customer* · Invoice# · Order Number · Invoice Date · Payment Terms · Due Date · Salesperson · Price List + per-line Disc/Tax line items with live totals, Notes/Terms, and Save and Send / Save as Draft / Make Recurring / Cancel (persists). Verified end-to-end in preview, no console errors.
  • Detail header spacing — added a consistent 24px gap between the detail header/toolbar and the status banner (.est-banner, used by estimate + invoice details) and the customer detail’s summary tiles, so the banner no longer sits flush against the action row.
  • All card containers are now white, not grey. Flipped every card surface from --grey1 to --surface (white) across the app — .sum-card, .est-doc, .stmt-doc, .est-banner, .bk-s, .bank-card, .sum-side-tile, .rec-b, .cmt-box, and the banking-summary accordion card. To keep white cards visible (no strokes/shadows allowed), they now sit on the grey page rather than nesting in a white panel: the customer-detail tab wrapper and the dashboard “Bank and Credit Cards” section are transparent, the banking account-summary wrapper toggles flat (.txn-card.flat) for the summary view while the transactions table keeps its white card, and the customer Comments/Transactions tab content is wrapped in its own white card. Grey is retained only for non-cards (hovers, icon circles, badges, modal footers, disabled inputs). Verified across estimates/customers/banking/dashboard, no console errors.
  • Estimates — deep cross-reference against the demo + gaps closed. Drove the live demo through the whole Estimates flow and matched it field-for-field:

    • Detail: added the demo’s Comments & History panel (toggle in the toolbar) — an Add-Comment composer + comment list and a status-derived audit/history timeline (created → sent → viewed → accepted/declined/invoiced/expired). Made the header’s primary actions status-dependent (Draft → Send Estimate + Mark as Sent; Sent → Mark Accepted/Declined + Convert to Invoice; Accepted → Convert to Invoice; Invoiced → View Invoice). Added Share to the More menu.
    • Per-line Discount & Tax: the demo’s line-item table has Discount and Tax columns (mine only had Qty/Rate/Amount). Reworked the data model and totals to compute per-line discount + tax (rolling into Sub Total · Discount · Shipping · Adjustment · Tax · Total); the detail document now shows Disc/Tax columns.
    • Form: added the missing Project Name and Price List fields, and the per-line Disc % / Tax % columns, all feeding the live-recalculating totals; Save validates the customer and persists.
    • Recorded the deep capture in docs/sales-teardown.md. Verified end-to-end in preview (status actions, Comments & History add/toggle, per-line math, form recalc), no console errors.
  • Sales · Estimates (batch 2 of Sales) — captured end-to-end from the live demo (route #/quotes) + Zoho API/Help docs, recorded in docs/sales-teardown.md, and built in the shell (#scr-estimates / #scr-estimate / #scr-estimate-form), wired to sidebar Sales → Estimates with breadcrumb Sales › Estimates › {num}:

    • List: columns Date · Estimate# · Reference# · Customer Name · Status · Amount; a view dropdown (All · Draft · Sent · Accepted · Declined · Invoiced · Expired) that filters; sortable Date/Estimate#/Customer/Amount with indicators; list-options hamburger (Sort · Import · Export · Refresh); a bulk bar (Mark as sent/accepted · Email · Print · Delete); full status badge set color-coded (Draft grey · Sent/Client-Viewed blue · Accepted/Invoiced/Approved green · Pending amber · Declined red · Expired amber).
    • Detail: PDF-style estimate document (MocX org block · ESTIMATE · number · Bill To with address · estimate/expiry dates · salesperson · line-item table · Sub Total/Discount/Shipping/Adjustment/Tax/Total · Notes · Terms), a status-contextual banner, and header actions Edit · Mails · PDF/Print · Convert to Invoice · More (Mark as Sent/Accepted/Declined · Clone · Create Project · Delete). Lifecycle actions update status live; Convert to Invoice flips status to Invoiced (and the button becomes “View Invoice”).
    • New / Edit form: header (Customer* · Estimate# · Reference# · Estimate/Expiry dates · Salesperson) + an editable line-item table (Item · Qty · Rate · Amount, add/remove rows) with live-calculating totals (Sub Total · Discount · Shipping · Adjustment · Tax % · Tax amount · Total) + Customer Notes · Terms; Save and Send / Save as Draft / Cancel actually persist (new estimate prepends to the list; edit updates in place). Verified end-to-end in preview, no console errors.
  • Sales · Customers (batch 1 of Sales) — captured end-to-end from the demo (docs/sales-teardown.md) and built in the shell: a Customers list (#scr-customers: Name · Company · Email · Work Phone · Receivables · Unused Credits, with search, an All Customers/Active/Inactive/Overdue/Unused-credits filter, bulk-select bar, per-row kebab, and avatars + status dots); a customer detail screen (#scr-customer); and a full New / Edit Customer form (#scr-customer-form: Customer Type, Primary Contact, Company, Display Name, Email/Phone + section tabs Other Details · Address · Contact Persons · Remarks, matching the demo’s fields). Wired to the sidebar Sales → Customers; breadcrumb Sales › Customers › {name}. All controls dynamic; verified, no console errors.

  • Customers menu — full demo cross-reference + every control wired up. Drove the live demo through the whole Customers menu (list, form, detail) and closed every gap:

    • List view: title is now a view dropdown matching the demo’s default filters (All Customers · Active · Inactive · Overdue · Unpaid · Client Portal Enabled · Client Portal Disabled · Duplicate · CRM Customers), each actually filtering; sortable columns (Name · Company · Receivables · Unused Credits) with live sort indicators; a list-options hamburger (Sort by · Import · Export · Refresh List); and a bulk-action bar aligned to the demo (Mark as inactive · Merge · Send email · Delete) that reads the live selection count.
    • New / Edit form now matches the demo field-for-field and is fully functional: added the Mobile field (Customer Phone = Work Phone + Mobile), Source, Documents upload, and a Portal Language field that reveals when portal access is enabled; the “shipping same as billing” toggle now shows/hides a full Shipping Address block; Save validates the required Display Name and actually persists (creates a new customer — slug id, opening balance → receivables — or updates the existing one) so it appears in the list immediately; added Save and New.
    • Detail: added the demo’s “Go to transactions →” link atop the Transactions tab.
    • Capture recorded in docs/sales-teardown.md (List view + form deep-capture sections). Verified end-to-end in preview (view filters, sort, hamburger, bulk bar, create/edit/persist, toggles), no console errors.
  • Customer detail — deep re-capture + rebuild to match the demo, no empty tabs. Clicked through every control on the live demo and rebuilt #scr-customer accurately:

    • Mails tab removed (per request); tabs are now Overview · Comments · Transactions · Statement.
    • Overview is now two-column and data-rich: Contact details, Address (Billing + Shipping), Other details (Customer Type · Currency · Price List · Payment Terms · Portal Status · Source · Website), Remarks; and on the right a Receivables panel + an Income bar chart (last 6 months, hover tooltips, total).
    • Comments — a working composer (Add Comment prepends a real comment + updates the count) over an “All comments {n}” list (avatar · author · time · body · contextual link), matching the demo.
    • Transactions — the demo’s grouped, collapsible sections each with a count + Add New: Invoices (Date · Invoice# · Amount · Balance Due · Status), Payments Received (Date · Payment# · Mode · Amount · Unused), Estimates, Credit Notes, with the demo’s full status set (Draft · Pending Approval · Approved · Open · Overdue · Partially Paid · Paid · Void). Empty sections show a real empty state, never a blank tab.
    • Statement — date-range + Filter (All/Outstanding) dropdowns, Send Email / Print / PDF, and a statement document (org block + “Customer Statement” + date range) with a running-balance table built from the customer’s invoices and payments.
    • Header menus now match the demo: New Transaction ▾ (Sales group: Invoice · Customer Payment · Estimate · Recurring Invoice · Expense · Recurring Expense · Journal · Credit Note · Project); More ▾ (Configure Customer Portal · Enable All Reminders · Clone · Merge Customers · Mark as Inactive · Delete).
    • CUSTOMERS enriched with per-customer addresses, other-details, remarks, comments, invoices/payments/estimates/credit-notes, and 6-month income so every tab is populated. Verified across customers (incl. inactive/empty), no console errors.
  • Banking round-2 — captured missed detail and built it:

    • Add Transaction types now vary by account type (was using the bank set for all): Bank = full set; Credit Card = Card Payment · Expense Refund / Expense · Owner Drawings; Cash = asset set minus Card Payment. Confirmed against the demo.
    • Transactions list: search + sortable columns — a Search input plus sortable Date / Deposits / Withdrawals / Running Balance headers with sort icons (search also filters the uncategorized feed).
    • Account Summary rebuilt to match the demo: Activity Summary (Check Summary, Latest Statement Details — Transactions/Auto-Categorized/Recognized/Duplicates/Uncategorized/Best Matches — last import, last reconciliation), Transaction Rules summary (withdrawal/deposit counts), a Bank Summary closing-balance chart, Total Uncategorized / Total Recognized tiles, and accordion sections for Recent Transactions, Recurring Expenses (→ Purchases), Recurring Journals (→ Accountant).
  • Full Zoho Books product map + feature-interlink reference — docs/zoho-books-product-map.md: every module, the shared foundations (COA/GL, Contacts, Taxes, Currencies), and how features interlink (Banking↔Sales/Purchases/Accountant, recurring generators, posting→GL, conversions). Captured so each future batch knows its dependencies.

  • Banking: account switcher on the transactions view — the account name in the header is now a dropdown listing all accounts (icon · name · currency, current one checked); picking one switches the view in place (re-renders + updates the breadcrumb) without going back to the list.

  • Banking: uncategorized counts are a single source of truth — every uncategorized count (account-row badge, transactions tile + tab, dashboard bank card + notification) now derives from the actual feed-item count, not a hardcoded number, and stays in sync as items are categorized/matched (syncAcctBadges()). Fixes the tab showing 39 when only 4 items existed.

  • Banking module built end-to-end (from docs/banking-teardown.md) — a working account transactions screen (#scr-bank-txns, opened by clicking anywhere on an account row or “View transactions”; the ⋮ menu and its actions are excluded from the row click): account header + breadcrumb (Dashboard › Banking › Account), balance summary tiles, Account Summary ↔ Transactions toggle, status tabs (All · Uncategorized · Categorized), the demo’s transaction table (Date · Reference# · Type · Status · Deposits · Withdrawals · Running Balance) with status pills, empty state, and “bank statements from inbox”. Plus the seven flows as live web .dlg modals / inline panels: Add Bank/Credit Card · Edit Account · Add Transaction (full Money In/Out type menu → form that prepends a real row) · Import Statement (3-step stepper: configure → map → preview) · Transaction Rules (criteria builder + action) · Match & Categorize (one-click match, categorize, exclude — decrements the uncategorized count) · Reconcile (live cleared/closing/difference, zero-to-reconcile). Overview fixes: per-row ⋮ menu now varies by account type (Bank/Card full, Cash reduced) and an Active Accounts status filter. All controls dynamic; verified no console errors.

  • Topbar breadcrumb trail — replaced the single page-name crumb with a real breadcrumb (renderCrumbs() + per-screen CRUMB_TRAILS): e.g. “Dashboard › Banking” with the parent crumbs clickable to navigate back. Extends to sub-pages as Banking flows are built.

  • Banking Cash flow chart rebased to an index (multi-currency fix) — because the six accounts span two currencies (₦/$) and very different sizes, each line is now indexed to its own period start (= 100) so trends are directly comparable on one axis, with a dashed baseline at 100. Absolute balances stay in the KPI cards, the table, and the hover tooltip (native currency). The multi-series tooltip now follows the cursor instead of floating above the chart.

  • Banking Cash flow chart now plots the actual accounts — replaced the four account-type series with one line per real account (GTBank · Operations, Sterling · Collections, Petty Cash, Mercury · Operating, JPMorgan · Reserve, Corporate Card), each color-coded with visible dots; the legend moved below the chart (demo placement) and lists those accounts. Per-date hover tooltip shows all six accounts’ balances in their native currency (₦/$). The All Accounts dropdown now drives the chart, highlighting the picked account and dimming the rest (“All Accounts” restores all). Hide chart also drops the “Account balances…” subtext (the “Cash flow” title stays).

  • Banking overview rebuilt to match the demo’s KPI set, chart and controls — replaced the placeholder summary tiles with the demo’s five cards: Bank Balance · Card Balance · Cash In Hand · Payment Clearing (the four account-type balances, each with its tinted circular icon, negative balances in red) plus an Uncategorized Transactions card (count + “Categorize now”). Added the All Accounts account-selector dropdown and moved Last 30 days to the overview header. The Cash flow chart is now the demo’s four-series line chart (Bank/Card/Cash/Payment Clearing, color-matched to the legend) with visible data-point dots on every series and a per-date multi-series hover tooltip (each series shown with its colour swatch + value). Fixed the inaccurate “Cash in / Cash out” legend.

  • Single app shell — consolidated the per-page shells into one screens/dashboard.html app with in-app screen switching (.app-screen sections + navTo()): the sidebar/topbar/Quick-Create/dropdowns are defined once, and Dashboard ↔ Banking switch without a reload (active nav + breadcrumb update). Removed the standalone banking.html (its content is now the Banking screen). Login still lands here.

  • Dashboard KPI cards: equal height with the footer anchored to the card bottom (no dead space on the Cash cards); chart hover tooltips on the Cash Flow line + Income/Expense bars.

  • Banking screen — expanded to match the demo fully: a Cash Flow chart (last-30-days area chart) + the accounts table rebuilt in a canonical Atlas .tbl-card with the demo’s columns (Account · Entity · Uncategorised · Pending · Amount in bank · Amount in Caesar), per-account transaction counts, amber uncategorised count badges, and the group-cash footer.

  • Banking page (folded into the Banking screen) — first module page behind the nav. Zoho’s banking features in our design: summary tiles (cash in Caesar, amount in bank, uncategorised, accounts) + an accounts table (account · entity · amount in bank vs amount in Caesar · status), with Add Bank/Credit Card + Import Statement actions and an All/NGN/USD filter. Reflects the finance team’s note that it’s manual-record (not feed-integrated). Shares the app shell (collapsible sidebar + tooltips, topbar, dropdowns). Dashboard ↔ Banking navigation wired (sidebar Banking item + “Go to Banking” CTA).

  • Dashboard KPI cards: added the current-vs-overdue split bar to Total Receivables and Total Payables (matching the demo).

  • Dashboard (screens/dashboard.html) — Zoho Books’ features & flows redesigned in the Rechaj design system (not a visual clone). Our components throughout: a collapsible + expandable sidebar (.sb-* — collapses to a 68px icon rail with tooltips; Sales/Purchases/Accountant expand to sub-items), our topbar (collapse toggle · breadcrumb · search · green New · notifications · org switcher · user-pill), line tabs, KPI stat cards (Receivables · Payables · Cash in hand · Cash inflow), charts (cash-flow area, income/expense bars, top-expenses donut), circular tinted icons, and bank-account cards. Per the finance walkthrough, dropped: Items, Time Tracking, Tax Returns, Configure Features list (sidebar) and Projects, Account Watchlist, Getting Started (dashboard). Brand green, General Sans, shadow-only cards. Login Sign In navigates here.

  • Login screen (screens/login.html) — first built surface. Caesar-distinct centered, logo-led form with floating finance objects (Acctual-style, in the Rechaj palette): a clean centered card (shadow-only) for the form, with invoice / journal / cash mini-cards, a “Posted” badge, and naira + USD coins drifting around an airy off-white canvas with soft green glow. Deliberately not the Atlas split-screen, so Caesar reads as its own product on landing. Rechaj palette throughout (General Sans, brand-green dark-on-green Sign In, canonical bolt logo, no card strokes). Previewable via the caesar-login launch config (port 8790).

  • Initial product scaffold (README, DESIGN.md, architecture.md, docs/).

  • Phase 1 BRD rendered to docs/brd.md; source .docx preserved in docs/attachments/.

  • Provisional persona/flow plan in flows/README.md.

  • Zoho Books product teardown in docs/zoho-books-teardown.md — full IA/flows/forms/reports/COA/settings of the demo we mirror, with the Caesar mirror/drop/add mapping.

  • Finance-team walkthrough scope decisions in docs/finance-walkthrough-2026-06-18.md — keep/drop/add per module from the stakeholder call, action items, and divergences to confirm with the CFO.

  • Registered Caesar across the monorepo (scaffold script, release-please manifest/config, root README, llms.txt).

  • All accounts and transactions consolidated to USD — removed every NGN account/amount (GTBank, Sterling, Petty Cash are now USD): account balances, transaction amounts, feed items, chart tooltips, KPI tiles (Cash In Hand $9.2K), the Bank/Credit-Cards dashboard cards, the group-cash footer (“$2.10M · all accounts in USD”), the Add Account currency picker (USD only), and the import preview are all $. The currency (All/NGN/USD) filter was removed since there’s a single currency now. The rebased Cash-flow chart stays (still multi-scale across accounts).
  • Add Transaction forms are per-type and now captured field-by-field from the demo (all 15 types) — each type renders exactly the demo’s fields: e.g. Customer Payment = Customer · Amount Received · Bank Charges · Date · Payment# · Reference# · Received Via · Description · Attachments; Expense = Expense Account · Vendor · Date · Amount · Tax · Reference# · Customer · Description · Attach Receipt; income types (Other/Interest Income, Owner’s Contribution, Sales Without Invoices) = From/Revenue Account · Amount · Received Via · …; Owner Drawings = To Account (equity); Card Payment / Transfers = From Account + To Account; Vendor Payment/Advance = Vendor · Amount · Date · Bank Charges · Paid Via. Added the Attachments field where the demo has it. (Exchange Rate / Reporting Tags omitted — single-currency USD.)
  • Add Bank/Credit Card form is now type-aware — selecting the account type re-renders the fields to match: Bank = Account Number* + Bank Name* + Bank Identifier Code; Credit Card drops Account Number + Bank Identifier (keeps Bank Name); Cash drops the bank fields (Description instead). Matches the demo’s per-type form.
  • Form fields a touch taller (38px → 42px) across modal inputs/selects; native <select> chevrons now use a custom icon with proper right-edge spacing (no more cramped arrows). Bare dialog inputs (rule criteria, import mapping) now share the same styling.
  • Bank Summary (Account Summary) chart now has hover tooltips — per-date closing balance; every chart in the app now has working hover tooltips. The Account Summary “Transaction Rules” card links to Manage rules (the list of set rules; New rule + Back inside).
  • Toasts use the canonical alert-toast component, top-center — replaced the custom black bottom-center pill with the design system’s .toast-live / .alert-toast pill (components/index.html): a colored badge + message + dismiss, fixed top-center, animating down-in / up-out, auto-dismiss. Variant is chosen per message — success (green “Done”), info (blue, e.g. coming-soon), warning (amber “Heads up”), gray (neutral).
  • Fluid shell (no horizontal scroll) — removed the hard min-width:1440px on body so the app resizes to the preview/browser viewport instead of forcing a fixed 1440px canvas (which overflowed the ~1425px panel). Wide tables now scroll inside their own container (the transactions table always; the accounts table below 1000px) so the page never scrolls horizontally, while account row menus stay un-clipped at desktop widths.
  • Sidebar collapsed by default — the app now loads with the sidebar collapsed to the 68px icon rail (tooltips on hover, expands on click), giving wider content room for data-dense menu pages. Toggled via the topbar control.
  • Banking accounts: replaced em dashes in account names (e.g. “GTBank — Operations”) with the DS middot (“GTBank · Operations”), per the no-em-dash rule; account-selector dropdown labels match.