Attendance Human Resources

Overtime Management

Request overtime assignments, view overtime schedules, and understand overtime compensation.

Overtime Management

Overtime Management

Request overtime assignments, view overtime schedules, and understand overtime compensation.

Quick Access

Role Navigation Route
Employee HR → Overtime Requests /hr/new-overtime-request
HR Admin HR → Overtime Requests /hr/hr-overtime-requests
HR Admin HR → Overtime Schedule /hr/overtime-schedule-calendar

Note: Overtime request feature requires HR_OVERTIME_REQUEST to be enabled.


For Employees

Requesting Overtime

  1. Go to HR → Overtime Requests
  2. Click + New Overtime Request
  3. Complete the form:
    • Date - When overtime will be worked
    • Hours - Expected overtime hours
    • Reason - Why overtime is needed
  4. Submit for approval

[Screenshot: overtime-request-form]

Overtime Types

Type Description
Pre-approved Scheduled in advance
Actual Based on hours worked beyond shift
Scheduled Part of overtime roster

Viewing Overtime History

  1. Go to your Timesheet
  2. View OT Hours column
  3. See overtime per day worked

Understanding Overtime Rates

Overtime compensation varies by:

  • Weekday OT - Standard overtime rate
  • Weekend OT - Higher rate for rest days
  • Public Holiday OT - Premium rate for holidays

Actual rates depend on your organization's policy and employment contract.


For Managers/HOD

Managing Team Overtime

Managers may need to:

  1. Pre-approve overtime for projects
  2. Review actual overtime worked
  3. Ensure overtime stays within budget

Overtime Approval

If overtime requests require approval:

  1. Review pending overtime requests
  2. Consider:
    • Business necessity
    • Employee's total hours
    • Budget constraints
  3. Approve or reject with comments

For HR Admin

Processing Overtime Requests

  1. Go to HR → Overtime Requests (/hr/hr-overtime-requests)
  2. View all pending requests
  3. Review and process:
    • Verify business justification
    • Check employee eligibility
    • Approve or reject

[Screenshot: overtime-requests-admin]

Overtime Schedule Calendar

For scheduled/rostered overtime:

  1. Go to HR → Overtime Schedule Calendar (/hr/overtime-schedule-calendar)
  2. Plan overtime assignments:
    • Select employees
    • Assign overtime shifts
    • Set overtime hours

[Screenshot: overtime-schedule-calendar]

Overtime Settings

Key settings affecting overtime:

Setting Description
OVERTIME_HOUR_CAP_INCLUDE_PAID_LEAVE Include paid leave in OT hour caps
OVERTIME_HOUR_CAP_INCLUDE_PUBLIC_HOLIDAYS Include public holidays in OT caps
SCHEDULED_OVERTIME_SETTING Enable scheduled overtime

Overtime in Payroll

Overtime flows to payroll:

  1. OT hours recorded in timesheet
  2. Rate calculated based on settings
  3. Included in payroll processing
  4. Appears on payslip under earnings

Overtime Calculation Deep Dive

Understanding how the system calculates overtime is essential for HR administrators and managers.

The Overtime Formula

The system calculates overtime using a multi-step process:

Step 1: Calculate Raw Overtime
─────────────────────────────
Before Shift OT = ShiftClockInTime - ActualClockInTime (if positive)
After Shift OT  = ActualClockOutTime - ShiftClockOutTime (if positive)
Raw Overtime    = Before Shift OT + After Shift OT

Step 2: Apply Buffers
─────────────────────
If Before Shift OT < OvertimeClockInBuffer → Before Shift OT = 0
If After Shift OT < OvertimeClockOutBuffer → After Shift OT = 0

Step 3: Block/Round the Overtime
────────────────────────────────
Chunked Overtime = Block(Raw Overtime, BlockMode, MinuteBlock)

Step 4: Calculate Earnings
──────────────────────────
Overtime Earned = OvertimeHourlyRate × Chunked Overtime Hours

Real-World Example: Standard Overtime

Employee: Azman Bin Hussin Date: January 9, 2026 Shift Template: "7.30AM" (07:30 - 16:00)

Setting Value
Scheduled Shift 07:30 - 16:00
Working Hours 7.5 hours
OvertimeClockOutBuffer 30 minutes
OvertimeBlockMode Floor
OvertimeMinuteBlock 60 minutes
OvertimeFactor 1.5×

Actual Attendance:

  • Clock In: 07:18 (12 minutes early)
  • Clock Out: 18:05 (2 hours 5 minutes after shift)

Calculation:

Raw OT After = 18:05 - 16:00 = 2:05:00 (125 minutes)
Buffer Check = 125 min > 30 min buffer ✓ (OT counts)
Block Rounding = Floor(125 / 60) × 60 = 120 minutes = 2:00:00
Hourly Rate = RM 13.08
Overtime Earned = RM 13.08 × 2.0 hours = RM 26.16

Result: 2:00 paid overtime, RM 26.16 earned


Overtime Strategy Options

The shift template defines how overtime rates are calculated. Three strategies are available:

DailyPayFactor Strategy

Calculates overtime based on the daily wage rate.

Formula OvertimeHourlyRate × OvertimeFactor × Hours
Best For Employees paid daily or with shift-based wages

Example:

  • Daily Wage: RM 100.00
  • Working Hours: 8
  • Hourly Rate: RM 100 ÷ 8 = RM 12.50
  • OT Factor: 1.5×
  • For 2 hours OT: RM 12.50 × 1.5 × 2 = RM 37.50

Fixed Strategy

Uses a fixed rate per overtime hour, regardless of base salary.

Formula FixedOvertimeRate × Hours
Best For Organizations with standardized OT rates

