Who can use this: Owner, Manager, Accountant. Approvers do not see journals. URL / Route:
/finance/entries(finance.entries.index). Detail:finance.entries.show,edit,update,create,store,destroy. Action endpoints:finance.entries.post,reverse,finance.entries.trash,restore,forceDelete. Plan / feature gate:feature:tracker.manual_journals(default: enabled). Permissions:journals.view,journals.create,journals.edit_draft,journals.delete,journals.post,journals.reverse,journals.restore,journals.delete_hard,journals.trash. Dimensions on lines also usedimensions.assign.
Purpose
A Journal entry is a manual general-ledger posting: explicit debits and credits to specific accounts. Use journals when no other document fits — accruals, prepayments, depreciation, payroll allocations, opening balances, period-end adjustments, and corrections. The Solavel report titled Journal Report shows manually entered journals; the General Ledger shows postings from every source.
Step by step
Browse entries
- Open
/finance/entries. Each row shows entry number, date, the colour-coded source chip (see below), the period chip (e.g. May · P5), the reference / memo / source-document link, total debit, total credit, status (Draft / Posted / Reversed / Voided), and the lines count with a balanced ✓ / unbalanced ⚠ marker. - Filter by search, status, source, date range, sort, and order — the page does NOT reload. Typing in the search box, picking a source, or changing any filter updates the table in place via AJAX, with a SolaBooks branded loading badge while the request is in flight. The URL stays in sync so the page is bookmarkable.
- The Show voided/audit entries toggle (pill switch on the actions row) reveals voided/reversed/cancelled entries that are normally hidden from the default view.
Source chip — colour-coded by workflow
Each entry's source is presented as the friendly business label, with a colour that groups related rows together at a glance:
| Workflow | Colour | Labels |
|---|---|---|
| AR — Money in | 🟢 Green | Invoice, Invoice Payment, Sales Receipt, Refund Receipt |
| AP — Bills | 🟣 Indigo | Bill, Bill Payment |
| AP — Expenses | 🟠 Amber | Expense, Expense Payment |
| Cash / Transfers / Notes | 🔵 Light blue | Transfer, generic Payment, Credit Note, Debit Note, Supplier Refund |
| Opening Balance | 🩶 Slate | Opening Balance |
| Inventory | 🟦 Teal | Inventory Adjustment, Inventory Opening |
| Fixed Asset | 🌸 Rose | Fixed Asset |
| Manual / Unknown | ⚪ Grey | Manual Journal Entry, Accounting Entry |
Non-manual rows show a 🔒 lock icon — the entry is owned by its source document and can only be managed from there (open the bill / invoice / expense to unpost or edit). Red is never used on a source chip; it's reserved for true errors.
Period chip
Each posted entry shows a small calendar badge like 📅 May · P5 next to its source. The tooltip is the full period name and number (e.g. "May 2026 (fiscal period 5)"). Opening Balance entries dated before any fiscal period (e.g. 2026-01-01) intentionally have no chip — they pre-date the books.
If a posting service ever forgets to set the period, the JE model fills it in automatically from entry_date on creation, so the chip never goes blank for normal transactions.
Reference column
For source-document JEs (Bill, Invoice, Sales Receipt, Expense, Payment, Refund), the Reference column leads with the source document's own number — PMT-00012, EXP-00003, BILL-001, INV-00005 — followed by the memo and (for payments) an "Applied to: INV-00005 / EXP-00012" link. No more cryptic #FK-id suffixes; users see real document numbers.
Create an entry
Route: finance.entries.create / store. Permission: journals.create (line dimensions also need dimensions.assign).
- Click New entry.
- Enter Entry date and Narration (a short description that appears on every line).
- Add lines. Each line: Account, Description, Debit OR Credit (one of the two), optional Dimension tags.
- Lines must balance — total debits must equal total credits before the form will save.
- Save as Draft or Save and Post.
Edit a draft
Route: finance.entries.edit / update. Permission: journals.edit_draft. Also gated by the can_edit_je middleware which checks lock dates and source — a system-generated journal cannot be edited as a draft.
Post a journal
Route: finance.entries.post. Permission: journals.post.
Posting writes the journal to the GL and locks the document. Posting is blocked when the entry date is in a locked period.
Reverse a posted journal
Route: finance.entries.reverse. Permission: journals.reverse.
Posts a mirror entry on the reversal date that flips every debit and credit. The original entry stays visible; the reversal appears as a new linked entry. Use when an accrual was posted twice or a wrong amount went through.
Delete (soft)
Route: finance.entries.destroy. Permission: journals.delete. Allowed only on Drafts. Posted entries cannot be deleted; reverse instead.
Trash and restore
- Trash list:
/finance/entries/trash(finance.entries.trash). Permission:journals.trash. - Restore from trash:
finance.entries.restore. Permission:journals.restore. - Permanent delete from trash:
finance.entries.forceDelete. Permission:journals.delete_hard(Owner-only by default; the Manager and Accountant role-permission sets explicitly denyjournals.delete_hard).
Print a PDF
Route: finance.entries.pdf. Permission: journals.view.
How the journal looks
Manual journals are the journal itself — every line you enter becomes a row in the GL exactly as typed.
Monthly rent accrual for JOD 500 (recognise the expense in March even though you pay in April):
| Account | Debit | Credit |
|---|---|---|
| Rent expense | 500.00 | |
| Accrued expenses (liability) | 500.00 |
When April's payment is recorded, the accrual is reversed (typically via a recurring reversal journal):
| Account | Debit | Credit |
|---|---|---|
| Accrued expenses (liability) | 500.00 | |
| Rent expense | 500.00 |
Prepayment — you paid JOD 1,200 in January for 12 months of insurance:
| Account | Debit | Credit |
|---|---|---|
| Prepaid insurance (asset) | 1,200.00 | |
| Bank | 1,200.00 |
Each month a JOD 100 expense recognition journal moves a slice from the asset to the P&L:
| Account | Debit | Credit |
|---|---|---|
| Insurance expense | 100.00 | |
| Prepaid insurance | 100.00 |
Year-end payroll accrual for JOD 3,000 of unpaid December wages:
| Account | Debit | Credit |
|---|---|---|
| Wages & salaries | 3,000.00 | |
| Accrued wages | 3,000.00 |
Owner cash injection of JOD 5,000 into the business:
| Account | Debit | Credit |
|---|---|---|
| Bank | 5,000.00 | |
| Owner's equity | 5,000.00 |
Correcting a misclassified expense — JOD 200 was booked to "Office supplies" but should have been "Software subscriptions":
| Account | Debit | Credit |
|---|---|---|
| Software subscriptions | 200.00 | |
| Office supplies | 200.00 |
Every line must balance (debits = credits). If they don't, the entry won't save.
Recurring journals
⚠️ Risk: feature key
tracker.recurring_journalsis declared infinance_features.php. Thefeature:tracker.recurring_*middleware on/recurring/templateschecks all four recurring keys at once — if any is missing, the page is blocked.
When feature:tracker.recurring_journals is on you can save any journal as a Recurring Template at /finance/recurring/templates (finance.recurring.templates.*). Common uses: monthly depreciation, monthly accrual reversals, payroll allocations.
The Recurring Templates section uses recurring.* permissions: recurring.view, recurring.create, recurring.edit, recurring.pause, recurring.runs.view.
When to use Journal vs Reverse vs Adjustment
| Situation | Use this |
|---|---|
| Standalone GL posting (accrual, prepayment, depreciation, correction) | Journal entry (this page) |
| Undo a previous journal that posted twice or with a wrong amount | Reverse from the journal's detail page (writes the mirror entry) |
| Period-end FX revaluation of foreign-currency balances | Base currency adjustments |
| Reverse a source-document JE (bill / invoice / payment) | Open the source document and unpost from there — don't try via the journal |
Common mistakes
- "Save is greyed out." Total debits must equal total credits. The form blocks save until balanced — check the running totals at the bottom of the lines.
- "Period locked." Posting, reversing, and force-deleting all require the entry date's period to be open. Unposting a Draft is fine in a locked period.
- Archived account on a line. Lines can only post to active accounts. If an account on the line is archived, change it or re-activate the account in Chart of accounts.
- Zero-amount line. Both Debit and Credit blank on a line is fine (no-op line); both non-zero on the same line is rejected — pick one.
- "My system journal is locked." Source-document JEs (Bill / Invoice / etc.) cannot be edited from the journal page — open the bill / invoice and unpost it from there. The journal shows a 🔒 icon when this is the case.
- Manual journal vanished after unpost. It didn't — manual JEs go back to Draft (not Voided) on unpost. Toggle Show voided / audit entries is OFF by default; drafts are still in the list, just not posted.
Tips
- Use Dimensions on lines to tag a journal by project, department, or cost centre for filtered reports.
- Save common journals (monthly depreciation, payroll allocation, accrual reversals) as recurring templates so the next month is one click.
- The Journal Report under Reports shows only manual journals; the General Ledger shows postings from every source.
Behaviour and rules
- Balance is enforced. A draft must have total debits = total credits before save; the same is checked again at post time.
- Period lock. Posting, editing posted, reversing, and force-deleting all require the entry date's period to be open. See Fiscal years and lock dates.
- System journals. The system itself writes journals when invoices/bills/expenses/payments post. Those journals appear in the entries list with source "system" and cannot be edited or reversed on their own — manage them by acting on the originating document.
- Manual vs source-document unposting.
- Manual JE (
source = MANUAL, no source document): Unpost returns the entry to Draft (editable + re-postable). It stays in the default entries list with the Draft badge. No voided audit row. - Source-document JE (Bill / Invoice / Expense / Payment / Sales Receipt / etc.): the JE is owned by its source document — open the bill/invoice/expense and unpost it from there. Doing so sets the JE to status Voided — kept in the entries list for the audit trail but excluded from the General Ledger and every report. No reversal entry is created, so the ledger is not filled with reversal pairs. A Voided entry is final; if the document is posted again, a fresh journal is written.
- Manual JE (
- Manager limits. The Manager role-permission set is denied
journals.delete_hardand (by default deny-list) several reversal-style operations on system documents. An Owner is needed for hard deletion. - Trash retention. Soft-deleted journals stay in
/finance/entries/trashindefinitely until force-deleted. - Append-only audit comments. Each journal has a comments tab visible to anyone with
comments.view.
Permissions / restrictions
- View:
journals.view. - Create / edit drafts:
journals.create,journals.edit_draft. - Post / Reverse:
journals.post,journals.reverse. - Soft delete:
journals.delete. - Trash list:
journals.trash. - Restore from trash:
journals.restore. - Hard delete:
journals.delete_hard(Owner-only by default).
Related
- Chart of Accounts
- Fiscal years and lock dates
- Reports — Journal Report, General Ledger, Account Balances, Trial Balance
- Settings — sequences, dimensions