from the "assigned to you" * notifications, as well as ?assigned_agent=. */ // Default Column Sortby Filter $sort = "recurring_ticket_next_run"; $order = "ASC"; // If client_id is in URI then show client Side Bar and client header if (isset($_GET['client_id'])) { require_once "includes/inc_all_client.php"; $client_query = "AND recurring_ticket_client_id = $client_id"; $client_url = "client_id=$client_id&"; } else { require_once "includes/inc_all.php"; $client_query = ''; $client_url = ''; } // Perms enforceUserPermission('module_support'); $can_edit = ticketCan(2); $can_delete = ticketCan(3); if (!isset($_GET['assigned_agent']) && isset($_GET['assigned'])) { $_GET['assigned_agent'] = $_GET['assigned']; } unset($_GET['assigned']); // Client (all clients) $client = 0; if (!$client_url && !empty($_GET['client'])) { $client = intval($_GET['client']); $client_query = "AND recurring_ticket_client_id = $client"; } // Category $category_filter = intval($_GET['category'] ?? 0); $category_query = $category_filter ? "AND recurring_ticket_category = $category_filter" : ''; // Agent $agent_filter = intval($_GET['assigned_agent'] ?? 0); $agent_query = $agent_filter ? "AND recurring_ticket_assigned_to = $agent_filter" : ''; // Billable - 1 or 0, or any $billable_filter = isset($_GET['billable']) && in_array((string) $_GET['billable'], ['0', '1'], true) ? intval($_GET['billable']) : null; $billable_query = $billable_filter === null ? '' : "AND recurring_ticket_billable = $billable_filter"; $filters = "(recurring_ticket_subject LIKE '%$q%' OR category_name LIKE '%$q%' OR client_name LIKE '%$q%' OR contact_name LIKE '%$q%' OR asset_name LIKE '%$q%') " . clientScopeSql('recurring_ticket_client_id') . " $client_query $category_query $agent_query $billable_query"; // Which ones - the pills along the top $running_sql = 'recurring_ticket_paused_at IS NULL'; $shows = [ '' => ['label' => 'All', 'where' => ''], 'week' => ['label' => 'Due this week', 'icon' => 'fa-calendar-week', 'where' => "$running_sql AND recurring_ticket_next_run BETWEEN CURDATE() AND CURDATE() + INTERVAL 7 DAY", 'title' => 'Raising a ticket in the next seven days'], 'missed' => ['label' => 'Missed', 'icon' => 'fa-exclamation-triangle', 'where' => "$running_sql AND recurring_ticket_next_run < CURDATE()", 'title' => 'Due before today and not raised - the nightly cron raises them on its next run', 'alarm' => 'danger'], 'paused' => ['label' => 'Paused', 'icon' => 'fa-pause', 'where' => 'recurring_ticket_paused_at IS NOT NULL', 'title' => 'Kept, raising nothing until resumed'], 'unassigned' => ['label' => 'Unassigned', 'icon' => 'fa-user-slash', 'where' => 'recurring_ticket_assigned_to = 0', 'title' => 'Raises tickets nobody has', 'alarm' => 'warning'], ]; $show = isset($shows[$_GET['show'] ?? '']) ? ($_GET['show'] ?? '') : ''; $show_query = $shows[$show]['where'] ? 'AND ' . $shows[$show]['where'] : ''; $joins = "LEFT JOIN clients ON recurring_ticket_client_id = client_id LEFT JOIN contacts ON recurring_ticket_contact_id = contact_id LEFT JOIN assets ON recurring_ticket_asset_id = asset_id LEFT JOIN categories ON category_id = recurring_ticket_category LEFT JOIN users ON user_id = recurring_ticket_assigned_to LEFT JOIN ticket_templates ON ticket_template_id = recurring_ticket_ticket_template_id"; // Only these sort - an unknown column would take the page down $frequency_days_sql = "CASE recurring_ticket_frequency WHEN 'Three Days' THEN 3 WHEN 'Weekly' THEN 7 WHEN 'Biweekly' THEN 14 WHEN 'Monthly' THEN 30 WHEN 'Quarterly' THEN 91 WHEN 'Biannually' THEN 182 WHEN 'Annually' THEN 365 ELSE 999 END"; $sortable_columns = [ 'recurring_ticket_next_run' => "recurring_ticket_paused_at IS NOT NULL, recurring_ticket_next_run $order", 'recurring_ticket_subject' => "recurring_ticket_subject $order", 'recurring_ticket_frequency' => "$frequency_days_sql $order", 'recurring_ticket_priority' => "CASE recurring_ticket_priority WHEN 'Urgent' THEN 0 WHEN 'High' THEN 1 WHEN 'Medium' THEN 2 WHEN 'Low' THEN 3 ELSE 4 END $order", 'category_name' => "category_name $order", 'user_name' => "recurring_ticket_assigned_to = 0 $order, user_name $order", 'client_name' => "client_name $order", ]; if (!isset($sortable_columns[$sort])) { $sort = 'recurring_ticket_next_run'; } $sql = mysqli_query($mysqli, "SELECT SQL_CALC_FOUND_ROWS recurring_tickets.*, client_name, contact_name, contact_photo, asset_name, category_name, category_color, category_icon, user_name, user_avatar, ticket_template_name, (SELECT COUNT(*) FROM recurring_ticket_tasks WHERE recurring_ticket_task_recurring_ticket_id = recurring_ticket_id) AS recurring_ticket_task_count FROM recurring_tickets $joins WHERE $filters $show_query ORDER BY {$sortable_columns[$sort]}, recurring_ticket_subject ASC LIMIT $record_from, $record_to"); $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $recurring_tickets = []; while ($row = mysqli_fetch_assoc($sql)) { $recurring_tickets[intval($row['recurring_ticket_id'])] = $row; } $last_tickets = recurringTicketLastTickets(array_keys($recurring_tickets)); // How many of each, for the pills - over what the filters leave $count_sql = []; foreach ($shows as $key => $s) { $count_sql[] = $key === '' ? 'COUNT(*)' : "COALESCE(SUM({$s['where']}), 0)"; } $row = mysqli_fetch_row(mysqli_query($mysqli, "SELECT " . implode(', ', $count_sql) . " FROM recurring_tickets $joins WHERE $filters")); $counts = []; foreach (array_keys($shows) as $i => $key) { $counts[$key] = intval($row[$i]); } $filter_url = function ($changes) { $params = array_merge($_GET, $changes); unset($params['page']); return '?' . http_build_query(array_filter($params, function ($v) { return $v !== '' && $v !== null; })); }; $sort_link = function ($column, $label) use ($url_query_strings_sort, $sort, $disp, $order_icon) { return '' . $label . ($sort === $column ? " $order_icon" : '') . ''; }; ?>