prepare("INSERT INTO projects (tenant_id, name, code, start_date, owner_id, estimated_completion_date, type, estimated_hours) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"); $stmt->execute([$tenant_id, $name, $code, $start_date, $owner_id, $est_completion, $type, $est_hours]); $stmt = db()->prepare("INSERT INTO activity_log (tenant_id, action, details) VALUES (?, ?, ?)"); $stmt->execute([$tenant_id, 'Project Created', "Added project: $name ($code)"]); header("Location: projects.php?success=1"); exit; } } // Fetch Data $search = $_GET['search'] ?? ''; $status_filter = $_GET['status'] ?? ''; $date_preset = $_GET['date_preset'] ?? ''; $start_from = $_GET['start_from'] ?? ''; $start_to = $_GET['start_to'] ?? ''; $query = " SELECT p.*, CONCAT(e.first_name, ' ', e.last_name) as owner_name, COALESCE((SELECT SUM(hours) FROM labour_entries WHERE project_id = p.id), 0) as total_hours FROM projects p LEFT JOIN employees e ON p.owner_id = e.id WHERE p.tenant_id = ?"; $params = [$tenant_id]; if ($search) { $query .= " AND (p.name LIKE ? OR p.code LIKE ?)"; $params[] = "%$search%"; $params[] = "%$search%"; } if ($status_filter) { $query .= " AND p.status = ?"; $params[] = $status_filter; } if ($date_preset && $date_preset !== 'custom') { switch ($date_preset) { case 'today': $query .= " AND p.start_date = CURRENT_DATE"; break; case 'this_week': $query .= " AND p.start_date >= DATE_SUB(CURRENT_DATE, INTERVAL WEEKDAY(CURRENT_DATE) DAY)"; break; case 'last_week': $query .= " AND p.start_date >= DATE_SUB(CURRENT_DATE, INTERVAL WEEKDAY(CURRENT_DATE) + 7 DAY) AND p.start_date < DATE_SUB(CURRENT_DATE, INTERVAL WEEKDAY(CURRENT_DATE) DAY)"; break; case 'this_month': $query .= " AND p.start_date >= DATE_FORMAT(CURRENT_DATE, '%Y-%m-01')"; break; case 'last_month': $query .= " AND p.start_date >= DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 MONTH), '%Y-%m-01') AND p.start_date < DATE_FORMAT(CURRENT_DATE, '%Y-%m-01')"; break; case 'this_year': $query .= " AND p.start_date >= DATE_FORMAT(CURRENT_DATE, '%Y-01-01')"; break; case 'last_year': $query .= " AND p.start_date >= DATE_FORMAT(DATE_SUB(CURRENT_DATE, INTERVAL 1 YEAR), '%Y-01-01') AND p.start_date < DATE_FORMAT(CURRENT_DATE, '%Y-01-01')"; break; } } elseif ($date_preset === 'custom' && $start_from && $start_to) { $query .= " AND p.start_date BETWEEN ? AND ?"; $params[] = $start_from; $params[] = $start_to; } $query .= " ORDER BY p.created_at DESC"; $projects = db()->prepare($query); $projects->execute($params); $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(); $pageTitle = "SR&ED Manager - Projects"; include __DIR__ . '/includes/header.php'; ?>
| Project Name | Owner | Type | Hours (Logged/Est) | Variance | Status | Actions |
|---|---|---|---|---|---|---|
| No projects found. | ||||||
= htmlspecialchars($p['name']) ?>= htmlspecialchars($p['code']) ?>
|
= htmlspecialchars($p['owner_name'] ?: 'Unassigned') ?> | = $p['type'] ?> | = number_format($total_hours, 1) ?> / = number_format($est_hours, 1) ?> | = ($variance >= 0 ? '+' : '') . number_format($variance, 1) ?> | = ucfirst(str_replace('_', ' ', $p['status'])) ?> | |