EOSB calculator — Article 39 in code
The two-band formula, the daily-rate divisor, the monthly snapshot, the IAS 19 treatment. Everything an auditor + HR coordinator + payroll officer needs to know to defend the firm's EOSB liability number.
The two bands — visualised
Cumulative days accrued — sketch
The formula
years_of_service = (last_day - joining_date) / 365.25
if years_of_service <= 3:
days_accrued = years_of_service * 15
else:
first_band = 3 * 15 # = 45 days
second_band = (years_of_service - 3) * 30
days_accrued = first_band + second_band
daily_rate = basic_salary / 30 # configurable
eosb = days_accrued * daily_rate
Configurable settings
| Setting | Default | Why configurable |
|---|---|---|
m13.eosb.first_period_years | 3 | Most firms use 3; some firm-specific contracts use different break |
m13.eosb.first_band_days | 15 | Statutory min; some firms enhance |
m13.eosb.second_band_days | 30 | Statutory min |
m13.eosb.daily_rate_divisor | 30 | Some firms use 26 (working days only) for higher EOSB |
Worked example 1 — exactly 3 years
Employee joined 1-Jan-2023. Last day 31-Dec-2025. Basic salary OMR 950.
- Service = 3.000 years
- First band: 3 × 15 = 45 days
- Second band: 0 days (no excess over 3 years)
- Daily rate: 950 / 30 = 31.667 OMR
- EOSB: 45 × 31.667 = 1,425.000 OMR
Worked example 2 — 4.25 years
Employee joined 1-Jan-2022. Last day 31-Mar-2026. Basic salary OMR 850.
- Service = 4.250 years
- First band: 3 × 15 = 45 days
- Second band: 1.25 × 30 = 37.5 days
- Total accrued: 82.5 days
- Daily rate: 850 / 30 = 28.333 OMR
- EOSB: 82.5 × 28.333 = 2,337.49 OMR
Worked example 3 — under 1 year
Employee joined 1-Aug-2025. Last day 31-Jan-2026. Basic salary OMR 600.
- Service = 0.5 years
- First band: 0.5 × 15 = 7.5 days
- Daily rate: 600 / 30 = 20 OMR
- EOSB: 7.5 × 20 = 150.000 OMR
(Some firms have a minimum-service-period before EOSB accrues — check the contract. The system supports both: default policy = pro-rate from day 1.)
The monthly snapshot table
employee_eosb_accruals stores one row per (employee × period_year × period_month) with:
years_of_serviceat month-endbasicat month-enddaily_ratedays_accrued_to_dateaccrued_amountcurrency(OMR)is_settlementflag (true on the final month)
UNIQUE (employee_id, period_year, period_month) makes the cron idempotent.
IAS 19 treatment
EOSB is a defined-benefit obligation per IAS 19. Treatment:
- P&L recognition: monthly accrual = current-month change in EOSB liability. Hits "Employee benefits expense".
- SFP recognition: cumulative liability = sum of all employees' accrued EOSB. Disclosed under "Provisions" or "Other long-term employee benefits".
- Disclosure: Note 19 (Provisions) of the FS — opening + accrual + paid - released = closing.
The aggregate of employee_eosb_accruals at any month-end IS the IAS 19 EOSB provision. M19 disclosure compliance flags this as a mandatory note.
Settlement (paid event)
When EOSB is paid (typically as part of final settlement):
- Final settlement record is created with EOSB component pulled from latest snapshot
- Approval → Payment
- Last snapshot row marked
is_settlement=1 - Liability releases (Dr Provision Cr Cash)
- Employee's accrual stream stops (status flips to terminated)
Audit perspective — defending the number
An external auditor (TPL-AA) will test the EOSB provision. The defence:
- Sample test: pick 5 employees, recompute EOSB independently using the formula, compare to
employee_eosb_accrualslatest row. Difference should be zero. - Completeness: count of active employees in
employeesmatches count in latest-month snapshot. - Cut-off: for any employee terminated in the period, check if final settlement was paid + whether liability was released.
- Disclosure: Note 19 movement table reconciles to GL.
Pick any active employee → Compensation → EOSB tab. The 4-tile hero shows the calculator output. Click Recompute to refresh against current employees.basic_salary. The monthly snapshot table below shows the historical liability evolution.
Don't manually edit employee_eosb_accruals rows. They are computed snapshots; manual edits break the audit trail. If a salary correction is needed, post a salary revision (history row) and let the next month's cron pick it up. Past months stay frozen.
For partner forecasting, project EOSB exposure 3-5 years out by extrapolating each employee's accrual. This is the firm's biggest single non-current liability. Audit firms are often surprised by EOSB exposure when major terminations bunch — having the projection helps.