prepare("INSERT INTO projects (tenant_id, name, code, start_date) VALUES (?, ?, ?, ?)"); $stmt->execute([$tenant_id, $name, $code, $start_date]); // Log Activity $stmt = db()->prepare("INSERT INTO activity_log (tenant_id, action, details) VALUES (?, ?, ?)"); $stmt->execute([$tenant_id, 'Project Created', "Added project: $name ($code)"]); header("Location: index.php?success=1"); exit; } } // Handle Add Labour if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_labour'])) { $project_id = (int)($_POST['project_id'] ?? 0); $employee_id = (int)($_POST['employee_id'] ?? 0); $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 && $employee_id && $hours > 0) { $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 if (!empty($_FILES['attachments']['name'][0])) { foreach ($_FILES['attachments']['tmp_name'] as $key => $tmp_name) { $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 (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) VALUES (?, 'labour_entry', ?, ?, ?, ?, ?)"); $stmt->execute([$tenant_id, $labour_entry_id, $file_name, $file_path, $file_size, $mime_type]); } } } // Log Activity $stmt = db()->prepare("INSERT INTO activity_log (tenant_id, action, details) VALUES (?, ?, ?)"); $stmt->execute([$tenant_id, 'Labour Added', "Logged $hours hours for employee ID $employee_id"]); header("Location: index.php?success=labour"); exit; } } // Fetch Data $projects = db()->prepare("SELECT * FROM projects WHERE tenant_id = ? ORDER BY created_at DESC"); $projects->execute([$tenant_id]); $projectList = $projects->fetchAll(); $employees = db()->prepare("SELECT * FROM employees WHERE tenant_id = ? ORDER BY 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(); $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(); $activities = db()->prepare("SELECT * FROM activity_log WHERE tenant_id = ? ORDER BY created_at DESC LIMIT 10"); $activities->execute([$tenant_id]); $activityList = $activities->fetchAll(); $projectDescription = $_SERVER['PROJECT_DESCRIPTION'] ?? 'SR&ED Project Tracking Software'; ?> SR&ED Manager - Dashboard
Active Projects
Project Name Code Start Date Status Actions
No projects found. Start by adding one.
Recent Labour Entries
Date Employee Project Hours Type / Evidence Actions
h
No labour entries found.
Activity Hub