From a1695010f1894cfb253565bee986a787cba7866a Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 28 May 2026 12:12:23 +0800 Subject: [PATCH] fix: allow bulk sync overwrite to process already-synced biometric records and respect active filters --- .../BiometricAttendanceController.php | 16 ++++++++++++++-- .../js/pages/hr/biometric-attendance/index.tsx | 7 ++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/BiometricAttendanceController.php b/app/Http/Controllers/BiometricAttendanceController.php index 671caa08a..c1fa1275b 100644 --- a/app/Http/Controllers/BiometricAttendanceController.php +++ b/app/Http/Controllers/BiometricAttendanceController.php @@ -163,8 +163,20 @@ class BiometricAttendanceController extends Controller $overwrite = $request->boolean('overwrite', false); - // Fetch all pending records - $pendingRecords = \App\Models\BiometricAttendance::where('sync_status', 'pending')->get(); + $query = \App\Models\BiometricAttendance::query(); + + if (!$overwrite) { + $query->where('sync_status', 'pending'); + } + + if ($request->has('start_date') && !empty($request->start_date)) { + $query->whereDate('punch_time', '>=', $request->start_date); + } + if ($request->has('end_date') && !empty($request->end_date)) { + $query->whereDate('punch_time', '<=', $request->end_date); + } + + $pendingRecords = $query->get(); $groupedAttendances = $pendingRecords->groupBy(function ($item) { return $item->biometric_emp_id . '_' . $item->punch_time->format('Y-m-d'); diff --git a/resources/js/pages/hr/biometric-attendance/index.tsx b/resources/js/pages/hr/biometric-attendance/index.tsx index 5c813ba53..fe54ac81a 100755 --- a/resources/js/pages/hr/biometric-attendance/index.tsx +++ b/resources/js/pages/hr/biometric-attendance/index.tsx @@ -342,7 +342,12 @@ export default function BiometricAttendance() { onClick={() => { setShowConfirmModal(false); toast.loading(t('Syncing biometric data... This may take a moment.')); - router.post(route('hr.biometric-attendance.sync-all'), { overwrite }, { + router.post(route('hr.biometric-attendance.sync-all'), { + overwrite, + start_date: startDate || undefined, + end_date: endDate || undefined, + search: searchTerm || undefined + }, { onSuccess: (page) => { toast.dismiss(); if (page.props.flash.success) {