38471-vm/api/biometric_sync.php
2026-02-18 02:09:29 +00:00

102 lines
3.8 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/../db/config.php';
header('Content-Type: application/json');
// Biometric devices usually send data via POST
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data || !is_array($data)) {
echo json_encode(['success' => false, 'error' => 'Invalid JSON input']);
exit;
}
/*
Expected format:
[
{"biometric_id": "101", "timestamp": "2026-02-17 08:05:00", "type": "in"},
{"biometric_id": "101", "timestamp": "2026-02-17 17:05:00", "type": "out"}
]
*/
$db = db();
$success_count = 0;
$errors = [];
try {
foreach ($data as $log) {
$biometric_id = $log['biometric_id'] ?? null;
$device_id = $log['device_id'] ?? null;
$timestamp = $log['timestamp'] ?? null;
$type_input = $log['type'] ?? 'unknown';
$type = 'unknown';
if (in_array(strtolower($type_input), ['in', 'check_in', 'entry'])) $type = 'check_in';
if (in_array(strtolower($type_input), ['out', 'check_out', 'exit'])) $type = 'check_out';
if (!$biometric_id || !$timestamp) {
continue;
}
// Find employee
$stmt = $db->prepare("SELECT id FROM hr_employees WHERE biometric_id = ?");
$stmt->execute([$biometric_id]);
$employee_id = $stmt->fetchColumn() ?: null;
// Insert into raw logs
$stmt = $db->prepare("INSERT INTO hr_biometric_logs (biometric_id, device_id, employee_id, timestamp, type) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$biometric_id, $device_id, $employee_id, $timestamp, $type]);
$log_id = $db->lastInsertId();
if ($employee_id) {
$date = date('Y-m-d', strtotime($timestamp));
$time = date('H:i:s', strtotime($timestamp));
// Logic to update hr_attendance
// If it's the first log of the day, it's clock_in.
// If it's another log, it might be clock_out.
$stmt = $db->prepare("SELECT id, clock_in, clock_out FROM hr_attendance WHERE employee_id = ? AND attendance_date = ?");
$stmt->execute([$employee_id, $date]);
$attendance = $stmt->fetch();
if (!$attendance) {
// First entry of the day
$stmt = $db->prepare("INSERT INTO hr_attendance (employee_id, attendance_date, status, clock_in) VALUES (?, ?, 'present', ?)");
$stmt->execute([$employee_id, $date, $time]);
} else {
// Update existing entry.
// Simple logic: if new time is earlier than clock_in, update clock_in.
// If new time is later than clock_out (or clock_out is null), update clock_out.
$current_in = $attendance['clock_in'];
$current_out = $attendance['clock_out'];
if ($time < $current_in) {
$stmt = $db->prepare("UPDATE hr_attendance SET clock_in = ? WHERE id = ?");
$stmt->execute([$time, $attendance['id']]);
} elseif (!$current_out || $time > $current_out) {
$stmt = $db->prepare("UPDATE hr_attendance SET clock_out = ? WHERE id = ?");
$stmt->execute([$time, $attendance['id']]);
}
}
// Mark log as processed
$db->prepare("UPDATE hr_biometric_logs SET processed = 1 WHERE id = ?")->execute([$log_id]);
$success_count++;
} else {
$errors[] = "Employee with Biometric ID $biometric_id not found.";
}
}
echo json_encode([
'success' => true,
'message' => "Processed $success_count logs.",
'errors' => $errors
]);
} catch (Exception $e) {
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}