Attendance — Production Guide
Licensing
- Catalog slug:
attendance - Category:
hr,sort_order = 30 - Free Marketplace opt-in
- Hard dependency on
employees(add_attendance_employees_dependency) - Current catalog version: 1.10.0 (holidays + auto-absent; prior 1.9.0 month matrix + export; 1.8.0 digest report recipients; 1.7.0 backdate permission)
Bootstrap
- Ensure Employees schema + catalog exist
- Migrate
attendance_records+attendance_reasons(+ check-in reason / work_mode columns) - Register module + permissions + dependency row
- Deploy Attendance UI under HR
Timezone
Self check-in “today”, the HH:MM timer, late classification, month matrix bounds, and daily digest send times use Settings → General → Timezone (same convention as Daily Reminder Time, meetings, and task/follow-up dues). Office start/end, remote start, late report time, and yesterday report time are workspace-local H:i values — not server UTC. See Workspace timezone convention.
Deploy checklist (1.10.0)
- Migrate through
2026_10_14_173200(attendance_holidays+ catalog attendance → 1.10.0). Do notdb:seed. - Smoke: Settings → Attendance → Manage holidays; Month day-header mark/clear holiday; past work day without record shows Absent; holiday shows H and is not deducted on a pay run
- Pest:
tests/Feature/Tenant/Attendance/AttendanceHolidayAndMatrixInferenceTest.php,AttendanceMatrixTest.php,PayPeriodCalculatorTest.php - Readiness: Attendance holidays + auto-absent 1.10.0
Deploy checklist (1.9.0)
- Migrate through
2026_10_14_205701(grantattendance.exportto default admin/manager + catalog attendance → 1.9.0) - Confirm default roles: admin + manager have
attendance.export; staff does not - Smoke: Month view shows employee×day grid; Export CSV/XLSX downloads
attendance_MM_YYYY.*; staff without export gets 403 on/attendance-records/export - Pest:
tests/Feature/Tenant/Attendance/AttendanceMatrixTest.php - Readiness: Attendance month matrix 1.9.0
Deploy checklist (1.7.0)
- Migrate through
2026_10_08_203346(grantattendance.backdateto default admin/manager + catalog attendance → 1.7.0) - Confirm default roles: admin + manager have
attendance.backdate; staff does not - Smoke: staff manual create accepts today only and rejects yesterday; owner/admin can create past dates; staff with
attendance.backdatecan create past dates - Pest:
tests/Feature/Tenant/Attendance/AttendanceBackdateTest.php
Deploy checklist (1.6.0)
- Migrate through
2026_10_03_003500(catalog attendance → 1.6.0) - Confirm scheduler runs
attendance:send-daily-reportsevery 5 minutes (withoutOverlapping,onOneServer) andemailsqueue workers are healthy - Smoke: two departments with managers + late employees → department manager A only sees/receives A’s team; Owner sees all; Spatie
managerwithoutmanager_iddoes not get digests and is self-scoped on list - Pest:
tests/Feature/Tenant/Attendance/AttendanceDailyReportDigestTest.php,AttendanceTest.phpdepartment-scope cases - Readiness: Attendance department-scoped 1.6.0
- After Pulse slow-path indexes ship: migrate
2026_10_02_203742_add_attendance_records_list_stats_indexes(list/stats/today date predicates) — Pulse slow-path readiness
Deploy checklist (1.5.0)
- Migrate through
2026_09_30_013600(catalog attendance → 1.5.0) - Confirm scheduler runs
attendance:send-daily-reportsevery 5 minutes (withoutOverlapping,onOneServer) andemailsqueue workers are healthy - Settings → Attendance: optionally enable Daily late report email / Yesterday’s attendance email and set send times
- Smoke: create late + open checkout records → advance test clock past send time →
php artisan attendance:send-daily-reports→ owner receives digests once - Pest:
tests/Feature/Tenant/Attendance/AttendanceDailyReportDigestTest.php
Deploy checklist (1.2.0)
- Run migrations through
2026_08_28_203200(reasons table, record columns, catalog bump) and2026_08_29_003000(attendance.force.deletegrant for admin defaults) - Confirm Marketplace blocks install when Employees is missing
- Confirm default roles: staff has
attendance.create+attendance.update; admin hasattendance.force.delete - Smoke:
- Enable Employees + Attendance
- Linked user: Check in (on-site/remote) → timer survives reload → Check out
- Late path: Other requires free text
- Settings: self-check toggle, auto-login (default off), remote grace
- When Auto check-in on login is on and Require late check-in reason is on, late logins do not auto check-in (staff must use explicit Check in with a reason)
- Pest:
tests/Feature/Tenant/Attendance - Playwright:
npm run test:e2e:attendance(modules suite; authz may skip on pre-entitled demo) - Production Readiness · Security Audit
Related Payroll 1.2.0
If shipping My salary slips in the same release: migrate 2026_08_28_204000 (payroll.view_own + payroll catalog 1.2.0) and smoke My salary slips PDF download for a linked staff user.