From 44b70d7161d7f0997cc42e09edcb7fb0046b8e95 Mon Sep 17 00:00:00 2001 From: wrongecho Date: Fri, 7 Mar 2025 13:28:35 +0000 Subject: [PATCH 001/105] Add database field for ticket_first_response_at. This can be used as part of metric reporting and also as part of SLAs in the future --- database_updates.php | 12 +++++++++--- db.sql | 1 + includes/database_version.php | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/database_updates.php b/database_updates.php index 50ea60ce..d2447bc2 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2423,10 +2423,16 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.7'"); } - // if (CURRENT_DATABASE_VERSION == '1.8.7') { - // // Insert queries here required to update to DB version 1.8.8 + if (CURRENT_DATABASE_VERSION == '1.8.7') { + mysqli_query($mysqli, "ALTER TABLE `tickets` ADD `ticket_first_response_at` DATETIME NULL DEFAULT NULL AFTER `ticket_archived_at`"); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.8.8') { + // // Insert queries here required to update to DB version 1.8.9 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.9'"); // } } else { diff --git a/db.sql b/db.sql index a757b2a2..df9dd6fa 100644 --- a/db.sql +++ b/db.sql @@ -2139,6 +2139,7 @@ CREATE TABLE `tickets` ( `ticket_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), `ticket_resolved_at` datetime DEFAULT NULL, `ticket_archived_at` datetime DEFAULT NULL, + `ticket_first_response_at` datetime DEFAULT NULL, `ticket_closed_at` datetime DEFAULT NULL, `ticket_created_by` int(11) NOT NULL, `ticket_assigned_to` int(11) NOT NULL DEFAULT 0, diff --git a/includes/database_version.php b/includes/database_version.php index 17de9b8e..79e76230 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.8.7"); +DEFINE("LATEST_DATABASE_VERSION", "1.8.8"); From e5dc50ec35543b85e1f1697c7ca45c709b4fe05e Mon Sep 17 00:00:00 2001 From: wrongecho Date: Fri, 7 Mar 2025 22:57:18 +0000 Subject: [PATCH 002/105] Add time by technician report --- modals/ticket_bulk_assign_modal.php | 1 - report_time_by_tech.php | 179 ++++++++++++++++++++++++++++ ticket.php | 2 +- 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 report_time_by_tech.php diff --git a/modals/ticket_bulk_assign_modal.php b/modals/ticket_bulk_assign_modal.php index 8743d75c..fb464ca6 100644 --- a/modals/ticket_bulk_assign_modal.php +++ b/modals/ticket_bulk_assign_modal.php @@ -20,7 +20,6 @@ 1 AND user_type = 1 AND user_status = 1 AND user_archived_at IS NULL diff --git a/report_time_by_tech.php b/report_time_by_tech.php new file mode 100644 index 00000000..7ce4abad --- /dev/null +++ b/report_time_by_tech.php @@ -0,0 +1,179 @@ + (int)$days, + 'hour' => (int)$hours, + 'minute' => (int)$minutes, + 'second' => (int)$seconds, + ]; + + foreach ($sections as $name => $value){ + if ($value > 0){ + $timeParts[] = $value. ' '.$name.($value == 1 ? '' : 's'); + } + } + + return implode(', ', $timeParts); +} + +if (isset($_GET['year'])) { + $year = intval($_GET['year']); +} else { + $year = date('Y'); +} + +if (isset($_GET['month'])) { + $month = intval($_GET['month']); +} else { + $month = date('m'); +} + +$sql_ticket_years = mysqli_query($mysqli, "SELECT DISTINCT YEAR(ticket_created_at) AS ticket_year FROM tickets ORDER BY ticket_year DESC"); + +$sql_clients = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients WHERE client_archived_at IS NULL ORDER BY client_name ASC"); + +$sql_users = mysqli_query($mysqli, " + SELECT users.user_id, user_name FROM users + LEFT JOIN user_settings on users.user_id = user_settings.user_id + WHERE user_type = 1 + AND user_status = 1 + AND user_archived_at IS NULL + ORDER BY user_name DESC" +); +// TODO: Maybe try and filter this to just users with the support module perm + +?> + +
+
+

Time Logged By Technician

+
+ +
+
+
+
+ +
+ +
+
+

Yearly ()

+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
TechnicianTickets assignedTickets touchedTotal time worked (H:M:S)
+
+
+
+ +
+
+ + Date: Mon, 10 Mar 2025 12:26:14 -0400 Subject: [PATCH 003/105] Added Recurring Invoice Reference ID to Invoices and Product ID reference to Invoice Items --- database_updates.php | 12 +++++++++--- db.sql | 18 ++++++++++-------- includes/database_version.php | 2 +- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/database_updates.php b/database_updates.php index d2447bc2..eadb71a8 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2429,10 +2429,16 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.8'"); } - // if (CURRENT_DATABASE_VERSION == '1.8.8') { - // // Insert queries here required to update to DB version 1.8.9 + if (CURRENT_DATABASE_VERSION == '1.8.8') { + mysqli_query($mysqli, "ALTER TABLE `invoices` ADD `invoice_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 AFTER `invoice_category_id`"); + mysqli_query($mysqli, "ALTER TABLE `invoice_items` ADD `item_product_id` INT(11) NOT NULL DEFAULT 0 AFTER `item_tax_id`"); + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.9'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.8.9') { + // // Insert queries here required to update to DB version 1.9.0 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.9'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.0'"); // } } else { diff --git a/db.sql b/db.sql index df9dd6fa..b731ab09 100644 --- a/db.sql +++ b/db.sql @@ -329,13 +329,13 @@ DROP TABLE IF EXISTS `certificate_history`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `certificate_history` ( - `certificate_history_id` int(11) NOT NULL AUTO_INCREMENT, - `certificate_history_column` varchar(200) NOT NULL, - `certificate_history_old_value` text NOT NULL, - `certificate_history_new_value` text NOT NULL, - `certificate_history_certificate_id` int(11) NOT NULL, - `certificate_history_modified_at` datetime NOT NULL DEFAULT current_timestamp(), - PRIMARY KEY (`certificate_history_id`) + `certificate_history_id` int(11) NOT NULL AUTO_INCREMENT, + `certificate_history_column` varchar(200) NOT NULL, + `certificate_history_old_value` text NOT NULL, + `certificate_history_new_value` text NOT NULL, + `certificate_history_certificate_id` int(11) NOT NULL, + `certificate_history_modified_at` datetime NOT NULL DEFAULT current_timestamp(), + PRIMARY KEY (`certificate_history_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -929,6 +929,7 @@ CREATE TABLE `invoice_items` ( `item_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), `item_archived_at` datetime DEFAULT NULL, `item_tax_id` int(11) NOT NULL DEFAULT 0, + `item_product_id` int(11) NOT NULL DEFAULT 0, `item_quote_id` int(11) NOT NULL DEFAULT 0, `item_recurring_id` int(11) NOT NULL DEFAULT 0, `item_invoice_id` int(11) NOT NULL DEFAULT 0, @@ -960,6 +961,7 @@ CREATE TABLE `invoices` ( `invoice_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), `invoice_archived_at` datetime DEFAULT NULL, `invoice_category_id` int(11) NOT NULL, + `invoice_recurring_invoice_id` int(11) NOT NULL DEFAULT 0, `invoice_client_id` int(11) NOT NULL, PRIMARY KEY (`invoice_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; @@ -2381,4 +2383,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-02-26 12:58:39 +-- Dump completed on 2025-03-10 12:25:19 diff --git a/includes/database_version.php b/includes/database_version.php index 79e76230..1a9644cb 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.8.8"); +DEFINE("LATEST_DATABASE_VERSION", "1.8.9"); From 3804e18e53e208db4652b206b67ea03ae6c4783e Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 10 Mar 2025 12:34:31 -0400 Subject: [PATCH 004/105] When cron or manually generating invoice from a Recurring Invoice insert referencing recurring Invoice ID into the invoice --- post/user/invoice.php | 2 +- scripts/cron.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/post/user/invoice.php b/post/user/invoice.php index d3e9402c..d77386d8 100644 --- a/post/user/invoice.php +++ b/post/user/invoice.php @@ -1467,7 +1467,7 @@ if (isset($_GET['force_recurring'])) { //Generate a unique URL key for clients to access $url_key = randomString(156); - mysqli_query($mysqli,"INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_client_id = $client_id"); + mysqli_query($mysqli,"INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_id, invoice_client_id = $client_id"); $new_invoice_id = mysqli_insert_id($mysqli); diff --git a/scripts/cron.php b/scripts/cron.php index 160dc895..25c700d4 100644 --- a/scripts/cron.php +++ b/scripts/cron.php @@ -582,7 +582,7 @@ while ($row = mysqli_fetch_array($sql_recurring)) { //Generate a unique URL key for clients to access $url_key = randomString(156); - mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_client_id = $client_id"); + mysqli_query($mysqli, "INSERT INTO invoices SET invoice_prefix = '$config_invoice_prefix', invoice_number = $new_invoice_number, invoice_scope = '$recurring_scope', invoice_date = CURDATE(), invoice_due = DATE_ADD(CURDATE(), INTERVAL $client_net_terms day), invoice_discount_amount = $recurring_discount_amount, invoice_amount = $recurring_amount, invoice_currency_code = '$recurring_currency_code', invoice_note = '$recurring_note', invoice_category_id = $category_id, invoice_status = 'Sent', invoice_url_key = '$url_key', invoice_recurring_invoice_id = $recurring_id, invoice_client_id = $client_id"); $new_invoice_id = mysqli_insert_id($mysqli); From 9b6ea851e7b5ac3248e5248955b8109293389dfa Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 10 Mar 2025 15:57:16 -0400 Subject: [PATCH 005/105] Removed the prepended user_ from the fields in the user_roles table, moved user_role_id from user_settings directly to users table, rename table user_permissions to user_client_permissions, removed unused Sessions vars in login. This upedate will require to update using update_cli.php --db_update --- admin_role.php | 30 ++++++++-------- admin_user.php | 12 +++---- ajax/ajax_project_edit.php | 5 ++- ajax/ajax_role_edit.php | 12 +++---- ajax/ajax_user_edit.php | 12 +++---- check_login.php | 28 ++++++++------- dashboard.php | 5 --- database_updates.php | 49 ++++++++++++++++++++++++-- db.sql | 28 +++++++-------- functions.php | 16 ++++----- includes/database_version.php | 2 +- login.php | 5 +-- modals/admin_user_add_modal.php | 8 ++--- modals/asset_bulk_add_ticket_modal.php | 5 ++- modals/project_add_modal.php | 5 ++- modals/recurring_ticket_add_modal.php | 5 ++- modals/ticket_add_modal.php | 5 ++- modals/trip_add_modal.php | 5 ++- post/admin/admin_role.php | 16 ++++----- post/admin/admin_user.php | 30 ++++++---------- ticket.php | 5 ++- 21 files changed, 156 insertions(+), 132 deletions(-) diff --git a/admin_role.php b/admin_role.php index f79def74..5ea1e4c6 100644 --- a/admin_role.php +++ b/admin_role.php @@ -1,7 +1,7 @@ "> - - Role + + Role Members - - Admin + + Admin Action @@ -70,17 +70,17 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); - - Role + + Role @@ -116,8 +116,8 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); $mfa_status_display = ""; } $user_config_force_mfa = intval($row['user_config_force_mfa']); - $user_role = $row['user_role']; - $user_role_display = nullable_htmlentities($row['user_role_name']); + $user_role = $row['user_role_id']; + $user_role_display = nullable_htmlentities($row['role_name']); $user_initials = nullable_htmlentities(initials($user_name)); $sql_last_login = mysqli_query( @@ -139,7 +139,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } // Get User Client Access Permissions - $user_client_access_sql = mysqli_query($mysqli,"SELECT client_id FROM user_permissions WHERE user_id = $user_id"); + $user_client_access_sql = mysqli_query($mysqli,"SELECT client_id FROM user_client_permissions WHERE user_id = $user_id"); $client_access_array = []; while ($row = mysqli_fetch_assoc($user_client_access_sql)) { $client_access_array[] = intval($row['client_id']); diff --git a/ajax/ajax_project_edit.php b/ajax/ajax_project_edit.php index 71bf976a..af61d3ef 100644 --- a/ajax/ajax_project_edit.php +++ b/ajax/ajax_project_edit.php @@ -74,9 +74,8 @@ ob_start(); 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC" + "SELECT user_id, user_name FROM users + WHERE user_role_id > 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC" ); while ($row = mysqli_fetch_array($sql_project_managers_select)) { $user_id_select = intval($row['user_id']); diff --git a/ajax/ajax_role_edit.php b/ajax/ajax_role_edit.php index f0f2d237..9b1d967f 100644 --- a/ajax/ajax_role_edit.php +++ b/ajax/ajax_role_edit.php @@ -4,18 +4,18 @@ require_once '../includes/ajax_header.php'; $role_id = intval($_GET['id']); -$sql = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE user_role_id = $role_id LIMIT 1"); +$sql = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE role_id = $role_id LIMIT 1"); $row = mysqli_fetch_array($sql); -$role_name = nullable_htmlentities($row['user_role_name']); -$role_description = nullable_htmlentities($row['user_role_description']); -$role_admin = intval($row['user_role_is_admin']); +$role_name = nullable_htmlentities($row['role_name']); +$role_description = nullable_htmlentities($row['role_description']); +$role_admin = intval($row['role_is_admin']); // Count number of users that have each role -$sql_role_user_count = mysqli_query($mysqli, "SELECT COUNT(users.user_id) FROM users LEFT JOIN user_settings on users.user_id = user_settings.user_id WHERE user_role = $role_id AND user_archived_at IS NULL"); +$sql_role_user_count = mysqli_query($mysqli, "SELECT COUNT(user_id) FROM users WHERE user_role_id = $role_id AND user_archived_at IS NULL"); $role_user_count = mysqli_fetch_row($sql_role_user_count)[0]; -$sql_users = mysqli_query($mysqli, "SELECT * FROM users LEFT JOIN user_settings on users.user_id = user_settings.user_id WHERE user_role = $role_id AND user_archived_at IS NULL"); +$sql_users = mysqli_query($mysqli, "SELECT * FROM users WHERE user_role_id = $role_id AND user_archived_at IS NULL"); // Initialize an empty array to hold user names $user_names = []; diff --git a/ajax/ajax_user_edit.php b/ajax/ajax_user_edit.php index f592d71b..54e916f5 100644 --- a/ajax/ajax_user_edit.php +++ b/ajax/ajax_user_edit.php @@ -12,11 +12,11 @@ $user_email = nullable_htmlentities($row['user_email']); $user_avatar = nullable_htmlentities($row['user_avatar']); $user_token = nullable_htmlentities($row['user_token']); $user_config_force_mfa = intval($row['user_config_force_mfa']); -$user_role = intval($row['user_role']); +$user_role_id = intval($row['user_role_id']); $user_initials = nullable_htmlentities(initials($user_name)); // Get User Client Access Permissions -$user_client_access_sql = mysqli_query($mysqli,"SELECT client_id FROM user_permissions WHERE user_id = $user_id"); +$user_client_access_sql = mysqli_query($mysqli,"SELECT client_id FROM user_client_permissions WHERE user_id = $user_id"); $client_access_array = []; while ($row = mysqli_fetch_assoc($user_client_access_sql)) { $client_access_array[] = intval($row['client_id']); @@ -107,13 +107,13 @@ ob_start(); diff --git a/check_login.php b/check_login.php index 72ffa668..2db055a1 100644 --- a/check_login.php +++ b/check_login.php @@ -27,17 +27,11 @@ if (!isset($_SESSION['logged']) || !$_SESSION['logged']) { exit; } -// Check user type -if ($_SESSION['user_type'] !== 1) { - header("Location: login.php"); - exit(); -} - // Set Timezone require_once "inc_set_timezone.php"; -// User IP & UA +// User Vars and User Settings $session_ip = sanitizeInput(getIP()); $session_user_agent = sanitizeInput($_SERVER['HTTP_USER_AGENT']); @@ -47,7 +41,7 @@ $sql = mysqli_query( $mysqli, "SELECT * FROM users LEFT JOIN user_settings ON users.user_id = user_settings.user_id - LEFT JOIN user_roles ON user_settings.user_role = user_roles.user_role_id + LEFT JOIN user_roles ON user_role_id = role_id WHERE users.user_id = $session_user_id"); $row = mysqli_fetch_array($sql); @@ -55,9 +49,10 @@ $session_name = sanitizeInput($row['user_name']); $session_email = $row['user_email']; $session_avatar = $row['user_avatar']; $session_token = $row['user_token']; // MFA Token -$session_user_role = intval($row['user_role']); -$session_user_role_display = sanitizeInput($row['user_role_name']); -if (isset($row['user_role_is_admin']) && $row['user_role_is_admin'] == 1) { +$session_user_type = intval($row['user_type']); +$session_user_role = intval($row['user_role_id']); +$session_user_role_display = sanitizeInput($row['role_name']); +if (isset($row['role_is_admin']) && $row['role_is_admin'] == 1) { $session_is_admin = true; } else { $session_is_admin = false; @@ -65,6 +60,15 @@ if (isset($row['user_role_is_admin']) && $row['user_role_is_admin'] == 1) { $session_user_config_force_mfa = intval($row['user_config_force_mfa']); $user_config_records_per_page = intval($row['user_config_records_per_page']); +// Check user type +if ($session_user_type !== 1) { + session_unset(); + session_destroy(); + header("Location: login.php"); + exit(); +} + +// Company Vars and Company Settings $sql = mysqli_query($mysqli, "SELECT * FROM companies, settings WHERE settings.company_id = companies.company_id AND companies.company_id = 1"); $row = mysqli_fetch_array($sql); @@ -78,7 +82,7 @@ $session_company_currency = $row['company_currency']; $currency_format = numfmt_create($session_company_locale, NumberFormatter::CURRENCY); // Get User Client Access Permissions -$user_client_access_sql = "SELECT client_id FROM user_permissions WHERE user_id = $session_user_id"; +$user_client_access_sql = "SELECT client_id FROM user_client_permissions WHERE user_id = $session_user_id"; $user_client_access_result = mysqli_query($mysqli, $user_client_access_sql); $client_access_array = []; diff --git a/dashboard.php b/dashboard.php index cae20984..92fa3fc0 100644 --- a/dashboard.php +++ b/dashboard.php @@ -73,11 +73,6 @@ $sql_years_select = mysqli_query($mysqli, " window.location.href = \'dashboard_technical.php\';'); - } - // Fetch financial data for the dashboard // Define variables to avoid errors in logs $largest_income_month = 0; diff --git a/database_updates.php b/database_updates.php index eadb71a8..ff203f75 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2435,10 +2435,53 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.8.9'"); } - // if (CURRENT_DATABASE_VERSION == '1.8.9') { - // // Insert queries here required to update to DB version 1.9.0 + if (CURRENT_DATABASE_VERSION == '1.8.9') { + mysqli_query($mysqli, "ALTER TABLE `users` ADD `user_role_id` INT(11) DEFAULT 0 AFTER `user_archived_at`"); + + // Copy user role from user settings table to the users table + mysqli_query($mysqli," + UPDATE `users` + JOIN `user_settings` ON users.user_id = user_settings.user_id + SET users.user_role_id = user_settings.user_role + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.0'"); + } + + if (CURRENT_DATABASE_VERSION == '1.9.0') { + mysqli_query($mysqli, "ALTER TABLE `user_settings` DROP `user_role`"); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.1'"); + } + + if (CURRENT_DATABASE_VERSION == '1.9.1') { + + mysqli_query($mysqli, + "ALTER TABLE `user_roles` + CHANGE COLUMN `user_role_id` `role_id` INT(11) NOT NULL AUTO_INCREMENT, + CHANGE COLUMN `user_role_name` `role_name` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `user_role_description` `role_description` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `user_role_type` `role_type` TINYINT(1) NOT NULL DEFAULT 1, + CHANGE COLUMN `user_role_is_admin` `role_is_admin` TINYINT(1) NOT NULL DEFAULT 0, + CHANGE COLUMN `user_role_created_at` `role_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + CHANGE COLUMN `user_role_updated_at` `role_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), + CHANGE COLUMN `user_role_archived_at` `role_archived_at` DATETIME NULL DEFAULT NULL + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.2'"); + } + + if (CURRENT_DATABASE_VERSION == '1.9.2') { + + mysqli_query($mysqli, "RENAME TABLE `user_permissions` TO `user_client_permissions`"); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.3'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.9.3') { + // // Insert queries here required to update to DB version 1.9.4 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.0'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.4'"); // } } else { diff --git a/db.sql b/db.sql index b731ab09..4f298057 100644 --- a/db.sql +++ b/db.sql @@ -2205,13 +2205,13 @@ CREATE TABLE `trips` ( /*!40101 SET character_set_client = @saved_cs_client */; -- --- Table structure for table `user_permissions` +-- Table structure for table `user_client_permissions` -- -DROP TABLE IF EXISTS `user_permissions`; +DROP TABLE IF EXISTS `user_client_permissions`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; -CREATE TABLE `user_permissions` ( +CREATE TABLE `user_client_permissions` ( `user_id` int(11) NOT NULL, `client_id` int(11) NOT NULL, PRIMARY KEY (`user_id`,`client_id`) @@ -2240,15 +2240,15 @@ DROP TABLE IF EXISTS `user_roles`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `user_roles` ( - `user_role_id` int(11) NOT NULL AUTO_INCREMENT, - `user_role_name` varchar(200) NOT NULL, - `user_role_description` varchar(200) DEFAULT NULL, - `user_role_type` tinyint(1) NOT NULL DEFAULT 1, - `user_role_is_admin` tinyint(1) NOT NULL DEFAULT 0, - `user_role_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `user_role_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), - `user_role_archived_at` datetime DEFAULT NULL, - PRIMARY KEY (`user_role_id`) + `role_id` int(11) NOT NULL AUTO_INCREMENT, + `role_name` varchar(200) NOT NULL, + `role_description` varchar(200) DEFAULT NULL, + `role_type` tinyint(1) NOT NULL DEFAULT 1, + `role_is_admin` tinyint(1) NOT NULL DEFAULT 0, + `role_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `role_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `role_archived_at` datetime DEFAULT NULL, + PRIMARY KEY (`role_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2261,7 +2261,6 @@ DROP TABLE IF EXISTS `user_settings`; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `user_settings` ( `user_id` int(11) NOT NULL, - `user_role` int(11) NOT NULL, `user_config_force_mfa` tinyint(1) NOT NULL DEFAULT 0, `user_config_records_per_page` int(11) NOT NULL DEFAULT 10, `user_config_dashboard_financial_enable` tinyint(1) NOT NULL DEFAULT 0, @@ -2296,6 +2295,7 @@ CREATE TABLE `users` ( `user_created_at` datetime NOT NULL DEFAULT current_timestamp(), `user_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), `user_archived_at` datetime DEFAULT NULL, + `user_role_id` int(11) DEFAULT 0, PRIMARY KEY (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2383,4 +2383,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-03-10 12:25:19 +-- Dump completed on 2025-03-10 15:52:38 diff --git a/functions.php b/functions.php index 4e013c37..56152129 100644 --- a/functions.php +++ b/functions.php @@ -541,7 +541,7 @@ function validateCSRFToken($token) function validateAdminRole() { - if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] != 3) { + if (!isset($session_user_role) || $session_user_role != 3) { $_SESSION['alert_type'] = "danger"; $_SESSION['alert_message'] = WORDING_ROLECHECK_FAILED; header("Location: " . $_SERVER["HTTP_REFERER"]); @@ -553,7 +553,7 @@ function validateAdminRole() // Validates a user is a tech (or admin). Stops page load and attempts to direct away from the page if not (i.e. user is an accountant) function validateTechRole() { - if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] == 1) { + if (!isset($session_user_role) || $session_user_role == 1) { $_SESSION['alert_type'] = "danger"; $_SESSION['alert_message'] = WORDING_ROLECHECK_FAILED; header("Location: " . $_SERVER["HTTP_REFERER"]); @@ -565,7 +565,7 @@ function validateTechRole() // Validates a user is an accountant (or admin). Stops page load and attempts to direct away from the page if not (i.e. user is a tech) function validateAccountantRole() { - if (!isset($_SESSION['user_role']) || $_SESSION['user_role'] == 2) { + if (!isset($session_user_role) || $session_user_role == 2) { $_SESSION['alert_type'] = "danger"; $_SESSION['alert_message'] = WORDING_ROLECHECK_FAILED; header("Location: " . $_SERVER["HTTP_REFERER"]); @@ -1313,15 +1313,15 @@ function lookupUserPermission($module) { $sql = mysqli_query( $mysqli, "SELECT - urp.user_role_permission_level + user_role_permissions.user_role_permission_level FROM - modules AS m + modules JOIN - user_role_permissions AS urp + user_role_permissions ON - m.module_id = urp.module_id + modules.module_id = user_role_permissions.module_id WHERE - m.module_name = '$module' AND urp.user_role_id = $session_user_role" + module_name = '$module' AND user_role_permissions.user_role_id = $session_user_role" ); $row = mysqli_fetch_array($sql); diff --git a/includes/database_version.php b/includes/database_version.php index 1a9644cb..b2d43d63 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.8.9"); +DEFINE("LATEST_DATABASE_VERSION", "1.9.3"); diff --git a/login.php b/login.php index c42b01eb..25eb1584 100644 --- a/login.php +++ b/login.php @@ -117,7 +117,7 @@ if (isset($_POST['login'])) { $user_email = sanitizeInput($row['user_email']); $token = sanitizeInput($row['user_token']); $force_mfa = intval($row['user_config_force_mfa']); - $user_role = intval($row['user_role']); + $user_role_id = intval($row['user_role_id']); $user_encryption_ciphertext = $row['user_specific_encryption_ciphertext']; $user_extension_key = $row['user_extension_key']; @@ -193,9 +193,6 @@ if (isset($_POST['login'])) { // Session info $_SESSION['user_id'] = $user_id; - $_SESSION['user_name'] = $user_name; - $_SESSION['user_type'] = 1; - $_SESSION['user_role'] = $user_role; $_SESSION['csrf_token'] = randomString(156); $_SESSION['logged'] = true; diff --git a/modals/admin_user_add_modal.php b/modals/admin_user_add_modal.php index 954b5b7d..9945a08e 100644 --- a/modals/admin_user_add_modal.php +++ b/modals/admin_user_add_modal.php @@ -71,13 +71,13 @@ diff --git a/modals/asset_bulk_add_ticket_modal.php b/modals/asset_bulk_add_ticket_modal.php index 941b3f6b..86124ef9 100644 --- a/modals/asset_bulk_add_ticket_modal.php +++ b/modals/asset_bulk_add_ticket_modal.php @@ -82,9 +82,8 @@ $sql = mysqli_query( $mysqli, - "SELECT users.user_id, user_name FROM users - LEFT JOIN user_settings on users.user_id = user_settings.user_id - WHERE user_role > 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC" + "SELECT user_id, user_name FROM users + WHERE user_role_id > 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']); diff --git a/modals/project_add_modal.php b/modals/project_add_modal.php index 463c2a7b..90c047cd 100644 --- a/modals/project_add_modal.php +++ b/modals/project_add_modal.php @@ -75,9 +75,8 @@ $sql = mysqli_query( $mysqli, - "SELECT users.user_id, user_name FROM users - LEFT JOIN user_settings on users.user_id = user_settings.user_id - WHERE user_role > 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC" + "SELECT user_id, user_name FROM users + WHERE user_role_id > 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']); diff --git a/modals/recurring_ticket_add_modal.php b/modals/recurring_ticket_add_modal.php index e905d559..cdc63a44 100644 --- a/modals/recurring_ticket_add_modal.php +++ b/modals/recurring_ticket_add_modal.php @@ -74,9 +74,8 @@ $sql = mysqli_query( $mysqli, - "SELECT users.user_id, user_name FROM users - LEFT JOIN user_settings on users.user_id = user_settings.user_id - WHERE user_role > 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC" + "SELECT user_id, user_name FROM users + WHERE user_role_id > 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']); diff --git a/modals/ticket_add_modal.php b/modals/ticket_add_modal.php index de6e3f29..7ecc4ee7 100644 --- a/modals/ticket_add_modal.php +++ b/modals/ticket_add_modal.php @@ -178,9 +178,8 @@ $sql = mysqli_query( $mysqli, - "SELECT users.user_id, user_name FROM users - LEFT JOIN user_settings on users.user_id = user_settings.user_id - WHERE user_role > 1 + "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 diff --git a/modals/trip_add_modal.php b/modals/trip_add_modal.php index 88491f3f..a16e3313 100644 --- a/modals/trip_add_modal.php +++ b/modals/trip_add_modal.php @@ -89,9 +89,8 @@ 1 AND user_archived_at IS NULL ORDER BY user_name ASC" + $sql = mysqli_query($mysqli, "SELECT user_id, user_name FROM users + WHERE user_role_id > 1 AND user_archived_at IS NULL ORDER BY user_name ASC" ); while ($row = mysqli_fetch_array($sql)) { $user_id = intval($row['user_id']); diff --git a/post/admin/admin_role.php b/post/admin/admin_role.php index 20fda49b..af659e70 100644 --- a/post/admin/admin_role.php +++ b/post/admin/admin_role.php @@ -14,12 +14,12 @@ if (isset($_POST['add_role'])) { $description = sanitizeInput($_POST['role_description']); $admin = intval($_POST['role_is_admin']); - mysqli_query($mysqli, "INSERT INTO user_roles SET user_role_name = '$name', user_role_description = '$description', user_role_is_admin = $admin"); + mysqli_query($mysqli, "INSERT INTO user_roles SET role_name = '$name', role_description = '$description', role_is_admin = $admin"); - $user_role_id = mysqli_insert_id($mysqli); + $role_id = mysqli_insert_id($mysqli); // Logging - logAction("User Role", "Create", "$session_name created user role $name", 0, $user_role_id); + logAction("User Role", "Create", "$session_name created user role $name", 0, $role_id); $_SESSION['alert_message'] = "User Role created"; @@ -37,7 +37,7 @@ if (isset($_POST['edit_role'])) { $description = sanitizeInput($_POST['role_description']); $admin = intval($_POST['role_is_admin']); - mysqli_query($mysqli, "UPDATE user_roles SET user_role_name = '$name', user_role_description = '$description', user_role_is_admin = $admin WHERE user_role_id = $role_id"); + mysqli_query($mysqli, "UPDATE user_roles SET role_name = '$name', role_description = '$description', role_is_admin = $admin WHERE role_id = $role_id"); // Update role access levels mysqli_query($mysqli, "DELETE FROM user_role_permissions WHERE user_role_id = $role_id"); @@ -68,7 +68,7 @@ if (isset($_GET['archive_role'])) { $role_id = intval($_GET['archive_role']); // Check role isn't in use - $sql_role_user_count = mysqli_query($mysqli, "SELECT COUNT(users.user_id) FROM users LEFT JOIN user_settings on users.user_id = user_settings.user_id WHERE user_role = $role_id AND user_archived_at IS NULL"); + $sql_role_user_count = mysqli_query($mysqli, "SELECT COUNT(user_id) FROM users WHERE user_role_id = $role_id AND user_archived_at IS NULL"); $role_user_count = mysqli_fetch_row($sql_role_user_count)[0]; if ($role_user_count != 0) { $_SESSION['alert_type'] = "error"; @@ -77,11 +77,11 @@ if (isset($_GET['archive_role'])) { exit(); } - mysqli_query($mysqli, "UPDATE user_roles SET user_role_archived_at = NOW() WHERE user_role_id = $role_id"); + mysqli_query($mysqli, "UPDATE user_roles SET role_archived_at = NOW() WHERE role_id = $role_id"); // Logging - $role_details = mysqli_fetch_array(mysqli_query($mysqli, "SELECT user_role_name FROM user_roles WHERE user_role_id = $role_id LIMIT 1")); - $role_name = sanitizeInput($role_details['user_role_name']); + $role_details = mysqli_fetch_array(mysqli_query($mysqli, "SELECT role_name FROM user_roles WHERE role_id = $role_id LIMIT 1")); + $role_name = sanitizeInput($role_details['role_name']); logAction("User Role", "Archive", "$session_name archived user role $role_name", 0, $role_id); $_SESSION['alert_message'] = "User Role archived"; diff --git a/post/admin/admin_user.php b/post/admin/admin_user.php index 5b095795..632fd083 100644 --- a/post/admin/admin_user.php +++ b/post/admin/admin_user.php @@ -15,7 +15,7 @@ if (isset($_POST['add_user'])) { $password = password_hash(trim($_POST['password']), PASSWORD_DEFAULT); $user_specific_encryption_ciphertext = encryptUserSpecificKey(trim($_POST['password'])); - mysqli_query($mysqli, "INSERT INTO users SET user_name = '$name', user_email = '$email', user_password = '$password', user_specific_encryption_ciphertext = '$user_specific_encryption_ciphertext'"); + mysqli_query($mysqli, "INSERT INTO users SET user_name = '$name', user_email = '$email', user_password = '$password', user_specific_encryption_ciphertext = '$user_specific_encryption_ciphertext' user_role_id = $role"); $user_id = mysqli_insert_id($mysqli); @@ -23,7 +23,7 @@ if (isset($_POST['add_user'])) { if (isset($_POST['clients'])) { foreach($_POST['clients'] as $client_id) { $client_id = intval($client_id); - mysqli_query($mysqli,"INSERT INTO user_permissions SET user_id = $user_id, client_id = $client_id"); + mysqli_query($mysqli,"INSERT INTO user_client_permissions SET user_id = $user_id, client_id = $client_id"); } } @@ -50,7 +50,7 @@ if (isset($_POST['add_user'])) { } // Create Settings - mysqli_query($mysqli, "INSERT INTO user_settings SET user_id = $user_id, user_role = $role, user_config_force_mfa = $force_mfa"); + mysqli_query($mysqli, "INSERT INTO user_settings SET user_id = $user_id, user_config_force_mfa = $force_mfa"); $sql = mysqli_query($mysqli,"SELECT * FROM companies WHERE company_id = 1"); $row = mysqli_fetch_array($sql); @@ -109,11 +109,11 @@ if (isset($_POST['edit_user'])) { $new_password = trim($_POST['new_password']); // Update Client Access - mysqli_query($mysqli,"DELETE FROM user_permissions WHERE user_id = $user_id"); + mysqli_query($mysqli,"DELETE FROM user_client_permissions WHERE user_id = $user_id"); if (isset($_POST['clients'])) { foreach($_POST['clients'] as $client_id) { $client_id = intval($client_id); - mysqli_query($mysqli,"INSERT INTO user_permissions SET user_id = $user_id, client_id = $client_id"); + mysqli_query($mysqli,"INSERT INTO user_client_permissions SET user_id = $user_id, client_id = $client_id"); } } @@ -153,7 +153,7 @@ if (isset($_POST['edit_user'])) { } } - mysqli_query($mysqli, "UPDATE users SET user_name = '$name', user_email = '$email' WHERE user_id = $user_id"); + mysqli_query($mysqli, "UPDATE users SET user_name = '$name', user_email = '$email', user_role_id = $role WHERE user_id = $user_id"); if (!empty($new_password)) { $new_password = password_hash($new_password, PASSWORD_DEFAULT); @@ -169,7 +169,7 @@ if (isset($_POST['edit_user'])) { } //Update User Settings - mysqli_query($mysqli, "UPDATE user_settings SET user_role = $role, user_config_force_mfa = $force_mfa WHERE user_id = $user_id"); + mysqli_query($mysqli, "UPDATE user_settings SET user_config_force_mfa = $force_mfa WHERE user_id = $user_id"); // Logging logAction("User", "Edit", "$session_name edited user $name", 0, $user_id); @@ -280,13 +280,13 @@ if (isset($_GET['archive_user'])) { if (isset($_POST['export_users_csv'])) { //get records from database - $sql = mysqli_query($mysqli, "SELECT * FROM users ORDER BY user_name ASC"); + $sql = mysqli_query($mysqli, "SELECT * FROM users LEFT JOIN user_roles ON user_role_id = role_id ORDER BY user_name ASC"); $count = mysqli_num_rows($sql); if ($count > 0) { - $delimiter = ", "; - $filename = $session_company_name . "-Users-" . date('Y-m-d') . ".csv"; + $delimiter = ","; + $filename = "Users-" . date('Y-m-d') . ".csv"; //create a file pointer $f = fopen('php://memory', 'w'); @@ -306,16 +306,8 @@ if (isset($_POST['export_users_csv'])) { } else{ $user_status_display = "Disabled"; } - $user_role = $row['user_role']; - if ($user_role == 3) { - $user_role_display = "Administrator"; - } elseif ($user_role == 2) { - $user_role_display = "Technician"; - } else { - $user_role_display = "Accountant"; - } - $lineData = array($row['user_name'], $row['user_email'], $user_role_display, $user_status_display, $row['user_created_at']); + $lineData = array($row['user_name'], $row['user_email'], $row['role_name'], $user_status_display, $row['user_created_at']); fputcsv($f, $lineData, $delimiter); } diff --git a/ticket.php b/ticket.php index d4d83a09..ff4e0eda 100644 --- a/ticket.php +++ b/ticket.php @@ -278,9 +278,8 @@ if (isset($_GET['ticket_id'])) { // Get Technicians to assign the ticket to $sql_assign_to_select = mysqli_query( $mysqli, - "SELECT users.user_id, user_name FROM users - LEFT JOIN user_settings on users.user_id = user_settings.user_id - WHERE user_role > 1 + "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 From 164a6a5604c7f4f53109941adc49cb34d3a2454a Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 10 Mar 2025 16:51:10 -0400 Subject: [PATCH 006/105] Started Standard user view and client user view in users --- admin_user.php | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/admin_user.php b/admin_user.php index 6f9899d7..4c5980bc 100644 --- a/admin_user.php +++ b/admin_user.php @@ -6,17 +6,24 @@ $order = "ASC"; require_once "includes/inc_all_admin.php"; - -//Rebuild URL -$url_query_strings_sort = http_build_query($get_copy); +// User Type Filter +if (isset($_GET['type']) && $_GET['type'] == "client") { + $type_filter = "client"; + $type_query = "AND user_type = 2"; +} else { + $type_filter = "user"; + $type_query = "AND user_type = 1"; +} $sql = mysqli_query( $mysqli, - "SELECT SQL_CALC_FOUND_ROWS * FROM users, user_settings, user_roles - WHERE users.user_id = user_settings.user_id - AND user_role_id = role_id - AND (user_name LIKE '%$q%' OR user_email LIKE '%$q%') + "SELECT SQL_CALC_FOUND_ROWS * FROM users + LEFT JOIN user_roles ON user_role_id = role_id + LEFT JOIN user_settings ON users.user_id = user_settings.user_id + LEFT JOIN contacts ON users.user_id = contact_user_id + WHERE (user_name LIKE '%$q%' OR user_email LIKE '%$q%') AND user_archived_at IS NULL + $type_query ORDER BY $sort $order LIMIT $record_from, $record_to" ); @@ -36,6 +43,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
-
- +
+
From 82c7a64a25635a352953d402f4f928cc0e37404b Mon Sep 17 00:00:00 2001 From: johnnyq Date: Mon, 10 Mar 2025 17:35:16 -0400 Subject: [PATCH 007/105] Added Bulk Delete Asset Functionality and also deleted more asset reference tables as we are not using cascade delete yet --- assets.php | 5 ++++ post/user/asset.php | 68 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/assets.php b/assets.php index ae2ab944..25d0e948 100644 --- a/assets.php +++ b/assets.php @@ -298,6 +298,11 @@ if (mysqli_num_rows($os_sql) > 0) { type="submit" form="bulkActions" name="bulk_unarchive_assets"> Unarchive + +
- + @@ -109,7 +109,7 @@ ob_start();
value="1" + value="1" >
@@ -117,7 +117,7 @@ ob_start();
-
+
@@ -152,7 +152,7 @@ ob_start(); } ?> - +
@@ -160,7 +160,7 @@ ob_start();
-
+
@@ -169,11 +169,11 @@ ob_start();
@@ -184,13 +184,13 @@ ob_start();
- +
-
+
@@ -208,7 +208,7 @@ ob_start(); $asset_name_select = nullable_htmlentities($row['asset_name']); $asset_contact_name_select = nullable_htmlentities($row['contact_name']); ?> - + CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.4'"); } - // if (CURRENT_DATABASE_VERSION == '1.9.4') { - // // Insert queries here required to update to DB version 1.9.5 + if (CURRENT_DATABASE_VERSION == '1.9.4') { + mysqli_query($mysqli, "RENAME TABLE `scheduled_tickets` TO `recurring_tickets`"); + + mysqli_query($mysqli, + "ALTER TABLE `recurring_tickets` + CHANGE COLUMN `scheduled_ticket_id` `recurring_ticket_id` INT(11) NOT NULL AUTO_INCREMENT, + CHANGE COLUMN `scheduled_ticket_category` `recurring_ticket_category` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `scheduled_ticket_subject` `recurring_ticket_subject` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `scheduled_ticket_details` `recurring_ticket_details` LONGTEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `scheduled_ticket_priority` `recurring_ticket_priority` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `scheduled_ticket_frequency` `recurring_ticket_frequency` VARCHAR(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `scheduled_ticket_billable` `recurring_ticket_billable` TINYINT(1) NOT NULL DEFAULT 0, + CHANGE COLUMN `scheduled_ticket_start_date` `recurring_ticket_start_date` DATE NOT NULL, + CHANGE COLUMN `scheduled_ticket_next_run` `recurring_ticket_next_run` DATE NOT NULL, + CHANGE COLUMN `scheduled_ticket_created_at` `recurring_ticket_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + CHANGE COLUMN `scheduled_ticket_updated_at` `recurring_ticket_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), + CHANGE COLUMN `scheduled_ticket_created_by` `recurring_ticket_created_by` INT(11) NOT NULL DEFAULT 0, + CHANGE COLUMN `scheduled_ticket_assigned_to` `recurring_ticket_assigned_to` INT(11) NOT NULL DEFAULT 0, + CHANGE COLUMN `scheduled_ticket_client_id` `recurring_ticket_client_id` INT(11) NOT NULL DEFAULT 0, + CHANGE COLUMN `scheduled_ticket_contact_id` `recurring_ticket_contact_id` INT(11) NOT NULL DEFAULT 0, + CHANGE COLUMN `scheduled_ticket_asset_id` `recurring_ticket_asset_id` INT(11) NOT NULL DEFAULT 0 + " + ); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.5'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.9.5') { + // // Insert queries here required to update to DB version 1.9.6 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.5'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.6'"); // } } else { diff --git a/db.sql b/db.sql index 42d864f9..0694d741 100644 --- a/db.sql +++ b/db.sql @@ -1494,6 +1494,34 @@ CREATE TABLE `recurring_payments` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `recurring_tickets` +-- + +DROP TABLE IF EXISTS `recurring_tickets`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `recurring_tickets` ( + `recurring_ticket_id` int(11) NOT NULL AUTO_INCREMENT, + `recurring_ticket_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `recurring_ticket_subject` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recurring_ticket_details` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recurring_ticket_priority` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL, + `recurring_ticket_frequency` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + `recurring_ticket_billable` tinyint(1) NOT NULL DEFAULT 0, + `recurring_ticket_start_date` date NOT NULL, + `recurring_ticket_next_run` date NOT NULL, + `recurring_ticket_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `recurring_ticket_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `recurring_ticket_created_by` int(11) NOT NULL DEFAULT 0, + `recurring_ticket_assigned_to` int(11) NOT NULL DEFAULT 0, + `recurring_ticket_client_id` int(11) NOT NULL DEFAULT 0, + `recurring_ticket_contact_id` int(11) NOT NULL DEFAULT 0, + `recurring_ticket_asset_id` int(11) NOT NULL DEFAULT 0, + PRIMARY KEY (`recurring_ticket_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `remember_tokens` -- @@ -1535,34 +1563,6 @@ CREATE TABLE `revenues` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; --- --- Table structure for table `scheduled_tickets` --- - -DROP TABLE IF EXISTS `scheduled_tickets`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `scheduled_tickets` ( - `scheduled_ticket_id` int(11) NOT NULL AUTO_INCREMENT, - `scheduled_ticket_category` varchar(200) DEFAULT NULL, - `scheduled_ticket_subject` varchar(500) NOT NULL, - `scheduled_ticket_details` longtext NOT NULL, - `scheduled_ticket_priority` varchar(200) DEFAULT NULL, - `scheduled_ticket_frequency` varchar(10) NOT NULL, - `scheduled_ticket_billable` tinyint(1) NOT NULL DEFAULT 0, - `scheduled_ticket_start_date` date NOT NULL, - `scheduled_ticket_next_run` date NOT NULL, - `scheduled_ticket_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `scheduled_ticket_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), - `scheduled_ticket_created_by` int(11) NOT NULL DEFAULT 0, - `scheduled_ticket_assigned_to` int(11) NOT NULL DEFAULT 0, - `scheduled_ticket_client_id` int(11) NOT NULL DEFAULT 0, - `scheduled_ticket_contact_id` int(11) NOT NULL DEFAULT 0, - `scheduled_ticket_asset_id` int(11) NOT NULL DEFAULT 0, - PRIMARY KEY (`scheduled_ticket_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - -- -- Table structure for table `service_assets` -- @@ -2400,4 +2400,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-03-11 15:09:10 +-- Dump completed on 2025-03-11 18:31:54 diff --git a/includes/client_side_nav.php b/includes/client_side_nav.php index 134d9cb3..bb1dbfc2 100644 --- a/includes/client_side_nav.php +++ b/includes/client_side_nav.php @@ -74,8 +74,8 @@

