Actions and results

What each Payroll button and automatic behaviour does, with worked numbers and what the system refuses.

On this page (19)

Payroll runs

ActionWhenWhat you doWhat happens
List and the 'Not implemented' bannerOpen Payroll > Payroll runsList loads with paging; banner text present. Note what it says about WPS / gratuity
Create a regular runApproved package DEMO-AE in force; pay group MONTHLY active; period 2026-09 (1-30 Sep)New run; Period MONTHLY 2026-09; Type Regular; CreateRun PR-MONTHLY-2026-09-01 opens in Draft; history 'payroll.run.create'
Second regular run for the same period refusedThe run above not cancelledNew run for the same period, RegularRefused with 'Period 2026-09 already has the regular run ...'. An Off-cycle run for the same period IS allowed (number ...-02)

Payroll run record

ActionWhenWhat you doWhat happens
Freeze inputsDraft run; 3 employees with contracts, bank accountsFreeze inputsState Frozen; one snapshot per person; input snapshot hash on Traceability; approved manual inputs for the period are taken by this run; freeze exceptions listed
Freeze refuses without an approved packageGroup whose package code has only a draft versionFreeze inputsRefused 'No approved rule package <code> is in force on <date>. Approve one under Configuration.'; run stays Draft
Freeze exceptions are raised, never silentEmployee B has no contract; employee C has no bank account; D's IBAN fails its checksumFreeze; open ExceptionsB: block 'No contract covers this pay period, so no payslip can be calculated.'; C: warn 'No active bank account is on file...'; D: 'The IBAN on file fails its checksum.' Nobody is skipped without a row
Calculate - full month (DEMO package arithmetic)Employee A: BASIC 10,000, HOUSING 4,000, TRANSPORT 1,000; full month; no overtimeCalculate; open A's payslipGross 15,000.00; DEMO_DEDUCTION 2% of gross = 300.00 (cap 500); Net 14,700.00; DEMO_EMPLOYER 3% = 450.00 shown separately (not in net). Each line has 'How it was calculated' steps incl. rounding (half-up, 2 places)
Calculate - joiner proration (calendar basis)Employee E joins 16 Sep 2026; same contract amounts; package day basis = calendarFreeze and calculateProration 15 / 30 days = 0.5: BASIC 5,000, HOUSING 2,000, TRANSPORT 500; gross 7,500.00; deduction 150.00; net 7,350.00; proration line on the payslip
Calculate - unpaid leaveEmployee F has 3 approved unpaid leave days in Sep (HR leave); full month otherwiseFreeze and calculatePaid days 27 / 30 = 0.9: gross 13,500.00 (prorated elements only); deduction 270.00; net 13,230.00. Hourly unpaid leave is NOT deducted
Calculate - fixed day basisA draft package version with day basis Fixed 30 days; joiner on 31 Jan in a 31-day monthCalculateEmployed 1 day, basis 30 -> factor 1/30 = 0.03333333; a full month is never above factor 1
Calculate - approved overtimeEmployee A has 10 approved overtime hours in Sep (attendance); BASIC is the overtime-eligible componentFreeze and calculateOVERTIME = 10,000 / 240 h = 41.666667 per hour x 10 x 1.5 = 625.00; gross 15,625.00; DEMO_DEDUCTION 312.50; net 15,312.50. Unapproved hours give warn 'N overtime hours are not approved and were left out.'
Calculate - manual input and loan instalmentApproved BONUS 1,500 input for A; an ESS loan with instalment 1,000 and 600 outstandingFreeze and calculateBONUS 1,500.00 earning (source input); LOAN_RECOVERY 600.00 (limited to what is outstanding); 2% deduction is on gross incl. the bonus; after posting the loan shows repaid and Settled
Pending input is excluded with a reasonA BONUS input still PendingFreezeException 'Input <id> (BONUS 1500) is excluded: input is pending, not approved.'; not paid
Mid-period pay changeHR pay change approved: salary 10,000 to 15 Sep, 12,000 from 16 SepFreeze and calculateBASIC is a day-weighted average: (10,000 x 15 + 12,000 x 15) / 30 = 11,000.00; review exception 'mid_period_pay_change' must be acknowledged
Negative net blocks the payslipA one-off PENALTY input larger than grossCalculateBlock 'Deductions exceed gross pay; approved negative-net handling is not configured, so no payslip is produced.'
Currency mismatchEmployee's contract in USD, group in AED (named member)FreezeBlock 'The contract is in USD but the pay group pays in AED; no conversion is applied.'
Variance against the prior posted runAugust run posted; package variance limit 10%; A's net goes from 14,700 to 16,500Calculate SeptemberReview exception 'Net pay moved 12.24% against PR-...-08-01 (14700.00 to 16500.00); the limit is 10%.'; a new person gives 'was not paid in ...'; a missing one 'was paid in ... but has no payslip in this run.'
Acknowledge an exceptionCalculated run with open review exceptionsAs an approver press Acknowledge, give a reasonStatus Acknowledged with the note; Approve button enables only when none is open
RecalculateCalculated runRecalculatePayslips rebuilt from the same snapshots; calculation exceptions renewed; freeze exceptions kept; new fingerprint
Back to draftFrozen or calculated runMenu > Back to draftState Draft; snapshots and payslips cleared; manual inputs released for the next freeze
Cancel runDraft / frozen / calculated runMenu > Cancel runState Cancelled; a new regular run for the period is now allowed; an approved or posted run cannot be cancelled ('A posted run cannot be cancelled. Raise a correction run.')
Approve (second person)Run calculated by user P; all exceptions acknowledgedSign in as approver A; ApproveState Approved; approved fingerprint equals run fingerprint; history shows A
Approve refused while exceptions are openOne open exceptionApprove (via API if the button is disabled)Refused '1 exception(s) are still open. Acknowledge each one with a reason, or fix the cause and calculate again.'
Post to accountingApproved run (DEMO package)As payroll finance: Post to accounting; open the journalONE balanced journal dated the period end, memo '[DEMO RULES] Payroll PR-... 2026-09'. Example A only: Dr 5210 15,000; Cr 2210 300; Dr 5220 450 / Cr 2220 450; Cr 2200 (net pay account) 14,700. Posting again returns the same journal
Publish payslipsPosted runPublish payslipsAll payslips Published; the employee sees them in ESS > Payroll (only now); publishing twice changes nothing
Raise payment instructionsPosted run; A and E have valid IBANs; C has noneRaise payment instructionsOne instruction per payslip with net > 0 (PI-<payslip>-1, value date = pay date); C skipped with exception 'No instruction for ...: no bank account on file.'; raising again creates no duplicates
Prepare generic payment filePending instructionsPrepare payment fileFile PF-<run>-01, GENERIC-CSV-1: header H (count, total), one D row per instruction (IBAN, amount 2 dp), trailer T (count, total); SHA-256 stored; instructions In file
Bank change invalidates an instructionInstruction raised; then the employee's bank account changed in ESS/HRPrepare payment fileThat instruction becomes Invalidated 'bank details changed after the instruction was raised' and is not in the file
Prepare WPS file (SIF)Posted run in AED; each employee has a labour card number in HR identifiersPrepare WPS file; MOHRE 13 digits, agent routing 9 digits, bank routing linesFile named <MOHRE><yyMMddHHmmss>.SIF: one EDR per employee (14-digit person code, routing, IBAN, period start/end, days, fixed pay, variable 0.00, leave days 0) and one SCR (count, total AED)
Close the runPosted, published, every instruction acceptedCloseState Paid / Closed. Before that: 'The run cannot close: payslips are not published; 2 payment instruction(s) are not accepted by the bank.'
Correction runPosted run; A should have had 250 more BONUSCorrection run: A's payslip, BONUS, 250, reasonNew run ...-02 type Correction, already Calculated, one delta payslip of 250; the original run, payslips and journal unchanged; goes through approve and post as usual

