BigBooks Docs
The Ledger

Journal Vouchers & Approval

As an operator, you will create a balanced manual journal voucher and move it through its lifecycle — post it directly, or submit it for an admin to approve — so that adjustments no document produces (accruals, reclassifications, opening balances) land correctly in the general ledger.

What you'll accomplish

As an Operator, you will create a balanced manual journal voucher and move it through its lifecycle — post it directly, or submit it for an Admin to approve — so that adjustments no document produces (accruals, reclassifications, opening balances) land correctly in the general ledger.

Before you start

Vouchers live at three routes: the list at /[lang]/entries, the editor at /[lang]/entries/new, and the approver queue at /[lang]/entries/approvals. The list is a data-table of vouchers with status filters, bulk Post selected / Submit / Delete actions, an account-details drawer, and import/template tools; a row opens its detail page (/[lang]/entries/[id]) or its editor (/[lang]/entries/[id]/edit). Creating or viewing vouchers needs a journal permission (canViewJournals / canCreateJournals); confirming or approving needs canConfirmJournals. Amounts are entered per line as a debit or a credit and stored as integer satang.

Compliance Note

A draft voucher changes nothing in the ledger. Postings appear only once the voucher is posted, and a posted voucher is locked — corrections require a reversing entry, per MoF 2020.

Steps

Open the entries list Go to /[lang]/entries. You see existing vouchers with status badges and counts, status/faceted filters, and the New action. Drafts can be bulk-posted or bulk-submitted from the toolbar.

Journal vouchers list with status filters, bulk Post/Submit/Delete actions, and the New button.
Journal vouchers list with status filters, bulk Post/Submit/Delete actions, and the New button.

Create a voucher Click New to open the document-style editor at /[lang]/entries/new. Add lines — each naming an account (from the active chart of accounts) and either a debit or a credit, plus a date and narration. A live total shows whether debits equal credits.

Document-style journal-entry editor with the line grid, date, narration, and the running debit/credit balance.
Document-style journal-entry editor with the line grid, date, narration, and the running debit/credit balance.

Save the draft Save. The voucher is created as a draft with a generated reference and appears in the list. It has no effect on any balance yet and can be edited freely.

A saved draft voucher in the list with its draft status badge.
A saved draft voucher in the list with its draft status badge.

Post it — directly or via approval With canConfirmJournals, Post the balanced draft to commit it immediately (draft → posted). Otherwise Submit it; it moves into the pending-approval queue.

Posting (or submitting) a balanced draft from the detail/list.
Posting (or submitting) a balanced draft from the detail/list.

Approve in the approvals dashboard An approver opens /[lang]/entries/approvals to see pending vouchers, then approves (which posts them) or rejects them — individually or in bulk.

Approval dashboard listing pending vouchers with approve / reject (and bulk) actions.
Approval dashboard listing pending vouchers with approve / reject (and bulk) actions.

What happens behind the scenes

The editor calls createJournalEntry (journalEntries/create.ts), which validates each line against the active chart of accounts (accounts/queries.ts getActiveAccounts): the account must exist and be active, a line must carry a debit or a credit but never both or neither, amounts must be non-negative, a non-LAK voucher must supply an exchange rate, and prior-period correction lines on accounts 6783/7783 must reference the original entry via correctsEntryId (MoF 2020). It then checks total debits equal total credits and saves as draft with a sequential JE… reference. Posting runs confirmEntry (journalEntries/confirm.ts): it re-asserts the entry is still a draft, re-checks the balance, flips the entry and all its lines to posted, and updates the draft→posted stats counter — after which the entry is immutable. The approval path (journalEntries/workflow.ts) routes a submitJournalEntry into the pending queue read by pendingApprovals (journalEntries/queries.ts); approveJournalEntry posts it, rejectJournalEntry sends it back. Only after posting do the lines aggregate into the general ledger and appear in /[lang]/transactions.

AccountDebitCredit
Account on each debit lineDebit amount-
Account on each credit line-Credit amount

Common problems

  • Unbalanced voucher: Posting is blocked until total debits equal total credits; the error reports both totals.
  • Bad line: A line with no account, with both a debit and a credit, with neither, or with a negative amount is rejected.
  • Missing FX rate: A non-LAK voucher needs an exchange rate before it can be created.
  • Correction rule: A 6783/7783 prior-period correction line must reference the original entry (correctsEntryId) or creation fails.
  • No permission to post: Without canConfirmJournals you can save and submit a draft but cannot post it — it must go through approval.
  • Editing a posted voucher: Posted vouchers are locked; record a reversing entry instead of editing or deleting.
  • Closed period: Posting into a closed accounting period is rejected.

On this page