Recurring Tickets - + if ($num_recurring_tickets) { ?> +

diff --git a/includes/database_version.php b/includes/database_version.php index 7f247a89..34ef3cc8 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.9.4"); +DEFINE("LATEST_DATABASE_VERSION", "1.9.5"); diff --git a/includes/get_side_nav_counts.php b/includes/get_side_nav_counts.php index c448632c..35c59e11 100644 --- a/includes/get_side_nav_counts.php +++ b/includes/get_side_nav_counts.php @@ -10,7 +10,7 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('ticket_id') AS nu $num_active_tickets = $row['num']; // Recurring Ticket Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('scheduled_ticket_id') AS num FROM scheduled_tickets LEFT JOIN clients ON client_id = scheduled_ticket_client_id WHERE 1 = 1 $access_permission_query")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_ticket_id') AS num FROM recurring_tickets LEFT JOIN clients ON client_id = recurring_ticket_client_id WHERE 1 = 1 $access_permission_query")); $num_recurring_tickets = $row['num']; // Active Project Count diff --git a/includes/inc_all_client.php b/includes/inc_all_client.php index aa25a4d6..461d91b8 100644 --- a/includes/inc_all_client.php +++ b/includes/inc_all_client.php @@ -145,8 +145,8 @@ if (isset($_GET['client_id'])) { $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('ticket_id') AS num FROM tickets WHERE ticket_archived_at IS NULL AND ticket_closed_at IS NOT NULL AND ticket_client_id = $client_id")); $num_closed_tickets = $row['num']; - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('scheduled_ticket_id') AS num FROM scheduled_tickets WHERE scheduled_ticket_client_id = $client_id")); - $num_scheduled_tickets = $row['num']; + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_ticket_id') AS num FROM recurring_tickets WHERE recurring_ticket_client_id = $client_id")); + $num_recurring_tickets = $row['num']; $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('service_id') AS num FROM services WHERE service_client_id = $client_id")); $num_services = $row['num']; diff --git a/post/user/ticket.php b/post/user/ticket.php index daca7392..d676ab24 100644 --- a/post/user/ticket.php +++ b/post/user/ticket.php @@ -2041,12 +2041,12 @@ if (isset($_POST['add_recurring_ticket'])) { $start_date = sanitizeInput($_POST['start_date']); - mysqli_query($mysqli, "INSERT INTO scheduled_tickets SET scheduled_ticket_subject = '$subject', scheduled_ticket_details = '$details', scheduled_ticket_priority = '$priority', scheduled_ticket_frequency = '$frequency', scheduled_ticket_billable = $billable, scheduled_ticket_start_date = '$start_date', scheduled_ticket_next_run = '$start_date', scheduled_ticket_assigned_to = $assigned_to, scheduled_ticket_created_by = $session_user_id, scheduled_ticket_client_id = $client_id, scheduled_ticket_contact_id = $contact_id, scheduled_ticket_asset_id = $asset_id"); + mysqli_query($mysqli, "INSERT INTO recurring_tickets SET recurring_ticket_subject = '$subject', recurring_ticket_details = '$details', recurring_ticket_priority = '$priority', recurring_ticket_frequency = '$frequency', recurring_ticket_billable = $billable, recurring_ticket_start_date = '$start_date', recurring_ticket_next_run = '$start_date', recurring_ticket_assigned_to = $assigned_to, recurring_ticket_created_by = $session_user_id, recurring_ticket_client_id = $client_id, recurring_ticket_contact_id = $contact_id, recurring_ticket_asset_id = $asset_id"); - $scheduled_ticket_id = mysqli_insert_id($mysqli); + $recurring_ticket_id = mysqli_insert_id($mysqli); // Logging - logAction("Recurring Ticket", "Create", "$session_name created recurring ticket for $subject - $frequency", $client_id, $scheduled_ticket_id); + logAction("Recurring Ticket", "Create", "$session_name created recurring ticket for $subject - $frequency", $client_id, $recurring_ticket_id); $_SESSION['alert_message'] = "Recurring ticket $subject - $frequency created"; @@ -2059,13 +2059,13 @@ if (isset($_POST['edit_recurring_ticket'])) { require_once 'post/user/ticket_recurring_model.php'; - $scheduled_ticket_id = intval($_POST['scheduled_ticket_id']); + $recurring_ticket_id = intval($_POST['recurring_ticket_id']); $next_run_date = sanitizeInput($_POST['next_date']); - mysqli_query($mysqli, "UPDATE scheduled_tickets SET scheduled_ticket_subject = '$subject', scheduled_ticket_details = '$details', scheduled_ticket_priority = '$priority', scheduled_ticket_frequency = '$frequency', scheduled_ticket_billable = $billable, scheduled_ticket_next_run = '$next_run_date', scheduled_ticket_assigned_to = $assigned_to, scheduled_ticket_asset_id = $asset_id, scheduled_ticket_contact_id = $contact_id WHERE scheduled_ticket_id = $scheduled_ticket_id"); + mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_subject = '$subject', recurring_ticket_details = '$details', recurring_ticket_priority = '$priority', recurring_ticket_frequency = '$frequency', recurring_ticket_billable = $billable, recurring_ticket_next_run = '$next_run_date', recurring_ticket_assigned_to = $assigned_to, recurring_ticket_asset_id = $asset_id, recurring_ticket_contact_id = $contact_id WHERE recurring_ticket_id = $recurring_ticket_id"); // Logging - logAction("Recurring Ticket", "Edit", "$session_name edited recurring ticket $subject", $client_id, $scheduled_ticket_id); + logAction("Recurring Ticket", "Edit", "$session_name edited recurring ticket $subject", $client_id, $recurring_ticket_id); $_SESSION['alert_message'] = "Recurring ticket $subject - $frequency updated"; @@ -2077,24 +2077,24 @@ if (isset($_GET['force_recurring_ticket'])) { enforceUserPermission('module_support', 2); validateCSRFToken($_GET['csrf_token']); - $scheduled_ticket_id = intval($_GET['force_recurring_ticket']); + $recurring_ticket_id = intval($_GET['force_recurring_ticket']); - $sql = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets WHERE scheduled_ticket_id = $scheduled_ticket_id"); + $sql = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_id = $recurring_ticket_id"); if (mysqli_num_rows($sql) > 0) { $row = mysqli_fetch_array($sql); - $schedule_id = intval($row['scheduled_ticket_id']); - $subject = sanitizeInput($row['scheduled_ticket_subject']); - $details = mysqli_real_escape_string($mysqli, $row['scheduled_ticket_details']); - $priority = sanitizeInput($row['scheduled_ticket_priority']); - $frequency = sanitizeInput(strtolower($row['scheduled_ticket_frequency'])); - $billable = intval($row['scheduled_ticket_billable']); - $old_next_scheduled_date = sanitizeInput($row['scheduled_ticket_next_run']); - $created_id = intval($row['scheduled_ticket_created_by']); - $assigned_id = intval($row['scheduled_ticket_assigned_to']); - $contact_id = intval($row['scheduled_ticket_contact_id']); - $client_id = intval($row['scheduled_ticket_client_id']); - $asset_id = intval($row['scheduled_ticket_asset_id']); + $schedule_id = intval($row['recurring_ticket_id']); + $subject = sanitizeInput($row['recurring_ticket_subject']); + $details = mysqli_real_escape_string($mysqli, $row['recurring_ticket_details']); + $priority = sanitizeInput($row['recurring_ticket_priority']); + $frequency = sanitizeInput(strtolower($row['recurring_ticket_frequency'])); + $billable = intval($row['recurring_ticket_billable']); + $old_next_recurring_date = sanitizeInput($row['recurring_ticket_next_run']); + $created_id = intval($row['recurring_ticket_created_by']); + $assigned_id = intval($row['recurring_ticket_assigned_to']); + $contact_id = intval($row['recurring_ticket_contact_id']); + $client_id = intval($row['recurring_ticket_client_id']); + $asset_id = intval($row['recurring_ticket_asset_id']); $url_key = randomString(156); $ticket_status = 1; // Default @@ -2167,22 +2167,22 @@ if (isset($_GET['force_recurring_ticket'])) { addToMailQueue($data); // Set the next run date (based on the scheduled date, rather than now, so things keep their schedule) - $dt_old_next_scheduled_date = new DateTime($old_next_scheduled_date); + $dt_old_next_recurring_date = new DateTime($old_next_recurring_date); if ($frequency == "weekly") { - $next_run = date_add($dt_old_next_scheduled_date, date_interval_create_from_date_string('1 week')); + $next_run = date_add($dt_old_next_recurring_date, date_interval_create_from_date_string('1 week')); } elseif ($frequency == "monthly") { - $next_run = date_add($dt_old_next_scheduled_date, date_interval_create_from_date_string('1 month')); + $next_run = date_add($dt_old_next_recurring_date, date_interval_create_from_date_string('1 month')); } elseif ($frequency == "quarterly") { - $next_run = date_add($dt_old_next_scheduled_date, date_interval_create_from_date_string('3 months')); + $next_run = date_add($dt_old_next_recurring_date, date_interval_create_from_date_string('3 months')); } elseif ($frequency == "biannually") { - $next_run = date_add($dt_old_next_scheduled_date, date_interval_create_from_date_string('6 months')); + $next_run = date_add($dt_old_next_recurring_date, date_interval_create_from_date_string('6 months')); } elseif ($frequency == "annually") { - $next_run = date_add($dt_old_next_scheduled_date, date_interval_create_from_date_string('12 months')); + $next_run = date_add($dt_old_next_recurring_date, date_interval_create_from_date_string('12 months')); } // Update the run date $next_run = $next_run->format('Y-m-d'); - mysqli_query($mysqli, "UPDATE scheduled_tickets SET scheduled_ticket_next_run = '$next_run' WHERE scheduled_ticket_id = $schedule_id"); + mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $schedule_id"); // Logging logAction("Ticket", "Create", "$session_name force created recurring scheduled $frequency ticket - $config_ticket_prefix$ticket_number - $subject", $client_id, $id); @@ -2204,21 +2204,21 @@ if (isset($_GET['delete_recurring_ticket'])) { enforceUserPermission('module_support', 3); validateCSRFToken($_GET['csrf_token']); - $scheduled_ticket_id = intval($_GET['delete_recurring_ticket']); + $recurring_ticket_id = intval($_GET['delete_recurring_ticket']); // Get Scheduled Ticket Subject Ticket Prefix, Number and Client ID for logging and alert message - $sql = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets WHERE scheduled_ticket_id = $scheduled_ticket_id"); + $sql = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_id = $recurring_ticket_id"); $row = mysqli_fetch_array($sql); - $subject = sanitizeInput($row['scheduled_ticket_subject']); - $frequency = sanitizeInput($row['scheduled_ticket_frequency']); + $subject = sanitizeInput($row['recurring_ticket_subject']); + $frequency = sanitizeInput($row['recurring_ticket_frequency']); - $client_id = intval($row['scheduled_ticket_client_id']); + $client_id = intval($row['recurring_ticket_client_id']); // Delete - mysqli_query($mysqli, "DELETE FROM scheduled_tickets WHERE scheduled_ticket_id = $scheduled_ticket_id"); + mysqli_query($mysqli, "DELETE FROM recurring_tickets WHERE recurring_ticket_id = $recurring_ticket_id"); // Logging - logAction("Recurring Ticket", "Delete", "$session_name deleted recurring ticket $subject", $client_id, $scheduled_ticket_id); + logAction("Recurring Ticket", "Delete", "$session_name deleted recurring ticket $subject", $client_id, $recurring_ticket_id); $_SESSION['alert_type'] = "error"; $_SESSION['alert_message'] = "Recurring ticket $subject - $frequency deleted"; @@ -2226,23 +2226,23 @@ if (isset($_GET['delete_recurring_ticket'])) { header("Location: " . $_SERVER["HTTP_REFERER"]); } -if (isset($_POST['bulk_delete_scheduled_tickets']) || isset($_POST['bulk_delete_recurring_tickets'])) { +if (isset($_POST['bulk_delete_recurring_tickets']) || isset($_POST['bulk_delete_recurring_tickets'])) { enforceUserPermission('module_support', 3); validateCSRFToken($_POST['csrf_token']); - if (isset($_POST['scheduled_ticket_ids'])) { + if (isset($_POST['recurring_ticket_ids'])) { - $count = count($_POST['scheduled_ticket_ids']); + $count = count($_POST['recurring_ticket_ids']); // Cycle through array and delete each recurring scheduled ticket - foreach ($scheduled_ticket_ids as $scheduled_ticket_id) { + foreach ($recurring_ticket_ids as $recurring_ticket_id) { - $scheduled_ticket_id = intval($scheduled_ticket_id); - mysqli_query($mysqli, "DELETE FROM scheduled_tickets WHERE scheduled_ticket_id = $scheduled_ticket_id"); + $recurring_ticket_id = intval($recurring_ticket_id); + mysqli_query($mysqli, "DELETE FROM recurring_tickets WHERE recurring_ticket_id = $recurring_ticket_id"); // Logging - logAction("Recurring Ticket", "Delete", "$session_name deleted recurring ticket", 0, $scheduled_ticket_id); + logAction("Recurring Ticket", "Delete", "$session_name deleted recurring ticket", 0, $recurring_ticket_id); } diff --git a/recurring_tickets.php b/recurring_tickets.php index 08c17716..246eb073 100644 --- a/recurring_tickets.php +++ b/recurring_tickets.php @@ -1,13 +1,13 @@ - - Subject + + Subject - - Priority + + Priority - - Frequency + + Frequency - - Next Run Date + + Next Run Date = 2) { ?> @@ -155,24 +155,24 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
- +
- + @@ -181,17 +181,17 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); data-toggle="ajax-modal" data-modal-size="lg" data-ajax-url="ajax/ajax_recurring_ticket_edit.php" - data-ajax-id="" + data-ajax-id="" > - + - + - + - + = 2) { ?> @@ -204,17 +204,17 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); data-toggle="ajax-modal" data-modal-size="lg" data-ajax-url="ajax/ajax_recurring_ticket_edit.php" - data-ajax-id="" + data-ajax-id="" > Edit - + Force Reoccur - + Delete diff --git a/scripts/cron.php b/scripts/cron.php index 25c700d4..d147a0d4 100644 --- a/scripts/cron.php +++ b/scripts/cron.php @@ -280,25 +280,25 @@ if ($tickets_pending_assignment > 0) { logApp("Cron", "info", "Cron created notifications for new tickets that are pending assignment"); } -// Recurring (Scheduled) tickets +// Recurring tickets // Get recurring tickets for today -$sql_scheduled_tickets = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets WHERE scheduled_ticket_next_run = CURDATE()"); +$sql_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_next_run = CURDATE()"); -if (mysqli_num_rows($sql_scheduled_tickets) > 0) { - while ($row = mysqli_fetch_array($sql_scheduled_tickets)) { +if (mysqli_num_rows($sql_recurring_tickets) > 0) { + while ($row = mysqli_fetch_array($sql_recurring_tickets)) { - $schedule_id = intval($row['scheduled_ticket_id']); - $subject = sanitizeInput($row['scheduled_ticket_subject']); - $details = mysqli_real_escape_string($mysqli, $row['scheduled_ticket_details']); - $priority = sanitizeInput($row['scheduled_ticket_priority']); - $frequency = sanitizeInput(strtolower($row['scheduled_ticket_frequency'])); - $billable = intval($row['scheduled_ticket_billable']); - $created_id = intval($row['scheduled_ticket_created_by']); - $assigned_id = intval($row['scheduled_ticket_assigned_to']); - $client_id = intval($row['scheduled_ticket_client_id']); - $contact_id = intval($row['scheduled_ticket_contact_id']); - $asset_id = intval($row['scheduled_ticket_asset_id']); + $schedule_id = intval($row['recurring_ticket_id']); + $subject = sanitizeInput($row['recurring_ticket_subject']); + $details = mysqli_real_escape_string($mysqli, $row['recurring_ticket_details']); + $priority = sanitizeInput($row['recurring_ticket_priority']); + $frequency = sanitizeInput(strtolower($row['recurring_ticket_frequency'])); + $billable = intval($row['recurring_ticket_billable']); + $created_id = intval($row['recurring_ticket_created_by']); + $assigned_id = intval($row['recurring_ticket_assigned_to']); + $client_id = intval($row['recurring_ticket_client_id']); + $contact_id = intval($row['recurring_ticket_contact_id']); + $asset_id = intval($row['recurring_ticket_asset_id']); $ticket_status = 1; // Default if ($assigned_id > 0) { @@ -408,7 +408,7 @@ if (mysqli_num_rows($sql_scheduled_tickets) > 0) { // Update the run date $next_run = $next_run->format('Y-m-d'); - $a = mysqli_query($mysqli, "UPDATE scheduled_tickets SET scheduled_ticket_next_run = '$next_run' WHERE scheduled_ticket_id = $schedule_id"); + $a = mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $schedule_id"); } } From d0b8095bbab70ed03a00102cfe94e7bbec13e951 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 11 Mar 2025 19:36:39 -0400 Subject: [PATCH 015/105] Feature: Added additional assets to Recurring Tickets as well --- ajax/ajax_asset_details.php | 26 ++++++++++--------- ajax/ajax_contact_details.php | 24 +++++++++--------- ajax/ajax_recurring_ticket_edit.php | 33 ++++++++++++++++++++++++ asset_details.php | 36 +++++++++++++++------------ calendar.php | 12 ++++----- contact_details.php | 32 ++++++++++++------------ database_updates.php | 18 +++++++++++--- db.sql | 19 +++++++++++++- global_search.php | 24 +++++++++--------- includes/database_version.php | 2 +- modals/recurring_ticket_add_modal.php | 25 +++++++++++++++++++ post/user/ticket.php | 30 +++++++++++++++++++--- scripts/cron.php | 10 ++++++-- 13 files changed, 207 insertions(+), 84 deletions(-) diff --git a/ajax/ajax_asset_details.php b/ajax/ajax_asset_details.php index be047a5d..585336aa 100644 --- a/ajax/ajax_asset_details.php +++ b/ajax/ajax_asset_details.php @@ -146,9 +146,11 @@ $sql_related_tickets = mysqli_query($mysqli, " $ticket_count = mysqli_num_rows($sql_related_tickets); // Related Recurring Tickets Query -$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets - WHERE scheduled_ticket_asset_id = $asset_id - ORDER BY scheduled_ticket_next_run DESC" +$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets + LEFT JOIN recurring_ticket_assets ON recurring_tickets.recurring_ticket_id = recurring_ticket_assets.recurring_ticket_id + WHERE recurring_ticket_asset_id = $asset_id OR recurring_ticket_assets.asset_id = $asset_id + GROUP BY recurring_tickets.recurring_ticket_id + ORDER BY recurring_ticket_next_run DESC" ); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); @@ -632,18 +634,18 @@ ob_start(); - - - - + + + + diff --git a/ajax/ajax_contact_details.php b/ajax/ajax_contact_details.php index 660af8a3..05f8a68a 100644 --- a/ajax/ajax_contact_details.php +++ b/ajax/ajax_contact_details.php @@ -75,9 +75,9 @@ $sql_related_tickets = mysqli_query($mysqli, "SELECT * FROM tickets $ticket_count = mysqli_num_rows($sql_related_tickets); // Related Recurring Tickets Query -$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets - WHERE scheduled_ticket_contact_id = $contact_id - ORDER BY scheduled_ticket_next_run DESC" +$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets + WHERE recurring_ticket_contact_id = $contact_id + ORDER BY recurring_ticket_next_run DESC" ); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); @@ -597,18 +597,18 @@ ob_start(); - - - - + + + + diff --git a/ajax/ajax_recurring_ticket_edit.php b/ajax/ajax_recurring_ticket_edit.php index 12a3ab1f..2ef5d31a 100644 --- a/ajax/ajax_recurring_ticket_edit.php +++ b/ajax/ajax_recurring_ticket_edit.php @@ -18,6 +18,14 @@ $recurring_ticket_contact_id = intval($row['recurring_ticket_contact_id']); $recurring_ticket_asset_id = intval($row['recurring_ticket_asset_id']); $recurring_ticket_billable = intval($row['recurring_ticket_billable']); +// Additional Assets Selected +$additional_assets_array = array(); +$sql_additional_assets = mysqli_query($mysqli, "SELECT asset_id FROM recurring_ticket_assets WHERE recurring_ticket_id = $recurring_ticket_id"); +while ($row = mysqli_fetch_array($sql_additional_assets)) { + $additional_asset_id = intval($row['asset_id']); + $additional_assets_array[] = $additional_asset_id; +} + // Generate the HTML form content using output buffering. ob_start(); ?> @@ -217,6 +225,31 @@ ob_start();
+
+ +
+
+ +
+ +
+
+
diff --git a/asset_details.php b/asset_details.php index 816600b5..9cf8fa97 100644 --- a/asset_details.php +++ b/asset_details.php @@ -94,9 +94,11 @@ if (isset($_GET['asset_id'])) { $ticket_count = mysqli_num_rows($sql_related_tickets); // Related Recurring Tickets Query - $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM scheduled_tickets - WHERE scheduled_ticket_asset_id = $asset_id - ORDER BY scheduled_ticket_next_run DESC" + $sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets + LEFT JOIN recurring_ticket_assets ON recurring_tickets.recurring_ticket_id = recurring_ticket_assets.recurring_ticket_id + WHERE recurring_ticket_asset_id = $asset_id OR recurring_ticket_assets.asset_id = $asset_id + GROUP BY recurring_tickets.recurring_ticket_id + ORDER BY recurring_ticket_next_run DESC" ); $recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets); @@ -920,29 +922,30 @@ if (isset($_GET['asset_id'])) { - + - + - + - + +
+ +
+
+ +
+ +
+
+ diff --git a/post/user/ticket.php b/post/user/ticket.php index d676ab24..cd4e4656 100644 --- a/post/user/ticket.php +++ b/post/user/ticket.php @@ -81,6 +81,7 @@ if (isset($_POST['add_ticket'])) { } } + // Add Additional Assets if (isset($_POST['additional_assets'])) { foreach ($_POST['additional_assets'] as $additional_asset) { $additional_asset_id = intval($additional_asset); @@ -195,6 +196,7 @@ if (isset($_POST['edit_ticket'])) { 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"); + // Add Additional Assets if (isset($_POST['additional_assets'])) { mysqli_query($mysqli, "DELETE FROM ticket_assets WHERE ticket_id = $ticket_id"); foreach ($_POST['additional_assets'] as $additional_asset) { @@ -2045,6 +2047,14 @@ if (isset($_POST['add_recurring_ticket'])) { $recurring_ticket_id = mysqli_insert_id($mysqli); + // Add Additional Assets + if (isset($_POST['additional_assets'])) { + foreach ($_POST['additional_assets'] as $additional_asset) { + $additional_asset_id = intval($additional_asset); + mysqli_query($mysqli, "INSERT INTO recurring_ticket_assets SET recurring_ticket_id = $recurring_ticket_id, asset_id = $additional_asset_id"); + } + } + // Logging logAction("Recurring Ticket", "Create", "$session_name created recurring ticket for $subject - $frequency", $client_id, $recurring_ticket_id); @@ -2064,6 +2074,15 @@ if (isset($_POST['edit_recurring_ticket'])) { mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_subject = '$subject', recurring_ticket_details = '$details', recurring_ticket_priority = '$priority', recurring_ticket_frequency = '$frequency', recurring_ticket_billable = $billable, recurring_ticket_next_run = '$next_run_date', recurring_ticket_assigned_to = $assigned_to, recurring_ticket_asset_id = $asset_id, recurring_ticket_contact_id = $contact_id WHERE recurring_ticket_id = $recurring_ticket_id"); + // Add Additional Assets + if (isset($_POST['additional_assets'])) { + mysqli_query($mysqli, "DELETE FROM recurring_ticket_assets WHERE recurring_ticket_id = $recurring_ticket_id"); + foreach ($_POST['additional_assets'] as $additional_asset) { + $additional_asset_id = intval($additional_asset); + mysqli_query($mysqli, "INSERT INTO recurring_ticket_assets SET recurring_ticket_id = $recurring_ticket_id, asset_id = $additional_asset_id"); + } + } + // Logging logAction("Recurring Ticket", "Edit", "$session_name edited recurring ticket $subject", $client_id, $recurring_ticket_id); @@ -2083,7 +2102,6 @@ if (isset($_GET['force_recurring_ticket'])) { if (mysqli_num_rows($sql) > 0) { $row = mysqli_fetch_array($sql); - $schedule_id = intval($row['recurring_ticket_id']); $subject = sanitizeInput($row['recurring_ticket_subject']); $details = mysqli_real_escape_string($mysqli, $row['recurring_ticket_details']); $priority = sanitizeInput($row['recurring_ticket_priority']); @@ -2117,6 +2135,12 @@ if (isset($_GET['force_recurring_ticket'])) { 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 = '$ticket_status', ticket_billable = $billable, ticket_url_key = '$url_key', ticket_created_by = $created_id, ticket_assigned_to = $assigned_id, ticket_contact_id = $contact_id, ticket_client_id = $client_id, ticket_asset_id = $asset_id"); $id = mysqli_insert_id($mysqli); + // Copy Additional Assets from Recurring ticket to new ticket + mysqli_query($mysqli, "INSERT INTO ticket_assets (ticket_id, asset_id) + SELECT $id, asset_id + FROM recurring_ticket_assets + WHERE recurring_ticket_id = $recurring_ticket_id"); + // Notifications customAction('ticket_create', $id); @@ -2182,7 +2206,7 @@ if (isset($_GET['force_recurring_ticket'])) { // Update the run date $next_run = $next_run->format('Y-m-d'); - mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $schedule_id"); + mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $recurring_ticket_id"); // Logging logAction("Ticket", "Create", "$session_name force created recurring scheduled $frequency ticket - $config_ticket_prefix$ticket_number - $subject", $client_id, $id); @@ -2226,7 +2250,7 @@ if (isset($_GET['delete_recurring_ticket'])) { header("Location: " . $_SERVER["HTTP_REFERER"]); } -if (isset($_POST['bulk_delete_recurring_tickets']) || isset($_POST['bulk_delete_recurring_tickets'])) { +if (isset($_POST['bulk_delete_recurring_tickets'])) { enforceUserPermission('module_support', 3); validateCSRFToken($_POST['csrf_token']); diff --git a/scripts/cron.php b/scripts/cron.php index d147a0d4..34b62ea2 100644 --- a/scripts/cron.php +++ b/scripts/cron.php @@ -288,7 +288,7 @@ $sql_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets if (mysqli_num_rows($sql_recurring_tickets) > 0) { while ($row = mysqli_fetch_array($sql_recurring_tickets)) { - $schedule_id = intval($row['recurring_ticket_id']); + $recurring_ticket_id = intval($row['recurring_ticket_id']); $subject = sanitizeInput($row['recurring_ticket_subject']); $details = mysqli_real_escape_string($mysqli, $row['recurring_ticket_details']); $priority = sanitizeInput($row['recurring_ticket_priority']); @@ -317,6 +317,12 @@ if (mysqli_num_rows($sql_recurring_tickets) > 0) { 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 = '$ticket_status', ticket_billable = $billable, ticket_created_by = $created_id, ticket_assigned_to = $assigned_id, ticket_contact_id = $contact_id, ticket_client_id = $client_id, ticket_asset_id = $asset_id"); $id = mysqli_insert_id($mysqli); + // Copy Additional Assets from Recurring ticket to new ticket + mysqli_query($mysqli, "INSERT INTO ticket_assets (ticket_id, asset_id) + SELECT $id, asset_id + FROM recurring_ticket_assets + WHERE recurring_ticket_id = $recurring_ticket_id"); + // Logging logAction("Ticket", "Create", "Cron created recurring scheduled $frequency ticket - $subject", $client_id, $id); @@ -408,7 +414,7 @@ if (mysqli_num_rows($sql_recurring_tickets) > 0) { // Update the run date $next_run = $next_run->format('Y-m-d'); - $a = mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $schedule_id"); + $a = mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_next_run = '$next_run' WHERE recurring_ticket_id = $recurring_ticket_id"); } } From a0598997d71f8647ac800e6494cac8ca0abeb901 Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 11 Mar 2025 19:55:08 -0400 Subject: [PATCH 016/105] Update Recurring Tickets in a few more places --- post/admin/admin_update.php | 14 +++++++------- scripts/cron.php | 14 +++++++------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/post/admin/admin_update.php b/post/admin/admin_update.php index f1430fbb..ece97680 100644 --- a/post/admin/admin_update.php +++ b/post/admin/admin_update.php @@ -39,9 +39,9 @@ if (isset($_GET['update'])) { $row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT COUNT('recurring_id') AS num FROM tickets")); $ticket_count = $row['num']; - // Scheduled Ticket Count - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('scheduled_ticket_id') AS num FROM scheduled_tickets")); - $scheduled_ticket_count = $row['num']; + // Recurring Ticket Count + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_ticket_id') AS num FROM recurring_tickets")); + $recurring_ticket_count = $row['num']; // Calendar Event Count $row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT COUNT('event_id') AS num FROM events")); @@ -59,9 +59,9 @@ if (isset($_GET['update'])) { $row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT COUNT('revenue_id') AS num FROM revenues")); $revenue_count = $row['num']; - // Recurring Count + // Recurring Invoice Count $row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT COUNT('recurring_id') AS num FROM recurring")); - $recurring_count = $row['num']; + $recurring_invoice_count = $row['num']; // Account Count $row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT COUNT('account_id') AS num FROM accounts")); @@ -208,12 +208,12 @@ if (isset($_GET['update'])) { 'comments' => "$comments", 'client_count' => $client_count, 'ticket_count' => $ticket_count, - 'scheduled_ticket_count' => $scheduled_ticket_count, + 'recurring_ticket_count' => $recurring_ticket_count, 'calendar_event_count' => $calendar_event_count, 'quote_count' => $quote_count, 'invoice_count' => $invoice_count, 'revenue_count' => $revenue_count, - 'recurring_count' => $recurring_count, + 'recurring_invoice_count' => $recurring_invoice_count, 'account_count' => $account_count, 'tax_count' => $tax_count, 'product_count' => $product_count, diff --git a/scripts/cron.php b/scripts/cron.php index 34b62ea2..5fa00f47 100644 --- a/scripts/cron.php +++ b/scripts/cron.php @@ -913,9 +913,9 @@ if ($config_telemetry > 0 || $config_telemetry == 2) { $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM tickets")); $ticket_count = $row['num']; - // Recurring (Scheduled) Ticket Count - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('scheduled_ticket_id') AS num FROM scheduled_tickets")); - $scheduled_ticket_count = $row['num']; + // Recurring Ticket Count + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_ticket_id') AS num FROM recurring_tickets")); + $recurring_ticket_count = $row['num']; // Calendar Event Count $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('event_id') AS num FROM events")); @@ -933,9 +933,9 @@ if ($config_telemetry > 0 || $config_telemetry == 2) { $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('revenue_id') AS num FROM revenues")); $revenue_count = $row['num']; - // Recurring Count + // Recurring Invoice Count $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM recurring")); - $recurring_count = $row['num']; + $recurring_invoice_count = $row['num']; // Account Count $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('account_id') AS num FROM accounts")); @@ -1081,12 +1081,12 @@ if ($config_telemetry > 0 || $config_telemetry == 2) { 'currency' => "$company_currency", 'client_count' => $client_count, 'ticket_count' => $ticket_count, - 'scheduled_ticket_count' => $scheduled_ticket_count, + 'recurring_ticket_count' => $recurring_ticket_count, 'calendar_event_count' => $calendar_event_count, 'quote_count' => $quote_count, 'invoice_count' => $invoice_count, 'revenue_count' => $revenue_count, - 'recurring_count' => $recurring_count, + 'recurring_invoice_count' => $recurring_invoice_count, 'account_count' => $account_count, 'tax_count' => $tax_count, 'product_count' => $product_count, From 619b93a545199d948f1ad7f7776444cdf725a45c Mon Sep 17 00:00:00 2001 From: johnnyq Date: Tue, 11 Mar 2025 22:08:37 -0400 Subject: [PATCH 017/105] Renamed Recurring to recurring_invoices updated a large portion of code, and updated many other fields to reflect recurring_invoice and not just recurring --- admin_settings_invoice.php | 4 +- ajax/ajax_recurring_invoice_edit.php | 44 ++-- clients.php | 4 +- dashboard.php | 4 +- database_updates.php | 54 ++++- db.sql | 70 +++---- get_settings.php | 4 +- includes/client_side_nav.php | 4 +- includes/database_version.php | 2 +- includes/get_side_nav_counts.php | 2 +- includes/inc_all_client.php | 8 +- modals/recurring_invoice_add_modal.php | 4 +- post/admin/admin_settings_invoice.php | 6 +- post/user/invoice.php | 272 ++++++++++++------------- recurring_invoices.php | 100 ++++----- scripts/cron.php | 40 ++-- 16 files changed, 335 insertions(+), 287 deletions(-) diff --git a/admin_settings_invoice.php b/admin_settings_invoice.php index a452af66..9633c3eb 100644 --- a/admin_settings_invoice.php +++ b/admin_settings_invoice.php @@ -77,7 +77,7 @@ require_once "includes/inc_all_admin.php";
- + @@ -87,7 +87,7 @@ require_once "includes/inc_all_admin.php";
- + diff --git a/ajax/ajax_recurring_invoice_edit.php b/ajax/ajax_recurring_invoice_edit.php index e0ab9d56..0a62b4f4 100644 --- a/ajax/ajax_recurring_invoice_edit.php +++ b/ajax/ajax_recurring_invoice_edit.php @@ -2,33 +2,33 @@ require_once '../includes/ajax_header.php'; -$recurring_id = intval($_GET['id']); +$recurring_invoice_id = intval($_GET['id']); -$sql = mysqli_query($mysqli, "SELECT * FROM recurring WHERE recurring_id = $recurring_id LIMIT 1"); +$sql = mysqli_query($mysqli, "SELECT * FROM recurring_invoices WHERE recurring_invoice_id = $recurring_invoice_id LIMIT 1"); $row = mysqli_fetch_array($sql); -$recurring_prefix = nullable_htmlentities($row['recurring_prefix']); -$recurring_number = intval($row['recurring_number']); -$recurring_scope = nullable_htmlentities($row['recurring_scope']); -$recurring_frequency = nullable_htmlentities($row['recurring_frequency']); -$recurring_status = nullable_htmlentities($row['recurring_status']); -$recurring_created_at = date('Y-m-d', strtotime($row['recurring_created_at'])); -$recurring_next_date = nullable_htmlentities($row['recurring_next_date']); -$recurring_discount = floatval($row['recurring_discount_amount']); -$category_id = intval($row['recurring_category_id']); +$recurring_invoice_prefix = nullable_htmlentities($row['recurring_invoice_prefix']); +$recurring_invoice_number = intval($row['recurring_invoice_number']); +$recurring_invoice_scope = nullable_htmlentities($row['recurring_invoice_scope']); +$recurring_invoice_frequency = nullable_htmlentities($row['recurring_invoice_frequency']); +$recurring_invoice_status = nullable_htmlentities($row['recurring_invoice_status']); +$recurring_invoice_created_at = date('Y-m-d', strtotime($row['recurring_invoice_created_at'])); +$recurring_invoice_next_date = nullable_htmlentities($row['recurring_invoice_next_date']); +$recurring_invoice_discount = floatval($row['recurring_invoice_discount_amount']); +$category_id = intval($row['recurring_invoice_category_id']); // Generate the HTML form content using output buffering. ob_start(); ?> - + @@ -50,8 +50,8 @@ ob_start(); @@ -62,7 +62,7 @@ ob_start();
- + @@ -76,7 +76,7 @@ ob_start(); '$recurring_created_at' OR category_archived_at IS NULL) ORDER BY category_name ASC"); + $sql_income_category = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_type = 'Income' AND (category_archived_at > '$recurring_invoice_created_at' OR category_archived_at IS NULL) ORDER BY category_name ASC"); while ($row = mysqli_fetch_array($sql_income_category)) { $category_id_select = intval($row['category_id']); $category_name_select = nullable_htmlentities($row['category_name']); @@ -104,7 +104,7 @@ ob_start();
- + @@ -115,10 +115,10 @@ ob_start(); @@ -127,7 +127,7 @@ ob_start(); diff --git a/clients.php b/clients.php index a4d742c0..b7306f23 100644 --- a/clients.php +++ b/clients.php @@ -362,13 +362,13 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); } //Get Monthly Recurring Total - $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND recurring_client_id = $client_id"); + $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND recurring_invoice_client_id = $client_id"); $row = mysqli_fetch_array($sql_recurring_monthly_total); $recurring_monthly_total = floatval($row['recurring_monthly_total']); //Get Yearly Recurring Total - $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND recurring_client_id = $client_id"); + $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND recurring_invoice_client_id = $client_id"); $row = mysqli_fetch_array($sql_recurring_yearly_total); $recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12; diff --git a/dashboard.php b/dashboard.php index 92fa3fc0..f4b968ad 100644 --- a/dashboard.php +++ b/dashboard.php @@ -124,11 +124,11 @@ if ($user_config_dashboard_financial_enable == 1) { "); // Get recurring invoice totals - $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND YEAR(recurring_created_at) <= $year"); + $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND YEAR(recurring_invoice_created_at) <= $year"); $row = mysqli_fetch_array($sql_recurring_yearly_total); $recurring_yearly_total = floatval($row['recurring_yearly_total']); - $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND YEAR(recurring_created_at) <= $year"); + $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND YEAR(recurring_invoice_created_at) <= $year"); $row = mysqli_fetch_array($sql_recurring_monthly_total); $recurring_monthly_total = floatval($row['recurring_monthly_total']) + ($recurring_yearly_total / 12); diff --git a/database_updates.php b/database_updates.php index 2fda14d4..cb6d154f 100644 --- a/database_updates.php +++ b/database_updates.php @@ -2529,10 +2529,58 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.6'"); } - // if (CURRENT_DATABASE_VERSION == '1.9.6') { - // // Insert queries here required to update to DB version 1.9.7 + if (CURRENT_DATABASE_VERSION == '1.9.6') { + mysqli_query($mysqli, "RENAME TABLE `recurring` TO `recurring_invoices`"); + + mysqli_query($mysqli, " + ALTER TABLE `recurring_invoices` + CHANGE COLUMN `recurring_id` `recurring_invoice_id` INT(11) NOT NULL AUTO_INCREMENT, + CHANGE COLUMN `recurring_prefix` `recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `recurring_number` `recurring_invoice_number` INT(11) NOT NULL, + CHANGE COLUMN `recurring_scope` `recurring_invoice_scope` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `recurring_frequency` `recurring_invoice_frequency` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `recurring_last_sent` `recurring_invoice_last_sent` DATE NULL DEFAULT NULL, + CHANGE COLUMN `recurring_next_date` `recurring_invoice_next_date` DATE NOT NULL, + CHANGE COLUMN `recurring_status` `recurring_invoice_status` INT(1) NOT NULL, + CHANGE COLUMN `recurring_discount_amount` `recurring_invoice_discount_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00, + CHANGE COLUMN `recurring_amount` `recurring_invoice_amount` DECIMAL(15,2) NOT NULL DEFAULT 0.00, + CHANGE COLUMN `recurring_currency_code` `recurring_invoice_currency_code` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL, + CHANGE COLUMN `recurring_note` `recurring_invoice_note` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `recurring_invoice_email_notify` `recurring_invoice_invoice_email_notify` TINYINT(1) NOT NULL DEFAULT 1, + CHANGE COLUMN `recurring_created_at` `recurring_invoice_created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP(), + CHANGE COLUMN `recurring_updated_at` `recurring_invoice_updated_at` DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP(), + CHANGE COLUMN `recurring_archived_at` `recurring_invoice_archived_at` DATETIME NULL DEFAULT NULL, + CHANGE COLUMN `recurring_category_id` `recurring_invoice_category_id` INT(11) NOT NULL, + CHANGE COLUMN `recurring_client_id` `recurring_invoice_client_id` INT(11) NOT NULL + "); + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.7'"); + } + + if (CURRENT_DATABASE_VERSION == '1.9.7') { + + mysqli_query($mysqli, " + ALTER TABLE `settings` + CHANGE COLUMN `config_recurring_prefix` `config_recurring_invoice_prefix` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, + CHANGE COLUMN `config_recurring_next_number` `config_recurring_invoice_next_number` INT(11) NOT NULL DEFAULT 1 + "); + + mysqli_query($mysqli, " + ALTER TABLE `history` + CHANGE COLUMN `history_recurring_id` `history_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 + "); + + mysqli_query($mysqli, " + ALTER TABLE `invoice_items` + CHANGE COLUMN `item_recurring_id` `item_recurring_invoice_id` INT(11) NOT NULL DEFAULT 0 + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.8'"); + } + + // if (CURRENT_DATABASE_VERSION == '1.9.8') { + // // Insert queries here required to update to DB version 1.9.9 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.7'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '1.9.9'"); // } } else { diff --git a/db.sql b/db.sql index de4917c5..58bafb0a 100644 --- a/db.sql +++ b/db.sql @@ -902,7 +902,7 @@ CREATE TABLE `history` ( `history_description` varchar(200) NOT NULL, `history_created_at` datetime NOT NULL DEFAULT current_timestamp(), `history_invoice_id` int(11) NOT NULL DEFAULT 0, - `history_recurring_id` int(11) NOT NULL DEFAULT 0, + `history_recurring_invoice_id` int(11) NOT NULL DEFAULT 0, `history_quote_id` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`history_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; @@ -931,7 +931,7 @@ CREATE TABLE `invoice_items` ( `item_tax_id` int(11) NOT NULL DEFAULT 0, `item_product_id` int(11) NOT NULL DEFAULT 0, `item_quote_id` int(11) NOT NULL DEFAULT 0, - `item_recurring_id` int(11) NOT NULL DEFAULT 0, + `item_recurring_invoice_id` int(11) NOT NULL DEFAULT 0, `item_invoice_id` int(11) NOT NULL DEFAULT 0, PRIMARY KEY (`item_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; @@ -1412,36 +1412,6 @@ CREATE TABLE `records` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; --- --- Table structure for table `recurring` --- - -DROP TABLE IF EXISTS `recurring`; -/*!40101 SET @saved_cs_client = @@character_set_client */; -/*!40101 SET character_set_client = utf8 */; -CREATE TABLE `recurring` ( - `recurring_id` int(11) NOT NULL AUTO_INCREMENT, - `recurring_prefix` varchar(200) DEFAULT NULL, - `recurring_number` int(11) NOT NULL, - `recurring_scope` varchar(255) DEFAULT NULL, - `recurring_frequency` varchar(200) NOT NULL, - `recurring_last_sent` date DEFAULT NULL, - `recurring_next_date` date NOT NULL, - `recurring_status` int(1) NOT NULL, - `recurring_discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00, - `recurring_amount` decimal(15,2) NOT NULL DEFAULT 0.00, - `recurring_currency_code` varchar(200) NOT NULL, - `recurring_note` text DEFAULT NULL, - `recurring_invoice_email_notify` tinyint(1) NOT NULL DEFAULT 1, - `recurring_created_at` datetime NOT NULL DEFAULT current_timestamp(), - `recurring_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), - `recurring_archived_at` datetime DEFAULT NULL, - `recurring_category_id` int(11) NOT NULL, - `recurring_client_id` int(11) NOT NULL, - PRIMARY KEY (`recurring_id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; -/*!40101 SET character_set_client = @saved_cs_client */; - -- -- Table structure for table `recurring_expenses` -- @@ -1473,6 +1443,36 @@ CREATE TABLE `recurring_expenses` ( ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci; /*!40101 SET character_set_client = @saved_cs_client */; +-- +-- Table structure for table `recurring_invoices` +-- + +DROP TABLE IF EXISTS `recurring_invoices`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!40101 SET character_set_client = utf8 */; +CREATE TABLE `recurring_invoices` ( + `recurring_invoice_id` int(11) NOT NULL AUTO_INCREMENT, + `recurring_invoice_prefix` varchar(200) DEFAULT NULL, + `recurring_invoice_number` int(11) NOT NULL, + `recurring_invoice_scope` varchar(255) DEFAULT NULL, + `recurring_invoice_frequency` varchar(200) NOT NULL, + `recurring_invoice_last_sent` date DEFAULT NULL, + `recurring_invoice_next_date` date NOT NULL, + `recurring_invoice_status` int(1) NOT NULL, + `recurring_invoice_discount_amount` decimal(15,2) NOT NULL DEFAULT 0.00, + `recurring_invoice_amount` decimal(15,2) NOT NULL DEFAULT 0.00, + `recurring_invoice_currency_code` varchar(200) NOT NULL, + `recurring_invoice_note` text DEFAULT NULL, + `recurring_invoice_invoice_email_notify` tinyint(1) NOT NULL DEFAULT 1, + `recurring_invoice_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `recurring_invoice_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(), + `recurring_invoice_archived_at` datetime DEFAULT NULL, + `recurring_invoice_category_id` int(11) NOT NULL, + `recurring_invoice_client_id` int(11) NOT NULL, + PRIMARY KEY (`recurring_invoice_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + -- -- Table structure for table `recurring_payments` -- @@ -1737,8 +1737,8 @@ CREATE TABLE `settings` ( `config_invoice_late_fee_enable` tinyint(1) NOT NULL DEFAULT 0, `config_invoice_late_fee_percent` decimal(5,2) NOT NULL DEFAULT 0.00, `config_invoice_paid_notification_email` varchar(200) DEFAULT NULL, - `config_recurring_prefix` varchar(200) DEFAULT NULL, - `config_recurring_next_number` int(11) NOT NULL, + `config_recurring_invoice_prefix` varchar(200) DEFAULT NULL, + `config_recurring_invoice_next_number` int(11) NOT NULL DEFAULT 1, `config_quote_prefix` varchar(200) DEFAULT NULL, `config_quote_next_number` int(11) DEFAULT NULL, `config_quote_footer` text DEFAULT NULL, @@ -2417,4 +2417,4 @@ CREATE TABLE `vendors` ( /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-03-11 19:35:52 +-- Dump completed on 2025-03-11 22:07:39 diff --git a/get_settings.php b/get_settings.php index f8fd2f7b..d142b709 100644 --- a/get_settings.php +++ b/get_settings.php @@ -49,8 +49,8 @@ $config_invoice_late_fee_percent = floatval($row['config_invoice_late_fee_percen $config_invoice_paid_notification_email = $row['config_invoice_paid_notification_email']; // Recurring Invoices -$config_recurring_prefix = $row['config_recurring_prefix']; -$config_recurring_next_number = intval($row['config_recurring_next_number']); +$config_recurring_invoice_prefix = $row['config_recurring_invoice_prefix']; +$config_recurring_invoice_next_number = intval($row['config_recurring_invoice_next_number']); // Quotes $config_quote_prefix = $row['config_quote_prefix']; diff --git a/includes/client_side_nav.php b/includes/client_side_nav.php index bb1dbfc2..e58539dd 100644 --- a/includes/client_side_nav.php +++ b/includes/client_side_nav.php @@ -277,8 +277,8 @@

