Skip to main content
Version: Current

Posting model

Posting is the controlled conversion of an approved Finance event into balanced debit and credit evidence in the internal Makronexus General Ledger. It is not the same as saving an invoice, receiving money, issuing a receipt, exporting a ledger file, or matching a bank statement.

Audience: accountants, bursars, finance-control owners, implementers, auditors, and support analysts
Learning time: 40 minutes
Navigation: Finance → Accounting → Posting Controls, Finance → Accounting → General Ledger, and Finance → Accounting → Journals
Product boundary: the backend posting resolver is authoritative. The browser must not invent final accounts, sides, or functional amounts.

Learning outcomes

You will be able to:

  • explain the difference between a source transaction, posting decision, journal document, journal line, and ledger export;
  • identify the configuration and evidence required before posting;
  • distinguish transaction currency from functional currency;
  • use posting simulation without treating it as a committed journal;
  • verify that a posting is balanced, idempotent, source-linked, and school-scoped;
  • recognise when an exception blocks posting or period close;
  • hand unresolved settlement and bank evidence to P6 without claiming reconciliation.

Exact definition and boundaries

A source record describes the operational event: an invoice was approved, a Payment was verified, a refund was processed, an expenditure was paid, or an authorised manual adjustment was requested. A posting rule and account mapping resolve that event to ledger accounts. A journal document records the accounting result. Its lines classify debit and credit amounts and can also carry cost centre, project, fund, department, revenue-stream, and other dimensions.

The internal General Ledger is the accounting source in Makronexus. Ledger Exports package posted information for downstream systems; they are not the primary ledger. A successful export does not prove that the source event was posted correctly, and a saved source transaction does not prove that a journal exists.

The current journal-document contract supports transaction currency, functional currency, exchange rate, an idempotency key, multiple lines, and totals for both transaction and functional debits and credits. The posting is acceptable only when the appropriate totals balance and every line points to an active posting account.

Prerequisites

RequirementWhy it mattersEvidence
Correct tenant and schoolaccount resolution and journals are scope-sensitiveschool selector and journal school identity
Active Chart of Accountspostings cannot use missing, inactive, or header accountsaccount code, status, type, and school/default scope
Effective posting policydefines blocking, approval, close, and manual-journal behaviouractive policy and effective dates
Effective account mappingsresolve posting type and source attributes to accountsmapping type, key, side, priority, and status
Open eligible accounting periodposting date must be governedfiscal year and period state
Currency designtransaction and functional amounts must be reproduciblecurrencies, rate, timestamp, source, and reference
Exact permissionUI visibility is not authoritysession ability list
Source approval/verificationonly eligible source states should postsource status and actor evidence
Idempotency identityprevents a repeated request from creating a second economic effectidempotency key and request fingerprint

Roles and exact permissions

ActionTypical roleExact abilityControl
View active policyaccountant or auditorfinance_control:readidentify tenant default versus school override
View mappings and overridesaccountantfinance_control:listdo not infer missing mappings
View readinessclose ownerfinance_control:readinessfailed checks must remain visible
Simulate postingaccountant or implementerfinance_control:simulatesimulation is non-posting evidence
List accountsaccountantgl_account:listchoose active non-header accounts
View journalsaccountant or auditorgl_journal_entry:listfilter by source, status, account, and date
Read one journalaccountant or support analystgl_journal_entry:readretain source and reversal lineage
View statementsaccountantgl:statementsuse backend-computed totals
Resolve posting exceptionauthorised control ownerfinance_posting_exception:resolverecord reason and evidence

The posting-controls UI also uses finance_control:create, finance_control:update, finance_control:delete, finance_control:request_change, finance_control:approve, and finance_control:apply_change. Those configuration and maker-checker actions are taught in Posting review and approval.

Posting decision model

A simulation answers what the current resolver would do. It does not reserve an account, lock a rate, close a period, or create a journal. Re-run simulation after any policy, mapping, source, currency, date, or Chart of Accounts change.

Guided procedure

  1. Confirm scope. Select the intended school and record whether the effective controls come from a tenant default or a school override. Expected result: the scope badge and school identity agree.
  2. Open Posting Controls. Review readiness, active policy, mappings, overrides, and open exceptions. Expected result: no critical blocker is hidden by a failed secondary panel.
  3. Identify the source event. Record source type, source ID, business date, posting date, amount, transaction currency, functional currency, and current source status.
  4. Confirm the posting type. Examples supported by current contracts include invoice, payment, refund, expenditure, credit note, scholarship, payroll, platform billing, manual, and reversal sources. Do not assume identical rules for every source.
  5. Run simulation when available. Inspect resolved debit account, credit account, sides, dimensions, policy source, mapping precedence, and warnings.
  6. Resolve blockers. Correct missing mappings, inactive/header accounts, closed periods, missing rate evidence, unapproved controls, or unsupported source state. Never bypass a blocker by selecting an unrelated account.
  7. Post through the governed source action or journal workflow. Supply an idempotency key for journal-document posting. Do not retry with a new key merely because the browser timed out.
  8. Read the returned journal. Verify header ID, entry number, source type/ID, school, currencies, exchange rate, line count, debit totals, credit totals, poster, and timestamp.
  9. Trace the result. Open the account activity, trial balance, and source detail. A success toast is insufficient.
  10. Preserve the handoff. P5 proves accounting evidence. Bank/provider settlement matching remains P6.