Example:

  • Fixed OT Rate: RM 15.00/hour
  • For 2 hours OT: RM 15.00 × 2 = RM 30.00

BasicSalaryPayFactor Strategy

Calculates overtime based on the employee's basic monthly salary.

Formula (BasicSalary ÷ WorkingDays ÷ Hours) × Factor × OT Hours
Best For Salaried employees with monthly pay

Example:

  • Basic Salary: RM 3,000
  • Working Days/Month: 22
  • Hours/Day: 8
  • Hourly Rate: RM 3,000 ÷ 22 ÷ 8 = RM 17.05
  • OT Factor: 1.5×
  • For 2 hours OT: RM 17.05 × 1.5 × 2 = RM 51.15

Overtime Calculation Methods

The OvertimeCalculation enum determines how overtime earnings are computed:

Method Description
HourlyFactored Standard calculation: Hourly Rate × Factor × Hours
OneTime Flat rate paid regardless of hours worked
FixedHourly Fixed per-hour rate (not based on salary)
CustomScript Uses custom C# script for calculation

Custom Script Example

Some organizations require specialized OT calculations. The OvertimeScript property allows custom logic:

// Example: Cap overtime at 2 hours per day
if (ot is null) return null;
var minutes = Convert.ToDecimal(Math.Ceiling(ot.Value.TotalMinutes));
var maxMinutes = 120m; // 2 hours max
return Math.Min(minutes, maxMinutes) * hourlyRate / 60m;

Note: Custom scripts require technical expertise. Contact your system administrator for setup.


Buffer Settings Explained

Buffers prevent minor time variations from affecting overtime calculations.

OvertimeClockOutBuffer

Purpose: Minimum minutes after shift end before overtime starts counting.

Buffer Value Behavior
0 or null Any time after shift counts as OT
30 Employee must work 30+ minutes extra to earn OT
60 Employee must work 60+ minutes extra to earn OT

Example with 30-minute buffer:

  • Shift ends: 17:00
  • Clocked out: 17:25 → No OT (under buffer)
  • Clocked out: 17:45 → OT counts from 17:00 (45 min raw)

OvertimeClockInBuffer

Purpose: Minimum minutes before shift start before overtime starts counting.

Example with 15-minute buffer:

  • Shift starts: 09:00
  • Clocked in: 08:50 → No OT (10 min < 15 min buffer)
  • Clocked in: 08:30 → OT counts (30 min > 15 min buffer)

Block Modes: Floor vs Ceiling

Overtime can be rounded using two modes:

Floor Mode (Round Down)

Pays only for complete blocks. More conservative for the employer.

Raw OT Block Size Paid OT
1:45 60 min 1:00
2:15 60 min 2:00
2:55 60 min 2:00
0:45 30 min 0:30

Ceiling Mode (Round Up)

Pays for any partial block. More generous for employees.

Raw OT Block Size Paid OT
1:45 60 min 2:00
2:15 60 min 3:00
0:05 30 min 0:30

Common Block Sizes

Block Size Use Case
15 minutes Granular tracking, commonly used
30 minutes Balanced approach
60 minutes Simplified full-hour blocks

Special Overtime Scenarios

Pre-Shift Overtime

When AllowOvertimeBefore is enabled, time worked before the shift starts counts as overtime.

Configuration:

  • AllowOvertimeBefore: true
  • OvertimeClockInBuffer: 15 (optional)

Example:

  • Shift: 09:00 - 18:00
  • Clock In: 07:30
  • Pre-shift OT: 1:30

Public Holiday Overtime

When IsPublicHoliday is true:

  • If PublicHolidaySeparateOvertime: false → All worked hours count as OT
  • If PublicHolidaySeparateOvertime: true → Only hours beyond shift are OT

Deduct Overtime If Late

When DeductOvertimeIfLate is enabled, lateness is subtracted from overtime.

Example:

  • Shift: 09:00 - 18:00
  • Clock In: 09:30 (30 minutes late)
  • Clock Out: 19:00 (60 minutes after shift)
  • Deducted OT: 60 - 30 = 30 minutes net OT

Overtime Thresholds and Caps

Minimum Hours to Qualify

Some organizations require minimum working hours before overtime is paid:

Setting Description
MinimumHourOvertime Hours required before OT qualifies
MinimumHourOvertimeIncludePaidLeave Count paid leave toward minimum
MinimumHourOvertimeIncludePublicHoliday Count holidays toward minimum

Overtime Caps

Organizations may limit overtime:

  • Daily maximum hours
  • Weekly maximum hours
  • Monthly cap for budgeting

Common Tasks

Submit Overtime Worked Yesterday

  1. Go to Overtime Requests
  2. Click + New
  3. Select yesterday's date
  4. Enter hours worked beyond shift
  5. Provide reason
  6. Submit

Check Monthly Overtime

  1. Go to My Timesheet
  2. Select the month
  3. Sum the OT Hours column
  4. Or check payslip for OT earnings

Understand Overtime on Payslip

Your payslip may show:

  • OT hours worked
  • OT rate applied
  • OT earnings amount
  • Breakdown by OT type (weekday/weekend)

Enable PAYSLIP_SHOW_OVERTIME_DETAILS setting to show detailed breakdown.


Tips

  1. Request in advance - Pre-approved overtime is easier to process than after-the-fact claims
  2. Track your hours - Keep personal record of overtime worked
  3. Check caps - Be aware of monthly overtime limits to avoid unpaid hours
  4. Understand your buffer - Know your organization's buffer settings to plan OT

See Also

An unhandled error has occurred. Reload X

Rejoining the server...

Rejoin failed... trying again in <span id="components-seconds-to-next-attempt"></span> seconds.

Failed to rejoin.
Please retry or reload the page.

The session has been paused by the server.

Failed to resume the session.
Please reload the page.