Add Employee Timeclock feature with kiosk, attendance report, and payroll CSV export

- New EmployeeClockEntry entity (facility-level attendance, separate from job time entries)
- KioskPin added to ApplicationUser; TimeclockKioskToken added to Company
- TimeclockController: clock in/out, who's in, 14-day history, manager edit/delete,
  tablet kiosk with device-cookie auth, PIN management via Users edit page
- Kiosk UI: employee tile grid + 4-digit PIN pad + auto-detect clock-in vs clock-out
- Attendance report at /Reports/Attendance with weekly subtotal rows
- Payroll CSV export at /Reports/AttendanceCsv (flat, one row per segment)
- AllowCustomFormulas wired through PlatformSubscriptionController + subscription views
- Fix soft-delete bug on CustomItemTemplate (missing HasQueryFilter in OnModelCreating)
- Help article (Help/Timeclock.cshtml) and AI knowledge base updated
- Migrations: AddEmployeeTimeclock, AddTimeclockKioskToken

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-26 19:53:13 -04:00
parent f625be01a3
commit 6c2fe6e1c4
40 changed files with 24125 additions and 16 deletions
@@ -97,6 +97,7 @@
<tr>
<th>Plan</th>
<th class="text-center">Online Payments (Stripe Connect)</th>
<th class="text-center">Custom Formula Templates</th>
</tr>
</thead>
<tbody>
@@ -114,12 +115,23 @@
title="Toggle online payment capability for @p.DisplayName plan" />
</div>
</td>
<td class="text-center">
<div class="form-check form-switch d-inline-block mb-0">
<input class="form-check-input plan-feature-toggle"
type="checkbox" role="switch"
data-plan-id="@p.Id"
data-feature="AllowCustomFormulas"
@(p.AllowCustomFormulas ? "checked" : "")
title="Toggle custom formula templates for @p.DisplayName plan" />
</div>
</td>
</tr>
}
</tbody>
</table>
<div class="px-3 py-2 text-muted" style="font-size:0.75rem;">
Changes take effect immediately. Companies on a plan with Online Payments enabled can connect their Stripe account in Company Settings.
Custom Formula Templates allow companies to define reusable pricing formulas in Company Settings &rarr; Custom Formulas.
</div>
</div>
</div>