| Priority | Rule Name | Scope | Condition (Logic) | Output / Remark Pattern | Status |
|---|---|---|---|---|---|
| 1 | Leave without reason (all empty) | Weekday |
Weekday AND • Start Time (C) = Empty • End Time (D) = Empty • Remarks (H) = Empty |
dispDate & " Leave without reason (weekday, no time in C/D, no remarks in H)" | Done |
| 2 | Leave without reason (missing time, no AL/SL/PH) | Weekday |
Weekday AND • (C = Empty OR D = Empty) • Remarks (H) NOT contain: AL/SL/CL/ML/PL/NPL/NPSL/Public Holiday |
dispDate & " Leave without reason (weekday, no time in C/D, no AL/SL/Public Holiday in remarks)" | Done |
| 2.1 | Special paid leave (CL/ML/PL) | Weekday Saturday PH |
(Weekday OR Sat OR PH) AND • C = Empty AND D = Empty • actualHours = 0 • Remarks contain: CL or ML or PL |
(No remark - valid paid leave CL/ML/PL) | Done |
| 2.5 | Half-day leave without work hours | Weekday |
Weekday AND • Remarks contain "(AM)" or "(PM)" • C = Empty AND D = Empty |
dispDate & " - Half-day leave but no work hours (expected work time in C/D for other half)" | Done |
| 3 | Working hours not numeric (E is N/A) | Weekday |
Weekday AND • C filled AND D filled • actualHours > 0 (from C-D) • E NOT numeric (N/A, text, error) |
dispDate & " Working hours missing C-D=" & Format(actualHours,"0.0") & "h E is not numeric (N/A)" | Done |
| 4 | C/D vs E mismatch | Weekday |
Weekday AND • C filled AND D filled • E is numeric • E ≠ (D-C) × 24 |
dispDate & " Working hours mismatch C-D=" & Format(actualHours,"0.0") & "h E=" & Format(workHours,"0.0") & "h" | Done |
| 5 | Actual < expected hours | Weekday |
Weekday AND • actualHours + tolerance(0.5) < expectedHours |
dispDate & " Hours mismatch actual " & Format(actualHours,"0.0") & "h expected " & Format(expectedHours,"0.0") & "h" | Done |
| 6 | OT not allowed (no OT eligibility) | Weekday |
Weekday AND • actualHours ≤ expectedHours + tolerance • OT (G) > 0 |
dispDate & " OT not allowed actual " & Format(actualHours,"0.0") & "h expected " & Format(expectedHours,"0.0") & "h OT(col G)=" & Format(otFromCol,"0.0") & "h" | Done |
| 7 | OT miscalculation (1-hour buffer) | Weekday |
Weekday AND • actualHours > expectedHours • calcOT = MAX(0, actual - expected - 1) • calcOT ≠ OT in col G |
dispDate & " OT miscalculation actual " & Format(actualHours,"0.0") & "h expected " & Format(expectedHours,"0.0") & "h OT(col G)=" & Format(otFromCol,"0.0") & "h OT(calc)=" & Format(calcOT,"0.0") & "h (OT = hours - 1)" | Done |
| 8 | Late coming (time-based) | Weekday |
Weekday AND • C filled AND D filled • startTime > scheduledStartTime + 15min |
dispDate & " Late coming start " & Format(startTime,"hh:nn") | Pending |
| 9 | Early leave (time-based) | Weekday |
Weekday AND • C filled AND D filled • endTime < scheduledEndTime - 15min |
dispDate & " Early leave end " & Format(endTime,"hh:nn") | Pending |
| 10 | Short hours (possible early leave/late coming) | Weekday |
Weekday AND • C filled AND D filled • actualHours + tolerance < expectedHours |
dispDate & " Working hours less than standard (possible early leave/late coming) actual " & Format(actualHours,"0.0") & "h expected " & Format(expectedHours,"0.0") & "h" | Done |
| 11 | Saturday leave without reason (5.5-day staff) | Saturday |
Saturday AND 5.5-day employee AND • 0 < actualHours ≤ 4 • actualHours < expectedHours • Remarks NOT contain leave types |
dispDate & " - Sat leave without reason (5.5-day staff) actual " & Format(actualHours,"0.0") & "h expected " & Format(expectedHours,"0.0") & "h" | Done |
| 12 | Saturday OT after 5.5 days (4h+ only) | Saturday |
Part A: Sat AND 5.5-day AND • C/D filled, weeklyDays>5.5, hrs≥4 Part B: Sat AND 5.5-day AND • actualHours > 4 • calcOT = actualHours - 4 • calcOT ≠ OT in col G |
Part A: dispDate & " Saturday OT hours=" & Format(actualHours,"0.0") & "h (after 5.5 days rule)" Part B: dispDate & " - Sat OT miscalculation (5.5-day staff) actual " & Format(actualHours,"0.0") & "h OT(col G)=" & Format(otFromCol,"0.0") & "h OT(calc)=" & Format(satOT,"0.0") & "h (OT = hours - 4)" |
Done |
| 13 | Sunday/PH hours mismatch | Sunday/PH |
(Sunday OR Public Holiday) AND • C filled AND D filled • E is numeric AND E ≠ (D-C)×24 OR • At least one of E or G filled • NOT (C-D = E = G) |
Version 1: dispDate & " Public Holiday hours mismatch C-D=" & Format(actualHours,"0.0") & "h E=" & Format(vE,"0.0") & "h G=" & Format(vG,"0.0") & "h" Version 2: dispDate & " - Public Holiday hours mismatch C-D=" & Format(actualHours,"0.0") & "h E=" & Format(CDbl(colE),"0.0") & "h" |
Done |
| 14 | Sunday/PH no work, no issue | Sunday/PH |
(Sunday OR Public Holiday) AND • C = Empty • D = Empty |
(No remark) | Done |
| 15 | Leave marked on rest day (warning) | Sunday/PH |
(Sunday OR Public Holiday) AND • Remarks contain any leave type: AL/SL/CL/ML/PL/NPL/NPSL |
dispDate & " - AL marked on rest day (Sun/PH)" dispDate & " - SL marked on rest day (Sun/PH)" dispDate & " - CL marked on rest day (Sun/PH)" dispDate & " - ML marked on rest day (Sun/PH)" dispDate & " - PL marked on rest day (Sun/PH)" dispDate & " - NPL marked on rest day (Sun/PH)" (6 different messages based on leave type) |
Done |