38960-vm/api/biometric_push.php
Flatlogic Bot f62878214d add HR
2026-03-22 06:48:07 +00:00

91 lines
3.1 KiB
PHP

<?php
header('Content-Type: application/json');
require_once __DIR__ . '/../db/config.php';
try {
$pdo = db();
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Database connection failed']);
exit;
}
// Read input
$input = file_get_contents('php://input');
$data = json_decode($input, true);
if (!$data) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Invalid JSON']);
exit;
}
// Basic Auth (API Key)
// In production, check against biometric_devices table
$api_key = $data['api_key'] ?? '';
if ($api_key !== 'test_key') {
// Check DB
$stmt = $pdo->prepare("SELECT id FROM biometric_devices WHERE api_key = ? AND status = 1");
$stmt->execute([$api_key]);
if (!$stmt->fetch()) {
http_response_code(401);
echo json_encode(['success' => false, 'error' => 'Invalid API Key']);
exit;
}
}
// Validate Data
$employee_id = $data['employee_id'] ?? null;
$timestamp = $data['timestamp'] ?? date('Y-m-d H:i:s'); // ISO 8601 or Y-m-d H:i:s
$type = $data['type'] ?? 'check_in'; // check_in or check_out
if (!$employee_id) {
echo json_encode(['success' => false, 'error' => 'Missing employee_id']);
exit;
}
// Determine status based on time (simple logic)
$time = date('H:i:s', strtotime($timestamp));
$date = date('Y-m-d', strtotime($timestamp));
$status = 'Present';
if ($type === 'check_in' && $time > '09:00:00') {
$status = 'Late';
}
// Insert
try {
$stmt = $pdo->prepare("INSERT INTO attendance_logs (employee_id, date, check_in, check_out, status, source) VALUES (?, ?, ?, ?, ?, 'Biometric Device')");
$check_in = ($type === 'check_in') ? date('Y-m-d H:i:s', strtotime($timestamp)) : null;
$check_out = ($type === 'check_out') ? date('Y-m-d H:i:s', strtotime($timestamp)) : null;
// Check if entry exists for this date to update instead of insert?
// For simplicity, we just insert logs. A real system might merge them.
// Let's try to find an existing log for today
$existing = $pdo->prepare("SELECT id FROM attendance_logs WHERE employee_id = ? AND date = ? ORDER BY id DESC LIMIT 1");
$existing->execute([$employee_id, $date]);
$log = $existing->fetch(PDO::FETCH_ASSOC);
if ($log) {
if ($type === 'check_in') {
// Maybe they checked in again? Update check_in if null
$upd = $pdo->prepare("UPDATE attendance_logs SET check_in = ? WHERE id = ? AND check_in IS NULL");
$upd->execute([$check_in, $log['id']]);
} else {
// Check out
$upd = $pdo->prepare("UPDATE attendance_logs SET check_out = ? WHERE id = ?");
$upd->execute([$check_out, $log['id']]);
}
$msg = "Updated existing log";
} else {
$stmt->execute([$employee_id, $date, $check_in, $check_out, $status]);
$msg = "Created new log";
}
echo json_encode(['success' => true, 'message' => $msg]);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => $e->getMessage()]);
}