Overtime Management
Request overtime assignments, view overtime schedules, and understand overtime compensation.
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
- Go to HR → Overtime Requests
- Click + New Overtime Request
- Complete the form:
- Date - When overtime will be worked
- Hours - Expected overtime hours
- Reason - Why overtime is needed
- 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
- Go to your Timesheet
- View OT Hours column
- 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:
- Pre-approve overtime for projects
- Review actual overtime worked
- Ensure overtime stays within budget
Overtime Approval
If overtime requests require approval:
- Review pending overtime requests
- Consider:
- Business necessity
- Employee's total hours
- Budget constraints
- Approve or reject with comments
For HR Admin
Processing Overtime Requests
- Go to HR → Overtime Requests (
/hr/hr-overtime-requests) - View all pending requests
- Review and process:
- Verify business justification
- Check employee eligibility
- Approve or reject
[Screenshot: overtime-requests-admin]
Overtime Schedule Calendar
For scheduled/rostered overtime:
- Go to HR → Overtime Schedule Calendar (
/hr/overtime-schedule-calendar) - 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:
- OT hours recorded in timesheet
- Rate calculated based on settings
- Included in payroll processing
- 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: trueOvertimeClockInBuffer: 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
- Go to Overtime Requests
- Click + New
- Select yesterday's date
- Enter hours worked beyond shift
- Provide reason
- Submit
Check Monthly Overtime
- Go to My Timesheet
- Select the month
- Sum the OT Hours column
- 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
- Request in advance - Pre-approved overtime is easier to process than after-the-fact claims
- Track your hours - Keep personal record of overtime worked
- Check caps - Be aware of monthly overtime limits to avoid unpaid hours
- Understand your buffer - Know your organization's buffer settings to plan OT