Actions and results
What each Payroll button and automatic behaviour does, with worked numbers and what the system refuses.
On this page (19)
Payroll runsPayroll run recordPayslipsManual inputsAdjustmentsEligibilityFinal settlementsSettlement recordPayment filesEnd-of-service provisionsPayroll registerVariance and exceptions / Payment statusRule packagesRule package recordPay elementsPay groupsPay periodsSettlement policiesPayroll app configuration
Payroll runs
| Action | When | What you do | What happens |
|---|---|---|---|
| List and the 'Not implemented' banner | Open Payroll > Payroll runs | List loads with paging; banner text present. Note what it says about WPS / gratuity | |
| Create a regular run | Approved package DEMO-AE in force; pay group MONTHLY active; period 2026-09 (1-30 Sep) | New run; Period MONTHLY 2026-09; Type Regular; Create | Run PR-MONTHLY-2026-09-01 opens in Draft; history 'payroll.run.create' |
| Second regular run for the same period refused | The run above not cancelled | New run for the same period, Regular | Refused with 'Period 2026-09 already has the regular run ...'. An Off-cycle run for the same period IS allowed (number ...-02) |
Payroll run record
| Action | When | What you do | What happens |
|---|---|---|---|
| Freeze inputs | Draft run; 3 employees with contracts, bank accounts | Freeze inputs | State 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 package | Group whose package code has only a draft version | Freeze inputs | Refused 'No approved rule package <code> is in force on <date>. Approve one under Configuration.'; run stays Draft |
| Freeze exceptions are raised, never silent | Employee B has no contract; employee C has no bank account; D's IBAN fails its checksum | Freeze; open Exceptions | B: 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 overtime | Calculate; open A's payslip | Gross 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 = calendar | Freeze and calculate | Proration 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 leave | Employee F has 3 approved unpaid leave days in Sep (HR leave); full month otherwise | Freeze and calculate | Paid 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 basis | A draft package version with day basis Fixed 30 days; joiner on 31 Jan in a 31-day month | Calculate | Employed 1 day, basis 30 -> factor 1/30 = 0.03333333; a full month is never above factor 1 |
| Calculate - approved overtime | Employee A has 10 approved overtime hours in Sep (attendance); BASIC is the overtime-eligible component | Freeze and calculate | OVERTIME = 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 instalment | Approved BONUS 1,500 input for A; an ESS loan with instalment 1,000 and 600 outstanding | Freeze and calculate | BONUS 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 reason | A BONUS input still Pending | Freeze | Exception 'Input <id> (BONUS 1500) is excluded: input is pending, not approved.'; not paid |
| Mid-period pay change | HR pay change approved: salary 10,000 to 15 Sep, 12,000 from 16 Sep | Freeze and calculate | BASIC 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 payslip | A one-off PENALTY input larger than gross | Calculate | Block 'Deductions exceed gross pay; approved negative-net handling is not configured, so no payslip is produced.' |
| Currency mismatch | Employee's contract in USD, group in AED (named member) | Freeze | Block 'The contract is in USD but the pay group pays in AED; no conversion is applied.' |
| Variance against the prior posted run | August run posted; package variance limit 10%; A's net goes from 14,700 to 16,500 | Calculate September | Review 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 exception | Calculated run with open review exceptions | As an approver press Acknowledge, give a reason | Status Acknowledged with the note; Approve button enables only when none is open |
| Recalculate | Calculated run | Recalculate | Payslips rebuilt from the same snapshots; calculation exceptions renewed; freeze exceptions kept; new fingerprint |
| Back to draft | Frozen or calculated run | Menu > Back to draft | State Draft; snapshots and payslips cleared; manual inputs released for the next freeze |
| Cancel run | Draft / frozen / calculated run | Menu > Cancel run | State 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 acknowledged | Sign in as approver A; Approve | State Approved; approved fingerprint equals run fingerprint; history shows A |
| Approve refused while exceptions are open | One open exception | Approve (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 accounting | Approved run (DEMO package) | As payroll finance: Post to accounting; open the journal | ONE 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 payslips | Posted run | Publish payslips | All payslips Published; the employee sees them in ESS > Payroll (only now); publishing twice changes nothing |
| Raise payment instructions | Posted run; A and E have valid IBANs; C has none | Raise payment instructions | One 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 file | Pending instructions | Prepare payment file | File 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 instruction | Instruction raised; then the employee's bank account changed in ESS/HR | Prepare payment file | That 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 identifiers | Prepare WPS file; MOHRE 13 digits, agent routing 9 digits, bank routing lines | File 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 run | Posted, published, every instruction accepted | Close | State Paid / Closed. Before that: 'The run cannot close: payslips are not published; 2 payment instruction(s) are not accepted by the bank.' |
| Correction run | Posted run; A should have had 250 more BONUS | Correction run: A's payslip, BONUS, 250, reason | New 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
| Action | When | What you do | What happens |
|---|---|---|---|
| Payslip record | Calculated payslip | Open a payslip | Lines with trace steps; proration 'paid days / basis = factor'; bank shown masked (e.g. AE07••••1234); opening is audited |
Manual inputs
| Action | When | What you do | What happens |
|---|---|---|---|
| Enter and approve an input | Users P (prepare) and A (approve) | P: New input BONUS 1,500 for A, period 2026-09; A: Approve | Pending then Approved; P cannot approve their own; Reject sets Rejected and the input never reaches a run |
| Newer source version supersedes | Input with source REF-1 v1 pending | (API) create REF-1 v2 | v2 Pending; v1 becomes Superseded with note 'Superseded by version 2.' |
Adjustments
| Action | When | What you do | What happens |
|---|---|---|---|
| HR adjustment to a frozen period | September run frozen; HR then approves 2 more unpaid leave days for A in September | Open Adjustments; freeze the October run | Adjustment 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 priced | Package without RETRO_PAY / RETRO_DEDUCTION, or no September snapshot | Freeze the next run | Adjustment shows 'Cannot price'; the employee is held back with a blocking exception until it is fixed or voided |
| Void an adjustment | Queued adjustment; user with payroll.approve | Void with a reason of 5+ characters | Status Void with the reason; it is never paid |
Eligibility
| Action | When | What you do | What happens |
|---|---|---|---|
| Check eligibility | HR activated 3 employees; one has no bank, one invalid IBAN | Check eligibility | Eligible / 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
| Action | When | What you do | What happens |
|---|---|---|---|
| Settlement is created from an HR termination | HR completes a termination of employee L (resignation, last day 15 Oct 2026) | Wait a minute (HR scheduler) or press Check for terminations | Exactly one Draft settlement PST-... for that termination; pressing again creates no second one |
Settlement record
| Action | When | What you do | What 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 September | Calculate | Unpaid 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 reading | A policy whose end_of_service component uses quantity source 'ae_gratuity_days' (API) and a per-day rule basic / 30 | Calculate for service of 2,738 days (7 years 6 months), BASIC 10,000 | Gratuity 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 component | Policy names notice_pay but the package has no rule for NOTICE_PAY | Calculate | Line 'Not configured - specialist rule required' (no guessed or zero figure); it must be acknowledged at sign-off |
| Recoveries and netting | HR marked a loan of 3,000 (1,000 repaid) and a laptop worth 1,500 'recover from final pay'; cap 50% | Calculate | Loan 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 off | Calculated, no blocking findings; specialist S | Preparer: Send for review; S: Sign off with notes | State 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 preparer | In review | S: Return to preparer with a reason | Back to Calculated; sign-off cleared; reason shown 'Last sent back by the specialist' |
| Approve creates the final run | Reviewed; approver A (not preparer, not specialist) | Approve | State Approved; final run (type Final settlement, one payslip) created and linked; smart button Final run opens it |
| Post, pay, file, close | Approved settlement | Finance: Post; payer (4th person, pay_prepare): Raise payment; prepare file; finance: release; bank accepted | Posted (one journal), instruction raised, file released, settlement Paid when the bank accepts; Close -> Closed |
| Dispute hold blocks | HR places a dispute hold on L | Try Approve, Raise payment, Prepare file, Release | Each refused with the hold text; banner 'Approval and payment are blocked until every hold is released in HR.' |
| No double pay with a regular run | Settlement approved for October (final run covers 1-15 Oct) | Freeze the October regular run | L 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 reopen | Calculated settlement | Cancel with reason; then Reopen | Cancelled; Reopen -> Draft. After approval: 'A settlement that reached a run cannot be reopened.' |
| Print statement | Calculated settlement | Print statement | Bilingual statement: termination, service, unpaid periods, earnings, deductions, recoveries, totals, not-configured notes, approvals, DEMO banner if demo |
Payment files
| Action | When | What you do | What happens |
|---|---|---|---|
| Release a file (second person) | File prepared by P | Finance F: Release to bank | State 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 answer | Released file | Bank 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 instruction | Rejected instruction; employee bank corrected | Repair | New instruction PI-...-2 'A new instruction was raised; payroll was not rerun.'; payslip, journal and net unchanged |
| Cancel a prepared file; download | Prepared file | Download file; then Cancel file | Downloaded bytes match the SHA-256 shown; after cancel the instructions return to Pending; a released file cannot be cancelled |
End-of-service provisions
| Action | When | What you do | What happens |
|---|---|---|---|
| Propose a monthly provision | Employees: X joined 1 Apr 2019 (BASIC 10,000), Y joined 1 Jan 2026; accounts 620200 / 240200 exist | Month end 2026-09-30; Work out the provision | X: 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 person | Proposed run by P | P tries Post; finance F posts | P 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-forward | October: X has left | Propose and post October; open roll-forward Jan-Oct | X: provision 0.00, charge = minus the previous ('left: provision released'); roll-forward opening + charges = closing and agrees with ledger 240200 |
Payroll register
| Action | When | What you do | What happens |
|---|---|---|---|
| Register reconciles | Posted runs | Open Payroll register; filter one run | Banner Gross - Deductions = Net (reconciles); Employer cost separate; totals follow the filter |
Variance and exceptions / Payment status
| Action | When | What you do | What happens |
|---|---|---|---|
| Reports | Runs with exceptions and instructions | Open both reports; filter by run and status | Rows and counts match the run records |
Rule packages
| Action | When | What you do | What happens |
|---|---|---|---|
| Install the DEMO package | No DEMO-AE yet | Install DEMO package | Draft 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 package | New package: code AE-STD, name, effective 2026-10-01, legal source, net pay account 2200, basis Calendar; Create draft | Draft v1 opens; 'Before it can be approved:' lists 'Add at least one pay element.' |
Rule package record
| Action | When | What you do | What happens |
|---|---|---|---|
| Add elements and rules | Draft package | Add 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 approval | Draft with an element lacking an account and a floor above cap | Look at 'Before it can be approved'; try Approve | Every problem listed; Approve refused 'The package cannot be approved yet.' with the list |
| Approve (second person) freezes the package | Valid draft authored by P | Rules approver A: Approve package; then try Add element | Approved, content hash shown; Add element/rule hidden; API refused 'An approved package is immutable. Create a new version to change it.' |
| New version | Approved v1 (no end date) | New version | Draft v2 copy of v1 (elements and rules), effective from today if v1 has no end date, otherwise day after v1's end |
| Overlapping versions refused | Approved v1 open-ended; draft v2 from today | Approve v2 | Refused '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 run | Package: OVERTIME 10, DEMO_DEDUCTION 20 (2% of gross, cap 500) | Gross 30,000 in a run | 2% = 600 -> capped at 500.00 with step 'capped at 500' |
| Rounding | Draft version with rounding 'down', 0 places | Calculate a run with BASIC 10,000 and 1/3 proration | 3,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 amount | Freeze or calculate a run | Refused '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
| Action | When | What you do | What happens |
|---|---|---|---|
| Elements list | Two package versions | Open Pay elements; group by Package | Each element shows its package version and status |
Pay groups
| Action | When | What you do | What happens |
|---|---|---|---|
| Create a group | New group MONTHLY, AED, package DEMO-AE | Listed with frequency monthly and 0 named members | |
| Named members limit the run | Group with 2 named members (API) | Freeze a run | Only those 2 are in the run (even if their contract currency differs - then a currency block) |
Pay periods
| Action | When | What you do | What happens |
|---|---|---|---|
| Create periods | Group MONTHLY | New period 1-30 Sep, cutoff 25 Sep, pay 28 Sep; then 1-31 Oct | Codes 2026-09 and 2026-10; an overlapping one refused; runs list shows Cutoff and 'passed' after 25 Sep while Draft |
Settlement policies
| Action | When | What you do | What happens |
|---|---|---|---|
| Create and approve a policy | Users 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 approves | Draft then Approved and immutable; P cannot approve ('...somebody other than its author.') |
| New version supersedes | Approved AE-SETTLE v1 from 1 Jan | New version; effective 1 Nov; approve | v2 Approved; v1 Superseded and ends 31 Oct automatically |
| Category overlap between two codes | Approved policy X covers Resignation | Approve policy Y also covering Resignation over the same dates | Refused 'Policy X v1 already covers resignation over these dates. Two policies for one category cannot overlap.' |
Payroll app configuration
| Action | When | What you do | What happens |
|---|---|---|---|
| Turn off Pay adjustments | Admin A proposes, admin B approves | Features: Pay adjustments off; propose; approve | Menu Pay inputs > Adjustments gone; Void refused 'capability_disabled'; existing rows readable |
| Turn off Payment instructions and bank files | As above | Turn off; open a posted run | Payment files menu gone; raising instructions / preparing / releasing files refused; files list still readable |
| Field rules | Set Input cutoff date = Required; New period without cutoff. Set Pay input source reference = Hidden; New input with a reference | Period refused without cutoff; input refused when a reference is sent; field hidden on the dialog |