Payslips

ActionWhenWhat you doWhat happens
Payslip recordCalculated payslipOpen a payslipLines with trace steps; proration 'paid days / basis = factor'; bank shown masked (e.g. AE07••••1234); opening is audited

Manual inputs

ActionWhenWhat you doWhat happens
Enter and approve an inputUsers P (prepare) and A (approve)P: New input BONUS 1,500 for A, period 2026-09; A: ApprovePending then Approved; P cannot approve their own; Reject sets Rejected and the input never reaches a run
Newer source version supersedesInput with source REF-1 v1 pending(API) create REF-1 v2v2 Pending; v1 becomes Superseded with note 'Superseded by version 2.'

Adjustments

ActionWhenWhat you doWhat happens
HR adjustment to a frozen periodSeptember run frozen; HR then approves 2 more unpaid leave days for A in SeptemberOpen Adjustments; freeze the October runAdjustment Queued with Effect on pay -(15,000 / 30 x 2) = -1,000.00 (RETRO_DEDUCTION); October run takes it (In a run), payslip line source 'adjustment', review exception 'Supplemental adjustment for period 2026-09: ... Review before approving.' Original September run untouched
Adjustment that cannot be pricedPackage without RETRO_PAY / RETRO_DEDUCTION, or no September snapshotFreeze the next runAdjustment shows 'Cannot price'; the employee is held back with a blocking exception until it is fixed or voided
Void an adjustmentQueued adjustment; user with payroll.approveVoid with a reason of 5+ charactersStatus Void with the reason; it is never paid

