Employee Payroll Profile — Detailed Requirements
What must be true of an employee before they can be paid correctly: the payroll-relevant attributes on the employee master (tax profile, nationality, birth date, employment dates, contribution group), the standing item assignments that define what they earn and what is deducted, and their per-scheme statutory registration numbers. The pay run never edits this data — it reads it.
Payroll profile
Tax residency, tax category, children, nationality, birth date, join/resign dates, contribution group.
Item assignments
Catalogue items assigned with an amount and an effective date window — the source of truth for what gets paid.
Statutory numbers
The employee's EPF / SOCSO / income-tax numbers for payslips and annual forms.
Employee · Detailed
Data model
Payroll reads the HR employee master and owns two satellites: the standing item assignment and the per-scheme statutory number.
payroll-relevant fields| Field | Type | Notes |
|---|---|---|
basicSalary | number | Fallback base; the run prefers the basic-salary item assignment when present. |
taxResidencyStatus key | enum | RESIDENT (default) / NON_RESIDENT — selects the PCB method. |
taxCategory key | enum | SINGLE / MARRIED_SPOUSE_WORKING / MARRIED_SPOUSE_NOT_WORKING — drives spouse relief. |
numberOfChildren | number (default 0) | × per-child relief. |
annualPersonalRelief | number (default 0) | Manual additive relief top-up per employee. |
nationality key | string | Drives foreign-worker EPF; blank/unknown treated as Malaysian. |
dateOfBirth key | date | Age at pay date → EPF senior rates, SOCSO category, EIS eligibility. |
employmentType | enum | FULL_TIME / PART_TIME / CONTRACT / INTERN / DOMESTIC_SERVANT — domestic servants are excluded from foreign-worker EPF. |
joinDate, resignDate key | dates | Drive mid-month proration and Borang E new/ceased counts. |
payrollContributionGroupId key | reference | The statutory policy applied when joining a run. |
attendanceGroupId | reference | Shift schedule → working-day set, working days/month, hours/day (defaults Mon–Fri, 30 days, 8 h). |
standing assignment| Field | Type | Notes |
|---|---|---|
employeeId | reference | Required. |
itemSettingId | reference → catalogue | The item definition supplying all behaviour flags. |
amount | number (default 0) | Flat amount for this employee — no formulas or percentages on the assignment. |
status | enum | ACTIVE (default) / INACTIVE. |
startDate key | date | Required. Effective from. |
endDate | date | Effective until; open-ended when unset. |
registration numbers| Field | Type | Notes |
|---|---|---|
employeeId + statutoryTypeId key | references | Unique per company + employee + scheme. |
number | string | EPF / SOCSO / income-tax number; used on the EA form and CP8D rows. |
Employee · Detailed
Payroll profile EMP-P
The employee master carries the attributes that parameterise every statutory and tax computation.
- Changing the tax category or children count changes the next calculated run's PCB (spouse relief only for married-spouse-not-working).
- An employee with no contribution group produces no statutory contributions.
- Age- and nationality-dependent statutory rules evaluate against date of birth and nationality at the run's pay date.
- Daily rate = salary ÷ working days in the pay period.
- Hourly rate = salary ÷ working days per month ÷ working hours per day.
- Salary is always treated as a monthly amount — there is no daily/hourly-rated employee type.
Employee · Detailed
Item assignments EMP-A
The standing assignment of a catalogue item to an employee — amount plus effective window. These are what a pay run actually reads.
[startDate, endDate] (open-ended when no end date).- Assignments outside their window are ignored by the run without being deleted.
- Ending a recurring allowance mid-year only requires setting its end date.
- Create and import reject a new assignment whose window overlaps an existing active assignment of the same item (open-ended treated as infinite).
- A RM12,000 annual allowance contributes RM1,000 per month.
- A RM6,000 annual bonus flagged additional remuneration pays RM6,000 in the run where it is active.
- One-off items pay as-is; their single-month date window is what makes them pay once.
Employee · Detailed
Statutory numbers EMP-S
The employee's own registration numbers with each agency, mirroring the company-level store at employee scope.
- Upserting a blank number deletes the record.
- Missing numbers render blank on the forms — they do not block generation.
Employee · Detailed
Bulk import EMP-M
Item assignments can be loaded from a spreadsheet — the practical path when onboarding a whole workforce.
- Unresolvable employee/item/group, missing amount, or invalid dates produce row-level errors and leave the row unpersisted.
- Confirmation re-validates, creates assignments, applies group updates, and reports success/error counts.
Employee · Detailed
Business rules
- Assignments are the source of truth for pay. The employee's
basicSalaryfield is only a fallback when no basic-salary item assignment exists. - Safe statutory defaults: blank nationality → Malaysian; missing birth date → under 60 and EIS-eligible.
- Join date on the 1st is a full month — proration triggers only for joins after the 1st or resignations within the pay month.
- Statutory numbers are identity data, not eligibility data — eligibility derives from age/nationality/employment type, never from the presence of a number.
Employee · Detailed