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 @@
-
-
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'])) {