Actions and results
What each Finance and Accounting button and automatic behaviour does, with worked numbers and what the system refuses.
On this page (78)
Accounting dashboardJournal entry pageJournal itemsChart of accountsPosting accountsJournalsAccounting periodsPeriod lock dateOpening balancesTrial balance (classic)Exchange ratesExchange revaluationCurrency translationRecurring entriesAccrualsDeferralsYear-end closePosting profilesRegister payment dialogPayments and receiptsOpen itemsCustomer statementsSupplier statementsReceivables agingPayables agingPayment dueGoods received not invoiced (GRNI)Bank reconciliation (statements)Bank reconciliation workspaceReconciliation rules and import profilesWrite-offs (customer and supplier)DisputesCollections worklistPromises to payDunning runsCollection policy and dunning levelsPayment proposal recordPayment holdsCredit positionCredit overridesCredit reservationsCredit groupsProvision matricesExpected credit loss runsBudgets (list)Budget pageBudget against actualBudget control policiesBudget commitmentsBudget overridesTreasury registerInstrument pageTreasury maturitiesTreasury instrument typesBank accountsImport statementBank statementsBank exceptionsReconciliation rulesBank import profilesCash positionCash forecastTrial balance (report)Financial statementsReport runnerTax reportsManagement P&L by dimensionLedgers and booksAccounting settingsTaxesTax code recordFiscal positionsDimension valuesAccount structure rulesValid combinationsDistribution modelsFinance FeaturesFinance Fields
Accounting dashboard
| Action | When | What you do | What happens |
|---|---|---|---|
| Figures tie to the books | Posted test invoices, bills and payments this month | Open the dashboard on Month to date; compare Revenue, Expenses, Net profit with the Profit and loss report, Receivables/Payables with the aging reports, Cash & bank with the trial balance | Every tile equals its report; year-end closing journals are left out of P&L; foreign invoices at their frozen rate |
| Blocks follow your rights | A user with dashboard.accounting but without collections.view / treasury.view / report.view | Open the dashboard | Collections, treasury and budget blocks are not shown; nothing the reader could not open |
Journal entry page
| Action | When | What you do | What happens |
|---|---|---|---|
| Save a balanced manual entry as draft | GJ with Needs approval = No; user with journal.post | New; Journal General Journal; Posting date today; Memo; line 1 Dr Office Supplies 1,050; line 2 Cr Cash and bank 1,050; Save | Saved as Draft with a GJ number; Balanced badge; nothing in Journal items with State Posted yet; trial balance unchanged |
| Post the draft | The draft above | Open it; Post Entry | State Posted; posted by/at recorded; Journal items show Dr Office Supplies 1,050 / Cr Cash and bank 1,050; trial balance moves by 1,050; History shows journal.post |
| Preview writes nothing | A draft entry with one problem (e.g. a blocked account) | Press Preview | Dialog 'Preview journal entry' lists 'What stops it' and 'Effect on the ledger' (Account, Debit, Credit, Net); nothing posted; after fixing: 'Ready to post. Nothing below stops it.' |
| Unbalanced entry refused | Dr 1,050 / Cr 1,000; Post | Badge 'Not balanced' with the Difference 50; posting refused 'Debits and credits must balance exactly.' | |
| Control account protected | GJ (Allow control accounts = Refuse) | Line to the customer control account (Trade receivables); Save | Refused: '<code> <name> is maintained by the customer records. Use the operational document rather than a manual journal...' |
| Control account allowed on ARJ | AR Adjustment Journal (Allow control accounts = Allow) | Journal type ARJ; Dr Trade receivables 100 with partner Test Customer / Cr Other Operating Expense 100; Post | Posted; the customer's statement and aging include the 100 |
| Foreign-currency entry converted by the server | Approved USD spot rate 3.6725 for today | Currency USD; Dr Foreign Currency Bank 1,000 / Cr Other income 1,000; Preview; Post | Lines carry USD 1,000 and AED 3,672.50 each; rate shown is the server's; a rounding fils (if any) on the largest line of the short side with a note |
| Auto-reverse accrual | Next month open | Entry type Accrual; Dr Electricity Expense 2,000 / Cr Expense Accruals 2,000; Auto-reverse on = 1st of next month; Post | Two entries: the accrual, and a reversal dated the 1st (Dr Expense Accruals 2,000 / Cr Electricity Expense 2,000) linked by Reversal / Reverses smart buttons |
| Reverse a posted entry | A posted manual entry; user with journal.reverse | Reverse; Reversal date today; Reason; Post the reversal | New entry 'Reversal of <number>: <reason>' with opposite lines and the same dimensions; original shows Reversed; second reverse returns the same reversal |
| Reset a posted entry to draft | A posted manual entry | Reset to draft; Reason; Reverse and open a draft | Original reversed; a new Draft copy opens with the same lines (split lines stay split); note 'Reset from <number>; reversed by <reversal>' |
| Reset refused on a document's journal | The journal of a posted sales invoice | Open it; try Reset to draft / Reverse | Not offered; via API 'This entry was raised by a document. Correct the document; its journal follows.' / 'Reverse this entry through its source document.' |
| Edit a draft | A draft entry | Edit; change an amount on both sides; Save | Saved; revision increases; edit in a second tab after that is refused 'Send the revision of the entry you opened, so an edit that was overtaken is refused.' |
| Edit a posted entry refused | A posted manual entry | Try Edit (API PATCH) | Refused: 'A posted entry is corrected by reversing it, not by editing it.' |
| Duplicate and Duplicate without amounts | A posted entry | More > Duplicate; then Duplicate without amounts | A new unsaved copy ('A copy, not yet saved.') with the same accounts; the second has empty amounts |
| Templates: save and use | Lines > Save lines as a template 'Monthly rent'; New entry; Templates > Use | Template saved (1-200 lines); using it fills the lines; Archive hides it | |
| Import lines from CSV | A CSV with 4 valid rows and 1 unknown account | Import; choose the file | Summary Rows valid 4, Rows with errors 1, Unknown accounts 1; import blocked 'Fix the rows with errors first'; after fixing, lines fill the grid |
| Split a line by percentage | Departments Admin and Sales exist | On a line choose Split by %: Admin 60, Sales 40; Post | Posted as two ledger lines 60/40 that read back as one line with shares; reports by department show 60/40 |
| Keyboard on the lines grid | Use Alt+Del on a line; Add a line; Remove empty lines | Line removed; new line added; empty lines removed | |
| Attachments | A draft | Drag a PDF onto Attachments; Save; Remove it | File attached and listed; Remove asks 'Remove this file?' then removes it |
| Idempotent retry | Post an entry; resend the same request with the same key (API) | The same entry is returned, not a second one; same key with different details -> 409 'This request key was already used for different details.' | |
| Approval workflow when the type needs approval | Journals: GJ Needs approval = Yes | Preparer: create entry and Submit for approval; Approver (different user): Approve; Poster: Post | States Draft -> Submitted -> Approved -> Posted; nothing in the ledger until Posted; History lists submit, approve, post with users |
| Reject, revise, cancel | A submitted entry | Approver: Reject with a note; Preparer: revise (back to Draft) or Cancel entry | Rejected -> Draft (revise) or Cancelled; cancelled entry can be reset to Draft; none of these touch the ledger |
| Posting into a soft-closed period | September Soft closed; user A without period.adjust, user B with it | A posts a September entry; B posts one | A refused: '<Period> is soft closed for the general ledger. An adjusting entry needs the right to post into a soft-closed period.'; B posted |
| A draft is re-checked at posting | A draft using an account that is then Blocked | Block the account; Post the draft | Refused with the blocked-account message; a draft cannot post anything a new entry could not |
Journal items
| Action | When | What you do | What happens |
|---|---|---|---|
| Filter and total | Several posted entries | Filter From/To this month, Account = Local Bank, State Posted | Only matching lines; Balance runs; 'Total of these lines' equals the sum shown; click a line opens its entry |
| Pivot | Switch View to Pivot; rows by account, columns by month | Pivot totals equal the list totals and the trial balance for the same dates |
Chart of accounts
| Action | When | What you do | What happens |
|---|---|---|---|
| Create an account | Company admin | New account 610400 Cleaning Expense, class expense, posting, Under 600000; Save | Saved; appears under its parent; available on manual journals |
| Used account is frozen | An account with posted lines | Change its class from expense to asset; Save | Refused: '<code> already has N posted line(s), so its class cannot change. Open a new account and move the balance with a journal instead.' |
| Block and deprecate | An unused test account | Set Status blocked; try to post; set active again | Posting refused while blocked; works again when active |
| Install the GCC reference chart | A test company on the 4-digit starter chart with no custom accounts | Use the GCC reference chart; Renumber and install | Accounts renumbered to the 6-digit chart (e.g. Local Bank 112100, Customer Control 120100); balances and history kept; second run refused |
Posting accounts
| Action | When | What you do | What happens |
|---|---|---|---|
| Map a role and see it used | Role 'Bank charges' empty | Post a bank charge from reconciliation -> refused; map Bank charges to Bank Charges account; repeat | First refused 'No account is set for ... Set it under Finance, Configuration, Posting accounts before posting this.'; then posts to the mapped account |
Journals
| Action | When | What you do | What happens |
|---|---|---|---|
| Turn on Needs approval | Open GJ; Needs approval before posting = Yes; Save; create a GJ entry | The entry is saved as Draft and offers Submit for approval instead of Post Entry | |
| Archive a journal type | Set ADJ Archived; try a new ADJ entry | Refused: 'The Adjustment Journal is inactive.' |
Accounting periods
| Action | When | What you do | What happens |
|---|---|---|---|
| Generate twelve months | No periods for 2027 | Fiscal year 2027; Generate twelve months | Twelve monthly periods Open; existing ones skipped; a company with no periods is governed by the lock date alone |
| Soft close, close, lock | All September close steps signed off; books agree | Set September Soft closed; then Closed; then Locked | Each move audited (period.soft_closed / closed / locked); Closed takes a close snapshot; Locked cannot change again |
| Hard close blocked by differences | AR subledger differs from the control account | Try to set Closed | Refused: '<Period> cannot be hard closed while these do not agree - ...'; with a full-sentence reason by a period.reopen holder it closes and the reason is stored |
| Close checklist sign-off (two people) | Template: Bank reconciled required with evidence; owner A | A adds evidence and Mark ready; A tries Sign off; B (period.lock) Signs off | A refused: 'Somebody other than the owner, and the person who marked it ready, signs it off.'; B signs off; step shows ready by / signed by |
| Figures move after ready | A step marked ready with difference 0 | Post an entry that changes that figure; try Sign off | Refused: 'The figures moved after this step was marked ready ... Send it back and mark it ready again.' |
| Narrow one module | September Open | Narrow Sales ledger = Closed; post a sales invoice and a manual GJ in September | Invoice refused for the sales ledger; GJ posts |
| Reopen request with approval | Policy 'Reopening a closed period needs an approved reopen request' ON; August Closed | User A (period.adjust): Request a reopen, scope Purchase ledger, window 25-31 Aug, reason and evidence; A tries Approve; B (period.reopen) Approves; post a bill dated 28 Aug | A refused 'Somebody other than the person who asked has to approve a reopen.'; after B approves the bill posts; a bill dated 10 Aug still refused; period shows it must be closed again |
Period lock date
| Action | When | What you do | What happens |
|---|---|---|---|
| Move the lock date | Company admin | Close period; Lock through 31/08/2026; post an entry dated 31/08 | Heading 'Locked through 2026-08-31'; posting refused 'This accounting period is locked.'; trying 31/07 later -> 'A lock date cannot be moved backwards through this action.' |
Opening balances
| Action | When | What you do | What happens |
|---|---|---|---|
| Load, dry run, approve, post | Fresh test company; cut-over 31/12/2025 | New batch; Load the template; adjust rows to balance; Run dry run; second user Approves; Post to ledger | Dry run clean, Difference 0; one OB journal carrying every row; ar rows become posted invoices with their own numbers and dates, negative rows on-account receipts; Reconciliation 'All agree' |
| Unbalanced batch cannot be approved | Upload rows with debits 50,000 and credits 49,000; Run dry run; Approve | Problem 'Debits and credits differ by 1000. Nothing balances a batch for you: find the missing or wrong row.'; Approve refused 'Only a batch whose last dry run was clean can be approved.' | |
| Roll back | A posted batch with no allocations | Roll back with a reason | Journal reversed, invoices/bills/receipts removed from open items; state Rolled back. With an allocation made -> 'N allocation(s) have been made against these opening items, so the batch cannot be rolled back. Undo them first...' |
Trial balance (classic)
| Action | When | What you do | What happens |
|---|---|---|---|
| Trial balance balances | Posted entries this year | Open Reporting > Trial balance (classic) for this year | Period debit = Period credit; Balance difference 0.00; Net result equals P&L net profit |
Exchange rates
| Action | When | What you do | What happens |
|---|---|---|---|
| Enter and approve a rate | User A fx.manage, user B fx.approve | A: New rate USD -> AED closing 3.6725 on 30/09/2026; B: Approve | Row shows Awaiting approval, then Approved; postings on/after that date can use it |
| Unapproved rate is not used | A USD rate entered but not approved | Post a USD invoice dated that day | Refused: 'No approved spot rate for USD to AED on or before <date>...' |
| Approved rate is frozen | An approved rate | Enter the same pair/type/date again with a different rate | Refused: 'This rate is approved. Record a correction on a new date instead.' |
Exchange revaluation
| Action | When | What you do | What happens |
|---|---|---|---|
| Preview a receivables revaluation | Open USD invoice 1,000 booked at 3.6000 (AED 3,600); approved closing rate 3.6500 | As at 30/09; Side Customers; Show what it would do | Row: Foreign balance 1,000, Booked at 3.6000, Closing rate 3.6500, Adjustment +50.00; Total adjustment 50.00; nothing posted |
| Post the revaluation (gain) | The preview above | Post the revaluation | FXJ entry: Dr Trade receivables 50 (with the customer) / Cr Unrealized exchange difference 50; listed under Revaluations made 'Standing', Reverses on 01/10 |
| Automatic reversal the day after | Policy reversal = The day after | Wait for the scheduler or press Reverse them now on/after 01/10 | Reversal dated 01/10: Dr Unrealized exchange difference 50 / Cr Trade receivables 50; status Reversed; the invoice's foreign amount never changes |
| Loss on payables | Open USD bill 2,000 booked at 3.6000; closing 3.6500 | Side Suppliers; post | Dr Unrealized exchange difference 100 (or Loss account) / Cr Trade payables 100 |
| Cash and bank balance | Policy: Cash and bank on, balance account Foreign Currency Bank; USD 1,000 carried at 3,600; closing 3.65 | Side Cash and bank; post | Dr Foreign Currency Bank 50 / Cr gain 50; earlier revaluation lines are not counted in what the account carries |
| No second answer while one stands | Policy reversal = When the next revaluation runs; a standing September run | Run October | September run reversed first, then October computed; the ledger never holds two standing revaluations of one kind |
| Separate gain and loss accounts | Policy gain account 710xxx, loss account 730xxx | Revalue a set with both gains and losses | Gains totalled to the gain account, losses to the loss account, each on its own line |
Currency translation
| Action | When | What you do | What happens |
|---|---|---|---|
| Translate to USD | Approved AED->USD closing and average rates | From 01/01 To 30/09; Reporting currency USD; Translate | Balance sheet accounts at closing, P&L at average, equity at historical; Translation adjustment shown; nothing posted |
Recurring entries
| Action | When | What you do | What happens |
|---|---|---|---|
| Create, approve and run a monthly rent journal | User A journal.prepare, user B journal.approve | A: New instruction 'Office rent', Monthly, last day, Dr Rent Expense 10,000 / Cr Expense Accruals 10,000; Save draft; B: Approve; Run what is due | Draft -> Approved; on the due date one RCJ journal per occurrence (Dr Rent Expense 10,000 / Cr Expense Accruals 10,000), posted in the drafter's name; Runs lists it; Next date moves a month |
| Author cannot approve | Template drafted by A | A presses Approve | Refused: 'Somebody other than the person who wrote this instruction has to approve it.' |
| Edit sends it back to draft | An approved template | Edit the amount; Save | State back to Draft; nothing runs until approved again |
| Never twice | An approved template due today | Press Run what is due twice (or two browsers at once) | Exactly one journal for that date (keyed by template + date) |
| Failure is recorded, not skipped | Template due in a closed period | Run what is due | Run recorded with the period error as Result; template waits on that date; nothing skipped silently |
| Allocation by fixed percentages | Rent 12,000 on Rent Expense; departments ADM, SAL | Allocation: source Rent Expense, fixed 12,000, Fixed percentages ADM 60 / SAL 40; approve; run | Dr Rent Expense (ADM) 7,200 / Dr Rent Expense (SAL) 4,800 / Cr Rent Expense (source) 12,000; shares add back exactly (largest takes rounding) |
| Allocation by revenue driver | Revenue booked to departments this month | Driver Revenue; run | Cost shared in proportion to each department's revenue; no revenue -> refused with 'no driver' message |
| Pause, resume, end, discard | Pause an approved template; Run what is due; Resume; End with a reason; Discard a never-run draft | Paused does not run; End stops it for good; an ended template is not edited ('An ended template is not edited.'); only a never-run draft is discarded | |
| Review mode | Template with review on | Run | Each occurrence is written as a draft journal for somebody to post |
Accruals
| Action | When | What you do | What happens |
|---|---|---|---|
| Post an accrual with next-day reversal | Open period | New accrual: Electricity Expense / Expense Accruals 2,000 dated 30/09, department ADM; Post the accrual | ACR-00001; journal Dr Electricity Expense 2,000 (ADM) / Cr Expense Accruals 2,000; reversal dated 01/10 Dr Expense Accruals / Cr Electricity Expense |
Deferrals
| Action | When | What you do | What happens |
|---|---|---|---|
| Prepaid insurance released monthly | User A journal.prepare, B journal.approve | A: New deferral Prepaid expense 12,000, 01/10/2026 - 30/09/2027, Prepaid Expenses / Insurance expense; Set up the schedule; B: Approve; Release what is due at 31/10 | 12 monthly lines of 1,000; release posts Dr Insurance expense 1,000 / Cr Prepaid Expenses 1,000; Released 1,000, Still to release 11,000 |
| Deferred revenue | Deferred revenue 6,000 over 6 months, Deferred revenue (liability) / Service Revenue; approve; release month 1 | Dr Deferred revenue 1,000 / Cr Service Revenue 1,000 | |
| Set-up person cannot approve; cancel the rest | A approves own deferral; then B cancels the rest with a reason | A refused 'Somebody other than the person who set this schedule up has to approve it.'; cancel stops future releases, posted ones stay |
Year-end close
| Action | When | What you do | What happens |
|---|---|---|---|
| Prepare and execute by two people | FY 2025 with income and expense; last period soft closed; no draft journals; users A and B with period.lock | A: Prepare a close, 31/12/2025, Retained Earnings; B: Close the year | CLJ journal dated 31/12/2025 that zeroes every income and expense account per dimension combination; difference to Retained Earnings (profit 150,000: Dr income accounts / Cr expense accounts / Cr Retained Earnings 150,000); P&L report for 2025 still shows the year |
| Preparer cannot execute | A prepared close | A presses Close the year | Refused: 'Somebody other than the person who prepared the year-end close has to execute it.' |
| Books changed after prepare | A prepared close | Post an adjusting entry in 2025 (period.adjust); B executes | Refused: 'The books changed after this close was prepared (profit X then, Y now). Cancel it and prepare it again.' |
| Checks stop the close | A draft journal dated in 2025, or the last period still Open | Execute | Refused: 'The year cannot be closed yet: ...' naming the failed check |
| Reverse a close | Executed 2025 close; 2026 not closed; user with period.reopen | Reverse with a reason | CLJ reversed; year free to close again; with 2026 closed -> 'The year ending 2026-12-31 is closed. Reverse that one first.' |
Posting profiles
| Action | When | What you do | What happens |
|---|---|---|---|
| Profile remaps revenue from a date | Users A (account.manage) and B (journal.approve) | A: New profile Customer invoice, from 01/10/2026, revenue -> Service Revenue; Save draft; B: Approve; post a customer invoice dated 02/10 | Invoice revenue line posts to Service Revenue; the journal records the profile and version; an invoice dated 30/09 still uses the role account |
| Versions do not overlap | Approved v1 from 01/10 | New version v2 from 01/01/2027; approve | v1 ends 31/12/2026 automatically; one approved version per date |
| Author cannot approve; empty profile refused | A approves own draft; approve a profile with no mapping and no rule | 'Somebody other than the person who drafted this profile has to approve it.' / 'A profile that maps nothing and sets no dimension rule changes nothing. Add something or discard it.' |
Register payment dialog
| Action | When | What you do | What happens |
|---|---|---|---|
| Full receipt against one invoice | Posted customer invoice INV-A of AED 5,000.00, nothing paid; bank account 112100 exists | Open the invoice, Register receipt, leave Amount 5,000.00, method Bank, Deposit to 112100, Register | Receipt posts: Dr 112100 Bank 5,000.00 / Cr Receivable 1210 5,000.00 (partner on the receivable line). An allocation of 5,000.00 settles the invoice; it shows Paid and outstanding 0.00; the payment appears under Payments and receipts as a Receipt. |
| Partial receipt | Invoice of AED 5,000.00 open | Register receipt of 2,000.00 (or choose Per cent of balance 40) | Dr Bank 2,000.00 / Cr Receivable 2,000.00. Invoice shows Partially paid, outstanding 3,000.00. 'Balance after this' in the dialog read 3,000.00 before saving. |
| Over-payment refused | Invoice outstanding 3,000.00 | Enter 3,500.00 and Register | Refused: '3500.00 exceeds the 3000.00 outstanding.' Nothing is posted. (An advance is booked from Payments and receipts without a document.) |
| Clear the balance as a write-off | Invoice of AED 1,000.00 open | Register receipt 999.50, tick Clear the balance, Write off to the rounding account, Register | Journal 1: Dr Bank 999.50 / Cr Receivable 999.50. Journal 2: Dr Write-off (rounding) account 0.50 / Cr Receivable 0.50. One allocation carries 999.50 money + 0.50 write-off; invoice is Paid. The bank reconciliation sees only 999.50. |
| Cheque needs a reference | Invoice open | Method Cheque, leave Cheque number empty, Register; then enter CHQ-004512 and register | First attempt: 'Enter the cheque or transaction reference.' Second posts with the reference on the payment. |
| Double click does not book twice | Dialog open on a 1,000.00 invoice | Click Register twice quickly | One payment of 1,000.00 exists (same key is idempotent); invoice outstanding 0.00, not -1,000.00. |
| Foreign currency receipt and exchange difference | USD invoice of USD 1,000.00 booked at 3.6700 (AED 3,670.00); approved USD/AED rate on payment date 3.6725 | Register receipt USD 1,000.00 on that date | Dr Bank 3,672.50 / Cr Receivable 3,672.50 (payment valued at the payment date rate); the invoice carried 3,670.00 so an exchange gain of AED 2.50 is posted on settlement (Dr Receivable 2.50 / Cr Realised exchange gain 2.50); invoice Paid in USD. |
| Receipt cannot predate the invoice | Invoice dated 15/09/2026 | Set payment date 10/09/2026 | Refused: 'Payment date cannot precede invoice date.' |
Payments and receipts
| Action | When | What you do | What happens |
|---|---|---|---|
| Record an advance (no document) | Customer exists | Record payment: Type Receipt, Partner Al Noor Trading, Amount 3,000.00, no document | Dr Bank 3,000.00 / Cr Receivable 3,000.00 (partner). Shows Unapplied 3,000.00 and appears on the customer's open items as money on account. |
| Allocate an advance to invoices | Unapplied receipt of 3,000.00; invoices INV-1 1,200.00 and INV-2 2,500.00 for the same customer | Allocate: payment, INV-1 1,200.00, INV-2 1,800.00 | Both lines allocate (no new journal; the ledger already holds the receipt). INV-1 Paid; INV-2 outstanding 700.00; receipt Unapplied 0.00. Trying 2,000 on INV-1 is refused: 'INV-1 has only 1200.00 outstanding.' |
| One payment settles many invoices (settle) | Customer with INV-1 1,000.00 and INV-2 500.00 open | Record payment, select both invoices with 1,000.00 and 500.00 | One receipt of 1,500.00 posts: Dr Bank 1,500.00 / Cr Receivable 1,500.00; two allocation lines; both invoices Paid. Selecting invoices of two customers is refused. |
| Early-payment discount | Invoice AED 10,000.00 with terms 2/10 net 30, paid on day 8 | Allocate the receipt of 9,800.00 and press Take on the invoice | Discount of 200.00 is booked as the write-off on the allocation (Dr Discount allowed 200.00 / Cr Receivable 200.00) and the invoice closes. On day 15 the Take action refuses: 'No early-settlement discount is open on <date> for <number>.' |
| Reverse a payment | Posted receipt of 1,000.00 that settled INV-1; you hold payment.reverse | Open the payment, Reverse payment, date today | Reversal journal: Dr Receivable 1,000.00 / Cr Bank 1,000.00. The allocation is undone so INV-1 is open again for 1,000.00 and the original payment shows Reversed Yes. |
| Reverse needs its own permission | User with payment.record but not payment.reverse | Open a payment and press Reverse payment (or call the endpoint) | Refused with a permission error; the payment is untouched. |
| Pay a supplier bill | Posted supplier bill BILL-1 AED 10,000.00 | Open bill, Register payment 10,000.00 from the bank account | Dr Payable 2100 10,000.00 (supplier) / Cr Bank 10,000.00. Bill shows Paid. A receipt is not accepted on a supplier document (direction must match the document side). |
| Supplier payment blocked by a hold | BILL-1 has an active payment hold | Register payment against BILL-1 | Refused with 'BILL-1 is on payment hold: <reason>.' Same for a payment through Record payment (settle) and for a whole-supplier hold. |
| Retention cannot be paid early | Supplier bill AED 10,000.00 with AED 1,000.00 retention held | Pay 9,500.00 | Refused: 'BILL-1: 1000.00 of it is retention held until released; at most 9000.00 can be paid now.' |
Open items
| Action | When | What you do | What happens |
|---|---|---|---|
| Outstanding is computed live | Invoice 5,000.00 with receipts of 2,000.00 and 1,000.00 allocated | Open Customer open items | Original 5,000.00, Allocated 3,000.00, Outstanding 2,000.00, status Partially paid. Original never changes. Undoing one allocation moves Allocated and Outstanding accordingly. |
| As-at date view | Receipt allocated on 05/10/2026 to a September invoice | Set As at 30/09/2026 | The invoice is still shown outstanding in full as at 30/09/2026; with As at today it is settled. |
| Undo an allocation | Allocation of 700.00 of a receipt to INV-2 | Undo allocation with today's date | Allocation is marked reversed on that date; INV-2 outstanding rises 700.00; receipt unapplied rises 700.00; no cash entry is reversed. |
| Credit note set against an invoice | Posted credit note 400.00 and invoice 1,000.00 | Allocate the credit note to the invoice for 400.00 | Invoice outstanding 600.00. A draft note is refused: 'Post the note before setting it against anything.' |
Customer statements
| Action | When | What you do | What happens |
|---|---|---|---|
| Statement arithmetic | Customer opening balance 2,000.00; in September invoices 6,000.00, credit note 500.00, receipts 4,000.00 | Run Customer statement 01/09 to 30/09 | Opening 2,000.00 + debits 6,000.00 - credits 4,500.00 = closing 3,500.00; 'reconciled' shows the customer's share of the receivable control account; open invoices listed as at 30/09. |
Supplier statements
| Action | When | What you do | What happens |
|---|---|---|---|
| Supplier statement credit balance | Supplier with bills 8,000.00 and payments 3,000.00 in the period, opening 0 | Run Supplier statement for the period | Closing 5,000.00 shown as owed to the supplier (credit balance); start after end is refused: 'The statement starts after it ends.' |
Receivables aging
| Action | When | What you do | What happens |
|---|---|---|---|
| Aging total agrees with the control account | Customers with invoices Current, 40 and 100 days old | Run Receivables aging at today | Each invoice lands in its bucket; grand total equals the receivable control account balance (the check line shows no difference). Unapplied receipts reduce, never hide, the total. |
Payables aging
| Action | When | What you do | What happens |
|---|---|---|---|
| Aging total agrees with the payable account | Bills at several ages | Run Payables aging | Buckets by days past due; total equals the payable control account. |
Payment due
| Action | When | What you do | What happens |
|---|---|---|---|
| Bills due and what stops them | Bill due 20/09 on hold; bill due 25/09 with a dispute of 500 of 2,000; bill already in a proposal | Run Payment due with end date 30/09/2026 | All three listed oldest first with Status and 'Why it cannot be paid yet' (payment hold, in dispute 500.00, in proposal PP-xxxxx). A later end date plans the next run. |
Goods received not invoiced (GRNI)
| Action | When | What you do | What happens |
|---|---|---|---|
| GRNI shows unbilled receipts | PO line 100 units received at AED 12.00, billed 60 | Run GRNI | Received 100, billed 60, not invoiced 40, value AED 480.00 with days waiting. Billing more than received appears too (the mismatch the other way). |
Bank reconciliation (statements)
| Action | When | What you do | What happens |
|---|---|---|---|
| Import a bank file | Import profile for the bank exists; file with 6 lines | New statement > Preview import > Import | Preview shows the lines read; import creates a Draft statement for the chosen account with opening/closing; wrong totals are refused: 'The lines add up to <n>, which takes <opening> to ...' |
| Auto-match | Draft statement; ledger holds a receipt entry of 2,000.00 on the same bank account | Auto-match | The 2,000.00 line is matched to that entry; lines with no equal-amount entry stay unmatched; nothing is posted. |
| Manual match refused when wrong | Statement line +2,000.00 | Match to an entry of 1,950.00; then to an entry on another bank account; then to an entry already used | Three refusals: 'That entry is 1950.00; the statement line is 2000.00.', 'That entry is not on this bank account.', 'That entry is already matched to another statement line.' |
| Match many | Statement line +1,500.00; three ledger receipts of 500.00 | Match many, choose the three entries | Group matched. Choosing one entry is refused ('Choose between 2 and ... entries to group.'); entries totalling 1,400.00 are refused with the total shown. |
| Add a bank charge line as a journal | Unexplained statement line -35.00 'Account fee' | Add line / book it to the bank charges account | Journal posts: Dr Bank charges 35.00 / Cr Bank 35.00 and the line is matched to it; difference falls to 0. |
| Close a statement | All lines matched and ledger agrees with the closing balance | Close | Statement becomes Reconciled and can no longer be edited ('A reconciled statement cannot be edited.'). With an unmatched line or a difference the close is refused naming the count or the difference. |
Bank reconciliation workspace
| Action | When | What you do | What happens |
|---|---|---|---|
| AI assist proposals | Draft statement with 10 open lines; policy AI On | Run assist | Rules propose first; the model sees only the residue. Each proposal has a score band Strong or Possible and a reason. Nothing is matched until Accept. If the model fails the rules' proposals stand. |
| Accept and reject a proposal | A proposal exists | Accept one; Reject another; try to accept an already decided one; accept a 'nothing fits' proposal | Accepted proposal matches the line; rejected stays open. Repeats refused: 'This proposal was already accepted.'; nothing-fits: 'This proposal says nothing fits, so there is nothing to accept. Find a match or book the line.' |
| Validate then submit | Statement with an unexplained line | Submit for approval; then Validate; fix; Submit | Submit before validation: 'Validate the statement first, and clear anything that fails.' With unexplained lines: '<n> statement line(s) are still unexplained. Match them, book them, or record them as exceptions before submitting.' With a difference: 'The books reconcile to ... and the bank says ...'. |
| Approve with maker-checker | Statement submitted by user A; policy maker-checker On | User A presses Approve; then user B (bankrec.approve) does | A: 'You submitted this reconciliation, so someone else has to approve it (maker-checker).' B: statement closes, certificate with a digest is produced, audit 'bankrec.approved'. |
| Return to the preparer | Submitted reconciliation | Return without a reason; then with one | 'Say why it is being returned.' then state goes back to open and the statement is editable again; while submitted it cannot be changed ('This reconciliation is submitted for approval. Return it to the preparer to change it.'). |
| Auto-match only what is certain (worked) | Statement lines: +5,000.00 on 5 Oct ref TRF778; ledger bank account has one receipt journal REC-0001 Dr 112100 5,000.00 dated 5 Oct memo containing TRF778; another receipt of 5,000.00 on 20 Oct | Run auto match. | Score: same amount 60 + same day 20 + reference match 15 = 95 (certain is 80 or more); the 5 Oct receipt is matched. The 20 Oct receipt (amount 60 only, 15 days apart = 60) is a suggestion, never applied. A different amount scores 0 and is never offered. |
| Accept, unmatch and refuse wrong matches | A suggested match | Accept this match; Unmatch; try to match a ledger entry of 4,999.00 to a 5,000.00 line; match an entry already used. | Accepted: line shows Matched. Unmatch clears it. Wrong amount: 'That entry is 4999.00; the statement line is 5000.00.' Used entry: 'That entry is already matched to another statement line.' Entry on another account: 'That entry is not on this bank account.' |
| Group one line to several entries and split a line (worked) | Bank receipt 7,500.00; ledger receipts 4,000.00 and 3,500.00; second line 5,000.00 of which 50.00 is a charge | Group candidates: select both; Split the second line into 4,950.00 (to the receipt) and 50.00 (explained as bank charge). | Group sums 7,500.00 and matches. Group of 4,000 + 3,000 -> 'Those 2 entries come to 7000.00; the statement line is 7500.00.' Same entry twice: 'The same entry is in the group twice.' Split parts 4,900 + 50 -> 'The parts come to 4950.00; the line is 5000.00.' |
| Combine several statement lines into one ledger entry; many-to-many | Two statement lines +2,000 and +3,000 and one ledger receipt 5,000 | Select both lines > combine and choose the entry. | Matched when totals agree; 'Those 2 lines come to 4000.00; the entry is 5000.00.' otherwise. Many-to-many: 'The lines come to X and the entries to Y; they must be the same.' and 'Receipts and payments are matched separately: every line and entry runs the same way.' |
| Explain a line by booking the missing entry (worked journal) | Statement line -50.00 'Bank charges 08/10'; account 720100 Bank charges exists | Create entry (Missing book entry) > account 720100 > confirm. | Journal created: Dr 720100 Bank charges 50.00 / Cr 112100 Bank 50.00, posted on the line date, and matched to the line automatically. The statement line is not edited or deleted. Without an account: 'Choose the account this belongs in.' |
| Reconciliation arithmetic (worked) | Ledger closing balance of 112100 at 31 Oct = 13,000.00. Statement closing 13,150.00. A cheque CHQ1002 -200.00 is in the books but not on the statement; a bank charge -50.00 is on the statement but not in the books | Open the reconciliation summary (header Difference). | reconciled_to = book closing - ledger-only items + statement-only items = 13,000.00 - (-200.00) + (-50.00) = 13,150.00. Difference = 13,150.00 - 13,150.00 = 0.00 (balanced). If the charge were typed as -60.00 the difference would be -10.00 and Close/Submit is refused with the 'difference' message. |
| Validate then submit for approval | bankrec.prepare; every line matched | Validate; then Submit for approval; then try to change a match. | Validate lists checks (e.g. Opening + movements = closing). Submit refused if not validated: 'Validate the statement first, and clear anything that fails.'; with open lines: 'N statement line(s) are still unexplained. Match them, book them, or record them as exceptions before submitting.'; with a difference: 'The books reconcile to ... The difference of ... has to be explained first.' After submit, edits are refused: 'This reconciliation is submitted for approval. Return it to the preparer to change it.' |
| Approve (maker-checker), return and certificate | A submitted reconciliation; second user with bankrec.approve | Preparer approves own; second user returns without reason; returns with reason; resubmit; second user approves; open Certificate. | 'You submitted this reconciliation, so someone else has to approve it (maker-checker).'; 'Say why it is being returned.'; returned shows 'Returned: <reason>'; approve closes the statement (state reconciled) and creates a certificate with a digest; approve before submit: 'Submit the reconciliation for approval first.' |
Reconciliation rules and import profiles
| Action | When | What you do | What happens |
|---|---|---|---|
| Rule scope and ambiguity | Rule R1 priority 100 for account X | Create R2 with the same scope, priority and dates | Refused as ambiguous; changing priority to 90 saves. Evidence without 'amount' is refused. |
Write-offs (customer and supplier)
| Action | When | What you do | What happens |
|---|---|---|---|
| Small write-off inside threshold posts at once | Tolerance Small balance: cap 50.00, posts without approval up to 10.00; invoice 1,000.00 with 8.00 left | New write-off, Small balance, 8.00, reason 'Rounding' | Status Posted straight away (auto): Dr Write-off expense 8.00 / Cr Receivable 8.00; invoice cleared; no approver recorded. |
| Write-off above threshold needs a second person | Same tolerance; invoice with 25.00 left; user A requests | A requests 25.00; A tries Approve; B (journal.approve) approves | Request waits (Requested). A: 'Somebody other than the person who asked has to approve a write-off.' B approves: Dr Write-off expense 25.00 / Cr Receivable 25.00, status Posted, Decided by B. |
| Cap refuses outright | Cap amount 50.00, cap 1% of bill; invoice total 1,200.00 | Request 60.00; then 15.00 | 60.00: 'A small balance write-off is capped at 50.00.' 15.00: 'A small balance write-off is capped at 1% of the bill (12.00).' |
| Bad debt always needs approval | Customer invoice 3,000.00 unpaid, tolerance threshold 100.00 | Request bad debt 200.00 | Waits for approval even though under the threshold. After approval: Dr Bad debt expense 200.00 / Cr Receivable 200.00. |
| No tolerance set | Company has no tolerance rows | Request any write-off with no reason; then with a reason | 'Say why this is being written off.' then it waits for approval (with no tolerance everything needs approval and nothing is capped). |
| Kind versus side | Supplier bill | Request Bad debt; request Vendor difference | Bad debt: 'A bad debt write-off does not apply to a supplier bill.' Vendor difference accepted: on approval Dr Payable / Cr write-off (difference) account. |
| Refuse and cancel | A requested write-off | Refuse with no note; with a note; the requester cancels another; a stranger without journal.approve cancels | 'Say why it is refused.' then Rejected; requester can cancel own; others refused: 'Only the person who asked, or an approver, can cancel this.' |
| Reverse a posted write-off | Posted write-off of 25.00; user with journal.reverse | Reverse with a reason | Reversal journal Dr Receivable 25.00 / Cr Write-off expense 25.00; invoice open again for 25.00; original stays on record as Reversed. Without a reason 'Say why it is being reversed.' |
| Record a recovery | Posted bad-debt write-off 1,200.00 | Record recovery 400.00 into the bank; then 900.00 | 400: Dr Bank 400.00 / Cr Recovery income 400.00; invoice stays cleared (the receivable is not reopened). 900: 'Only 800.00 of WO-00001 is still to recover.' A recovery can be reversed with a reason. |
| Two requests cannot exceed the balance | Invoice with 30.00 left; one request of 20.00 waiting | Request another 20.00 | Refused: '<number> has only 30.00 outstanding after the write-offs already waiting.' |
| Stale approval | Request of 25.00 waiting, but the invoice was then paid down to 10.00 | Approve | Refused: '<number> now owes less than 25.00, so it cannot be written off.' |
Disputes
| Action | When | What you do | What happens |
|---|---|---|---|
| Open a dispute | Customer invoice outstanding 3,000.00 | New dispute: amount 1,200.00, reason, owner, expected date | Dispute opens (Open). The 1,200.00 is excluded from dunning notices and from payment proposals; the other 1,800.00 is still chased. A second dispute on the invoice is refused. |
| Edit and resolve | Open dispute 1,200.00 | Edit amount to 4,000.00; then 800.00; Resolve with a note | 4,000: 'That is more than the item still owes.' 800 saves. Resolve needs 'Say how it was settled.'; status Resolved and the invoice is chaseable in full again. |
| Supplier dispute stops the proposal | Supplier bill 2,000.00 wholly in dispute | Add the bill to a payment proposal | Refused: '<number> is wholly in dispute, so there is nothing to pay.' A part dispute lowers the payable amount by the disputed part. |
Collections worklist
| Action | When | What you do | What happens |
|---|---|---|---|
| Worklist is live from open items | Customer A overdue 5,000.00 (60 days) with 1,000.00 in dispute; customer B not overdue | Open Collections; then tick Include customers that are not overdue | A shows Outstanding, Overdue 5,000.00, In dispute 1,000.00, oldest 60 days, collector and risk; B appears only with the tick. Figures agree with the aged receivables. |
| Log a contact | A customer on the worklist | Log a contact: kind call, note, outcome, next action and date | Appears under Contacts and notices and as Last contact. An escalation without an owner is refused: 'Say who it is escalated to.' |
Promises to pay
| Action | When | What you do | What happens |
|---|---|---|---|
| Add a promise | Customer overdue 8,000.00 | Add a promise 8,000.00 for 07/10/2026 | Open promise saved and a note appears in the contacts. A second one is refused; a past date is refused; 7 months ahead is refused. |
| Kept or broken is worked out from receipts | Open promise 8,000.00 due 07/10, grace 3 days | Receive 8,000.00 on 06/10; separately let another promise pass with no money | First becomes Kept (Received 8,000.00). The other becomes Broken once the date plus grace has passed and shows in Broken promises. |
| Cancel a promise | Open promise | Cancel without a reason; with one | 'Say why the promise is cancelled.' then Cancelled; a cancelled or kept promise cannot be cancelled again ('This promise is already cancelled.'). |
Dunning runs
| Action | When | What you do | What happens |
|---|---|---|---|
| Propose a run | Levels 1 (15 days) and 2 (30 days); customer A 45 days overdue 5,000.00; B has an open promise; C all in dispute; D marked No automated reminders | Propose a run as at today | Draft run: A gets a level 2 notice (proposed); B skipped 'Promise to pay ... by <date>'; C skipped 'Everything overdue is in dispute'; D skipped 'Marked 'No automated reminders' on the customer'. Nothing is posted. |
| Skip reasons | Unapplied receipts 5,000.00 for a customer overdue 5,000.00; another overdue only 20.00 with minimum 50.00; another got a level 2 notice 3 days ago and spacing is 14 | Propose a run | Skipped with 'Unapplied receipts or credit notes cover the overdue amount: allocate them', 'Below the minimum amount (50.00)', and 'Level 2 notice went on <date>'. |
| Issue the run | Draft run with proposed notices | Issue | Notices move to sent/issued by channel; an email level with no customer email is flagged and skipped. Run becomes Issued. Only one draft run may exist: a second Propose says '<code> is still draft. Issue or cancel it before starting another.' |
| Withdraw a notice and cancel a run | Draft run | Withdraw one notice with a reason; cancel the run | Notice withdrawn ('Say why it is withdrawn.' required); run Cancelled and nothing is sent. Withdraw on an issued run: '<code> is issued; notices can only be withdrawn from a draft.' |
| Fees and interest on a notice | Policy fees On (legal reviewed); level 2 fee 25.00, interest 12% a year, basis 365; net overdue 10,000.00, 30 days late | Propose a run | Notice shows Fee 25.00 and Interest 10,000 x 12% x 30/365 = 98.63. Neither is posted to the ledger; raising them as an invoice is a separate deliberate step. With fees Off both are 0.00. |
Collection policy and dunning levels
| Action | When | What you do | What happens |
|---|---|---|---|
| Switch on fees needs legal confirmation | Fees Off | Switch on without ticking Legal review; then with review and a note | First refused with the 'regulated ... legal position has been reviewed' message; second saves and is audited as collections.fees_enabled with the note. |
| Level ladder rules | Level 1 at 15 days, level 2 at 30 | Add level 3 at 20 days; add level 10; add a second level 2; Add the standard levels on a company that has levels | 'Level 2 starts at 30 days; level 3 has to start later.' 'The level is a number from 1 to 9.' 'Level 2 already exists.' 'This company already has dunning levels.' Delete of a level that sent notices: 'Notices were sent at this level. Switch it off instead.' |
Payment proposal record
| Action | When | What you do | What happens |
|---|---|---|---|
| Prepare a proposal by due date | Three posted supplier bills due by 31/10 (one held, one disputed in full) | New proposal, Pay from bank account, Include everything due by 31/10/2026 | Draft proposal with only eligible bills; held and wholly disputed bills are left out; each line To pay = outstanding less dispute less retention. |
| Three-person control | Users P (payment.prepare), A (payment.approve), R (payment.release); separation switch On | P submits; P tries Approve; A approves; A tries Release; R releases | P: refused 'Somebody other than the person who prepared this proposal has to approve it.' A approves: bank file fixed with a SHA-256 fingerprint. A release: 'The person who releases a payment is neither the person who prepared it nor the one who approved it.' R release succeeds. |
| Release books the payments | Approved proposal: bills of 4,000.00 and 6,000.00 to two suppliers | Release to the bank | Two payments post in one unit of work: Dr Payable 4,000.00 / Cr Bank 4,000.00 and Dr Payable 6,000.00 / Cr Bank 6,000.00; bills Paid; proposal Released. |
| Separation switched off | Policy Separate release Off; A approved | A releases | Allowed (approver may release), but the preparer still cannot: 'The person who prepared a proposal cannot release it.' |
| Release withdraws a stale approval | Approved proposal; after approval a supplier's bank account changed (or a bill was partly paid) | Release | Release does not pay: approval withdrawn, affected lines held, proposal back to pending with the reason ('The earlier approval was withdrawn: ...'); somebody independent must approve again. |
| Authorised signers | Bank account lists signers (not user R) | R releases | Refused: 'You are not an authorised signer of <bank account>.' |
| Supplier without bank details | Supplier with no bank account on file in a proposal | Submit for approval | Refused: '<supplier> has no bank account on file. Add one, or hold <bill>.' All lines held: 'There is nothing to pay: every bill is held or there are none.' |
| Bank answers per line | Released proposal with 2 bills | Record Accepted for one, Rejected (reason) for the other | Accepted line stays paid. Rejected line reverses its payment (Dr Bank / Cr Payable for the amount), the bill is open again and free for a new proposal. Rejection without a reason refused; changing an accepted line: 'reverse its payment from the payment screen ...' |
| Download the bank file | Approved proposal | Download bank file as a preparer, then as approver | Preparer without approve/release: 'Only somebody who approves or releases payments can download the bank file.' Approver gets the generic header/detail/trailer CSV (not ISO 20022) with count and total. |
| Cancel | Draft proposal; a released one | Cancel the draft with a reason; try the released one | Draft cancels and frees its bills. Released: 'A released proposal is with the bank: record its ...' Cancel without a reason: 'Say why the proposal is cancelled.' |
| Edit rules | Pending proposal | Add a bill; hold a bill; remove a bill | 'Only a draft can be edited. Send an approved or pending one back, or cancel it.' Holds are allowed in draft or pending only. |
Payment holds
| Action | When | What you do | What happens |
|---|---|---|---|
| Place and lift a hold | Posted supplier bill BILL-9; users P (payment.prepare) and A (payment.approve) | P places a hold with a reason; P tries to lift it; A lifts it | Hold Active; the bill cannot be paid or proposed. P lifting is refused by permission; A lifts with a reason, state Released, Released by A. Placing again on the same bill: 'That is already on payment hold.' |
| Whole-supplier hold | Supplier with 5 open bills | Place scope A whole supplier | Every bill of that supplier is refused for payment with 'This supplier is on payment hold: <reason>' until released. |
Credit position
| Action | When | What you do | What happens |
|---|---|---|---|
| Exposure against limit | Customer limit 100,000.00; open invoices 85,000.00; confirmed orders not yet invoiced 5,000.00 | Open Credit position | Customer listed as near limit with Exposure 90,000.00 and Available 10,000.00; tiles count it under needs attention. |
| Confirming an order past the limit is refused | Hard block policy; exposure 85,000.00; order of 30,000.00 (would be 115,000.00) | Confirm the sales order | Refused with 'Credit check: ...' and the hint to ask for a credit override. Nothing is confirmed and no reservation is written. |
| Apply the overdue rule | Customers with items 20, 70 and 100 days overdue | Enter 60 and Apply the overdue rule | Customers over 60 days are put on hold (blocking new orders); the 20-day customer is untouched; the result lists who was held. 0 days is refused. |
Credit overrides
| Action | When | What you do | What happens |
|---|---|---|---|
| Override lifecycle with two people | Limit 100,000.00, exposure 85,000.00, order 30,000.00; user S (document.confirm) and approver M (credit.release) | S requests max excess 15,000.00 until a date in 10 days; S tries Approve; M approves; S confirms the order | S cannot approve: 'Somebody other than the person who asked has to approve a credit override.' After M approves the order confirms; excess is min(30,000, 115,000 - 100,000) = 15,000.00; override Used 15,000.00; a reservation Held records exposure before 85,000.00 and after 115,000.00. |
| Override is bounded | Approved override of 15,000.00 | Confirm a second order that needs 20,000.00 excess; confirm one after the end date | Refused: the override has no room or has expired; using it does not extend it. A blocked/blacklisted customer cannot even be given one. |
| Refuse and cancel | Requested override | Refuse without a note; with one; the requester cancels another; a stranger cancels | 'Say why the request is refused.' then Rejected; requester can cancel; others without credit.release: 'Only the person who asked, or someone who can release credit, can cancel this.' |
Credit reservations
| Action | When | What you do | What happens |
|---|---|---|---|
| Reservation states | Order confirmed under credit | Cancel the order; invoice another fully; try Release on a standing order | Cancelled order: reservation Released and its override draw is given back. Fully invoiced: Consumed (exposure counted once as a receivable). Manual Release of a standing order: 'The order still stands. Cancel it, and its credit is released with it.' |
Credit groups
| Action | When | What you do | What happens |
|---|---|---|---|
| Group limit across members | Group limit 250,000.00 policy Block the order; member A exposure 150,000.00, member B 90,000.00 | Confirm an order of 20,000.00 for B | Combined 240,000.00 + 20,000.00 = 260,000.00 > 250,000.00 so the order is refused with the group message; Warn only lets it through with a note on the reservation. |
| Membership rules | Customer A already in group G1 | Add A to a new group G2; add a partner of another company; reuse code of G1 | 'A is already in another credit group.' 'Each member is one of this company's customers.' 'Another credit group has that code.' |
Provision matrices
| Action | When | What you do | What happens |
|---|---|---|---|
| Build and approve a matrix with two people | Users E (ecl.manage) and F (ecl.approve); matrix with rates | E creates the matrix, saves rates, E tries Approve; F approves; F tries to edit | E approve: 'Somebody other than the person who built this matrix has to approve it.' F approves; afterwards edits refused: 'An approved matrix is never edited. Make a new version.' No rates: 'There are no rates to approve.' |
| New version retires the old | Approved matrix v1 | New version; leave it draft; try another new version; approve v2 | Second attempt: 'Version 2 is still a draft. Finish that one first.' Approving v2 retires v1; a draft can be discarded unless a run used it. |
Expected credit loss runs
| Action | When | What you do | What happens |
|---|---|---|---|
| Provision arithmetic | Buckets 0-30 and 31-60; exposure 200,000.00 and 80,000.00; rates 1% (overlay 0) and 5% (overlay +10%); allowance in the ledger 3,000.00 | Work out the provision as at today | 0-30: 200,000 x 1% = 2,000.00. 31-60: 80,000 x 5% x 1.10 = 4,400.00. Required 6,400.00; in the ledger 3,000.00; adjustment +3,400.00. Unapplied receipts and credit notes are first taken off the oldest items. |
| Post the true-up (second person) | Draft run with adjustment +3,400.00; preparer E, poster F | E tries Post; F posts | E: 'Somebody other than the person who prepared the provision has to post it.' F: Dr ECL expense 3,400.00 / Cr Allowance 3,400.00 dated the run date; status Posted. |
| Release when the need falls | Required 9,000.00 against an allowance of 12,000.00; release account set | Prepare and post | Adjustment -3,000.00: Dr Allowance 3,000.00 / Cr Release account 3,000.00 (or the expense account if none named). |
| Stale or incomplete run cannot post | Draft run; then a manual entry changes the allowance; another run has exposure with no matching rate | Post each | 'The allowance changed after this run was prepared (<then> then, <now> now). Cancel it and prepare it again.' and '<n> of exposure matched no rate in <matrix>. Add a rate (a row with no portfolio and no risk covers everything) ...' |
| Run date rules and reversal | Posted run at 30/09 | Prepare a run for 15/09; prepare another for 30/09; reverse the posted run with no reason; reverse with a reason after a later run exists | 'The provision as at 2026-09-30 is already posted. A run is for a date after the last posted one.' / 'A provision for 2026-09-30 already stands ...' / 'Say why the provision is reversed.' / 'The provision as at <date> was worked on top of this one. Reverse that first.' A clean reversal posts the opposite journal. |
Budgets (list)
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a budget | budget.manage; chart has income and expense accounts | New budget > Name 'Budget 2026', Scenario Original, From 2026-01-01, To 2026-12-31 > Create. | A draft 'BUD-2026-ORI v1' appears with Income 0.00, Expense 0.00; audit 'budget.created'. Creating a second Original budget for 2026 is refused: 'Another budget already uses that code. Make a new version of it instead.' |
| Edit conflict on a budget | Two users open the same draft | User 1 saves lines; user 2 saves lines from the stale page. | User 2 is refused: 'Somebody changed this budget. Reload it and look again.' |
Budget page
| Action | When | What you do | What happens |
|---|---|---|---|
| Save budget lines from CSV (annual split worked) | A draft budget 2026-01-01 to 2026-12-31 | Paste: account,period,amount / 610300,annual,10000 / 410100,2026-01,50000 > Save lines. | Account 610300 gets 12 monthly rows: 11 x 833.33 and the last month 833.37 (10,000 - 11 x 833.33 = 833.37), total 10,000.00. Account 410100 gets one row in January. Totals: Income 50,000.00, Expense 10,000.00. Saving again replaces every earlier row. |
| Refuse bad budget rows | A draft budget | Save a row for account 120100 (asset); then a negative amount; then period 'Q1'. | Each refused with its row number: 'Row 1: 120100 is a asset account; a budget covers income and expense.'; 'Row 1: amounts are positive; ...'; 'Row 1: the period is yyyy-mm, or annual.' Nothing is saved. |
| Approve a budget (maker-checker) | Draft with lines built by user A; user B has budget.approve | As user A click Approve; then as user B click Approve. | A: 'Somebody other than the person who built this budget has to approve it.' B: status Approved, Approved by B, audit 'budget.approved'. A draft with no lines: 'There are no lines to approve.' An approved budget cannot be approved again: 'This budget is already approved.' |
| An approved version is never edited; make a new version | Approved budget v1 | Try Save lines or edit name; then New version. | Edit refused: 'An approved version is never edited. Make a new version.' New version creates v2 as a draft copy of v1's lines. While v2 is still a draft, another New version is refused: 'Version 2 is still a draft. Finish that one first.' Approving v2 (by someone other than its author) turns v1 into Replaced. |
| Discard a draft | Draft budget | Click Discard draft. | Draft and its lines are deleted. An approved budget cannot be discarded: 'Only a draft is discarded; an approved budget is retired by approving its successor.' A draft used by a control policy: 'A budget control policy uses this budget.' |
Budget against actual
| Action | When | What you do | What happens |
|---|---|---|---|
| Variance and favourable colour (worked) | Approved budget: account 610300 (an expense account, called Marketing in these examples) budget 30,000 (Jan to Mar); account 410100 Sales budget 100,000; ledger Jan to Mar: 610300 debits 34,500, 410100 credits 90,000 | Choose the budget, From 2026-01-01 To 2026-03-31. | 610300: Budget 30,000.00, Actual 34,500.00, Variance 4,500.00, 15.0% (unfavourable for an expense). 410100: Budget 100,000.00, Actual 90,000.00 (income shown positive), Variance -10,000.00, -10.0% (unfavourable for income). Result: budget 70,000.00, actual 55,500.00, variance -14,500.00. |
| Availability after commitments (worked) | Budget for 610300 is 1,000; actual 300; open commitments 200 | Open the report for the year; read the 610300 row. | Unspent = 1,000 - 300 = 700.00; Committed 200.00; Available = 1,000 - 300 - 200 = 500.00. Income accounts show no committed or available figure. |
| Actual leaves year-end closing entries out | A closed year with a year-end close journal | Run the report over the closed year. | Actual equals the ledger activity of the year and is not zeroed by the closing entry (journals from source 'yearend' are excluded). |
| Unbudgeted spend is flagged | Account 610100 has postings but no budget line | Open the report. | 610100 is listed with Budget 0.00, the actual amount, and no variance percentage (blank), marked unbudgeted. |
| Commitments from purchase orders | Confirmed purchase order with a service line 4,000 not yet billed | Open the report; then bill half of it. | Committed on the expense posting-role account rises by 4,000.00; after billing 2,000 it falls to 2,000.00. Stocked goods lines are not counted (balance sheet matter). |
| Dimension filter hides commitments | Open the statement with a dimension filter (API ?department=SALES) | Request /budgets/<id>/statement?department=SALES. | Only budget lines and actuals carrying that dimension value are used; commitments show 0.00 because they are not filtered by dimension. |
Budget control policies
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a policy | budget.manage; an approved budget | New policy > Name, Approved budget, Accounts 600000 to 699999, Measured whole budget, Tolerance 10, Block unless overridden > Save. | Policy saved with an auto code BC-xxxxxxxx; audit 'budget_control.saved'. Choosing a draft budget is refused: 'A policy controls an approved budget version.' |
| Warn at the limit (worked) | Policy: warn, tolerance 0, whole budget; account 610300 budget 12,000 for the year, spent 11,900, no commitments | Post a manual journal Dr 610300 500 / Cr bank 500. | Limit 12,000; used = 11,900 + 500 = 12,400 > 12,000; the journal posts and an audit row 'budget.warning' is written: '610300 ... would pass its budget (BUD-2026-ORI): budget 12,000.00, spent 11,900.00, this 500.00.' The posting is not stopped. |
| Block at the limit with tolerance (worked) | Policy: block, tolerance 10%, whole budget; 610300 budget 12,000, spent 12,500 | Post Dr 610300 600 / Cr bank 600; then Dr 610300 50 / Cr bank 50. | Limit = 12,000 x 110 / 100 = 13,200. 12,500 + 600 = 13,100 is within the limit and posts. After that spent is 13,100, and 13,100 + 50 = 13,150 also posts; a further 100 (13,250 > 13,200) is refused with 'Budget control <code>: ... Ask for a budget override (Planning > Budget control), and have somebody else approve it.' and no journal is made. |
| Basis: year to date versus whole year (worked) | Budget 610300 is 1,000 per month for 2026; posting date 15 March; spent so far 2,900 | With basis year to date post 200; then switch the policy to whole budget and post 200. | Year to date: months up to March = 3,000; 2,900 + 200 = 3,100 > 3,000 -> breach. Whole budget: 12,000; 3,100 < 12,000 -> no breach. |
| Commitments counted as spent (worked) | Policy counts commitments; budget 1,000; actual 600; open commitment 300 | Post Dr 610300 200. | used = 600 + 300 + 200 = 1,100 > 1,000 -> breach, and the message includes ', committed 300.00'. Untick 'Count commitments as spent' and the same posting passes (800). |
| Account with no budget line | Policy covers 600000 to 699999; account 690000 has no budget line | Post Dr 690000 100 with the option unticked, then ticked. | Unticked: not controlled, posts. Ticked: limit 0, so the 100 breaches (warn or block as set). Reversal, year-end, opening, FX and ECL journals are never checked. |
Budget commitments
| Action | When | What you do | What happens |
|---|---|---|---|
| Add and release a commitment | budget.manage | Add commitment 'Fit-out' 610300, 25,000, today; then Release with reason 'Contract cancelled'. | Code CMT-00001 (next number), Status Open, counted in Committed on the report. After release: Status Released and no longer counted. Releasing again: 'This commitment is already released.'. Empty reason: 'Say why it is released or cancelled.' |
Budget overrides
| Action | When | What you do | What happens |
|---|---|---|---|
| Request, approve and use an override (worked) | Block policy; 610300 over limit by 100; user A budget.manage, user B budget.approve | A requests 500 for 14 days, reason 'Urgent campaign'; B approves; A posts Dr 610300 300; then another Dr 610300 300. | Request Waiting. B approves -> Approved. First posting passes and Used becomes 300.00 (excess charged, remaining 200.00, audit 'budget.override_used'). The second needs 300 but only 200 remains -> refused with the budget control message. |
| Approver cannot be the requester | User A requested an override and also holds budget.approve | A clicks Approve on own request. | 'Somebody other than the person who asked has to approve a budget override.' |
| Refuse, cancel and expiry | A waiting request; an approved one past its end date | Refuse without a reason; refuse with a reason; the requester cancels another; look at an expired approved one. | 'Say why the request is refused.' then Refused. Cancel by the requester works; cancel by a third person without budget.approve: 'Only the person who asked, or an approver, can cancel this.' Expired approved override shows 'Ended' and is not used. Approving one already past its date: 'This override would already have ended. Ask for a new one.' A decided request: 'This request is already approved.' |
Treasury register
| Action | When | What you do | What happens |
|---|---|---|---|
| Register a post-dated cheque received | treasury.manage; type 'Cheque' active | Register an instrument > Type Cheque, number CHQ-1001, counterparty 'Al Noor Trading', face value 12,500.00, date on the cheque 60 days ahead > Register. | Code TRY-00001 (next number), Status Post dated, direction in, issued today; History shows 'registered'. Nothing is posted to the ledger. |
| Required details differ by kind | Types exist | Register a guarantee without a bank; a deposit without a bank; a cheque without a number. | 'Name the bank.' / 'Name the bank.' / 'Enter the number or reference.' Maturity before issue: 'It cannot mature before it is issued.' |
| Called, expired and cancelled need a reason | An active guarantee | Mark as called with no note; then with a note. | 'Say why it is called.' then Status Called (final). |
| Collateral is masked for viewers | Guarantee with collateral 'Cash margin 5,000'; user with treasury.view only | Open the instrument as the viewer, then as a manager. | Viewer sees 'held (details are restricted)'; manager sees 'Cash margin 5,000.00 <note>'. |
Instrument page
| Action | When | What you do | What happens |
|---|---|---|---|
| Cheque status flow | A post-dated cheque | Mark as received > deposited > returned (with note) > deposited > cleared. | Allowed moves: post_dated to received, issued, deposited, cancelled; received to deposited, cancelled, returned; deposited to cleared, returned; returned to deposited or cancelled; cleared and cancelled are final. A wrong jump: 'A cheque that is cleared can become: nothing (it is final).' Returned without a note: 'Say why it is returned.' Clearing does not post a bank entry (register only). |
| Release a bank guarantee (maker-checker, worked) | Guarantee 100,000.00 registered by user A; type needs evidence and a second person; user B has treasury.release | A opens it and tries Release; B releases with evidence 'Bank letter 889'. | A: 'Somebody other than the person who registered this instrument has to release it.' (A needs treasury.release even to see the button). B: Status Released, Released by B with the evidence line; History 'released'. Without evidence: 'Releasing needs evidence: ...'. |
| Release target for each kind | Guarantee, deposit, letter of credit, cheque | Open each and check which Release target is offered. | Guarantee -> released, deposit -> withdrawn, letter of credit -> closed; a cheque has no release. Calling release on a cheque or a final instrument: 'A cheque that is cleared cannot be released.' |
| Letter of credit drawings (worked) | Letter of credit face value 80,000.00 USD | Record a drawing of 50,000; then 40,000; then 30,000; then try Release. | After 50,000: Utilised 50,000, Balance 30,000, status Utilised. 40,000 refused: 'Only 30000.00 USD is left on this letter of credit.' 30,000 accepted: Balance 0.00. A face value edit below utilised: 'The face value cannot be less than what has been utilised.' A cheque drawing: 'Only a letter of credit is drawn on.' |
| Edit an open instrument and final instruments | An active guarantee; a released one | Change the maturity date and notes of the active one; try the released one. | Change saved and History shows 'amended' with 'maturity <old> to <new>; notes'. The released instrument: 'This instrument is released; it is no longer edited.' |
Treasury maturities
| Action | When | What you do | What happens |
|---|---|---|---|
| Cash-related versus contingent (worked) | Open: cheque 10,000 AED matures in 5 days (in); deposit 50,000 AED matures in 20 days (out); guarantee 100,000 AED in 40 days; LC face 80,000 USD drawn 50,000 in 10 days | Open Maturities, Looking ahead 30 days; then 90. | 30 days: Cash-related totals AED in 10,000.00, out 50,000.00; Contingent: LC counted at its open balance 30,000.00 USD out; the guarantee (40 days) not listed. 90 days adds the guarantee 100,000.00 AED out. Cash and contingent are never added; currencies are never added. |
| Overdue open instruments | An open cheque dated yesterday | Open Maturities and the register. | A warning '1 instrument(s) are past their maturity and still open.' The row is red with 'overdue'. Final instruments are never overdue. Due soon uses the type's Alert days (a guarantee type of 30 days flags 30 days ahead). |
Treasury instrument types
| Action | When | What you do | What happens |
|---|---|---|---|
| Add the standard types | treasury.manage; company with no types | Click Add the standard types. | Seven types: Cheque (no evidence, no second person, alert 7), Bank guarantee, Performance guarantee, Advance payment guarantee (30 days), Bid bond (14), Fixed deposit (14), Letter of credit (30), each with evidence and second person ticked except Cheque. Clicking again: 'This company already has instrument types.' |
| Edit, switch off and delete a type | A type with instruments | Change its kind; delete it; untick Active. | 'Instruments of this type exist, so its kind cannot change.'; 'Instruments of this type exist. Switch the type off instead.'; switching off works and the type disappears from the Register picker. A type without instruments deletes cleanly. |
Bank accounts
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a bank account with a ledger account | reference.manage; a postable asset account 112100 exists | New bank account > Code ENBD-AED-01, Name, Bank, Currency AED, Ledger account 112100 > Bank details: IBAN AE070331234567890123456 > Save. | Saved; list shows IBAN as 'AE07 •••• 3456', Beneficiary version 1, Active. The full IBAN is never returned by the API (only has_iban true). Re-using 112100 for another active account: '112100 already carries the bank account ENBD-AED-01.' |
| IBAN checks and beneficiary version (fraud control) | An existing account at version 1 | Enter an IBAN with a wrong check digit; then a valid new IBAN; then change only the account holder; then change only Notes. | Bad IBAN refused with the check-digit message. A new IBAN raises Beneficiary version to 2 and History shows 'iban' with the user and time; holder name change makes version 3; Notes change does not raise the version. Audit 'bank_account.beneficiary_changed'. |
| Remove a sealed bank detail | An account with IBAN on file | On the IBAN field click Remove it > Save. | IBAN cleared (has_iban false), version raised; Keep it after all undoes the removal before saving. Closing the account (Status Closed) hides it from the default list. |
Import statement
| Action | When | What you do | What happens |
|---|---|---|---|
| Import a CSV statement (worked) | journal.prepare; account 112100; profile none; CSV with columns Date,Description,Reference,Debit,Credit,Balance: 05/10/2026 'Transfer ABC Trading' credit 5,000.00; 08/10/2026 'Bank charges' debit 50.00; 12/10/2026 'CHQ 1001' debit 1,800.00; opening 10,000.00 | Choose account and file > Next > reference ENBD-2026-10, From 2026-10-01, To 2026-10-31, opening 10,000.00 > review rows > Import. | Three valid lines: +5,000.00, -50.00, -1,800.00 (dates read day-first); closing computed 13,150.00 and must equal the file balance; statement appears as Imported with 0 matched. Day-first: 03/04 is 3 April. |
| Duplicate protection | The statement above already imported | Import the same file again; then a file with 2 old and 3 new rows. | Same file: 'Every valid row in that file has been imported already.' Mixed file: old rows marked 'Seen before' and skipped, new rows imported; a duplicate warning shows on the statement. |
| Import with a profile and balance check | Profile: format csv, semicolon, date %d.%m.%Y, numbers 1.234,50, validate balance on | Import a semicolon file whose closing balance is wrong by 10.00. | 'Balance check failed, so nothing was imported: the statement opens at ...' With tolerance 10.00 the file imports. The step shows 'Read through the import profile: <name>'. |
| camt.053 and MT940 files | A camt.053 XML and an MT940 file | Import each. | Entries read with value dates and bank references; wrong content: 'That XML could not be read as a camt.053 statement.' / 'No transactions (tag 61) were found in that MT940 file.' BAI2 and OFX are not available. |
| Profile that does not match the file | A profile set to MT940 | Import a CSV file with it. | 'The import profile reads MT940 files, but this file looks like ...' |
Bank statements
| Action | When | What you do | What happens |
|---|---|---|---|
| Reconciled statements are locked | A reconciled statement | Add a line; edit; match a line. | 'This statement is already reconciled.' / 'A reconciled statement cannot be edited.' |
| Close a statement with a difference | Draft statement with an unexplained line | Close. | '1 statement line(s) are still unexplained.' With all matched but a difference: 'The ledger reconciles to <x>, and the bank says <y>. The difference is <z>.' |
Bank exceptions
| Action | When | What you do | What happens |
|---|---|---|---|
| Raise and assign an exception | bankrec.prepare | Open a line > Details > set Exception 'Timing difference', Category, Assignee, Note. | Saved; the line is listed on Exceptions and counted in the header; an assignee from another company is refused. |
Reconciliation rules
| Action | When | What you do | What happens |
|---|---|---|---|
| Company policy and rule priority (worked) | Policy: window 30, strong 80, possible 50. Rule A (account 112100, priority 10, window 7). Rule B (all accounts, priority 20, window 14) | Open Reconciliation rules; check the effective rule for account 112100 and for 112200. | 112100 uses Rule A (lower priority number wins; window 7); 112200 uses Rule B (window 14); a blank rule field inherits the company figure. Two rules with equal scope, priority and dates are refused as ambiguous. |
Bank import profiles
| Action | When | What you do | What happens |
|---|---|---|---|
| Create, edit and delete a profile | bankrec.configure | New profile with a column mapping; save; edit; delete. | Saved with auto code; a mapping without a date column is refused; only one active profile per account; delete removes it (statements already imported stay). |
Cash position
| Action | When | What you do | What happens |
|---|---|---|---|
| Cash position arithmetic (worked) | Account 112100: ledger balance 100,000.00; last reconciled statement 30 Sep; since then a receipt 8,000.00 and a payment 3,000.00 are in the books and not on any statement | Open Banking > Cash position as at today. | Pending receipts 8,000.00; pending payments 3,000.00; Bank balance (estimated) = 100,000 - 8,000 + 3,000 = 95,000.00; Available cash = 100,000 - 8,000 = 92,000.00 (money not yet cleared is not available; a payment booked is already gone). Opening balances are never pending. |
Cash forecast
| Action | When | What you do | What happens |
|---|---|---|---|
| Weekly forecast arithmetic (worked) | Available cash today 92,000.00; open customer invoice 20,000 due in week 2; supplier bill 15,000 overdue; a confirmed sales order 10,000 due in week 3; assumption payroll -85,000 in week 4 | Start today, 13 weeks, Calculate. | Overdue bill lands in week 1: week 1 closing 77,000.00; week 2 +20,000 = 97,000.00; week 3 committed +10,000 = 107,000.00; week 4 assumption -85,000 = 22,000.00. Lowest point and Weeks below zero update; actual, committed and assumption columns are never blended; items beyond the last week show as 'Due after the last week'. A bill in a payment proposal sits on the proposal's payment date. |
| Save and reopen versions | journal.prepare | Save this version for scenario Base twice; open version 1. | Versions 1 and 2 of 'Base' are listed with their closing figures; version 1 reopens exactly as it was made (immutable). Payroll, tax, projects and treasury instruments are not read automatically (only via assumptions) and the result says so. |
| Assumption checks | Forecast screen | Add an assumption with amount 0; with no description; calculate 0 weeks. | Add stays disabled without date, amount and description; API refusals as in the field list; 'A forecast covers 1 to 52 weeks.' |
Trial balance (report)
| Action | When | What you do | What happens |
|---|---|---|---|
| Trial balance totals agree (worked) | Posted journals: Dr 112100 Bank 10,000 / Cr 310000 Capital 10,000; Dr 610300 Marketing 2,000 / Cr 112100 Bank 2,000; draft entry Dr 610100 500 / Cr 112100 500 not posted | Run Trial Balance for this fiscal year, Entries Posted only; then Posted and draft. | Posted only: 112100 closing debit 8,000.00; 310000 closing credit 10,000.00; 610300 closing debit 2,000.00; total debit 10,000.00 = total credit 10,000.00. Posted and draft: 610100 shows 500.00 and the result is marked provisional; 112100 8,000 - 500 = 7,500.00. |
Financial statements
| Action | When | What you do | What happens |
|---|---|---|---|
| Profit and loss and balance sheet agree (worked) | Same data as above plus a sale posted: Dr 120100 Receivables 5,250 / Cr 410100 Sales 5,000 / Cr 220100 VAT output 250 | Run Profit & Loss and Balance Sheet for the year. | P&L: Revenue 5,000.00, Expenses 2,000.00, Net profit 3,000.00. Balance sheet: Assets 8,000.00 (bank) + 5,250.00 (receivables) = 13,250.00; Liabilities 250.00; Equity capital 10,000.00 + current year profit 3,000.00 = 13,000.00; liabilities + equity 13,250.00 = assets (balanced). |
| Comparison column | Prior year has data | Run P&L with Compare with Previous fiscal year. | A Comparison column appears with last year's amounts for the same rows. |
Report runner
| Action | When | What you do | What happens |
|---|---|---|---|
| Drill down adds up to the clicked figure | Trial balance run for Q1 | Click the 112100 row. | The General Ledger opens with the same period and filters narrowed to account 112100; its debits and credits equal the Period debit and credit of the row. A report with no drill-down: '<title> rows do not open into anything.' |
| Saved views | report.view | Set Period This quarter, Entries Posted and draft; Save this view as 'Q posted+draft' visibility Everyone; reload; pick it. | The filters come back exactly; a second user sees it when it is shared; Only me stays private; Company default loads for everyone. |
| Export totals equal the screen | report.export; Trial Balance run | Export as CSV, XLSX and PDF. | Same rows and totals as the screen; the file has a header with company, filters and user; PDF is archived with a SHA-256 shown in the response header; no export right gives 403; PDF without doc.print gives 403. |
| Filter validation | Report runner | Call a report with an account from another company, a start after the end, an unknown dimension. | 'An account in the filter is not in this company.'; 'The start date cannot come after the end date.'; 'Unknown dimension <code>.' |
Tax reports
| Action | When | What you do | What happens |
|---|---|---|---|
| VAT return summary (worked journal) | Sale invoice 10,000.00 net with tax SR 5% (tax 500.00); zero-rated export 4,000.00 (ZR); exempt sale 1,000.00 (EX); purchase 6,000.00 net with SR (input tax 300.00, recoverable 100%) | Run Tax Return Summary for the month. | Output side: SR net 10,000.00 tax 500.00; ZR net 4,000.00 tax 0.00 (its own line); EX net 1,000.00 tax 0.00 (its own line). Input side: SR net 6,000.00 tax 300.00 recoverable 300.00. Net VAT payable 500.00 - 300.00 = 200.00. Posting for the sale: Dr 120100 Receivables 10,500.00 / Cr 410100 Sales 10,000.00 / Cr 220100 VAT output 500.00. |
| Partly recoverable tax and reverse charge (worked journal) | Tax code with recovery 50%; reverse charge purchase of a foreign service 2,000.00 net at 5% | Post a bill with the 50% code on 1,000.00 net (tax 50.00); post the reverse charge bill; run Tax Detail and Reverse Charge. | 50% code: Dr 610300 Expense 1,025.00 (1,000 + 25 irrecoverable tax) / Dr 140100 VAT input 25.00 / Cr 210100 Payables 1,050.00. Reverse charge: tax 100.00 is accounted on both sides (Dr VAT input 100.00 / Cr VAT output 100.00) so it nets to nothing in the return; the Reverse Charge report lists the bill with net 2,000.00 tax 100.00. Detail shows partner tax registration. |
Management P&L by dimension
| Action | When | What you do | What happens |
|---|---|---|---|
| Unallocated lines are shown | Expense 3,000 posted to department Sales and 1,000 with no department | Run Department P&L. | Sales expense 3,000.00 and a 'Not set' row of 1,000.00; total equals the P&L expense of 4,000.00. |
Ledgers and books
| Action | When | What you do | What happens |
|---|---|---|---|
| General ledger running balance (worked) | Account 112100: opening 1,000.00; movements +500, -200 in the period | Run General Ledger for account 112100. | Running balance 1,000.00, then 1,500.00, then 1,300.00; paged output keeps the running balance across pages; totals row equals the trial balance period figures. |
Accounting settings
| Action | When | What you do | What happens |
|---|---|---|---|
| Change the fiscal year start month | period.lock | Edit > Year starts in April > Save; then run a report with 'This fiscal year'. | Saved and audited ('policy.fiscal_year_start'); This fiscal year now runs 1 April to 31 March; no posting changes. A user without period.lock gets 403. |
| Lock date only moves forward | Lock currently 2026-08-31 | Move the lock to 2026-09-30; then to 2026-07-31. | First saved, audited 'period.locked'; second refused: 'A lock date cannot be moved backwards through this action.' Postings dated on or before the lock are refused. |
Taxes
| Action | When | What you do | What happens |
|---|---|---|---|
| Install the UAE tax pack | reference.manage | Install a country's taxes > AE. | Codes created with effective-dated rates from 2018-01-01: SR 5%, ZR 0%, EX 0%, OS 0%, RC 5% (reverse charge, purchase), IM 5% (import, purchase) and others in the pack. Installing again adds nothing twice. 'IN' is refused: 'There is no tax pack for IN.' Packs: AE, SA, BH, OM, QA, KW only. |
Tax code record
| Action | When | What you do | What happens |
|---|---|---|---|
| Rate windows over time (worked) | Code SA-VAT with 5% from 2018-01-01 to 2020-06-30 (closed window) and another code VAT-X with 5% from 2018-01-01 open-ended | On VAT-X add a rate 15% from 2020-07-01. On SA-VAT add 15% from 2020-07-01 with no end. | VAT-X: refused 'VAT-X already has a rate covering 2020-07-01. Close the existing window first.'. SA-VAT: accepted. An invoice dated 2020-06-15 prices at 5%, dated 2020-07-15 at 15%. A date with no window: '<code> has no rate for <date>. Add one before using it; ...' |
| Tax line posting (worked journal) | Sales invoice, one line 1,000.00, tax SR 5%, customer in Dubai | Post the invoice. | Dr 120100 Receivables 1,050.00 / Cr 410100 Sales 1,000.00 / Cr 220100 VAT output 50.00. A purchase bill of 1,000.00 with SR: Dr 610300 Expense 1,000.00 / Dr 140100 VAT input 50.00 / Cr 210100 Payables 1,050.00. |
Fiscal positions
| Action | When | What you do | What happens |
|---|---|---|---|
| Export position removes or zero-rates the tax (worked) | Position EXPORT: tax SR -> ZR; position FREEZONE: SR -> Nothing at all; customer assigned each in turn | Create a sales invoice 2,000.00 with SR for each customer; use 'explain' on the customer. | EXPORT: tax 0.00 shown on its own zero-rated line of the return (net 2,000.00). FREEZONE: no tax and the line does not appear on the return at all. Receivable 2,000.00 in both. Without a position: 2,100.00 with 100.00 VAT. |
| Automatic position and account substitution | Position auto-apply, country AE, registered only; account rule 410100 -> 410300 | Create a customer in AE with a tax registration, then one without; invoice both. | Customer with registration gets the position automatically; without does not; a position naming the country beats a generic one (then lower sequence, then code). Sales post to 410300 instead of 410100 where mapped. |
| Save validation | reference.manage | Add two rules for SR; a rule SR->SR; a duplicate code. | The three refusals quoted in the field list; 201 rules: 'Up to 200 tax substitutions.' |
Dimension values
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a hierarchy and close a value | reference.manage | Create DUBAI (branch) and MARINA rolling up to DUBAI; set Closed after 2026-06-30; post on 2026-07-15 with MARINA. | Hierarchy shown on 'Rolls up'; the posting is refused: 'MARINA is not available for a posting dated 2026-07-15.' Reopen makes it available again. |
Account structure rules
| Action | When | What you do | What happens |
|---|---|---|---|
| Required dimension on expense accounts | Rule: cost centre required for class expense | Post Dr 610300 100 with no cost centre; then with one. | Refused: '610300 <name> needs a cost centre. ...' then accepted. A prohibited rule refuses a line that carries the dimension. Nothing is seeded: a new rule starts refusing postings that used to pass. |
Valid combinations
| Action | When | What you do | What happens |
|---|---|---|---|
| Only and never rules (worked) | Rule A: when project is Marina then branch must be Dubai (only). Rule B: when department is Sales then cost centre must not be Workshop (never) | Post a line with Marina and Abu Dhabi; Sales and Workshop; Marina and Dubai. | First refused naming the rule: 'project Marina: it takes branch Dubai. (Marina is a Dubai project)'; second refused by rule B; third accepted. A rule judges only lines carrying both dimensions. Try a combination reports the same without posting. |
Distribution models
| Action | When | What you do | What happens |
|---|---|---|---|
| Share a line across departments (worked journal) | Model 'Office rent': department Sales 60 / Admin 40 | Post a rent line of 10,000.00 using the model. | One ledger line per share: Dr 610200 Rent 6,000.00 (Sales) + Dr 610200 Rent 4,000.00 (Admin) / Cr 210100 Payables 10,000.00. With two split dimensions the shares multiply (60/40 x 50/50 gives four lines 30/30/20/20). Odd cents go to the largest remainders: 100.00 over 3 x 33.3333% gives 33.34 / 33.33 / 33.33. |
| Model suggestion and matching | Two models match account 610300: order 10 and order 20 | Post a line to 610300 asking for a suggestion. | The lower order number wins; a model limited to a partner or class matches only those. |
Finance Features
| Action | When | What you do | What happens |
|---|---|---|---|
| Turn Budgets off and on | apps.configure and a second approver with apps.config.approve | Propose Budgets off with a reason; the same user approves; the second user approves; try to create a budget; reads; turn it on again. | Self-approval refused: 'Somebody other than the person who proposed it must review a configuration change.' After approval the Planning > Budgets menus disappear, creating a budget is refused with 'Budgets and budget control is disabled for this company.' (409, capability_disabled), existing budgets stay readable. |
| Protected controls and stale proposals | Proposal open | Try to switch off Journals; approve an old proposal after another was approved. | 'A protected control cannot be turned off.' / 'Another revision was approved since this was proposed. Propose it again against the current configuration.' A rejection needs a note: 'Say why the change is rejected.' |
Finance Fields
| Action | When | What you do | What happens |
|---|---|---|---|
| Make the payment reference required | A company with the switch finance.payment.reference set to Required | Record a bank payment with no reference; then a cheque with a number. | 'Payment reference is required by this company.' (422) for the first; cheque accepted. A cheque needs its number whatever the switch says. |
| Hide treasury notes and credit override evidence | treasury.notes Hidden; credit_override.evidence Hidden | Register an instrument with notes; request a credit override with evidence. | 'Treasury instrument notes is turned off for this company.' (400) and 'Credit override evidence is turned off for this company.' A field set read-only refuses edits: '<field> cannot be changed in this company.' |