hours if ($project_id && $employee_id && !empty($days)) { $db = db(); foreach ($days as $date => $hours) { $hours = (float)$hours; if ($hours <= 0) continue; $stmt = $db->prepare("INSERT INTO labour_entries (tenant_id, project_id, employee_id, entry_date, hours, labour_type_id, evidence_type_id, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$tenant_id, $project_id, $employee_id, $date, $hours, $labour_type_id, $evidence_type_id, $notes]); } $stmt = $db->prepare("INSERT INTO activity_log (tenant_id, action, details) VALUES (?, ?, ?)"); $stmt->execute([$tenant_id, 'Bulk Labour Added', "Logged hours for employee ID $employee_id via bulk entry"]); header("Location: labour.php?success=1"); exit; } } if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_labour'])) { $project_id = (int)($_POST['project_id'] ?? 0); $employee_ids = isset($_POST['employee_ids']) ? array_map('intval', $_POST['employee_ids']) : []; if (empty($employee_ids) && isset($_POST['employee_id'])) { $employee_ids = [(int)$_POST['employee_id']]; } $entry_date = $_POST['entry_date'] ?? date('Y-m-d'); $hours = (float)($_POST['hours'] ?? 0); $labour_type_id = (int)($_POST['labour_type_id'] ?? 0); $evidence_type_id = (int)($_POST['evidence_type_id'] ?? 0); $notes = $_POST['notes'] ?? ''; if ($project_id && !empty($employee_ids) && $hours > 0) { $db = db(); foreach ($employee_ids as $employee_id) { $stmt = $db->prepare("INSERT INTO labour_entries (tenant_id, project_id, employee_id, entry_date, hours, labour_type_id, evidence_type_id, notes) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$tenant_id, $project_id, $employee_id, $entry_date, $hours, $labour_type_id, $evidence_type_id, $notes]); $labour_entry_id = (int)$db->lastInsertId(); // Handle File Uploads (only for the first one or all? Usually all if it's a team entry) if (!empty($_FILES['attachments']['name'][0])) { foreach ($_FILES['attachments']['tmp_name'] as $key => $tmp_name) { if ($_FILES['attachments']['error'][$key] === UPLOAD_ERR_OK) { $file_name = $_FILES['attachments']['name'][$key]; $file_size = $_FILES['attachments']['size'][$key]; $mime_type = $_FILES['attachments']['type'][$key]; $file_ext = pathinfo($file_name, PATHINFO_EXTENSION); $new_file_name = uniqid() . '.' . $file_ext; $file_path = 'uploads/' . $new_file_name; if (!is_dir('uploads')) mkdir('uploads', 0775, true); if (move_uploaded_file($tmp_name, $file_path)) { $stmt = $db->prepare("INSERT INTO attachments (tenant_id, entity_type, entity_id, file_name, file_path, file_size, mime_type, uploaded_by) VALUES (?, 'labour_entry', ?, ?, ?, ?, ?, ?)"); $stmt->execute([$tenant_id, $labour_entry_id, $file_name, $file_path, $file_size, $mime_type, $currentUserName]); } } } } } $stmt = $db->prepare("INSERT INTO activity_log (tenant_id, action, details) VALUES (?, ?, ?)"); $stmt->execute([$tenant_id, 'Labour Added', "Logged $hours hours for " . count($employee_ids) . " employee(s)"]); header("Location: labour.php?success=1"); exit; } } // Fetch Data $labourEntries = db()->prepare(" SELECT le.*, p.name as project_name, e.name as employee_name, lt.name as labour_type, et.name as evidence_type FROM labour_entries le JOIN projects p ON le.project_id = p.id JOIN employees e ON le.employee_id = e.id LEFT JOIN labour_types lt ON le.labour_type_id = lt.id LEFT JOIN evidence_types et ON le.evidence_type_id = et.id WHERE le.tenant_id = ? ORDER BY le.entry_date DESC, le.created_at DESC "); $labourEntries->execute([$tenant_id]); $labourList = $labourEntries->fetchAll(); $projects = db()->prepare("SELECT id, name FROM projects WHERE tenant_id = ? AND is_archived = 0 ORDER BY name"); $projects->execute([$tenant_id]); $projectList = $projects->fetchAll(); $employees = db()->prepare("SELECT id, first_name, last_name FROM employees WHERE tenant_id = ? ORDER BY first_name, last_name"); $employees->execute([$tenant_id]); $employeeList = $employees->fetchAll(); $labourTypes = db()->prepare("SELECT * FROM labour_types WHERE tenant_id = ? ORDER BY name"); $labourTypes->execute([$tenant_id]); $labourTypeList = $labourTypes->fetchAll(); $evidenceTypes = db()->prepare("SELECT * FROM evidence_types WHERE tenant_id = ? ORDER BY name"); $evidenceTypes->execute([$tenant_id]); $evidenceTypeList = $evidenceTypes->fetchAll(); // Find current employee (mocked as user_id 1) $currentUser = db()->prepare("SELECT name FROM users WHERE id = 1"); $currentUser->execute(); $currentUserName = $currentUser->fetchColumn() ?: 'System'; $currentEmployeeStmt = db()->prepare("SELECT id FROM employees WHERE user_id = 1 AND tenant_id = ?"); $currentEmployeeStmt->execute([$tenant_id]); $currentEmployeeId = $currentEmployeeStmt->fetchColumn() ?: null; $teams = db()->prepare("SELECT * FROM teams WHERE tenant_id = ? ORDER BY name"); $teams->execute([$tenant_id]); $teamList = $teams->fetchAll(); $teamMembers = db()->prepare("SELECT * FROM employee_teams WHERE tenant_id = ?"); $teamMembers->execute([$tenant_id]); $teamMemberList = $teamMembers->fetchAll(); // Group by team $teamMembersGrouped = []; foreach ($teamMemberList as $tm) { $teamMembersGrouped[$tm['team_id']][] = $tm['employee_id']; } $pageTitle = "SR&ED Manager - Labour Tracking"; include __DIR__ . '/includes/header.php'; ?>

Labour Tracking

Date Employee Project Hours Type / Evidence Notes Actions
No labour entries found.
h