Recurring Invoices 0) { ?> - + if ($num_recurring_invoices) { ?> +

diff --git a/includes/database_version.php b/includes/database_version.php index a24d286b..79f89e0f 100644 --- a/includes/database_version.php +++ b/includes/database_version.php @@ -5,4 +5,4 @@ * It is used in conjunction with database_updates.php */ -DEFINE("LATEST_DATABASE_VERSION", "1.9.6"); +DEFINE("LATEST_DATABASE_VERSION", "1.9.8"); diff --git a/includes/get_side_nav_counts.php b/includes/get_side_nav_counts.php index 35c59e11..6d0afd4b 100644 --- a/includes/get_side_nav_counts.php +++ b/includes/get_side_nav_counts.php @@ -22,7 +22,7 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('invoice_id') AS n $num_open_invoices = $row['num']; // Recurring Invoice Count -$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM recurring WHERE recurring_archived_at IS NULL")); +$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices WHERE recurring_invoice_archived_at IS NULL")); $num_recurring_invoices = $row['num']; // Open Quotes Count diff --git a/includes/inc_all_client.php b/includes/inc_all_client.php index 461d91b8..55ffdd0d 100644 --- a/includes/inc_all_client.php +++ b/includes/inc_all_client.php @@ -115,13 +115,13 @@ if (isset($_GET['client_id'])) { $balance = $invoice_amounts - $amount_paid; //Get Monthly Recurring Total - $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_monthly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'month' AND recurring_client_id = $client_id"); + $sql_recurring_monthly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_monthly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'month' AND recurring_invoice_client_id = $client_id"); $row = mysqli_fetch_array($sql_recurring_monthly_total); $recurring_monthly_total = floatval($row['recurring_monthly_total']); //Get Yearly Recurring Total - $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_amount) AS recurring_yearly_total FROM recurring WHERE recurring_status = 1 AND recurring_frequency = 'year' AND recurring_client_id = $client_id"); + $sql_recurring_yearly_total = mysqli_query($mysqli, "SELECT SUM(recurring_invoice_amount) AS recurring_yearly_total FROM recurring_invoices WHERE recurring_invoice_status = 1 AND recurring_invoice_frequency = 'year' AND recurring_invoice_client_id = $client_id"); $row = mysqli_fetch_array($sql_recurring_yearly_total); $recurring_yearly_total = floatval($row['recurring_yearly_total']) / 12; @@ -196,8 +196,8 @@ if (isset($_GET['client_id'])) { $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('quote_id') AS num FROM quotes WHERE quote_archived_at IS NULL AND quote_client_id = $client_id")); $num_quotes = $row['num']; - $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_id') AS num FROM recurring WHERE recurring_archived_at IS NULL AND recurring_client_id = $client_id")); - $num_recurring = $row['num']; + $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('recurring_invoice_id') AS num FROM recurring_invoices WHERE recurring_invoice_archived_at IS NULL AND recurring_invoice_client_id = $client_id")); + $num_recurring_invoices = $row['num']; $row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('payment_id') AS num FROM payments, invoices WHERE payment_invoice_id = invoice_id AND invoice_client_id = $client_id")); $num_payments = $row['num']; diff --git a/modals/recurring_invoice_add_modal.php b/modals/recurring_invoice_add_modal.php index e194178f..33cd8ab5 100644 --- a/modals/recurring_invoice_add_modal.php +++ b/modals/recurring_invoice_add_modal.php @@ -1,4 +1,4 @@ - -
+
- +
@@ -238,7 +237,7 @@ ob_start(); $tag_id_select = intval($row['tag_id']); $tag_name_select = nullable_htmlentities($row['tag_name']); ?> - + @@ -259,7 +258,7 @@ ob_start();
diff --git a/ajax/ajax_credential_view.php b/ajax/ajax_credential_view.php index 96dfd392..ea2a38f3 100644 --- a/ajax/ajax_credential_view.php +++ b/ajax/ajax_credential_view.php @@ -2,26 +2,26 @@ require_once '../includes/ajax_header.php'; -$login_id = intval($_GET['id']); +$credential_id = intval($_GET['id']); -$sql = mysqli_query($mysqli, "SELECT * FROM logins WHERE login_id = $login_id LIMIT 1"); +$sql = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_id = $credential_id LIMIT 1"); $row = mysqli_fetch_array($sql); -$login_name = nullable_htmlentities($row['login_name']); -$login_description = nullable_htmlentities($row['login_description']); -$login_uri = nullable_htmlentities($row['login_uri']); -$login_uri_2 = nullable_htmlentities($row['login_uri_2']); -$login_username = nullable_htmlentities(decryptLoginEntry($row['login_username'])); -$login_password = nullable_htmlentities(decryptLoginEntry($row['login_password'])); -$login_otp_secret = nullable_htmlentities($row['login_otp_secret']); -$login_id_with_secret = '"' . $row['login_id'] . '","' . $row['login_otp_secret'] . '"'; -if (empty($login_otp_secret)) { +$credential_name = nullable_htmlentities($row['credential_name']); +$credential_description = nullable_htmlentities($row['credential_description']); +$credential_uri = nullable_htmlentities($row['credential_uri']); +$credential_uri_2 = nullable_htmlentities($row['credential_uri_2']); +$credential_username = nullable_htmlentities(decryptLoginEntry($row['credential_username'])); +$credential_password = nullable_htmlentities(decryptLoginEntry($row['credential_password'])); +$credential_otp_secret = nullable_htmlentities($row['credential_otp_secret']); +$credential_id_with_secret = '"' . $row['credential_id'] . '","' . $row['credential_otp_secret'] . '"'; +if (empty($credential_otp_secret)) { $otp_display = "-"; } else { - $otp_display = " Hover.."; + $otp_display = " Hover.."; } -$login_note = nullable_htmlentities($row['login_note']); -$login_created_at = nullable_htmlentities($row['login_created_at']); +$credential_note = nullable_htmlentities($row['credential_note']); +$credential_created_at = nullable_htmlentities($row['credential_created_at']); // Generate the HTML form content using output buffering. ob_start(); diff --git a/ajax/ajax_service_edit.php b/ajax/ajax_service_edit.php index 8d2258ec..e0932ba1 100644 --- a/ajax/ajax_service_edit.php +++ b/ajax/ajax_service_edit.php @@ -18,23 +18,23 @@ $service_updated_at = nullable_htmlentities($row['service_updated_at']); $service_review_due = nullable_htmlentities($row['service_review_due']); $client_id = intval($row['service_client_id']); -// Associated Assets (and their logins/networks/locations) +// Associated Assets (and their credentials/networks/locations) $sql_assets = mysqli_query( $mysqli, "SELECT * FROM service_assets LEFT JOIN assets ON service_assets.asset_id = assets.asset_id LEFT JOIN asset_interfaces ON interface_asset_id = assets.asset_id AND interface_primary = 1 - LEFT JOIN logins ON service_assets.asset_id = logins.login_asset_id + LEFT JOIN credentials ON service_assets.asset_id = credentials.credential_asset_id LEFT JOIN networks ON interface_network_id = networks.network_id LEFT JOIN locations ON assets.asset_location_id = locations.location_id WHERE service_id = $service_id" ); -// Associated logins -$sql_logins = mysqli_query( +// Associated credentials +$sql_credentials = mysqli_query( $mysqli, - "SELECT * FROM service_logins - LEFT JOIN logins ON service_logins.login_id = logins.login_id + "SELECT * FROM service_credentials + LEFT JOIN credentials ON service_credentials.credential_id = credentials.credential_id WHERE service_id = $service_id" ); @@ -280,21 +280,21 @@ ob_start();
- - '$service_created_at' OR login_archived_at IS NULL) AND login_client_id = $client_id"); + $sql_all = mysqli_query($mysqli, "SELECT * FROM credentials WHERE (credential_archived_at > '$service_created_at' OR credential_archived_at IS NULL) AND credential_client_id = $client_id"); while ($row_all = mysqli_fetch_array($sql_all)) { - $login_id = intval($row_all['login_id']); - $login_name = nullable_htmlentities($row_all['login_name']); + $credential_id = intval($row_all['credential_id']); + $credential_name = nullable_htmlentities($row_all['credential_name']); - if (in_array($login_id, $selected_ids)) { - echo ""; + if (in_array($credential_id, $selected_ids)) { + echo ""; } else{ - echo ""; + echo ""; } } ?> diff --git a/asset_details.php b/asset_details.php index 9cf8fa97..572a8f87 100644 --- a/asset_details.php +++ b/asset_details.php @@ -184,29 +184,29 @@ if (isset($_GET['asset_id'])) { $document_count = mysqli_num_rows($sql_related_documents); - // Related Logins Query - $sql_related_logins = mysqli_query($mysqli, " + // Related Credentials Query + $sql_related_credentials = mysqli_query($mysqli, " SELECT - logins.login_id AS login_id, - logins.login_name, - logins.login_description, - logins.login_uri, - logins.login_username, - logins.login_password, - logins.login_otp_secret, - logins.login_note, - logins.login_important, - logins.login_contact_id, - logins.login_asset_id - FROM logins - LEFT JOIN login_tags ON login_tags.login_id = logins.login_id - LEFT JOIN tags ON tags.tag_id = login_tags.tag_id - WHERE login_asset_id = $asset_id - AND login_archived_at IS NULL - GROUP BY logins.login_id - ORDER BY login_name DESC + credentials.credential_id AS credential_id, + credentials.credential_name, + credentials.credential_description, + credentials.credential_uri, + credentials.credential_username, + credentials.credential_password, + credentials.credential_otp_secret, + credentials.credential_note, + credentials.credential_important, + credentials.credential_contact_id, + credentials.credential_asset_id + FROM credentials + LEFT JOIN credential_tags ON credential_tags.credential_id = credentials.credential_id + LEFT JOIN tags ON tags.tag_id = credential_tags.tag_id + WHERE credential_asset_id = $asset_id + AND credential_archived_at IS NULL + GROUP BY credentials.credential_id + ORDER BY credential_name DESC "); - $login_count = mysqli_num_rows($sql_related_logins); + $credential_count = mysqli_num_rows($sql_related_credentials); // Related Software Query $sql_related_software = mysqli_query( @@ -523,7 +523,7 @@ if (isset($_GET['asset_id'])) {
-
"> +
">

