Lifecycle — offer letter to final settlement
Six sub-tabs covering every people-event from joining to leaving: onboarding (templated), offboarding (clearance gates), appraisals (cycles), disciplinary (3-warnings rule), exit interview (structured feedback), final settlement (auto-pulled EOSB + leave + loans). Drives the most consequential firm decisions.
The 6 sub-tabs
1 · Onboarding
4 seeded templates: audit_hire (25 standard items) · admin_hire · intern · partner. Items grouped by category: HR · IT · Finance · Manager · Compliance · Training. Each item has days_to_complete + is_blocking flag.
Auto-creation: on EmployeeService::create, an onboarding instance auto-materialises from the matching template. Idempotent — re-running create doesn't duplicate.
Workflow: tick blocking items → when all blocking ticked, parent onboarding auto-completes. Audit-logged.
2 · Offboarding
Clearance gates (6 flags): assets_returned · knowledge_handed_over · it_revoked · finance_cleared · visa_cancelled · final_settlement_done.
Status lifecycle: initiated → in_progress → clearance_done (5/6 ticked) → settled (6/6 ticked, including final_settlement_done).
Cancel: allowed up to but not including settled. Reactivation also supported.
3 · Appraisals
Three cycle types: mid_year · annual · probation. Each appraisal has overall_rating · score · manager_comments · self_comments · partner_comments · employee_comments · development_plan · promotion_recommendation · increment_pct. Finalised appraisals are locked from edit.
4 · Disciplinary
Action types: verbal_warning · written_warning · final_warning · suspension · salary_deduction · demotion · termination. Severity grades: minor · moderate · serious · gross.
Auto-expiry: warnings have valid_until — typically 6-12 months. Active warnings counted via activeWarningCount(). 3-warnings-rule: when count ≥ 3, the Disciplinary tab shows a red banner.
5 · Exit interview
Structured feedback when offboarding active. One-time per employee. Fields: primary_reason · 0-10 rating across satisfaction dimensions · would_rejoin · would_recommend · open feedback · is_confidential gate (HR-only access).
6 · Final settlement
The big one. Auto-pulls four sources when generated:
- EOSB at last working day (from
CompensationService::computeEosb) - Leave encashment = current annual balance × daily rate
- Outstanding loans (from active deductions)
- Asset recovery (from unreturned assets)
Plus optional manual lines: salary_arrears · notice_period_pay · bonus_arrears · other_credits · other_deductions.
Net payable = EOSB + leave_encash + manual_credits − loan_outstanding − asset_recovery − manual_deductions.
Status: draft → approved → paid. Mark-paid auto-ticks final_settlement_done flag → offboarding rolls to settled.
Branded PDF: FinalSettlementPdfService mirrors the M11 invoice-PDF pipeline. A4 portrait with firm header + employee block + line-by-line table + Art. 39 explanation + 3-signature block + firm stamp. Cache busted on approve/pay.
The full lifecycle picture
Step-by-step — offboarding an employee
Initiate offboarding
Open employee → Offboarding tab → Initiate. Form: last_working_day · reason (resignation / termination / retirement / death) · notes. System creates
employee_offboardingrow · status=initiated.Walk the 6 clearance gates
As each happens: tick the flag. Assets returned (auto from Assets tab when all rows have returned_date). IT revoked (manual after IT confirms). Knowledge handed over (manager confirms). Visa cancelled. Finance cleared. Final settlement = last gate.
Conduct exit interview
Exit Interview tab while offboarding still active. One row only — once recorded, becomes read-only.
Generate final settlement
Final Settlement tab → Generate. Auto-pulls EOSB + leave + loans + assets. Add manual lines if applicable. Save as draft.
Approve + pay
Partner approves (status draft → approved). Process bank transfer. Mark paid (status approved → paid). System auto-ticks final_settlement_done flag → offboarding rolls to settled.
Soft-delete employee
Once offboarding=settled, the employee can be soft-deleted (
jobs.deleted_atstamped). Audit history preserved forever.
Open Disciplinary tab on an employee with 3+ active warnings. Red banner appears. This is the trigger for the firm's escalation policy — Oman Labour Law allows summary termination after 3 warnings + worsening misconduct, with documentation showing the chain.
Don't generate final settlement until the last working day is firm and EOSB calculation reflects the actual end date. Recompute close to that date — a salary revision in the last month would shift the daily rate. The system supports recompute on draft state; once approved/paid, locked.
Audit_hire is heavier than admin_hire (extra items: independence training, ISA briefing, methodology induction, capability matrix entry). If a senior hire bypasses some items because of prior firm experience, mark as N/A with reason ("ex-Big4, methodology equivalent"). Don't just delete — preserve the rationale.