diff --git a/README.md b/README.md index 64b59883..8e8e1668 100644 --- a/README.md +++ b/README.md @@ -134,8 +134,7 @@ See the [forum](https://forum.itflow.org/d/11-road-map) and the [open issues](ht ## Support & Contributions ### Forum -For help using ITFlow, feature requests, and general ideas / discussions please use the community [forum](https://forum.itflow.org). -For bugs, please raise an [issue](https://github.com/itflow-org/itflow/issues). +For help using ITFlow, bugs, feature requests, and general ideas / discussions please use the community [forum](https://forum.itflow.org). ### Contributing If you want to improve ITFlow, feel free to fork the repo and create a pull request, but make sure to discuss significant changes or new features with fellow contributors on the forum first. This helps ensure that your contributions are aligned with project goals, and saves time for everyone. All contributions should follow our [code standards](https://docs.itflow.org/code_standards). diff --git a/client_tickets.php b/client_tickets.php index 4c2d1340..284acdbb 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') { @@ -40,6 +38,7 @@ $sql = mysqli_query( LEFT JOIN assets ON ticket_asset_id = asset_id LEFT JOIN locations ON ticket_location_id = location_id LEFT JOIN vendors ON ticket_vendor_id = vendor_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE ticket_client_id = $client_id AND $ticket_status_snippet AND $ticket_billable_snippet @@ -50,12 +49,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 +141,16 @@ $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 = nullable_htmlentities($row['ticket_status']); + $ticket_status_id = intval($row['ticket_status_id']); + $ticket_status_name = nullable_htmlentities($row['ticket_status_name']); + $ticket_status_color = nullable_htmlentities($row['ticket_status_color']); $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 == "Closed") { + if (!empty($ticket_closed_at)) { $ticket_updated_at_display = "

Never

"; } else { $ticket_updated_at_display = "

Never

"; @@ -159,8 +160,6 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); } $ticket_closed_at = nullable_htmlentities($row['ticket_closed_at']); - $ticket_status_color = getTicketStatusColor($ticket_status); - if ($ticket_priority == "High") { $ticket_priority_display = "$ticket_priority"; } elseif ($ticket_priority == "Medium") { @@ -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 == "Closed") { + if (!empty($ticket_closed_at)) { $ticket_assigned_to_display = "

Not Assigned

"; } else { $ticket_assigned_to_display = "

Not Assigned

"; @@ -181,7 +180,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); } else { $ticket_assigned_to_display = nullable_htmlentities($row['user_name']); } - + $project_id = intval($row['ticket_project_id']); $contact_name = nullable_htmlentities($row['contact_name']); @@ -261,7 +260,7 @@ $total_scheduled_tickets = intval($row['total_scheduled_tickets']); - + @@ -286,7 +285,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 = 1; // Default if ($assigned_id > 0) { - $ticket_status = 'Open'; // Set to open if we've auto-assigned an agent + $ticket_status = 2; // Set to open if we've auto-assigned an agent } // Assign this new ticket the next ticket number @@ -381,7 +379,7 @@ if ($config_ticket_autoclose == 1) { $sql_tickets_to_chase = mysqli_query( $mysqli, "SELECT * FROM tickets - WHERE ticket_status = 'Auto Close' + WHERE ticket_status = 4 AND ticket_updated_at < NOW() - INTERVAL $config_ticket_autoclose_hours HOUR" ); @@ -395,7 +393,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 = 5, 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 +408,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 = 4 AND ticket_updated_at < NOW() - INTERVAL 48 HOUR" ); @@ -422,7 +420,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 +429,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..152797f1 100644 --- a/cron_ticket_email_parser.php +++ b/cron_ticket_email_parser.php @@ -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 = 1, ticket_created_by = 0, ticket_contact_id = $contact_id, ticket_client_id = $client_id"); $id = mysqli_insert_id($mysqli); // Logging @@ -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 == 5) { 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 = 2 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 3a9c3d4c..e3a5f101 100644 --- a/database_updates.php +++ b/database_updates.php @@ -1688,7 +1688,6 @@ 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`"); @@ -1747,10 +1746,39 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.1.5'"); } - // if (CURRENT_DATABASE_VERSION == '1.1.5') { - // // Insert queries here required to update to DB version 1.1.6 + if (CURRENT_DATABASE_VERSION == '1.1.5') { + + // Add new ticket_statuses table + 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, + `ticket_status_active` TINYINT(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`ticket_status_id`) + )"); + + // Pre-seed default system/built-in ticket statuses + 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'"); // 4 + mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Closed', ticket_status_color = 'dark'"); // 5 + + // 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.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.6'"); + // 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 cd83a8e7..e6a7ca45 100644 --- a/database_version.php +++ b/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.1.5"); +DEFINE("LATEST_DATABASE_VERSION", "1.1.6"); diff --git a/db.sql b/db.sql index f6edc4b1..b64a7bfd 100644 --- a/db.sql +++ b/db.sql @@ -1618,6 +1618,19 @@ CREATE TABLE `ticket_templates` ( ) 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`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; + -- -- Table structure for table `ticket_views` -- @@ -1862,4 +1875,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2024-03-27 19:16:15 +-- As of 2024 03 29 diff --git a/functions.php b/functions.php index 17df05b4..de0a016e 100644 --- a/functions.php +++ b/functions.php @@ -1139,15 +1139,32 @@ function createiCalStrCancel($originaliCalStr) { } function getTicketStatusColor($ticket_status) { - 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"; + + global $mysqli; + + $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"; +} + +function getTicketStatusName($ticket_status) { + + global $mysqli; + + $status_id = intval($ticket_status); + $row = mysqli_fetch_array(mysqli_query($mysqli, "SELECT * FROM ticket_statuses WHERE ticket_status_id = $status_id LIMIT 1")); + + if ($row) { + return nullable_htmlentities($row['ticket_status_name']); + } + + // Default return + return "Unknown"; + } 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/portal/portal_functions.php b/portal/portal_functions.php index a9ac1f14..2b960e13 100644 --- a/portal/portal_functions.php +++ b/portal/portal_functions.php @@ -16,10 +16,10 @@ function verifyContactTicketAccess($requested_ticket_id, $expected_ticket_state) // Setup if ($expected_ticket_state == "Closed") { // Closed tickets - $ticket_state_snippet = "ticket_status = 'Closed'"; + $ticket_state_snippet = "ticket_status = 5"; } else { // Open (working/hold) tickets - $ticket_state_snippet = "ticket_status != 'Closed'"; + $ticket_state_snippet = "ticket_status != 5"; } // Verify the contact has access to the provided ticket ID diff --git a/portal/portal_post.php b/portal/portal_post.php index 2e154385..b98a2555 100644 --- a/portal/portal_post.php +++ b/portal/portal_post.php @@ -33,7 +33,7 @@ if (isset($_POST['add_ticket'])) { $new_config_ticket_next_number = $config_ticket_next_number + 1; mysqli_query($mysqli, "UPDATE settings SET config_ticket_next_number = $new_config_ticket_next_number WHERE company_id = 1"); - mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_status = 'New', ticket_created_by = 0, ticket_contact_id = $contact, 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 = '$details', ticket_priority = '$priority', ticket_status = 1, ticket_created_by = 0, ticket_contact_id = $contact, ticket_client_id = $client_id"); $id = mysqli_insert_id($mysqli); // Notify agent DL of the new ticket, if populated with a valid email @@ -86,7 +86,7 @@ if (isset($_POST['add_ticket_comment'])) { $ticket_reply_id = mysqli_insert_id($mysqli); // 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 = $session_client_id LIMIT 1"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 2 WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id LIMIT 1"); // Get ticket details & Notify the assigned tech (if any) @@ -201,7 +201,7 @@ if (isset($_GET['close_ticket'])) { if (verifyContactTicketAccess($ticket_id, "Open")) { // Close ticket - mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 'Closed', ticket_closed_at = NOW() WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_status = 5, ticket_closed_at = NOW() WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id"); // Add reply mysqli_query($mysqli, "INSERT INTO ticket_replies SET ticket_reply = 'Ticket closed by $session_contact_name.', ticket_reply_type = 'Client', ticket_reply_by = $session_contact_id, ticket_reply_ticket_id = $ticket_id"); diff --git a/portal/ticket.php b/portal/ticket.php index cee3b2f6..7b6725b7 100644 --- a/portal/ticket.php +++ b/portal/ticket.php @@ -20,10 +20,21 @@ if (isset($_GET['id']) && intval($_GET['id'])) { if ($session_contact_primary == 1 || $session_contact_is_technical_contact) { // For a primary / technical contact viewing all tickets - $ticket_sql = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN users on ticket_assigned_to = user_id WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id"); + $ticket_sql = mysqli_query($mysqli, + "SELECT * FROM tickets + LEFT JOIN users on ticket_assigned_to = user_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id" + ); + } else { // For a user viewing their own ticket - $ticket_sql = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN users on ticket_assigned_to = user_id WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); + $ticket_sql = mysqli_query($mysqli, + "SELECT * FROM tickets + LEFT JOIN users on ticket_assigned_to = user_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id + WHERE ticket_id = $ticket_id AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id" + ); } $ticket_row = mysqli_fetch_array($ticket_sql); @@ -32,11 +43,12 @@ if (isset($_GET['id']) && intval($_GET['id'])) { $ticket_prefix = nullable_htmlentities($ticket_row['ticket_prefix']); $ticket_number = intval($ticket_row['ticket_number']); - $ticket_status = nullable_htmlentities($ticket_row['ticket_status']); + $ticket_status = nullable_htmlentities($ticket_row['ticket_status_name']); $ticket_priority = nullable_htmlentities($ticket_row['ticket_priority']); $ticket_subject = nullable_htmlentities($ticket_row['ticket_subject']); $ticket_details = $purifier->purify($ticket_row['ticket_details']); $ticket_assigned_to = nullable_htmlentities($ticket_row['user_name']); + $ticket_closed_at = nullable_htmlentities($ticket_row['ticket_closed_at']); $ticket_feedback = nullable_htmlentities($ticket_row['ticket_feedback']); ?> @@ -56,7 +68,7 @@ if (isset($_GET['id']) && intval($_GET['id'])) {

