diff --git a/public/index.php b/public/index.php index ed4385c..4509085 100644 --- a/public/index.php +++ b/public/index.php @@ -119,7 +119,7 @@ if ($route === 'saved_filter_save') { if (($_SERVER['REQUEST_METHOD'] ?? 'GET') !== 'POST') { http_response_code(405); exit('Save requires POST'); } verify_csrf(); $name = trim(scalar_input($_POST['filter_name'] ?? null)); if ($name === '' || mb_strlen($name) > 120) { http_response_code(400); exit('Filter name is required.'); } - $filterJson = json_encode(['q' => trim(scalar_input($_POST['q'] ?? null)), 'status_filter' => scalar_input($_POST['status_filter'] ?? 'open')], JSON_THROW_ON_ERROR); + $filterJson = json_encode(['q' => trim(scalar_input($_POST['q'] ?? null)), 'status_filter' => scalar_input($_POST['status_filter'] ?? 'open'), 'technician_id' => filter_var(scalar_input($_POST['technician_id'] ?? null), FILTER_VALIDATE_INT) ?: null], JSON_THROW_ON_ERROR); db()->prepare('INSERT INTO saved_filters (user_id, name, route, filter_json) VALUES (:user, :name, :route, :filters) ON DUPLICATE KEY UPDATE filter_json = VALUES(filter_json)')->execute(['user' => $user['id'], 'name' => $name, 'route' => 'jobcards', 'filters' => $filterJson]); header('Location: /?route=jobcards&saved=1'); exit; } @@ -442,7 +442,9 @@ if ($route === 'jobcards') { $search = trim(scalar_input($_GET['q'] ?? ($_SESSION['jobcard_filters']['q'] ?? null))); $statusFilter = scalar_input($_GET['status_filter'] ?? ($_SESSION['jobcard_filters']['status_filter'] ?? null), 'open'); if (!in_array($statusFilter, ['open', 'in_progress', 'assigned', 'closed'], true)) $statusFilter = 'open'; - $_SESSION['jobcard_filters'] = ['q' => $search, 'status_filter' => $statusFilter]; + $technicianFilter = filter_var(scalar_input($_GET['technician_id'] ?? ($_SESSION['jobcard_filters']['technician_id'] ?? null)), FILTER_VALIDATE_INT, ['options' => ['min_range' => 1]]); + if ($technicianFilter === false) $technicianFilter = null; + $_SESSION['jobcard_filters'] = ['q' => $search, 'status_filter' => $statusFilter, 'technician_id' => $technicianFilter]; $page = max(1, (int)filter_var(scalar_input($_GET['page'] ?? null), FILTER_VALIDATE_INT)); $offset = ($page - 1) * 25; $savedFilterStmt = db()->prepare('SELECT id, name, filter_json FROM saved_filters WHERE user_id = :user AND route = :route ORDER BY name'); $savedFilterStmt->execute(['user' => $user['id'], 'route' => 'jobcards']); $savedFilters = $savedFilterStmt->fetchAll(); @@ -452,6 +454,8 @@ if ($route === 'jobcards') { if ($statusFilter === 'closed') { $conditions[] = "j.status = 'closed'"; } elseif ($statusFilter === 'in_progress') { $conditions[] = "j.status = 'in_progress'"; } elseif ($statusFilter === 'assigned') { $conditions[] = "j.status = 'assigned'"; } else { $conditions[] = "j.status <> 'closed'"; } $scopeJoin = ''; if ($user['role_name'] === 'Technician') { $scopeJoin = ' JOIN jobcard_assignments ja ON ja.jobcard_id = j.id AND ja.user_id = ?'; array_unshift($params, (int)$user['id']); } + elseif ($technicianFilter !== null) { $scopeJoin = ' JOIN jobcard_assignments ja_filter ON ja_filter.jobcard_id = j.id AND ja_filter.user_id = ?'; array_unshift($params, $technicianFilter); } + $technicianOptions = $user['role_name'] === 'Technician' ? [] : db()->query("SELECT u.id, u.name FROM users u JOIN roles r ON r.id = u.role_id WHERE u.is_active = 1 AND r.name = 'Technician' ORDER BY u.name")->fetchAll(); if ($user['role_name'] === 'Technician') { $clientListForJobcard = db()->prepare("SELECT DISTINCT c.id, c.name FROM clients c JOIN jobcards j ON j.client_id = c.id JOIN jobcard_assignments ja ON ja.jobcard_id = j.id AND ja.user_id = :user WHERE c.status = 'active' ORDER BY c.name"); $clientListForJobcard->execute(['user' => $user['id']]); @@ -468,12 +472,12 @@ if ($route === 'jobcards') { echo ''; if (isset($_GET['created'])) echo '
Jobcard created successfully.
'; if ($errors) echo '
' . e(implode(' ', $errors)) . '
'; - echo '
My open jobsAssignedIn progressClosed
'; foreach ($savedFilters as $saved) { $savedData = json_decode((string)$saved['filter_json'], true); if (is_array($savedData)) echo '' . e($saved['name']) . ''; } echo '
'; + echo '
My open jobsAssignedIn progressClosed
'; foreach ($savedFilters as $saved) { $savedData = json_decode((string)$saved['filter_json'], true); if (is_array($savedData)) echo '' . e($saved['name']) . ''; } echo '
'; if (can('jobcards.manage')) { echo '

Create jobcard

'; } echo '
'; if (!$jobcards) echo ''; foreach ($jobcards as $jobcard) echo ''; - echo '
ReferenceClientPriorityStatusWork requestedCreated
No jobcards found.
' . e($jobcard['reference_no']) . '' . e($jobcard['client_name']) . '' . e(ucfirst($jobcard['priority'])) . '' . e(ucwords(str_replace('_', ' ', $jobcard['status']))) . '' . e($jobcard['work_requested']) . '' . e($jobcard['created_at']) . '
PreviousNext
'; + echo '
PreviousNext
'; render_footer(); exit; }