diff --git a/client_tickets.php b/client_tickets.php index 4518e822..eba4013c 100644 --- a/client_tickets.php +++ b/client_tickets.php @@ -7,15 +7,13 @@ $order = "DESC"; require_once "inc_all_client.php"; -if (isset($_GET['status']) && ($_GET['status']) == 'Open') { - $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; -} elseif (isset($_GET['status']) && ($_GET['status']) == 'Closed') { +if (isset($_GET['status']) && ($_GET['status']) == 'Closed') { $status = 'Closed'; - $ticket_status_snippet = "ticket_status = 'Closed'"; + $ticket_status_snippet = "ticket_closed_at IS NOT NULL"; } else { + // Default - Show open tickets $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; + $ticket_status_snippet = "ticket_closed_at IS NULL"; } if (isset($_GET['billable']) && ($_GET['billable']) == '1') { @@ -50,12 +48,12 @@ $sql = mysqli_query( $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); //Get Total tickets open -$sql_total_tickets_open = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_open FROM tickets WHERE ticket_client_id = $client_id AND ticket_status != 'Closed'"); +$sql_total_tickets_open = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_open FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NULL"); $row = mysqli_fetch_array($sql_total_tickets_open); $total_tickets_open = intval($row['total_tickets_open']); //Get Total tickets closed -$sql_total_tickets_closed = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_closed FROM tickets WHERE ticket_client_id = $client_id AND ticket_status = 'Closed'"); +$sql_total_tickets_closed = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_closed FROM tickets WHERE ticket_client_id = $client_id AND ticket_closed_at IS NOT NULL"); $row = mysqli_fetch_array($sql_total_tickets_closed); $total_tickets_closed = intval($row['total_tickets_closed']); @@ -142,14 +140,15 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); $ticket_number = nullable_htmlentities($row['ticket_number']); $ticket_subject = nullable_htmlentities($row['ticket_subject']); $ticket_priority = nullable_htmlentities($row['ticket_priority']); - $ticket_status = sanitizeInput(getTicketStatusName($row['ticket_status'])); + $ticket_status_id = intval($row['ticket_status']); + $ticket_status_name = sanitizeInput(getTicketStatusName($row['ticket_status'])); $ticket_billable = intval($row['ticket_billable']); $ticket_created_at = nullable_htmlentities($row['ticket_created_at']); $ticket_created_at_time_ago = timeAgo($row['ticket_created_at']); $ticket_updated_at = nullable_htmlentities($row['ticket_updated_at']); $ticket_updated_at_time_ago = timeAgo($row['ticket_updated_at']); if (empty($ticket_updated_at)) { - if ($ticket_status == $config_ticket_status_id_closed || $ticket_status == "Closed") { + if (!empty($ticket_closed_at)) { $ticket_updated_at_display = "

Never

"; } else { $ticket_updated_at_display = "

Never

"; @@ -159,7 +158,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); } $ticket_closed_at = nullable_htmlentities($row['ticket_closed_at']); - $ticket_status_color = getTicketStatusColor($ticket_status); + $ticket_status_color = getTicketStatusColor($ticket_status_id); if ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; @@ -173,7 +172,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); $ticket_assigned_to = intval($row['ticket_assigned_to']); if (empty($ticket_assigned_to)) { - if ($ticket_status == $config_ticket_status_id_closed || $ticket_status == "Closed") { + if (!empty($ticket_closed_at)) { $ticket_assigned_to_display = "

Not Assigned

"; } else { $ticket_assigned_to_display = "

Not Assigned

"; @@ -256,7 +255,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); - + @@ -281,7 +280,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); 0) { $contact_id = intval($row['scheduled_ticket_contact_id']); $asset_id = intval($row['scheduled_ticket_asset_id']); - $ticket_status = 'New'; // Default + $ticket_status = $config_ticket_status_id_new; // Default if ($assigned_id > 0) { - $ticket_status = 'Open'; // Set to open if we've auto-assigned an agent + $ticket_status = $config_ticket_status_id_open; // Set to open if we've auto-assigned an agent } // Assign this new ticket the next ticket number @@ -381,7 +383,7 @@ if ($config_ticket_autoclose == 1) { $sql_tickets_to_chase = mysqli_query( $mysqli, "SELECT * FROM tickets - WHERE ticket_status = 'Auto Close' + WHERE ticket_status = '$config_ticket_status_id_autoclose' AND ticket_updated_at < NOW() - INTERVAL $config_ticket_autoclose_hours HOUR" ); @@ -395,7 +397,7 @@ if ($config_ticket_autoclose == 1) { $ticket_assigned_to = sanitizeInput($row['ticket_assigned_to']); $client_id = intval($row['ticket_client_id']); - mysqli_query($mysqli,"UPDATE tickets SET ticket_status = 'Closed', ticket_closed_at = NOW(), ticket_closed_by = $ticket_assigned_to WHERE ticket_id = $ticket_id"); + mysqli_query($mysqli,"UPDATE tickets SET ticket_status = '$config_ticket_status_id_closed', ticket_closed_at = NOW(), ticket_closed_by = $ticket_assigned_to WHERE ticket_id = $ticket_id"); //Logging mysqli_query($mysqli,"INSERT INTO logs SET log_type = 'Ticket', log_action = 'Closed', log_description = '$ticket_prefix$ticket_number auto closed', log_entity_id = $ticket_id"); @@ -410,7 +412,7 @@ if ($config_ticket_autoclose == 1) { "SELECT contact_name, contact_email, ticket_id, ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_client_id FROM tickets LEFT JOIN clients ON ticket_client_id = client_id LEFT JOIN contacts ON ticket_contact_id = contact_id - WHERE ticket_status = 'Auto Close' + WHERE ticket_status = '$config_ticket_status_id_autoclose' AND ticket_updated_at < NOW() - INTERVAL 48 HOUR" ); @@ -422,7 +424,7 @@ if ($config_ticket_autoclose == 1) { $ticket_prefix = sanitizeInput($row['ticket_prefix']); $ticket_number = intval($row['ticket_number']); $ticket_subject = sanitizeInput($row['ticket_subject']); - $ticket_status = sanitizeInput($row['ticket_status']); + $ticket_status = sanitizeInput( getTicketStatusName($row['ticket_status'])); $client_id = intval($row['ticket_client_id']); $sql_ticket_reply = mysqli_query($mysqli, "SELECT ticket_reply FROM ticket_replies WHERE ticket_reply_type = 'Public' AND ticket_reply_ticket_id = $ticket_id ORDER BY ticket_reply_created_at DESC LIMIT 1"); @@ -431,7 +433,7 @@ if ($config_ticket_autoclose == 1) { $subject = "Ticket pending closure - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

Hello, $contact_name

This is an automatic friendly reminder that your ticket regarding \"$ticket_subject\" will be closed, unless you respond.

--------------------------------
$ticket_reply--------------------------------

If your issue is resolved, you can ignore this email - the ticket will automatically close. If you need further assistance, please respond to this email.

Ticket: $ticket_prefix$ticket_number
Subject: $ticket_subject
Status: $ticket_status
Portal: https://$config_base_url/portal/ticket.php?id=$ticket_id

--
$company_name - Support
$config_ticket_from_email
$company_phone"; + $body = "##- Please type your reply above this line -##

Hello, $contact_name

This is an automatic friendly reminder that your ticket regarding \"$ticket_subject\" will be closed, unless you respond.

--------------------------------
$ticket_reply--------------------------------

If your issue is resolved, you can ignore this email - the ticket will automatically close. If you need further assistance, please respond to this email.

Ticket: $ticket_prefix$ticket_number
Subject: $ticket_subject
Status: $ticket_status
Portal: https://$config_base_url/portal/ticket.php?id=$ticket_id

--
$company_name - Support
$config_ticket_from_email
$company_phone"; $data = [ [ diff --git a/cron_ticket_email_parser.php b/cron_ticket_email_parser.php index b8cee1ff..fde69c29 100644 --- a/cron_ticket_email_parser.php +++ b/cron_ticket_email_parser.php @@ -110,7 +110,7 @@ $allowed_extensions = array('jpg', 'jpeg', 'gif', 'png', 'webp', 'pdf', 'txt', ' function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date, $subject, $message, $attachments) { // Access global variables - global $mysqli,$config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_ticket_client_general_notifications, $config_ticket_new_ticket_notification_email, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_smtp_host, $config_smtp_port, $config_smtp_encryption, $config_smtp_username, $config_smtp_password, $allowed_extensions; + global $mysqli,$config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_ticket_client_general_notifications, $config_ticket_new_ticket_notification_email, $config_ticket_status_id_new, $config_ticket_status_id_closed, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_smtp_host, $config_smtp_port, $config_smtp_encryption, $config_smtp_username, $config_smtp_password, $allowed_extensions; // Get the next Ticket Number and add 1 for the new ticket number $ticket_number_sql = mysqli_fetch_array(mysqli_query($mysqli, "SELECT config_ticket_next_number FROM settings WHERE company_id = 1")); @@ -122,7 +122,7 @@ function addTicket($contact_id, $contact_name, $contact_email, $client_id, $date $message = nl2br($message); $message = mysqli_escape_string($mysqli, "Email from: $contact_email at $date:-

$message"); - mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_subject = '$subject', ticket_details = '$message', ticket_priority = 'Low', ticket_status = 'New', ticket_created_by = 0, ticket_contact_id = $contact_id, ticket_client_id = $client_id"); + mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_subject = '$subject', ticket_details = '$message', ticket_priority = 'Low', ticket_status = '$config_ticket_status_id_new', ticket_created_by = 0, ticket_contact_id = $contact_id, ticket_client_id = $client_id"); $id = mysqli_insert_id($mysqli); // Logging @@ -213,7 +213,7 @@ function addReply($from_email, $date, $subject, $ticket_number, $message, $attac // Add email as a comment/reply to an existing ticket // Access global variables - global $mysqli, $config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_smtp_host, $config_smtp_port, $config_smtp_encryption, $config_smtp_username, $config_smtp_password, $allowed_extensions; + global $mysqli, $config_app_name, $company_name, $company_phone, $config_ticket_prefix, $config_ticket_status_id_open, $config_ticket_status_id_closed, $config_base_url, $config_ticket_from_name, $config_ticket_from_email, $config_smtp_host, $config_smtp_port, $config_smtp_encryption, $config_smtp_username, $config_smtp_password, $allowed_extensions; // Set default reply type $ticket_reply_type = 'Client'; @@ -243,7 +243,7 @@ function addReply($from_email, $date, $subject, $ticket_number, $message, $attac $client_name = sanitizeInput($row['client_name']); // Check ticket isn't closed - tickets can't be re-opened - if ($ticket_status == "Closed") { + if ($ticket_status == $config_ticket_status_id_closed) { mysqli_query($mysqli, "INSERT INTO notifications SET notification_type = 'Ticket', notification = 'Email parser: $from_email attempted to re-open ticket $config_ticket_prefix$ticket_number (ID $ticket_id) - check inbox manually to see email', notification_action = 'ticket.php?ticket_id=$ticket_id', notification_client_id = $client_id"); $email_subject = "Action required: This ticket is already closed"; @@ -360,7 +360,7 @@ function addReply($from_email, $date, $subject, $ticket_number, $message, $attac } // Update Ticket Last Response Field & set ticket to open as client has replied - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 'Open' WHERE ticket_id = $ticket_id AND ticket_client_id = $client_id LIMIT 1"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '$config_ticket_status_id_open' WHERE ticket_id = $ticket_id AND ticket_client_id = $client_id LIMIT 1"); echo "Updated existing ticket.
"; mysqli_query($mysqli, "INSERT INTO logs SET log_type = 'Ticket', log_action = 'Update', log_description = 'Email parser: Client contact $from_email updated ticket $config_ticket_prefix$ticket_number ($subject)', log_client_id = $client_id"); diff --git a/dashboard.php b/dashboard.php index 8d20596d..3cc490b6 100644 --- a/dashboard.php +++ b/dashboard.php @@ -89,7 +89,7 @@ if ($user_config_dashboard_financial_enable == 1) { //Define var so it doesnt throw errors in logs $largest_income_month = 0; - + //Get Total income $sql_total_payments_to_invoices = mysqli_query($mysqli, "SELECT SUM(payment_amount) AS total_payments_to_invoices FROM payments WHERE YEAR(payment_date) = $year"); $row = mysqli_fetch_array($sql_total_payments_to_invoices); @@ -169,7 +169,7 @@ if ($user_config_dashboard_financial_enable == 1) { if ($config_module_enable_ticketing && $config_module_enable_accounting) { //Get Unbilled, closed tickets - $sql_unbilled_tickets = mysqli_query($mysqli, "SELECT COUNT('ticket_id') AS unbilled_tickets FROM tickets WHERE ticket_status = 'Closed' AND ticket_billable = 1 AND ticket_invoice_id = 0 AND YEAR(ticket_created_at) = $year"); + $sql_unbilled_tickets = mysqli_query($mysqli, "SELECT COUNT('ticket_id') AS unbilled_tickets FROM tickets WHERE ticket_closed_at IS NOT NULL AND ticket_billable = 1 AND ticket_invoice_id = 0 AND YEAR(ticket_created_at) = $year"); $row = mysqli_fetch_array($sql_unbilled_tickets); $unbilled_tickets = intval($row['unbilled_tickets']); } else { @@ -772,13 +772,14 @@ if ($user_config_dashboard_technical_enable == 1) { $ticket_number = intval($row['ticket_number']); $ticket_subject = nullable_htmlentities($row['ticket_subject']); $ticket_priority = nullable_htmlentities($row['ticket_priority']); - $ticket_status = nullable_htmlentities($row['ticket_status']); + $ticket_status_id = intval($row['ticket_status']); + $ticket_status_name = sanitizeInput(getTicketStatusName($row['ticket_status'])); $ticket_created_at = nullable_htmlentities($row['ticket_created_at']); $ticket_created_at_time_ago = timeAgo($row['ticket_created_at']); $ticket_updated_at = nullable_htmlentities($row['ticket_updated_at']); $ticket_updated_at_time_ago = timeAgo($row['ticket_updated_at']); if (empty($ticket_updated_at)) { - if ($ticket_status == "Closed") { + if (!empty($ticket_closed_at)) { $ticket_updated_at_display = "

Never

"; } else { $ticket_updated_at_display = "

Never

"; @@ -791,17 +792,7 @@ if ($user_config_dashboard_technical_enable == 1) { $contact_id = intval($row['ticket_contact_id']); $contact_name = nullable_htmlentities($row['contact_name']); - if ($ticket_status == "New") { - $ticket_status_color = "danger"; - } elseif ($ticket_status == "Open") { - $ticket_status_color = "primary"; - } elseif ($ticket_status == "On Hold") { - $ticket_status_color = "success"; - } elseif ($ticket_status == "Auto Close") { - $ticket_status_color = "dark"; - } elseif ($ticket_status == "Closed") { - $ticket_status_color = "dark"; - } + $ticket_status_color = getTicketStatusColor($ticket_status_id); if ($ticket_priority == "High") { $ticket_priority_color = "danger"; @@ -831,7 +822,7 @@ if ($user_config_dashboard_technical_enable == 1) { - + diff --git a/database_updates.php b/database_updates.php index 8d7d2d7c..67d8f09c 100644 --- a/database_updates.php +++ b/database_updates.php @@ -1689,8 +1689,69 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { if (CURRENT_DATABASE_VERSION == '1.1.3') { + mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_subnet` VARCHAR(200) DEFAULT NULL AFTER `network`"); + mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_primary_dns` VARCHAR(200) DEFAULT NULL AFTER `network_gateway`"); + mysqli_query($mysqli, "ALTER TABLE `networks` ADD `network_secondary_dns` VARCHAR(200) DEFAULT NULL AFTER `network_primary_dns`"); + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.4'"); + } + + if (CURRENT_DATABASE_VERSION == '1.1.4') { + + // Add Project Templates + mysqli_query($mysqli, "CREATE TABLE `project_templates` ( + `project_template_id` INT(11) NOT NULL AUTO_INCREMENT, + `project_template_name` VARCHAR(200) NOT NULL, + `project_template_description` TEXT DEFAULT NULL, + `project_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + `project_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `project_template_archived_at` DATETIME DEFAULT NULL, + PRIMARY KEY (`project_template_id`) + )"); + + // Add Ticket Templates + mysqli_query($mysqli, "CREATE TABLE `ticket_templates` ( + `ticket_template_id` INT(11) NOT NULL AUTO_INCREMENT, + `ticket_template_name` VARCHAR(200) NOT NULL, + `ticket_template_description` TEXT DEFAULT NULL, + `ticket_template_subject` VARCHAR(200) DEFAULT NULL, + `ticket_template_details` LONGTEXT DEFAULT NULL, + `ticket_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + `ticket_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `ticket_template_archived_at` DATETIME DEFAULT NULL, + `ticket_template_project_template_id` INT(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`ticket_template_id`) + )"); + + // Add Task Templates + mysqli_query($mysqli, "CREATE TABLE `task_templates` ( + `task_template_id` INT(11) NOT NULL AUTO_INCREMENT, + `task_template_name` VARCHAR(200) NOT NULL, + `task_template_description` TEXT DEFAULT NULL, + `task_template_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + `task_template_updated_at` DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, + `task_template_archived_at` DATETIME DEFAULT NULL, + `task_template_ticket_template_id` INT(11) NOT NULL, + PRIMARY KEY (`task_template_id`) + )"); + + mysqli_query($mysqli, "ALTER TABLE `projects` ADD `project_completed_at` DATETIME DEFAULT NULL AFTER `project_updated_at`"); + + mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_project_id` INT(11) NOT NULL DEFAULT 0 AFTER `ticket_invoice_id`"); + + mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_template`"); + mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_finish_date`"); + mysqli_query($mysqli, "ALTER TABLE `tasks` DROP `task_project_id`"); + + mysqli_query($mysqli, "ALTER TABLE `projects` DROP `project_template`"); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.5'"); + } + + if (CURRENT_DATABASE_VERSION == '1.1.5') { + // Add new ticket_statuses table - mysqli_query($mysqli, "CREATE TABLE `ticket_statuses` ( + mysqli_query($mysqli, + "CREATE TABLE `ticket_statuses` ( `ticket_status_id` INT(11) NOT NULL AUTO_INCREMENT, `ticket_status_name` VARCHAR(200) NOT NULL, `ticket_status_color` VARCHAR(200) NOT NULL, @@ -1702,7 +1763,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'New', ticket_status_color = 'danger'"); // Default ID for new tickets is 1 mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Open', ticket_status_color = 'primary'"); // 2 mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'On Hold', ticket_status_color = 'success'"); // 3 - mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Auto Close', ticket_status_color = 'dark'"); // 5 + mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Auto Close', ticket_status_color = 'dark'"); // 4 mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Closed', ticket_status_color = 'dark'"); // 5 // Add default values above to settings @@ -1711,13 +1772,20 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_status_id_autoclose` int(1) NOT NULL DEFAULT '4' AFTER `config_ticket_status_id_open`"); mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_status_id_closed` int(1) NOT NULL DEFAULT '5' AFTER `config_ticket_status_id_autoclose`"); - mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.4'"); + // Update existing tickets to use new values + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 1 WHERE ticket_status = 'New'"); // New + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2 WHERE ticket_status = 'Open'"); // Open + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 3 WHERE ticket_status = 'On Hold'"); // On Hold + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 4 WHERE ticket_status = 'Auto Close'"); // Auto Close + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5 WHERE ticket_closed_at IS NOT NULL"); // Closed + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.6'"); } - // if (CURRENT_DATABASE_VERSION == '1.1.4') { - // // Insert queries here required to update to DB version 1.1.5 + // if (CURRENT_DATABASE_VERSION == '1.1.6') { + // // Insert queries here required to update to DB version 1.1.7 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.5'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.7'"); // } } else { diff --git a/database_version.php b/database_version.php index 62e7c706..f933d1f9 100644 --- a/database_version.php +++ b/database_version.php @@ -5,5 +5,5 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.1.4"); +DEFINE("LATEST_DATABASE_VERSION", "1.1.6"); diff --git a/db.sql b/db.sql index c2d9f586..47b15f0f 100644 --- a/db.sql +++ b/db.sql @@ -848,7 +848,10 @@ CREATE TABLE `networks` ( `network_description` text DEFAULT NULL, `network_vlan` int(11) DEFAULT NULL, `network` varchar(200) NOT NULL, + `network_subnet` varchar(200) DEFAULT NULL, `network_gateway` varchar(200) NOT NULL, + `network_primary_dns` varchar(200) DEFAULT NULL, + `network_secondary_dns` varchar(200) DEFAULT NULL, `network_dhcp_range` varchar(200) DEFAULT NULL, `network_notes` text DEFAULT NULL, `network_created_at` datetime NOT NULL DEFAULT current_timestamp(), @@ -928,6 +931,24 @@ CREATE TABLE `products` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `project_templates` +-- + +DROP TABLE IF EXISTS `project_templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `project_templates` ( + `project_template_id` int(11) NOT NULL AUTO_INCREMENT, + `project_template_name` varchar(200) NOT NULL, + `project_template_description` text DEFAULT NULL, + `project_template_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `project_template_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `project_template_archived_at` datetime DEFAULT NULL, + PRIMARY KEY (`project_template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `projects` -- @@ -937,11 +958,11 @@ DROP TABLE IF EXISTS `projects`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `projects` ( `project_id` int(11) NOT NULL AUTO_INCREMENT, - `project_template` tinyint(1) NOT NULL DEFAULT 0, `project_name` varchar(255) NOT NULL, `project_description` text DEFAULT NULL, `project_created_at` datetime NOT NULL DEFAULT current_timestamp(), `project_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `project_completed_at` datetime DEFAULT NULL, `project_archived_at` datetime DEFAULT NULL, `project_client_id` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`project_id`) @@ -1483,6 +1504,25 @@ CREATE TABLE `tags` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `task_templates` +-- + +DROP TABLE IF EXISTS `task_templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `task_templates` ( + `task_template_id` int(11) NOT NULL AUTO_INCREMENT, + `task_template_name` varchar(200) NOT NULL, + `task_template_description` text DEFAULT NULL, + `task_template_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `task_template_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `task_template_archived_at` datetime DEFAULT NULL, + `task_template_ticket_template_id` int(11) NOT NULL, + PRIMARY KEY (`task_template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `tasks` -- @@ -1492,17 +1532,14 @@ DROP TABLE IF EXISTS `tasks`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `tasks` ( `task_id` int(11) NOT NULL AUTO_INCREMENT, - `task_template` tinyint(1) NOT NULL DEFAULT 0, `task_name` varchar(255) NOT NULL, `task_description` text DEFAULT NULL, - `task_finish_date` date DEFAULT NULL, `task_status` varchar(255) DEFAULT NULL, `task_completed_at` datetime DEFAULT NULL, `task_completed_by` int(11) DEFAULT NULL, `task_created_at` datetime NOT NULL DEFAULT current_timestamp(), `task_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), `task_ticket_id` int(11) DEFAULT NULL, - `task_project_id` int(11) DEFAULT NULL, PRIMARY KEY (`task_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1564,17 +1601,38 @@ CREATE TABLE `ticket_replies` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `ticket_templates` +-- + +DROP TABLE IF EXISTS `ticket_templates`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `ticket_templates` ( + `ticket_template_id` int(11) NOT NULL AUTO_INCREMENT, + `ticket_template_name` varchar(200) NOT NULL, + `ticket_template_description` text DEFAULT NULL, + `ticket_template_subject` varchar(200) DEFAULT NULL, + `ticket_template_details` longtext DEFAULT NULL, + `ticket_template_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `ticket_template_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `ticket_template_archived_at` datetime DEFAULT NULL, + `ticket_template_project_template_id` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`ticket_template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `ticket_statuses` -- DROP TABLE IF EXISTS `ticket_statuses`; CREATE TABLE IF NOT EXISTS `ticket_statuses` ( - `ticket_status_id` int(11) NOT NULL AUTO_INCREMENT, - `ticket_status_name` varchar(200) NOT NULL, - `ticket_status_color` varchar(200) NOT NULL, - `ticket_status_active` TINYINT(1) NOT NULL DEFAULT '1', - PRIMARY KEY (`ticket_status_id`) + `ticket_status_id` int(11) NOT NULL AUTO_INCREMENT, + `ticket_status_name` varchar(200) NOT NULL, + `ticket_status_color` varchar(200) NOT NULL, + `ticket_status_active` TINYINT(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`ticket_status_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -- @@ -1620,7 +1678,7 @@ CREATE TABLE `tickets` ( `ticket_id` int(11) NOT NULL AUTO_INCREMENT, `ticket_prefix` varchar(200) DEFAULT NULL, `ticket_number` int(11) NOT NULL, - `ticket_source` varchar(255) DEFAULT NULL, + `ticket_source` varchar(255) DEFAULT NULL COMMENT 'Where the Ticket Came from\r\nEmail, Client Portal, In-App, Project Template', `ticket_category` varchar(200) DEFAULT NULL, `ticket_subject` varchar(200) NOT NULL, `ticket_details` longtext NOT NULL, @@ -1644,6 +1702,7 @@ CREATE TABLE `tickets` ( `ticket_location_id` int(11) NOT NULL DEFAULT 0, `ticket_asset_id` int(11) NOT NULL DEFAULT 0, `ticket_invoice_id` int(11) NOT NULL DEFAULT 0, + `ticket_project_id` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`ticket_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -1820,4 +1879,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-03-19 17:11:58 +-- As of 2024 03 29 diff --git a/functions.php b/functions.php index fb8d89a6..de0a016e 100644 --- a/functions.php +++ b/functions.php @@ -1142,41 +1142,21 @@ function getTicketStatusColor($ticket_status) { global $mysqli; - if (intval($ticket_status)) { - $status_id = intval($ticket_status); - $row = mysqli_fetch_array(mysqli_query($mysqli, "SELECT * FROM ticket_statuses WHERE ticket_status_id = $status_id LIMIT 1")); + $status_id = intval($ticket_status); + $row = mysqli_fetch_array(mysqli_query($mysqli, "SELECT ticket_status_color FROM ticket_statuses WHERE ticket_status_id = $status_id LIMIT 1")); - if ($row) { - return nullable_htmlentities($row['ticket_status_color']); - } - - // Default return - return "Unknown"; + if ($row) { + return nullable_htmlentities($row['ticket_status_color']); } - // Legacy support for named statuses - if ($ticket_status == "New") { - return "danger"; - } elseif ($ticket_status == "Open") { - return "primary"; - } elseif ($ticket_status == "On Hold") { - return "success"; - } elseif ($ticket_status == "Auto Close") { - return "dark"; - } elseif ($ticket_status == "Closed") { - return "dark"; - } + // Default return + return "Unknown"; } function getTicketStatusName($ticket_status) { global $mysqli; - // Legacy support for named statuses - if (!intval($ticket_status)) { - return $ticket_status; - } - $status_id = intval($ticket_status); $row = mysqli_fetch_array(mysqli_query($mysqli, "SELECT * FROM ticket_statuses WHERE ticket_status_id = $status_id LIMIT 1")); diff --git a/global_search.php b/global_search.php index 14fceb2c..9bb698cf 100644 --- a/global_search.php +++ b/global_search.php @@ -26,7 +26,7 @@ if (isset($_GET['query'])) { AND client_name LIKE '%$query%' ORDER BY client_id DESC LIMIT 5" ); - + $sql_contacts = mysqli_query($mysqli, "SELECT * FROM contacts LEFT JOIN clients ON client_id = contact_client_id WHERE contact_archived_at IS NULL @@ -37,7 +37,7 @@ if (isset($_GET['query'])) { OR contact_mobile LIKE '%$phone_query%') ORDER BY contact_id DESC LIMIT 5" ); - + $sql_vendors = mysqli_query($mysqli, "SELECT * FROM vendors LEFT JOIN clients ON vendor_client_id = client_id WHERE vendor_archived_at IS NULL @@ -52,20 +52,20 @@ if (isset($_GET['query'])) { AND domain_name LIKE '%$query%' ORDER BY domain_id DESC LIMIT 5" ); - + $sql_products = mysqli_query($mysqli, "SELECT * FROM products WHERE product_archived_at IS NULL AND product_name LIKE '%$query%' ORDER BY product_id DESC LIMIT 5" ); - + $sql_documents = mysqli_query($mysqli, "SELECT * FROM documents LEFT JOIN clients on document_client_id = clients.client_id WHERE document_archived_at IS NULL AND MATCH(document_content_raw) AGAINST ('$query') ORDER BY document_id DESC LIMIT 5" ); - + $sql_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN clients on tickets.ticket_client_id = clients.client_id WHERE ticket_archived_at IS NULL @@ -73,7 +73,7 @@ if (isset($_GET['query'])) { OR ticket_number = '$ticket_num_query') ORDER BY ticket_id DESC LIMIT 5" ); - + $sql_logins = mysqli_query($mysqli, "SELECT * FROM logins LEFT JOIN contacts ON login_contact_id = contact_id LEFT JOIN clients ON login_client_id = client_id @@ -108,10 +108,10 @@ if (isset($_GET['query'])) { ); $q = nullable_htmlentities($_GET['query']); - + ?> - +
@@ -291,7 +291,7 @@ if (isset($_GET['query'])) { $domain_id = intval($row['domain_id']); $client_id = intval($row['client_id']); $client_name = nullable_htmlentities($row['client_name']); - + ?> @@ -308,7 +308,7 @@ if (isset($_GET['query'])) {
- + 0) { ?> @@ -418,7 +418,7 @@ if (isset($_GET['query'])) { $ticket_prefix = nullable_htmlentities($row['ticket_prefix']); $ticket_number = intval($row['ticket_number']); $ticket_subject = nullable_htmlentities($row['ticket_subject']); - $ticket_status = nullable_htmlentities($row['ticket_status']); + $ticket_status = nullable_htmlentities(getTicketStatusName($row['ticket_status'])); $client_name = nullable_htmlentities($row['client_name']); $client_id = intval($row['ticket_client_id']); @@ -598,7 +598,7 @@ if (isset($_GET['query'])) { if (empty($contact_name)) { $contact_name_display = "-"; }else{ - $contact_name_display = "$contact_name"; + $contact_name_display = "$contact_name"; } $contact_archived_at = nullable_htmlentities($row['contact_archived_at']); if (empty($contact_archived_at)) { @@ -652,12 +652,12 @@ if (isset($_GET['query'])) { while ($row = mysqli_fetch_array($sql_ticket_replies)) { $ticket_id = intval($row['ticket_id']); - + // Only output the ticket header if we're at a new ticket if ($ticket_id !== $last_ticket_id) { if ($last_ticket_id !== null) { // Close the previous ticket's card (except for the very first ticket) - echo '
'; + echo ''; } $ticket_prefix = nullable_htmlentities($row['ticket_prefix']); @@ -699,7 +699,7 @@ if (isset($_GET['query'])) { if ($last_ticket_id !== null) { // Close the last ticket's card - echo ''; + echo ''; } ?> @@ -721,4 +721,4 @@ require_once "footer.php"; ?> - \ No newline at end of file + diff --git a/post/ticket.php b/post/ticket.php index edceef98..468020c1 100644 --- a/post/ticket.php +++ b/post/ticket.php @@ -850,16 +850,13 @@ if (isset($_POST['add_ticket_reply'])) { $ticket_id = intval($_POST['ticket_id']); $ticket_reply = mysqli_real_escape_string($mysqli, $_POST['ticket_reply']); - $ticket_status = sanitizeInput($_POST['status']); + $ticket_status = intval($_POST['status']); $ticket_status_name = sanitizeInput(getTicketStatusName($row['ticket_status'])); // Handle the time inputs for hours, minutes, and seconds $hours = intval($_POST['hours']); $minutes = intval($_POST['minutes']); $seconds = intval($_POST['seconds']); - //var_dump($_POST); - //exit; - // Combine into a single time string $ticket_reply_time_worked = sanitizeInput(sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds)); @@ -877,7 +874,7 @@ if (isset($_POST['add_ticket_reply'])) { $ticket_reply_id = mysqli_insert_id($mysqli); // Update Ticket Last Response Field - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = '$ticket_status' WHERE ticket_id = $ticket_id"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = $ticket_status WHERE ticket_id = $ticket_id"); if ($ticket_status == $config_ticket_status_id_closed || $ticket_status == 'Closed') { mysqli_query($mysqli, "UPDATE tickets SET ticket_closed_at = NOW() WHERE ticket_id = $ticket_id"); diff --git a/report_ticket_by_client.php b/report_ticket_by_client.php index b182850d..96b967e4 100644 --- a/report_ticket_by_client.php +++ b/report_ticket_by_client.php @@ -94,12 +94,12 @@ $sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients $ticket_raised_count = intval($row['ticket_raised_count']); // Calculate total tickets raised in period that are closed - $sql_ticket_closed_count = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS ticket_closed_count FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id AND ticket_status = 'Closed'"); + $sql_ticket_closed_count = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS ticket_closed_count FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id AND ticket_closed_at IS NOT NULL"); $row = mysqli_fetch_array($sql_ticket_closed_count); $ticket_closed_count = intval($row['ticket_closed_count']); // Used to calculate average time to close tickets that were raised in period specified - $sql_tickets = mysqli_query($mysqli, "SELECT ticket_created_at, ticket_closed_at FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id AND ticket_status = 'Closed' AND ticket_closed_at IS NOT NULL"); + $sql_tickets = mysqli_query($mysqli, "SELECT ticket_created_at, ticket_closed_at FROM tickets WHERE YEAR(ticket_created_at) = $year AND ticket_client_id = $client_id AND ticket_closed_at IS NOT NULL"); if ($ticket_raised_count > 0) { diff --git a/ticket.php b/ticket.php index 2b030fd7..08231ff9 100644 --- a/ticket.php +++ b/ticket.php @@ -252,9 +252,9 @@ if (isset($_GET['ticket_id'])) {
-

Ticket

+

Ticket

- +
- +
- +
@@ -337,16 +337,15 @@ if (isset($_GET['ticket_id'])) {
@@ -608,7 +607,7 @@ if (isset($_GET['ticket_id'])) { if ($prev_ticket_row) { $prev_ticket_id = intval($prev_ticket_row['ticket_id']); $prev_ticket_subject = nullable_htmlentities($prev_ticket_row['ticket_subject']); - $prev_ticket_status = nullable_htmlentities($prev_ticket_row['ticket_status']); + $prev_ticket_status = nullable_htmlentities( getTicketStatusName($prev_ticket_row['ticket_status'])); ?>
@@ -682,7 +681,7 @@ if (isset($_GET['ticket_id'])) { + if (empty ($ticket_closed_at)) { ?>
Scheduled:
@@ -908,7 +907,7 @@ if (isset($_GET['ticket_id'])) {
-
@@ -926,7 +925,7 @@ if (isset($_GET['ticket_id'])) { + if (empty($ticket_closed_at)) { ?> Close Ticket @@ -969,7 +968,7 @@ require_once "footer.php"; - + diff --git a/ticket_assign_modal.php b/ticket_assign_modal.php index eaf75208..de84f7c0 100644 --- a/ticket_assign_modal.php +++ b/ticket_assign_modal.php @@ -9,7 +9,7 @@
- + "; } ?> + $ticket_scheduled_for
"; } ?> @@ -460,7 +464,7 @@ $user_active_assigned_tickets = intval($row['total_tickets_assigned']);