Solavel Solavel Docs

Journal entries

docs/solavel-finance/journals.md

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, pdf. Trash: 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 use dimensions.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

  1. 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.
  2. 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.
  3. 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).

  1. Click New entry.
  2. Enter Entry date and Narration (a short description that appears on every line).
  3. Add lines. Each line: Account, Description, Debit OR Credit (one of the two), optional Dimension tags.
  4. Lines must balance — total debits must equal total credits before the form will save.
  5. 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 deny journals.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_journals is declared in finance_features.php. The feature:tracker.recurring_* middleware on /recurring/templates checks 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.
  • Manager limits. The Manager role-permission set is denied journals.delete_hard and (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/trash indefinitely 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

Source: docs/solavel-finance/journals.md ← All documentation