Attendance Management

7 min read

This guide covers daily time records (DTR), time tracking, grace periods, overtime, absence detection, and the integration between attendance and payroll in TalinoHR.

Daily Time Record (DTR)

The Daily Time Record is the foundation of attendance tracking in the Philippines. Each attendance record captures:

  • Date - The work date
  • Time In - Clock-in time
  • Time Out - Clock-out time
  • Late Minutes - Minutes arrived after scheduled time-in (after grace period)
  • Undertime Minutes - Minutes left before scheduled time-out
  • Overtime Minutes - Approved overtime minutes (display field, actual OT computed from OvertimeApplication)
  • Is Absent - Whether the employee was absent
  • Is Half Day - Whether it was a half-day attendance
  • Is On Leave - Whether the employee was on approved leave
  • Is Rest Day - Whether the date falls on a rest day per the work schedule

Work Schedule Integration

Attendance records are tightly linked to work schedules. The system uses the employee's assigned WorkSchedule to determine:

Rest Day Detection

The schedule stores time-in/time-out for each day of the week (mondayIn, mondayOut, tuesdayIn, etc.). Days where both time-in and time-out are null are treated as rest days. For example, a standard Monday-Friday schedule has saturdayIn: null and sundayIn: null, making Saturday and Sunday rest days.

Time Snap to Schedule

When an employee clocks in, the system snaps the recorded time to the scheduled time-in/time-out. This prevents minor clock variations from causing false late/undertime records.

Grace Period

The grace period determines how many minutes after the scheduled time-in an employee can arrive without being marked late.

  • Company default: Set in company settings (gracePeriodMinutes, default: 0)
  • Per-schedule override: Each WorkSchedule has an optional gracePeriodMinutes field that overrides the company default

Example: If the schedule is 8:00 AM with a 15-minute grace period, an employee arriving at 8:14 AM is not late. An employee arriving at 8:16 AM is late by 16 minutes.

Recording Attendance

Manual Entry

HR staff can manually enter attendance records through the admin attendance page. This is used for:

  • Correcting missed clock-ins/outs
  • Entering records from manual timesheets
  • Recording attendance for locations without biometric devices

Bulk Upload

For companies using external time-keeping systems (biometric scanners, access cards), attendance records can be bulk uploaded via CSV import. The CSV should include employee number, date, time-in, and time-out.

Employee Self-Service

Employees can view their attendance records through ESS → Attendance (/ess/attendance). The ESS portal shows:

  • Monthly attendance summary
  • Daily time records with late/undertime/absent flags
  • Leave days marked in the calendar

Absence Detection

TalinoHR includes an automatic absence detector that identifies employees who should have worked but have no attendance record.

How It Works

The absence detector (lib/attendance/absence-detector.ts) runs for a date range and:

  1. Fetches all active employees with assigned work schedules
  2. For each employee, checks each date in the range
  3. Determines if the date is a workday (has scheduled hours for that day of the week)
  4. Skips holidays and rest days
  5. If no attendance record exists for a workday, creates one with isAbsent: true and absenceReason: "AWOL" (Absent Without Leave)

What Gets Skipped

  • Rest days - Days without scheduled hours per the work schedule
  • Holidays - Dates matching company holidays (national or location-specific)
  • Existing records - Days that already have an attendance record (including leave days)
  • Separated employees - Employees with status RESIGNED, TERMINATED, or RETIRED
  • Employees without schedules - Employees not assigned to any work schedule

Running Absence Detection

Absence detection can be triggered for a specific date range. It is typically run after the pay period closes to ensure all absences are captured before payroll computation.

Overtime Management

Filing Overtime

Employees file overtime requests through ESS → Overtime (/ess/overtime):

  1. Select the date of overtime work
  2. Enter the number of overtime hours
  3. Provide a reason/description
  4. Submit the application

The system checks for duplicate overtime applications on the same date to prevent double-filing.

Admin Overtime

HR/managers can view and manage overtime applications from the admin overtime page at Overtime (/overtime). The admin view shows:

  • Employee name and number
  • Date, hours, and reason
  • Current status (PENDING, APPROVED, REJECTED)

Overtime Approval

Overtime applications follow the status flow:

PENDING -> APPROVED or REJECTED

When an overtime application is approved:

  • The overtimeMinutes field on the corresponding attendance record is updated (for display purposes)
  • The payroll engine reads approved OvertimeApplication records directly when computing overtime pay

When rejected:

  • The rejection reason is stored in the remarks field
  • The application remains in the system for audit purposes

Overtime Pay Computation

The payroll engine computes overtime pay using DOLE-mandated multipliers based on the day type:

Day TypeOT Multiplier
Ordinary day125% of hourly rate
Rest day130% of hourly rate
Special non-working holiday130% of hourly rate
Special non-working holiday + rest day150% of hourly rate
Regular holiday200% of hourly rate
Regular holiday + rest day260% of hourly rate

Overtime Rounding

Overtime hours are rounded based on the company's overtimeRoundingMinutes setting (default: 15 minutes). For example, with 15-minute rounding, 1 hour and 22 minutes of overtime is rounded to 1 hour and 15 minutes.

Night Differential

Night shift differential (NSD) applies to work performed between 10:00 PM and 6:00 AM.

NSD Rate

The base NSD rate is 10% of the hourly rate. However, NSD stacks on the day-type multiplier:

  • Ordinary day NSD: hourlyRate x 10%
  • Rest day NSD: hourlyRate x 130% x 10%
  • Regular holiday NSD: hourlyRate x 200% x 10%

This means an employee working a night shift on a regular holiday earns NSD based on the holiday rate, not just the ordinary rate.

NSD Computation

The payroll engine automatically detects night hours from attendance records (hours between 22:00 and 06:00) and computes NSD pay based on the applicable day-type multiplier for that date.

Payroll Integration

Attendance Deductions

During payroll computation (Steps 3-4 of the engine), attendance records drive deductions:

  • Late minutes: Converted to an hourly-rate deduction
  • Undertime minutes: Same as late
  • Absent days: Full-day or half-day deduction at the daily rate
  • Unpaid leave: Leave on unpaid leave types counted as absent days

Attendance records marked with isOnLeave: true where the leave type is paid are completely skipped by the payroll engine. No deduction is made.

Payroll Lock

Once a payroll run has been computed for a period, attendance records for that period are locked. This prevents changes to attendance data from creating inconsistencies with the already-computed payroll items.

To make attendance corrections after computation, you must:

  1. Make the corrections to attendance records
  2. Recompute the payroll run to recalculate based on updated attendance

Holiday Pay Integration

Attendance records are checked during holiday pay computation:

  • The engine determines if an employee worked on a holiday based on whether a time-in exists
  • Rest day status is checked from the attendance record's isRestDay flag
  • The day-before-holiday rule (Art. 94) checks the nearest preceding workday's attendance to determine holiday pay eligibility

Common Issues

Employee Marked Absent on a Holiday

Ensure the holiday is properly configured in the system for the employee's location. National holidays apply to all locations; local holidays need to be assigned to the specific location.

Grace Period Not Working

Check two things:

  1. The company's gracePeriodMinutes setting
  2. The employee's work schedule gracePeriodMinutes override (takes precedence if set)

Overtime Not Reflected in Payroll

The payroll engine reads approved OvertimeApplication records, not the overtimeMinutes field on attendance records. Ensure the overtime application exists and has been approved.

Incorrect Late Minutes

Verify the employee's work schedule time-in setting. Late minutes are computed as the difference between actual time-in and scheduled time-in, minus the applicable grace period.