Shifts & Schedules
Understanding your work schedule, shift assignments, and viewing team rosters.
Shifts & Schedules
Understanding your work schedule, shift assignments, and viewing team rosters.
Quick Access
| Role | Navigation | Route |
|---|---|---|
| Employee | HR → My Schedules | /hr/my-shift-calendar |
| Manager/HOD | HR → Shift Calendar | /hr/shift-drag-drop-calendar |
| HR Admin | HR → Shift Schedule Templates | /hr/shift-schedule-templates |
For Employees
Viewing Your Schedule
- Go to HR → My Schedules (
/hr/my-shift-calendar) - View your current week's schedule:
- Assigned shifts per day
- Start and end times
- Off days
- Leave days
[Screenshot: my-shift-calendar]
Understanding Your Shift
Each shift display shows:
| Element | Description |
|---|---|
| Shift Name | e.g., "Morning Shift", "Night Shift" |
| Time | Start and end times (e.g., 09:00 - 18:00) |
| Break | Scheduled break duration |
| Off Day | Marked differently (usually grayed out) |
| Leave | Shows approved leave type |
Shift Types
| Type | Description |
|---|---|
| Regular | Standard working hours |
| Split | Two work periods with long break |
| Flexi | Flexible start/end within range |
| Off | Scheduled rest day |
Viewing Leave Balance
Your schedule view may also display:
- Remaining annual leave days
- Other leave type balances
- Upcoming public holidays
For Managers/HOD
Managing Team Schedules
- Go to HR → Shift Calendar (
/hr/shift-drag-drop-calendar) - Select your department
- View the weekly/monthly roster
[Screenshot: shift-drag-drop-calendar]
Drag-and-Drop Scheduling
To change an employee's shift:
- Click and hold the employee's shift block
- Drag to the desired date
- Drop to assign the new shift
- Confirm the change
Viewing Staff Strength
The calendar shows:
- Number of staff scheduled per shift
- Minimum staffing requirements
- Under-staffed warnings (if configured)
[Screenshot: staff-strength-indicator]
Schedule Deviations
When actual attendance differs from scheduled:
- Deviation indicators highlight discrepancies
- Review reasons for schedule changes
- Approve or flag for follow-up
For HR Admin
Creating Shift Templates
- Go to HR → Shift Schedule Templates (
/hr/shift-schedule-templates) - Click + New Template
- Configure:
- Template name
- Work days (Mon-Sun pattern)
- Shifts per day
- Break rules
- Overtime settings
[Screenshot: shift-template-editor]
Assigning Shifts to Employees
Individual Assignment:
- Go to employee profile
- Navigate to Shift Schedule section
- Assign shift template
Bulk Assignment:
- Use the Shift Calendar
- Select multiple employees
- Apply template to selection
Managing Multiple Locations
For organizations with multiple work locations:
- Ensure work locations are configured
- Assign location-specific shift templates
- Staff can be assigned to location-appropriate shifts
ShiftScheduleTemplate Complete Reference
The ShiftScheduleTemplate entity controls all aspects of shift timing, overtime, breaks, and penalties.
Core Settings
| Property | Type | Description |
|---|---|---|
Name |
string | Display name (e.g., "Morning Shift") |
Code |
string | Short identifier (e.g., "AM") |
Color |
string | Display color for calendars |
IconClass |
string | Icon CSS class |
Note |
string | Description or notes |
IsActive |
bool | Whether template is usable |
IsSystem |
bool | System-managed template |
IsOffDay |
bool | Marks as scheduled day off |
Shift Timing
| Property | Type | Description |
|---|---|---|
StartsHour |
int | Shift start hour (0-23) |
StartsMinute |
int | Shift start minute (0-59) |
EndsHour |
int | Shift end hour (0-23) |
EndsMinute |
int | Shift end minute (0-59) |
WorkingHours |
decimal | Expected working hours |
WorkLocationId |
int | Associated work location |
DepartmentId |
int? | Associated department |
Computed Properties:
StartTimeFormatted: "HH:mm" format start timeEndTimeFormatted: "HH:mm" format end timeFormattedTime: "HH:mm - HH:mm" full range
Clock In/Out Settings
| Property | Type | Description |
|---|---|---|
AllowClockInOutsideLocation |
bool | Allow clock-in from any location |
AllowClockOutOutsideLocation |
bool | Allow clock-out from any location |
AllowedEarlyClockIn |
int? | Minutes before shift can clock in |
MustUsePinnedDevice |
bool | Require designated device |
DisallowManualEdit |
bool | Prevent manual timesheet changes |
AllowTripTouch |
bool | Enable trip start/end touches |
Break Configuration
| Property | Type | Description |
|---|---|---|
BreakIsMandatory |
bool | Force break tracking |
MaxBreaks |
int? | Maximum breaks per day |
MaxBreakLengthInMinutes |
int? | Maximum break duration |
AllowedBreakAfterHour |
int? | Earliest break start hour |
AllowedBreakAfterMinute |
int? | Earliest break start minute |
DisallowedBreakAfterHour |
int? | Latest break start hour |
DisallowedBreakAfterMinute |
int? | Latest break start minute |
BreakDeviations |
list | Allowed break time variations |
Overtime Settings
| Property | Type | Description |
|---|---|---|
AllowOvertimeBefore |
bool | Count pre-shift work as OT |
AllowOvertimeAfter |
bool | Count post-shift work as OT |
OvertimeClockInBuffer |
int? | Min minutes before shift for OT |
OvertimeClockOutBuffer |
int? | Min minutes after shift for OT |
OvertimeBlockMode |
BlockMode? | Floor or Ceiling rounding |
OvertimeMinuteBlock |
int? | Block size (15, 30, 60 min) |
OvertimeFactor |
decimal? | Pay multiplier (e.g., 1.5) |
OvertimeValue |
decimal? | Fixed OT value |
OvertimeStrategy |
enum | DailyPayFactor, Fixed, BasicSalaryPayFactor |
OvertimeUseScript |
bool | Use custom calculation script |
OvertimeScript |
string | Custom C# script for OT |
DeductOvertimeIfLate |
bool | Subtract lateness from OT |
OvertimeStrategy Options:
| Value | Description |
|-------|-------------|
| DailyPayFactor | OT based on daily wage |
| Fixed | Fixed OT rate per hour |
| BasicSalaryPayFactor | OT based on basic salary |
Penalty Settings
| Property | Type | Description |
|---|---|---|
ClockInDeductionMode |
enum | How to calculate late penalty |
ClockInDeductionRate |
decimal? | Penalty rate for late arrival |
ClockOutDeductionMode |
enum | How to calculate early exit penalty |
ClockOutDeductionRate |
decimal? | Penalty rate for early departure |
BreakDeductionMode |
enum | How to calculate break penalty |
BreakDeductionRate |
decimal? | Penalty rate for break excess |
PenaltyClockInBuffer |
int? | Grace period for late arrival |
PenaltyClockOutBuffer |
int? | Grace period for early departure |
PenaltyBreakBuffer |
int? | Grace period for break overrun |
PenaltyBlockMode |
BlockMode? | Floor or Ceiling rounding |
PenaltyMinuteBlock |
int? | Block size for penalties |
ClockInTieredPenalties |
list | Graduated penalty tiers |
AttendanceDeductionMode Options:
| Value | Description |
|-------|-------------|
| None | No penalty applied |
| FixedPerBlock | Fixed amount per time block |
| OneTime | Single flat amount |
| Tiered | Graduated by lateness severity |
| DailyRate | Proportional to daily wage |
Wage Settings
| Property | Type | Description |
|---|---|---|
Wages |
list | Wage validity periods |
ShiftWageValidity Structure:
| Property | Type | Description |
|----------|------|-------------|
| From | DateOnly | Start date |
| To | DateOnly? | End date |
| Amount | decimal | Wage amount |
| Note | string | Notes |
Timezone Settings
| Property | Type | Description |
|---|---|---|
ServerTimezoneOffset |
double | Server timezone offset |
OrganizationTimezoneOffset |
double | Organization timezone offset |
Work From Home
| Property | Type | Description |
|---|---|---|
WorkFromHome |
bool | Enable WFH for this shift |
WorkFromHomePolicy |
int? | WFH policy reference |
Template Configuration Examples
Example 1: Standard Office Shift
Name: "7.30AM" (i90042721 - Pilot)
{
"Name": "7.30AM",
"Code": "730AM",
"StartsHour": 7,
"StartsMinute": 30,
"EndsHour": 16,
"EndsMinute": 0,
"WorkingHours": 7.5,
"BreakIsMandatory": true,
"MaxBreakLengthInMinutes": 60,
"AllowOvertimeBefore": true,
"AllowOvertimeAfter": true,
"OvertimeClockOutBuffer": 30,
"OvertimeBlockMode": "Floor",
"OvertimeMinuteBlock": 60,
"OvertimeFactor": 1.5,
"PenaltyClockInBuffer": 5,
"ClockInDeductionMode": "DailyRate"
}
Behavior:
- 07:30 - 16:00 shift (7.5 hours)
- 60-minute mandatory break
- OT requires 30+ min after shift
- OT rounded down to full hours
- 5-minute grace for late arrival
Example 2: Tiered Penalty Shift
Name: "Morning" (Kaewta - AppStafyCoTh)
{
"Name": "Morning",
"StartsHour": 8,
"StartsMinute": 45,
"EndsHour": 19,
"EndsMinute": 45,
"ClockInDeductionMode": "OneTime",
"ClockInTieredPenalties": [
{
"Name": "Tier 1",
"StartMinutes": 1,
"EndMinutes": 15,
"Rate": 10.00
},
{
"Name": "Tier 2",
"StartMinutes": 16,
"EndMinutes": 45,
"Rate": 30.00
},
{
"Name": "Tier 3",
"StartMinutes": 46,
"EndMinutes": null,
"Rate": 50.00
}
]
}
Behavior:
- Late 1-15 min: RM 10 penalty
- Late 16-45 min: RM 30 penalty
- Late 46+ min: RM 50 penalty
Example 3: Custom OT Script Shift
Name: "Shop 3 - A" (MrPa - AppStafyCoTh)
{
"Name": "Shop 3 - A",
"OvertimeUseScript": true,
"OvertimeScript": "if (ot is null) return null;\nvar minutes = Convert.ToDecimal(Math.Ceiling(ot.Value.TotalMinutes));\nreturn 0m;",
"BreakDeductionMode": "FixedPerBlock",
"BreakDeductionRate": 1.0,
"PenaltyMinuteBlock": 1
}
Behavior:
- Custom script always returns 0 (no OT paid)
- Break excess: RM 1.00 per minute
Example 4: Flexible Hours Shift
{
"Name": "Flexi 9-6",
"StartsHour": 9,
"StartsMinute": 0,
"EndsHour": 18,
"EndsMinute": 0,
"WorkingHours": 8,
"AllowedEarlyClockIn": 60,
"PenaltyClockInBuffer": 30,
"PenaltyClockOutBuffer": 30,
"AllowOvertimeAfter": true,
"OvertimeClockOutBuffer": 60
}
Behavior:
- Can clock in up to 60 min early
- 30-min grace for late/early
- OT only after 60+ min extra
Example 5: Night Shift
{
"Name": "Night Shift",
"StartsHour": 22,
"StartsMinute": 0,
"EndsHour": 6,
"EndsMinute": 0,
"WorkingHours": 7,
"AllowOvertimeBefore": false,
"AllowOvertimeAfter": true,
"OvertimeClockOutBuffer": 15,
"OvertimeFactor": 2.0
}
Behavior:
- 22:00 - 06:00 (crosses midnight)
- 2.0× OT factor (night premium)
- No pre-shift OT allowed
TieredPenalty Structure
| Property | Type | Description |
|---|---|---|
Name |
string | Display name |
StartMinutes |
int | Tier starts at X minutes late |
EndMinutes |
int? | Tier ends at X minutes (null = unlimited) |
Rate |
decimal? | Penalty rate for this tier |
FixedAmount |
decimal? | Alternative fixed amount |
Range Logic:
- Tier matches if:
StartMinutes <= late minutes <= EndMinutes - If
EndMinutesis null:StartMinutes <= late minutes(no upper limit)
Schedule Views
Calendar Views Available
| View | Best For |
|---|---|
| Day | Detailed single-day planning |
| Week | Standard weekly roster view |
| Month | Overview and pattern planning |
Shared Shift Calendar
For cross-department visibility:
- Go to HR → Shared Shift Calendar (
/hr/shared-shift-calendar) - View schedules across departments
- Useful for coordination and coverage planning
Common Tasks
Request a Schedule Change
- Contact your manager or HR
- Provide:
- Requested change dates
- Preferred shift/time
- Reason for request
- Wait for approval
Schedule changes may require advance notice per company policy.
Swap Shifts with a Colleague
- Both employees must agree to the swap
- Manager approval is required
- HR or Manager makes the change in the system
View Public Holidays
Public holidays are shown on your schedule calendar with special marking:
- Typically colored differently
- May show as "Public Holiday" in the shift slot
- Affects overtime calculations
Tips
- Check schedule weekly - Review your upcoming week every Monday to plan ahead
- Note pattern changes - If your shift pattern changes, verify with your manager
- Plan leave around your schedule - Consider your shift pattern when applying for leave
- Understand your template - Know your shift's OT and penalty settings