Eligibility

ActionWhenWhat you doWhat happens
Check eligibilityHR activated 3 employees; one has no bank, one invalid IBANCheck eligibilityEligible / Blocked rows with reasons: not activated, has left, no active contract, no bank account, invalid IBAN, no pay group, ambiguous pay group. A replayed HR event changes nothing

Final settlements

ActionWhenWhat you doWhat happens
Settlement is created from an HR terminationHR completes a termination of employee L (resignation, last day 15 Oct 2026)Wait a minute (HR scheduler) or press Check for terminationsExactly one Draft settlement PST-... for that termination; pressing again creates no second one

Settlement record

ActionWhenWhat you doWhat happens
Calculate a settlement (DEMO policy)L: BASIC 10,000, HOUSING 4,000, TRANSPORT 1,000; joined 1 Oct 2023; 10 leave days due; last paid period SeptemberCalculateUnpaid salary 1-15 Oct by the package proration (15/31 x 15,000 = 7,258.06); leave 10 x 0.5 x (15,000 / 30) = 2,500.00; end of service 3 completed years x 3 x (10,000 / 30) = 3,000.00 (DEMO values); every line has steps
UAE gratuity readingA policy whose end_of_service component uses quantity source 'ae_gratuity_days' (API) and a per-day rule basic / 30Calculate for service of 2,738 days (7 years 6 months), BASIC 10,000Gratuity days = 5 x 21 + 2.5014 x 30 = 180.04; amount = 180.04 x 10,000 / 30 = 60,013.70. Under 365 days = 0; never above 720 days (2 years' wage); unpaid absence days are not service
Not configured componentPolicy names notice_pay but the package has no rule for NOTICE_PAYCalculateLine 'Not configured - specialist rule required' (no guessed or zero figure); it must be acknowledged at sign-off
Recoveries and nettingHR marked a loan of 3,000 (1,000 repaid) and a laptop worth 1,500 'recover from final pay'; cap 50%CalculateLoan 2,000 and asset 1,500 netted in priority order within 50% of the settlement after statutory deductions; any rest shown as Unrecovered (pursue outside payroll) and a finding
Send for review and sign offCalculated, no blocking findings; specialist SPreparer: Send for review; S: Sign off with notesState In review then Reviewed; preparer cannot sign off ('A settlement is reviewed by a specialist other than the person who prepared or sent it.')
Return to preparerIn reviewS: Return to preparer with a reasonBack to Calculated; sign-off cleared; reason shown 'Last sent back by the specialist'
Approve creates the final runReviewed; approver A (not preparer, not specialist)ApproveState Approved; final run (type Final settlement, one payslip) created and linked; smart button Final run opens it
Post, pay, file, closeApproved settlementFinance: Post; payer (4th person, pay_prepare): Raise payment; prepare file; finance: release; bank acceptedPosted (one journal), instruction raised, file released, settlement Paid when the bank accepts; Close -> Closed
Dispute hold blocksHR places a dispute hold on LTry Approve, Raise payment, Prepare file, ReleaseEach refused with the hold text; banner 'Approval and payment are blocked until every hold is released in HR.'
No double pay with a regular runSettlement approved for October (final run covers 1-15 Oct)Freeze the October regular runL gets blocking 'Period 2026-10 is already paid by the final settlement PST-... (...); paying it here as well would pay the same days twice.'
Cancel and reopenCalculated settlementCancel with reason; then ReopenCancelled; Reopen -> Draft. After approval: 'A settlement that reached a run cannot be reopened.'
Print statementCalculated settlementPrint statementBilingual statement: termination, service, unpaid periods, earnings, deductions, recoveries, totals, not-configured notes, approvals, DEMO banner if demo

Payment files

ActionWhenWhat you doWhat happens
Release a file (second person)File prepared by PFinance F: Release to bankState Released; P could not release it; a changed bank account withdraws the file 'The file was withdrawn: bank details changed before release.'
Record the bank's answerReleased fileBank accepted all (or Bank rejected all)File and instructions Accepted (or Rejected); partial answers via API give Partial; an accepted instruction cannot be reversed
Repair a rejected instructionRejected instruction; employee bank correctedRepairNew instruction PI-...-2 'A new instruction was raised; payroll was not rerun.'; payslip, journal and net unchanged
Cancel a prepared file; downloadPrepared fileDownload file; then Cancel fileDownloaded bytes match the SHA-256 shown; after cancel the instructions return to Pending; a released file cannot be cancelled

End-of-service provisions

ActionWhenWhat you doWhat happens
Propose a monthly provisionEmployees: X joined 1 Apr 2019 (BASIC 10,000), Y joined 1 Jan 2026; accounts 620200 / 240200 existMonth end 2026-09-30; Work out the provisionX: service days counted to 30 Sep; gratuity days by the 21/30 rule; provision = days x 10,000 / 30. Y: under one year -> 0.00. Charge = provision - last posted. Disclaimer about specialist approval shown
Post by a second personProposed run by PP tries Post; finance F postsP refused 'A provision is posted by somebody other than whoever proposed it.'; F posts: journal Dr 620200 / Cr 240200 for the charge
Leaver's provision released and roll-forwardOctober: X has leftPropose and post October; open roll-forward Jan-OctX: provision 0.00, charge = minus the previous ('left: provision released'); roll-forward opening + charges = closing and agrees with ledger 240200

Payroll register

ActionWhenWhat you doWhat happens
Register reconcilesPosted runsOpen Payroll register; filter one runBanner Gross - Deductions = Net (reconciles); Employer cost separate; totals follow the filter

Variance and exceptions / Payment status

ActionWhenWhat you doWhat happens
ReportsRuns with exceptions and instructionsOpen both reports; filter by run and statusRows and counts match the run records

Rule packages

ActionWhenWhat you doWhat happens
Install the DEMO packageNo DEMO-AE yetInstall DEMO packageDraft DEMO-AE v1 with 17 elements (BASIC, HOUSING, TRANSPORT, OVERTIME, BONUS, RETRO_PAY, RETRO_DEDUCTION, LOAN_RECOVERY, ...) and 5 rules; draft DEMO-SETTLE policy; accounts 2200/2210/2220/5210/5220 created; red DEMO chip
Create a packageNew package: code AE-STD, name, effective 2026-10-01, legal source, net pay account 2200, basis Calendar; Create draftDraft v1 opens; 'Before it can be approved:' lists 'Add at least one pay element.'

Rule package record

ActionWhenWhat you doWhat happens
Add elements and rulesDraft packageAdd element BASIC (earning, 5210, prorate); Add rule DEDUCT percent of gross 5 (needs element DEDUCT first)Rule refused until the element exists ('Add the pay element to the package first.'); then listed with parameters
Validation before approvalDraft with an element lacking an account and a floor above capLook at 'Before it can be approved'; try ApproveEvery problem listed; Approve refused 'The package cannot be approved yet.' with the list
Approve (second person) freezes the packageValid draft authored by PRules approver A: Approve package; then try Add elementApproved, content hash shown; Add element/rule hidden; API refused 'An approved package is immutable. Create a new version to change it.'
New versionApproved v1 (no end date)New versionDraft v2 copy of v1 (elements and rules), effective from today if v1 has no end date, otherwise day after v1's end
Overlapping versions refusedApproved v1 open-ended; draft v2 from todayApprove v2Refused 'Version 1 is still in force over these dates. Close its end date first.'; after closing v1 (API close-window, rules_approve) v2 can be approved
Rule order and cap/floor in a runPackage: OVERTIME 10, DEMO_DEDUCTION 20 (2% of gross, cap 500)Gross 30,000 in a run2% = 600 -> capped at 500.00 with step 'capped at 500'
RoundingDraft version with rounding 'down', 0 placesCalculate a run with BASIC 10,000 and 1/3 proration3,333.33... -> 3,333 (down, 0 places); the unrounded value kept beside the rounded one
Changed package is caught(DB) edit an approved package's rule amountFreeze or calculate a runRefused 'Rule package DEMO-AE v1 no longer matches the content that was approved. It will not be used.' / 'The rule package used to freeze this run has changed.'

Pay elements

ActionWhenWhat you doWhat happens
Elements listTwo package versionsOpen Pay elements; group by PackageEach element shows its package version and status

Pay groups

ActionWhenWhat you doWhat happens
Create a groupNew group MONTHLY, AED, package DEMO-AEListed with frequency monthly and 0 named members
Named members limit the runGroup with 2 named members (API)Freeze a runOnly those 2 are in the run (even if their contract currency differs - then a currency block)

Pay periods

ActionWhenWhat you doWhat happens
Create periodsGroup MONTHLYNew period 1-30 Sep, cutoff 25 Sep, pay 28 Sep; then 1-31 OctCodes 2026-09 and 2026-10; an overlapping one refused; runs list shows Cutoff and 'passed' after 25 Sep while Draft

Settlement policies

ActionWhenWhat you doWhat happens
Create and approve a policyUsers P (configure) and A (rules_approve)P: New policy AE-SETTLE, package DEMO-AE, categories Resignation + End of contract, components unpaid_salary, leave_encashment (LEAVE_ENCASHMENT), end_of_service (END_OF_SERVICE, 365 min); A approvesDraft then Approved and immutable; P cannot approve ('...somebody other than its author.')
New version supersedesApproved AE-SETTLE v1 from 1 JanNew version; effective 1 Nov; approvev2 Approved; v1 Superseded and ends 31 Oct automatically
Category overlap between two codesApproved policy X covers ResignationApprove policy Y also covering Resignation over the same datesRefused 'Policy X v1 already covers resignation over these dates. Two policies for one category cannot overlap.'

Payroll app configuration

ActionWhenWhat you doWhat happens
Turn off Pay adjustmentsAdmin A proposes, admin B approvesFeatures: Pay adjustments off; propose; approveMenu Pay inputs > Adjustments gone; Void refused 'capability_disabled'; existing rows readable
Turn off Payment instructions and bank filesAs aboveTurn off; open a posted runPayment files menu gone; raising instructions / preparing / releasing files refused; files list still readable
Field rulesSet Input cutoff date = Required; New period without cutoff. Set Pay input source reference = Hidden; New input with a referencePeriod refused without cutoff; input refused when a reference is sent; field hidden on the dialog