Skip to main content

Post a journal entry

Shillinq's journal entries (journaalposten) are the human-authored construct above the general ledger. Every invoice, every bill, every bank line eventually lives in the GL — but the journal-entry page is where you author the postings the rest of the system cannot derive on its own. T1 of the bookkeeping foundation ships three sub-types:

  • Manual (memoriaalboeking) — a one-off correction, write-off, reclassification, or opening-balance entry.
  • Recurring — a template that materialises a posting on a cadence (monthly subscription, depreciation schedule, periodic accrual).
  • Reversing — an accrual that automatically posts the opposite side at the start of the next designated period (year-end accrual, prepaid-expense recognition).

The journal entry is the author's view; on post, Shillinq materialises exactly one balanced GLTransaction (per REQ-JE-007) and gates the transition through OpenRegister's approval-workflow abstraction (per REQ-JE-008) — never through an app-local approvers table.

Goal​

By the end one balanced journal entry is posted in Shillinq: lines are entered, the debit/credit totals balance, a sequential journalNumber is assigned, the materialised GLTransaction is linked back from the journal, the audit trail records the operator and timestamp, and (if the administration policy requires it) the approval-gate has cleared.

Prerequisites​

  • Shillinq open and the OpenRegister back end connected (see Open Shillinq for the first time).
  • The chart of accounts set up so the line accounts exist (see Set up your chart of accounts).
  • The bookkeeping role on the Shillinq instance.
  • For an above-threshold journal: an approver in the bookkeeping-approver role (configured through OR's approval-workflow extension — not through Shillinq).

Steps​

  1. Open Bookkeeping → Journaalposten from the Shillinq navigation and click New journal. The journal form opens. Pick the journalType — manual, recurring, or reversing. Set the entry date and a human-readable description.

    New journal form

  2. Add the lines. Each line has an account number (picked from the chart of accounts), a side (debit or credit), and a non-negative amount in the administration's base currency. Shillinq computes the running debit and credit totals live as you type; the Post button stays disabled until they match (per the balance invariant on the GL transaction lifecycle).

    Journal lines with running totals

  3. (Optional) Attach a source document. Pick a docudesk attachment (Shillinq references it by URI; the file blob never lives in the bookkeeping register, per REQ-JE-006). On a manual memoriaal, this is typically the supporting PDF; on a recurring depreciation template, it's the asset register evidence; on a reversing accrual, it's the year-end working paper.

    Source document attached

  4. (Recurring only) Configure the cadence: interval (daily, weekly, monthly, yearly), anchor (the ISO date the schedule starts from), endsOn (an end date, or null for open-ended), and count (a number of occurrences, or null for unbounded). The OpenRegister ScheduledWorkflow primitive consumes this cadence and materialises a new GLTransaction per tick — Shillinq does not run its own background job.

    Recurring cadence configuration

  5. (Reversing only) Pick the reversesOn period. The journal posts in the current period; at the start of the named period (typically the next month or the next fiscal year), Shillinq auto-materialises the inverse GLTransaction and back-links it via reversesTransactionId.

  6. Click Post. If the administration policy says journals above a threshold (commonly €5 000) require approval, the journal transitions draft → pending with approvalState: pending — an approver in the configured role then approves or rejects. Below threshold (or when no policy applies), the journal transitions draft → posted directly with approvalState: not-required and the materialised GLTransaction appears in the general ledger.

    Posted journal with link to GL transaction

Verification​

The journal appears in the Journaalposten list with state: posted and the assigned journalNumber. Opening the detail page shows the journalType, the approvalState, the sourceDocumentUri (when attached), and a link to the materialised GLTransaction. The GL transaction's lines mirror the journal's lines exactly (1:1), postingDate matches entryDate, and the sum of debit lines equals the sum of credit lines. The audit trail (provided by OpenRegister per ADR-022) records the operator, the entry/edit/approve/post events, and the timestamps.

Common issues​

SymptomFix
Post button stays disabledThe debit total does not match the credit total. The balance invariant lives on the GLTransaction.post lifecycle transition (per REQ-GL-005); fix a line amount until the totals match.
Journal stays in pendingThe administration policy requires approval; no approver in bookkeeping-approver has acted yet. Approvers see the entry on their My approvals queue (rendered by OR's approval-workflow extension).
Recurring template did not fire on the cadence tickThe OR ScheduledWorkflow engine is not running, or the cadence's endsOn / count is already reached. Re-check the cadence object and the OR scheduler status.
Reversing journal did not auto-invertThe reversesOn period has not yet started, or the OR lifecycle action is not registered for the period boundary. T1 supports both the ScheduledWorkflow path and the period-close lifecycle path (per REQ-JE-004); confirm which the instance uses.
Void transition fails with "storneer eerst de grootboektransactie"A posted journal cannot be voided until its materialised GLTransaction is reversed (per REQ-JE-010). Reverse the GL transaction first, then void the journal.
Journal type closing is rejectedT1 ships three sub-types only (manual, recurring, reversing); period-close adjustments belong to T3 (per REQ-JE-003).
Source-document URL points at a missing fileThe docudesk attachment was deleted; replace the URI or upload a new attachment in docudesk and reference it. The bookkeeping register does not embed the file blob (per REQ-JE-006).
Screenshots may be missingApp not yet installed in the test environment; rerun npm run test:e2e:docs once it is.

Reference​