Ticket + if (empty($ticket_closed_at)) { ?> Close ticket

@@ -70,7 +82,7 @@ if (isset($_GET['id']) && intval($_GET['id'])) {
Priority:
- + Assigned to:

@@ -81,7 +93,7 @@ if (isset($_GET['id']) && intval($_GET['id'])) { - +
diff --git a/portal/ticket_view_all.php b/portal/ticket_view_all.php index 5eea42d1..8abefd09 100644 --- a/portal/ticket_view_all.php +++ b/portal/ticket_view_all.php @@ -16,19 +16,16 @@ if ($session_contact_primary == 0 && !$session_contact_is_technical_contact) { if (!isset($_GET['status'])) { // If nothing is set, assume we only want to see open tickets $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; -} elseif (isset($_GET['status']) && ($_GET['status']) == 'Open') { - $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; + $ticket_status_snippet = "ticket_status != 5"; } elseif (isset($_GET['status']) && ($_GET['status']) == 'Closed') { $status = 'Closed'; - $ticket_status_snippet = "ticket_status = 'Closed'"; + $ticket_status_snippet = "ticket_status = 5"; } else { $status = '%'; $ticket_status_snippet = "ticket_status LIKE '%'"; } -$all_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN contacts ON ticket_contact_id = contact_id WHERE $ticket_status_snippet AND ticket_client_id = $session_client_id ORDER BY ticket_id DESC"); +$all_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN contacts ON ticket_contact_id = contact_id LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE $ticket_status_snippet AND ticket_client_id = $session_client_id ORDER BY ticket_id DESC"); ?>

All tickets

@@ -61,7 +58,7 @@ $all_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN contacts O $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($row['ticket_status_name']); $ticket_contact_name = nullable_htmlentities($row['contact_name']); echo ""; diff --git a/portal/tickets.php b/portal/tickets.php index ebd2696e..523d5435 100644 --- a/portal/tickets.php +++ b/portal/tickets.php @@ -13,32 +13,29 @@ require_once "inc_portal.php"; if (!isset($_GET['status'])) { // If nothing is set, assume we only want to see open tickets $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; -} elseif (isset($_GET['status']) && ($_GET['status']) == 'Open') { - $status = 'Open'; - $ticket_status_snippet = "ticket_status != 'Closed'"; + $ticket_status_snippet = "ticket_status != 5 AND ticket_status != 'Closed'"; } elseif (isset($_GET['status']) && ($_GET['status']) == 'Closed') { $status = 'Closed'; - $ticket_status_snippet = "ticket_status = 'Closed'"; + $ticket_status_snippet = "ticket_status = 5 OR ticket_status = 'Closed'"; } else { $status = '%'; $ticket_status_snippet = "ticket_status LIKE '%'"; } -$contact_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN contacts ON ticket_contact_id = contact_id WHERE $ticket_status_snippet AND ticket_contact_id = $session_contact_id AND ticket_client_id = $session_client_id ORDER BY ticket_id DESC"); +$contact_tickets = mysqli_query($mysqli, "SELECT * FROM tickets LEFT JOIN contacts ON ticket_contact_id = contact_id LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE $ticket_status_snippet AND ticket_contact_id = $session_contact_id AND ticket_client_id = $session_client_id ORDER BY ticket_id DESC"); //Get Total tickets closed -$sql_total_tickets_closed = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_closed FROM tickets WHERE ticket_status = 'Closed' AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); +$sql_total_tickets_closed = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_closed FROM tickets WHERE ticket_closed_at IS NOT NULL AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); $row = mysqli_fetch_array($sql_total_tickets_closed); $total_tickets_closed = intval($row['total_tickets_closed']); //Get Total tickets open -$sql_total_tickets_open = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_open FROM tickets WHERE ticket_status != 'Closed' AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); +$sql_total_tickets_open = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets_open FROM tickets WHERE ticket_closed_at IS NULL AND ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); $row = mysqli_fetch_array($sql_total_tickets_open); $total_tickets_open = intval($row['total_tickets_open']); //Get Total tickets -$sql_total_tickets = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets FROM tickets WHERE ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); +$sql_total_tickets = mysqli_query($mysqli, "SELECT COUNT(ticket_id) AS total_tickets FROM tickets WHERE ticket_client_id = $session_client_id AND ticket_contact_id = $session_contact_id"); $row = mysqli_fetch_array($sql_total_tickets); $total_tickets = intval($row['total_tickets']); @@ -65,7 +62,7 @@ $total_tickets = intval($row['total_tickets']); $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($row['ticket_status_name']); ?> diff --git a/post/ticket.php b/post/ticket.php index 26e628d7..5da65657 100644 --- a/post/ticket.php +++ b/post/ticket.php @@ -11,9 +11,9 @@ if (isset($_POST['add_ticket'])) { $client_id = intval($_POST['client']); $assigned_to = intval($_POST['assigned_to']); if ($assigned_to == 0) { - $ticket_status = 'New'; + $ticket_status = 1; } else { - $ticket_status = 'Open'; + $ticket_status = 2; } $contact = intval($_POST['contact']); $subject = sanitizeInput($_POST['subject']); @@ -63,7 +63,7 @@ if (isset($_POST['add_ticket'])) { // Check that task_name is not-empty (For some reason the !empty on the array doesnt work here like in watchers) if (!empty($task_name)) { mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_ticket_id = $ticket_id"); - } + } } } @@ -94,6 +94,7 @@ if (isset($_POST['add_ticket'])) { $ticket_details = mysqli_escape_string($mysqli, $row['ticket_details']); $ticket_priority = sanitizeInput($row['ticket_priority']); $ticket_status = sanitizeInput($row['ticket_status']); + $ticket_status_name = sanitizeInput(getTicketStatusName($row['ticket_status'])); $client_id = intval($row['ticket_client_id']); $ticket_created_by = intval($row['ticket_created_by']); $ticket_assigned_to = intval($row['ticket_assigned_to']); @@ -343,8 +344,10 @@ if (isset($_POST['assign_ticket'])) { $ticket_id = intval($_POST['ticket_id']); $assigned_to = intval($_POST['assigned_to']); $ticket_status = sanitizeInput($_POST['ticket_status']); - if ($ticket_status == 'New' && $assigned_to !== 0) { - $ticket_status = 'Open'; + + // New > Open as assigned + if ($ticket_status == 1 && $assigned_to !== 0) { + $ticket_status = 2; } // Allow for un-assigning tickets @@ -369,7 +372,7 @@ if (isset($_POST['assign_ticket'])) { } // Get & verify ticket details - $ticket_details_sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_client_id, client_name FROM tickets LEFT JOIN clients ON ticket_client_id = client_id WHERE ticket_id = '$ticket_id' AND ticket_status != 'Closed'"); + $ticket_details_sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_client_id, client_name FROM tickets LEFT JOIN clients ON ticket_client_id = client_id WHERE ticket_id = '$ticket_id' AND ticket_status != 5"); $ticket_details = mysqli_fetch_array($ticket_details_sql); $ticket_prefix = sanitizeInput($ticket_details['ticket_prefix']); @@ -439,15 +442,16 @@ if (isset($_GET['delete_ticket'])) { $ticket_id = intval($_GET['delete_ticket']); // Get Ticket and Client ID for logging and alert message - $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); + $sql = mysqli_query($mysqli, "SELECT ticket_prefix, ticket_number, ticket_subject, ticket_status, ticket_closed_at, ticket_client_id FROM tickets WHERE ticket_id = $ticket_id"); $row = mysqli_fetch_array($sql); $ticket_prefix = sanitizeInput($row['ticket_prefix']); $ticket_number = sanitizeInput($row['ticket_number']); $ticket_subject = sanitizeInput($row['ticket_subject']); $ticket_status = sanitizeInput($row['ticket_status']); + $ticket_closed_at = sanitizeInput($row['ticket_closed_at']); $client_id = intval($row['ticket_client_id']); - if ($ticket_status !== 'Closed') { + if (empty($ticket_closed_at)) { mysqli_query($mysqli, "DELETE FROM tickets WHERE ticket_id = $ticket_id"); // Delete all ticket replies @@ -491,8 +495,8 @@ if (isset($_POST['bulk_assign_ticket'])) { $ticket_subject = sanitizeInput($row['ticket_subject']); $client_id = intval($row['ticket_client_id']); - if ($ticket_status == 'New' && $assigned_to !== 0) { - $ticket_status = 'Open'; + if ($ticket_status == 1 && $assigned_to !== 0) { + $ticket_status = 2; } // Allow for un-assigning tickets @@ -634,7 +638,7 @@ if (isset($_POST['bulk_close_tickets'])) { $ticket_prefix = sanitizeInput($row['ticket_prefix']); $ticket_number = intval($row['ticket_number']); - $ticket_status = sanitizeInput($row['ticket_status']); + $ticket_status = sanitizeInput(getTicketStatusName($row['ticket_status'])); $ticket_subject = sanitizeInput($row['ticket_subject']); $current_ticket_priority = sanitizeInput($row['ticket_priority']); $client_id = intval($row['ticket_client_id']); @@ -726,6 +730,7 @@ if (isset($_POST['bulk_ticket_reply'])) { // POST variables $ticket_reply = mysqli_escape_string($mysqli, $_POST['bulk_reply_details']); $ticket_status = sanitizeInput($_POST['bulk_status']); + $ticket_status_name = sanitizeInput(getTicketStatusName($row['ticket_status'])); $private_note = intval($_POST['bulk_private_reply']); if ($private_note == 1) { $ticket_reply_type = 'Internal'; @@ -793,7 +798,7 @@ if (isset($_POST['bulk_ticket_reply'])) { if (filter_var($contact_email, FILTER_VALIDATE_EMAIL)) { $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

Hello $contact_name,

Your ticket regarding $ticket_subject has been updated.

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

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

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

Hello $contact_name,

Your ticket regarding $ticket_subject has been updated.

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

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

--
$company_name - Support
$from_email
$company_phone"; $data = []; @@ -854,15 +859,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)); @@ -880,9 +883,10 @@ 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 == 'Closed') { + // CLose the ticket, if set + if ($ticket_status == 5) { mysqli_query($mysqli, "UPDATE tickets SET ticket_closed_at = NOW() WHERE ticket_id = $ticket_id"); } @@ -922,15 +926,15 @@ if (isset($_POST['add_ticket_reply'])) { // Slightly different email subject/text depending on if this update closed the ticket or not - if ($ticket_status == 'Closed') { + if ($ticket_status == 5) { $subject = "Ticket closed - [$ticket_prefix$ticket_number] - $ticket_subject | (do not reply)"; $body = "Hello $contact_name,

Your ticket regarding $ticket_subject has been closed.

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

We hope the request/issue was resolved to your satisfaction. If you need further assistance, please raise a new ticket using the below details. Please do not reply to this email.

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

--
$company_name - Support
$config_ticket_from_email
$company_phone"; - } elseif ($ticket_status == 'Auto Close') { + } elseif ($ticket_status == 4) { $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject | (pending closure)"; - $body = "##- Please type your reply above this line -##

Hello $contact_name,

Your ticket regarding $ticket_subject has been updated and is pending closure.

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

If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please respond to let us know!

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,

Your ticket regarding $ticket_subject has been updated and is pending closure.

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

If your request/issue is resolved, you can simply ignore this email. If you need further assistance, please respond to let us know!

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

--
$company_name - Support
$config_ticket_from_email
$company_phone"; } else { $subject = "Ticket update - [$ticket_prefix$ticket_number] - $ticket_subject"; - $body = "##- Please type your reply above this line -##

Hello $contact_name,

Your ticket regarding $ticket_subject has been updated.

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

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,

Your ticket regarding $ticket_subject has been updated.

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

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

--
$company_name - Support
$config_ticket_from_email
$company_phone"; } $data = []; 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/setup.php b/setup.php index 0d5a7476..59df2dfe 100644 --- a/setup.php +++ b/setup.php @@ -257,7 +257,7 @@ if (isset($_POST['add_company_settings'])) { unlink('uploads/tmp/cronkey.php'); } - + // Create Main Account Types mysqli_query($mysqli,"INSERT INTO account_types SET account_type_name = 'Asset', account_type_parent = 1, account_type_description = 'Assets are economic resources which are expected to benefit the business in the future.'"); @@ -295,6 +295,12 @@ if (isset($_POST['add_company_settings'])) { //Create Calendar mysqli_query($mysqli,"INSERT INTO calendars SET calendar_name = 'Default', calendar_color = 'blue'"); + // Add default ticket statuses + 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 = 'success'"); // 4 + mysqli_query($mysqli, "INSERT INTO ticket_statuses SET ticket_status_name = 'Closed', ticket_status_color = 'dark'"); // 5 $_SESSION['alert_message'] = "Company $name created!"; diff --git a/ticket.php b/ticket.php index 0fbe5dc9..bde6acab 100644 --- a/ticket.php +++ b/ticket.php @@ -27,6 +27,7 @@ if (isset($_GET['ticket_id'])) { LEFT JOIN locations ON ticket_location_id = location_id LEFT JOIN assets ON ticket_asset_id = asset_id LEFT JOIN vendors ON ticket_vendor_id = vendor_id + LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id WHERE ticket_id = $ticket_id LIMIT 1" ); @@ -76,8 +77,9 @@ if (isset($_GET['ticket_id'])) { } $ticket_feedback = nullable_htmlentities($row['ticket_feedback']); - $ticket_status = nullable_htmlentities($row['ticket_status']); - $ticket_status_color = getTicketStatusColor($ticket_status); + $ticket_status = intval($row['ticket_status_id']); + $ticket_status_name = nullable_htmlentities($row['ticket_status_name']); + $ticket_status_color = nullable_htmlentities($row['ticket_status_color']); $ticket_vendor_ticket_number = nullable_htmlentities($row['ticket_vendor_ticket_number']); $ticket_created_at = nullable_htmlentities($row['ticket_created_at']); @@ -261,15 +263,16 @@ if (isset($_GET['ticket_id'])) {
+
-

Ticket

+

Ticket

- +
- + - +
- +
@@ -388,16 +391,15 @@ if (isset($_GET['ticket_id'])) {
@@ -545,7 +547,7 @@ if (isset($_GET['ticket_id'])) {
- +

+ @@ -662,7 +665,7 @@ if (isset($_GET['ticket_id'])) {
- > value=""> -
+
@@ -726,7 +729,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'])); ?>
@@ -787,7 +790,7 @@ if (isset($_GET['ticket_id'])) { - +