Credentials

@@ -544,56 +544,56 @@ if (isset($_GET['asset_id'])) { "; + $credential_uri_display = "$credential_uri"; } - $login_username = nullable_htmlentities(decryptLoginEntry($row['login_username'])); - if (empty($login_username)) { - $login_username_display = "-"; + $credential_username = nullable_htmlentities(decryptCredentialEntry($row['credential_username'])); + if (empty($credential_username)) { + $credential_username_display = "-"; } else { - $login_username_display = "$login_username"; + $credential_username_display = "$credential_username"; } - $login_password = nullable_htmlentities(decryptLoginEntry($row['login_password'])); - $login_otp_secret = nullable_htmlentities($row['login_otp_secret']); - $login_id_with_secret = '"' . $row['login_id'] . '","' . $row['login_otp_secret'] . '"'; - if (empty($login_otp_secret)) { + $credential_password = nullable_htmlentities(decryptCredentialEntry($row['credential_password'])); + $credential_otp_secret = nullable_htmlentities($row['credential_otp_secret']); + $credential_id_with_secret = '"' . $row['credential_id'] . '","' . $row['credential_otp_secret'] . '"'; + if (empty($credential_otp_secret)) { $otp_display = "-"; } else { - $otp_display = " Hover.."; + $otp_display = " Hover.."; } - $login_note = nullable_htmlentities($row['login_note']); - $login_important = intval($row['login_important']); - $login_contact_id = intval($row['login_contact_id']); - $login_asset_id = intval($row['login_asset_id']); + $credential_note = nullable_htmlentities($row['credential_note']); + $credential_important = intval($row['credential_important']); + $credential_contact_id = intval($row['credential_contact_id']); + $credential_asset_id = intval($row['credential_asset_id']); // Tags - $login_tag_name_display_array = array(); - $login_tag_id_array = array(); - $sql_login_tags = mysqli_query($mysqli, "SELECT * FROM login_tags LEFT JOIN tags ON login_tags.tag_id = tags.tag_id WHERE login_id = $login_id ORDER BY tag_name ASC"); - while ($row = mysqli_fetch_array($sql_login_tags)) { + $credential_tag_name_display_array = array(); + $credential_tag_id_array = array(); + $sql_credential_tags = mysqli_query($mysqli, "SELECT * FROM credential_tags LEFT JOIN tags ON credential_tags.tag_id = tags.tag_id WHERE credential_id = $credential_id ORDER BY tag_name ASC"); + while ($row = mysqli_fetch_array($sql_credential_tags)) { - $login_tag_id = intval($row['tag_id']); - $login_tag_name = nullable_htmlentities($row['tag_name']); - $login_tag_color = nullable_htmlentities($row['tag_color']); - if (empty($login_tag_color)) { - $login_tag_color = "dark"; + $credential_tag_id = intval($row['tag_id']); + $credential_tag_name = nullable_htmlentities($row['tag_name']); + $credential_tag_color = nullable_htmlentities($row['tag_color']); + if (empty($credential_tag_color)) { + $credential_tag_color = "dark"; } - $login_tag_icon = nullable_htmlentities($row['tag_icon']); - if (empty($login_tag_icon)) { - $login_tag_icon = "tag"; + $credential_tag_icon = nullable_htmlentities($row['tag_icon']); + if (empty($credential_tag_icon)) { + $credential_tag_icon = "tag"; } - $login_tag_id_array[] = $login_tag_id; - $login_tag_name_display_array[] = "$login_tag_name"; + $credential_tag_id_array[] = $credential_tag_id; + $credential_tag_name_display_array[] = "$credential_tag_name"; } - $login_tags_display = implode('', $login_tag_name_display_array); + $credential_tags_display = implode('', $credential_tag_name_display_array); ?> @@ -602,18 +602,18 @@ if (isset($_GET['asset_id'])) { - + - - + + - + - +
-
"> +
">

Credentials

@@ -467,57 +467,57 @@ if (isset($_GET['contact_id'])) { "; + $credential_uri_display = "$credential_uri"; } - $login_uri_2 = nullable_htmlentities($row['login_uri_2']); - $login_username = nullable_htmlentities(decryptLoginEntry($row['login_username'])); - if (empty($login_username)) { - $login_username_display = "-"; + $credential_uri_2 = nullable_htmlentities($row['credential_uri_2']); + $credential_username = nullable_htmlentities(decryptCredentialEntry($row['credential_username'])); + if (empty($credential_username)) { + $credential_username_display = "-"; } else { - $login_username_display = "$login_username"; + $credential_username_display = "$credential_username"; } - $login_password = nullable_htmlentities(decryptLoginEntry($row['login_password'])); - $login_otp_secret = nullable_htmlentities($row['login_otp_secret']); - $login_id_with_secret = '"' . $row['login_id'] . '","' . $row['login_otp_secret'] . '"'; - if (empty($login_otp_secret)) { + $credential_password = nullable_htmlentities(decryptCredentialEntry($row['credential_password'])); + $credential_otp_secret = nullable_htmlentities($row['credential_otp_secret']); + $credential_id_with_secret = '"' . $row['credential_id'] . '","' . $row['credential_otp_secret'] . '"'; + if (empty($credential_otp_secret)) { $otp_display = "-"; } else { - $otp_display = " Hover.."; + $otp_display = " Hover.."; } - $login_note = nullable_htmlentities($row['login_note']); - $login_important = intval($row['login_important']); - $login_contact_id = intval($row['login_contact_id']); - $login_asset_id = intval($row['login_asset_id']); + $credential_note = nullable_htmlentities($row['credential_note']); + $credential_important = intval($row['credential_important']); + $credential_contact_id = intval($row['credential_contact_id']); + $credential_asset_id = intval($row['credential_asset_id']); // Tags - $login_tag_name_display_array = array(); - $login_tag_id_array = array(); - $sql_login_tags = mysqli_query($mysqli, "SELECT * FROM login_tags LEFT JOIN tags ON login_tags.tag_id = tags.tag_id WHERE login_id = $login_id ORDER BY tag_name ASC"); - while ($row = mysqli_fetch_array($sql_login_tags)) { + $credential_tag_name_display_array = array(); + $credential_tag_id_array = array(); + $sql_credential_tags = mysqli_query($mysqli, "SELECT * FROM credential_tags LEFT JOIN tags ON credential_tags.tag_id = tags.tag_id WHERE credential_id = $credential_id ORDER BY tag_name ASC"); + while ($row = mysqli_fetch_array($sql_credential_tags)) { - $login_tag_id = intval($row['tag_id']); - $login_tag_name = nullable_htmlentities($row['tag_name']); - $login_tag_color = nullable_htmlentities($row['tag_color']); - if (empty($login_tag_color)) { - $login_tag_color = "dark"; + $credential_tag_id = intval($row['tag_id']); + $credential_tag_name = nullable_htmlentities($row['tag_name']); + $credential_tag_color = nullable_htmlentities($row['tag_color']); + if (empty($credential_tag_color)) { + $credential_tag_color = "dark"; } - $login_tag_icon = nullable_htmlentities($row['tag_icon']); - if (empty($login_tag_icon)) { - $login_tag_icon = "tag"; + $credential_tag_icon = nullable_htmlentities($row['tag_icon']); + if (empty($credential_tag_icon)) { + $credential_tag_icon = "tag"; } - $login_tag_id_array[] = $login_tag_id; - $login_tag_name_display_array[] = "$login_tag_name"; + $credential_tag_id_array[] = $credential_tag_id; + $credential_tag_name_display_array[] = "$credential_tag_name"; } - $login_tags_display = implode('', $login_tag_name_display_array); + $credential_tags_display = implode('', $credential_tag_name_display_array); ?> @@ -526,18 +526,18 @@ if (isset($_GET['contact_id'])) { - + - - + + - + - +