Accounting impact

Accounting impact is configuration-derived. The following pattern is illustrative:

EventDebitCreditAmount basisDateReversal
approved student invoicereceivableconfigured revenue/deferred accountapproved invoice linesposting datelinked offsetting journal
verified Paymentcash/bank/clearingreceivable or student creditverified and allocated amount policyposting daterefund/reversal workflow
authorised refundrefund/receivable/student-credit accountcash/bank/clearingapproved return componentsreturn datecompensating evidence
manual adjustmentselected active posting accountselected active posting accountapproved document linesjournal datelinked reversal document

Never copy an illustrative account name into production configuration without verifying the school’s Chart of Accounts and effective mapping.

Controls and audit evidence

Minimum evidence includes source identity, source state, posting type, effective policy, mapping or override used, account identities, line sides, transaction and functional amounts, exchange rate, idempotency key, actor, timestamps, journal header, legacy projection IDs where present, and any exception or approval record.

Posted history is not corrected by editing totals in place. Use a linked reversal or a governed compensating journal. Keep simulation output separate from committed journal evidence. If the same idempotency key returns an existing document, treat that as duplicate prevention, not as a new posting.

Worked scenario: Mupfure Learning Academy

Mupfure Learning Academy verifies a USD 600 bank Payment allocated to two invoices. The accountant confirms the school scope, active policy, payment.verified mapping, settlement account, receivable account, open period, and functional-currency rule. Simulation resolves the accounts without blockers. The posting returns one journal document with balanced transaction and functional totals and source linkage to the Payment.

The accountant does not mark the bank movement reconciled. The journal proves accounting recognition; P6 will prove the external statement match.

Failure modes

SymptomLikely causeEvidence to inspectSafe actionEscalate when
no journal after eligible source actionmissing mapping, automation disabled, exception, or source ineligiblesource status, posting readiness, exceptions, audit eventscorrect named blocker and retry idempotentlysource is eligible and resolver reports ready but no journal exists
debit and credit totals differinvalid document or normalization defectjournal totals and every linedo not rely on the entry; block closebackend accepted an unbalanced posted document
wrong school account usedscope omitted or override/default precedence misunderstoodschool ID, account school scope, mapping sourcereverse and repost through approved correctioncross-school account identity appears
duplicate-looking journalsretry used different key or two source events existidempotency keys, source IDs, timestamps, fingerprintsdetermine economic identity before reversalduplicates cannot be linked to requests
simulation and posted result differcontrols, source, period, or rates changedsimulation timestamp and effective evidencere-simulate and explain changesame immutable inputs resolve differently
export exists but journal is missingexport is not the source ledgerexport lines and GL journalsinvestigate GL firstexport contains unsupported fabricated accounting

Verification checklist

  • Tenant and school scope are explicit.
  • Source type, source ID, state, amount, currency, and dates are recorded.
  • Effective policy and mapping evidence is retained.
  • Every account is active, non-header, and in the allowed scope.
  • Transaction and functional debit/credit totals balance.
  • Exchange-rate evidence is reproducible when currencies differ.
  • Idempotency identity is retained.
  • Journal source and reversal lineage are visible.
  • Trial-balance or account-activity effect is reproducible.
  • No bank/provider reconciliation claim is made from posting alone.

Practice and knowledge check

Guided practice: simulate and trace one approved source event in a test school. Record every input and compare the simulation with the committed journal.

Independent scenario: a Payment is verified, the receipt exists, and no journal appears. Build a safe investigation order without creating a manual journal first.

  1. Why is a source transaction not a journal?
  2. Why must the frontend not calculate final accounts?
  3. What does an idempotency key protect?
  4. Why is a ledger export not the General Ledger?
  5. Which totals must balance in a multi-currency journal document?
  6. What is the difference between simulation and posting?
  7. Which evidence belongs to P6 rather than P5?

Answer guide: operational and accounting records have different purposes; the backend resolver owns mappings and rules; idempotency prevents duplicate effects; exports package ledger data; transaction and functional debits/credits must balance; simulation is non-committing; external bank/provider matching belongs to reconciliation.

Next lesson

Continue to Journals and journal lines.