";
} else {
$project_status_display = "Open";
$project_completed_date_display = "";
}
// Override Tab Title // No Sanitizing needed as this var will only be used in the tab title
$tab_title = "{$row['project_prefix']}{$row['project_number']}";
$page_title = $row['project_name'];
// Tickets on the project - the ones this agent may reach (an internal project can hold any client's)
$ticket_scope = clientScopeSql('ticket_client_id');
$project_ticket_sorts = [
'ticket_number' => "ticket_number $order",
'ticket_priority' => "CASE ticket_priority WHEN 'Urgent' THEN 0 WHEN 'High' THEN 1 WHEN 'Medium' THEN 2 WHEN 'Low' THEN 3 ELSE 4 END $order",
'ticket_status' => "ticket_status_order $order",
'user_name' => "ticket_assigned_to = 0 $order, user_name $order",
'ticket_updated_at' => "COALESCE(ticket_updated_at, ticket_created_at) $order",
'client_name' => "client_name $order",
];
if (!isset($project_ticket_sorts[$sort])) {
$sort = 'ticket_number';
}
$sql_tickets = mysqli_query($mysqli, "SELECT tickets.ticket_id, ticket_prefix, ticket_number, ticket_subject, ticket_priority, ticket_status,
ticket_assigned_to, ticket_billable, ticket_created_at, ticket_updated_at, ticket_resolved_at, ticket_closed_at, ticket_client_id,
ticket_status_name, ticket_status_color, client_name, user_name, user_avatar
FROM tickets
LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id
LEFT JOIN clients ON ticket_client_id = client_id
LEFT JOIN users ON ticket_assigned_to = user_id
WHERE ticket_project_id = $project_id $ticket_scope
ORDER BY {$project_ticket_sorts[$sort]}, ticket_number DESC"
);
$project_tickets = [];
while ($ticket_row = mysqli_fetch_assoc($sql_tickets)) {
$project_tickets[intval($ticket_row['ticket_id'])] = $ticket_row;
}
$project_ticket_replies = ticketLastReplies(array_keys($project_tickets));
$ticket_count = count($project_tickets);
$closed_ticket_count = count(array_filter(array_column($project_tickets, 'ticket_closed_at')));
$resolved_ticket_count = count(array_filter(array_column($project_tickets, 'ticket_resolved_at')));
$tickets_closed_percent = 100; //Default
if ($ticket_count) {
$tickets_closed_percent = round(($closed_ticket_count / $ticket_count) * 100);
}
$tickets_resolved_percent = 100; //Default
if ($ticket_count) {
$tickets_resolved_percent = round(($resolved_ticket_count / $ticket_count) * 100);
}
// Get All Tasks
$sql_tasks = mysqli_query($mysqli,
"SELECT task_completed_at, task_id, task_name FROM tickets, tasks
WHERE ticket_id = task_ticket_id
AND ticket_project_id = $project_id $ticket_scope
ORDER BY task_created_at ASC"
);
$task_count = mysqli_num_rows($sql_tasks);
// Get Completed Task Count
$sql_tasks_completed = mysqli_query($mysqli,
"SELECT 1 FROM tickets, tasks
WHERE ticket_id = task_ticket_id
AND ticket_project_id = $project_id $ticket_scope
AND task_completed_at IS NOT NULL"
);
$completed_task_count = mysqli_num_rows($sql_tasks_completed);
// Tasks Completed Percent
if ($task_count) {
$tasks_completed_percent = round(($completed_task_count / $task_count) * 100);
}
//Get Total Ticket Time
$sql_ticket_total_reply_time = mysqli_query($mysqli, "SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(ticket_reply_time_worked))) AS ticket_total_reply_time FROM ticket_replies
LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id
WHERE ticket_reply_archived_at IS NULL AND ticket_project_id = $project_id");
$row = mysqli_fetch_assoc($sql_ticket_total_reply_time);
$ticket_total_reply_time = escapeHtml($row['ticket_total_reply_time']);
// Get all Assigned ticket Users as a comma-separated string
$sql_project_collaborators = mysqli_query($mysqli, "
SELECT GROUP_CONCAT(DISTINCT user_name SEPARATOR ', ') AS user_names
FROM users
LEFT JOIN ticket_replies ON user_id = ticket_reply_by
LEFT JOIN tickets ON ticket_id = ticket_reply_ticket_id
WHERE ticket_reply_archived_at IS NULL AND ticket_project_id = $project_id
");
// Fetch the result
$row = mysqli_fetch_assoc($sql_project_collaborators);
// The user names in a comma-separated string
$ticket_collaborators = escapeHtml($row['user_names']);
?>