From 5d2b14259cdf3efdb93c159a99ff13207bcb8e2c Mon Sep 17 00:00:00 2001 From: johnnyq Date: Thu, 12 Jun 2025 17:13:17 -0400 Subject: [PATCH] Added Ticket Due Date basic functionality to tickets --- ajax/ajax_ticket_edit.php | 45 ++++++++++++++++++++++++++ database_updates.php | 3 +- db.sql | 3 +- modals/ticket_add_modal.php | 63 +++++++++++++++++++++++-------------- post/user/ticket.php | 28 +++++++++++++++-- 5 files changed, 114 insertions(+), 28 deletions(-) diff --git a/ajax/ajax_ticket_edit.php b/ajax/ajax_ticket_edit.php index de022663..a52816c4 100644 --- a/ajax/ajax_ticket_edit.php +++ b/ajax/ajax_ticket_edit.php @@ -18,6 +18,8 @@ $ticket_priority = nullable_htmlentities($row['ticket_priority']); $ticket_billable = intval($row['ticket_billable']); $ticket_vendor_ticket_number = nullable_htmlentities($row['ticket_vendor_ticket_number']); $ticket_created_at = nullable_htmlentities($row['ticket_created_at']); +$ticket_due_at = nullable_htmlentities($row['ticket_due_at']); +$ticket_assigned_to = intval($row['ticket_assigned_to']); $contact_id = intval($row['ticket_contact_id']); $asset_id = intval($row['ticket_asset_id']); $location_id = intval($row['ticket_location_id']); @@ -128,6 +130,49 @@ ob_start(); +
+
+
+ +
+
+ +
+ +
+
+
+
+
+ +
+
+ +
+ +
+
+
+
+ = 2) { ?>
diff --git a/database_updates.php b/database_updates.php index d14d0c5a..12c38e49 100644 --- a/database_updates.php +++ b/database_updates.php @@ -3465,7 +3465,8 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { } if (CURRENT_DATABASE_VERSION == '2.1.4') { - mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_timer_autostart` TINYINT(1) NOT NULL DEFAULT '0' AFTER `config_ticket_default_billable`"); + mysqli_query($mysqli, "ALTER TABLE `settings` ADD `config_ticket_timer_autostart` TINYINT(1) NOT NULL DEFAULT '0' AFTER `config_ticket_default_billable`"); + mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_due_at` DATETIME DEFAULT NULL AFTER `ticket_updated_at`"); mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.1.5'"); } diff --git a/db.sql b/db.sql index 12549030..af9ff4db 100644 --- a/db.sql +++ b/db.sql @@ -2245,6 +2245,7 @@ CREATE TABLE `tickets` ( `ticket_url_key` varchar(200) DEFAULT NULL, `ticket_created_at` datetime NOT NULL DEFAULT current_timestamp(), `ticket_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `ticket_due_at` datetime DEFAULT NULL, `ticket_resolved_at` datetime DEFAULT NULL, `ticket_archived_at` datetime DEFAULT NULL, `ticket_first_response_at` datetime DEFAULT NULL, @@ -2501,4 +2502,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-06-12 13:43:40 +-- Dump completed on 2025-06-12 17:12:13 diff --git a/modals/ticket_add_modal.php b/modals/ticket_add_modal.php index 2eb9a265..33322e15 100644 --- a/modals/ticket_add_modal.php +++ b/modals/ticket_add_modal.php @@ -172,31 +172,46 @@
-
- -
-
- -
- + + 1 - AND user_type = 1 - AND user_status = 1 - AND user_archived_at IS NULL - ORDER BY user_name ASC" - ); - while ($row = mysqli_fetch_array($sql)) { - $user_id = intval($row['user_id']); - $user_name = nullable_htmlentities($row['user_name']); ?> - - - + $sql = mysqli_query( + $mysqli, + "SELECT user_id, user_name FROM users + WHERE user_role_id > 1 + AND user_type = 1 + AND user_status = 1 + AND user_archived_at IS NULL + ORDER BY user_name ASC" + ); + while ($row = mysqli_fetch_array($sql)) { + $user_id = intval($row['user_id']); + $user_name = nullable_htmlentities($row['user_name']); ?> + + + +
+
+
+
+
+ +
+
+ +
+ +
+
diff --git a/post/user/ticket.php b/post/user/ticket.php index e3d36467..3d8a3bbc 100644 --- a/post/user/ticket.php +++ b/post/user/ticket.php @@ -30,6 +30,18 @@ if (isset($_POST['add_ticket'])) { $use_primary_contact = intval($_POST['use_primary_contact'] ?? 0); $ticket_template_id = intval($_POST['ticket_template_id']); $billable = intval($_POST['billable'] ?? 0); + // Validate/clean due field + $dueInput = $_POST['due'] ?? null; + if ($dueInput === null || trim($dueInput) === '') { + $due = 'NULL'; // prepare as SQL-safe string + } else { + $d = DateTime::createFromFormat('Y-m-d\TH:i', $dueInput); // for + if ($d !== false) { + $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL + } else { + $due = 'NULL'; // fallback if invalid + } + } // Add the primary contact as the ticket contact if "Use primary contact" is checked if ($use_primary_contact == 1) { @@ -53,7 +65,7 @@ if (isset($_POST['add_ticket'])) { 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_source = 'Agent', ticket_category = $category_id, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = '$billable', ticket_status = '$ticket_status', ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_contact_id = $contact, ticket_url_key = '$url_key', ticket_client_id = $client_id, ticket_invoice_id = 0, ticket_project_id = $project_id"); + mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_source = 'Agent', ticket_category = $category_id, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = '$billable', ticket_status = '$ticket_status', ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_contact_id = $contact, ticket_url_key = '$url_key', ticket_due_at = $due, ticket_client_id = $client_id, ticket_invoice_id = 0, ticket_project_id = $project_id"); $ticket_id = mysqli_insert_id($mysqli); @@ -193,8 +205,20 @@ if (isset($_POST['edit_ticket'])) { $asset_id = intval($_POST['asset']); $location_id = intval($_POST['location']); $project_id = intval($_POST['project']); + // Validate/clean due field + $dueInput = $_POST['due'] ?? null; + if ($dueInput === null || trim($dueInput) === '') { + $due = 'NULL'; // prepare as SQL-safe string + } else { + $d = DateTime::createFromFormat('Y-m-d\TH:i', $dueInput); // for + if ($d !== false) { + $due = "'" . $d->format('Y-m-d H:i:s') . "'"; // wrap in quotes for SQL + } else { + $due = 'NULL'; // fallback if invalid + } + } - mysqli_query($mysqli, "UPDATE tickets SET ticket_category = $category_id, ticket_subject = '$ticket_subject', ticket_priority = '$ticket_priority', ticket_billable = $billable, ticket_details = '$details', ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_contact_id = $contact_id, ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); + mysqli_query($mysqli, "UPDATE tickets SET ticket_category = $category_id, ticket_subject = '$ticket_subject', ticket_priority = '$ticket_priority', ticket_billable = $billable, ticket_details = '$details', ticket_due_at = $due, ticket_vendor_ticket_number = '$vendor_ticket_number', ticket_contact_id = $contact_id, ticket_vendor_id = $vendor_id, ticket_location_id = $location_id, ticket_asset_id = $asset_id, ticket_project_id = $project_id WHERE ticket_id = $ticket_id"); // Add Additional Assets if (isset($_POST['additional_assets'])) {