diff --git a/CHANGELOG.md b/CHANGELOG.md index adfae84f..e06f7b4b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,46 @@ This file documents all notable changes made to ITFlow. +## [26.03] Stable Release +### Bug Fixes +- Ticket Templates: Fix Task Sorting. +- Ticket: Lower autoclose setting minimum value from 48 to 24 Hours. +- Ticket: Fix Task Approval. +- Recurring Ticket: add empty value placeholder for Ticket Frequency. +- Documents/Files: Fix redirect after File Upload to redirect to files instead of the non existent documents. +- Setup: Fix base url tacking on /setup when not installing via script. + + +### New Features & Updates +- Clients: Net Terms: Added common 45 and 15 Days, removed 14 Days not as common. +- Clients: Bulk Action Set Net Terms Added. +- Clients: Swapped location and contact column, add PopOver with Details such as created, abbreviation, DB ID instead of taking up space underneath client, rounded tag pills and increased padding, removed info badges and added one info badge that displays a popover with details. +- Clients: Added New Ticket to Client Top Header Menu. +- Clients: Client Overview: UI Sprucing. +- Invoice: Send reminder 1 day after due date. +- Invoices/Quotes/Recurring Invoices: Split Items tables into their own POST logic and Modal UIs and tables (quote_items, invoice_items, recurring_items). +- Tickets: New Ticket Parsing - Anyone CC'ed onto the original email that created the ticket is added as a ticket watcher. +- Ticket/Quotes: Quotes can now be associated with a ticket. +- Networks: Removed Subnet Mask Field, Use CIDR instead. +- Networks: Rearranged fields, Updated placeholders, Add/Edit/list for better flow. +- Networks: Renamed DHCP to IP Range to allow for you use of both DHCP and or Usable IPs. +- Assets: Rearranged fields, Updated placeholders, Add/Edit/list for better flow. +- Assets: Added IPv6 if available under IP, Make and Model are now one line with Serial Underneath. Added OS under Type. use pill for status. +- Calendar: Event thats are cut off can now be viewed as a tooltip on hover. +- Calendar: Renamed System Calendars to built-in calendars and added the names and color dot for reference. +- Calendar: You can now delete a custom calendar. +- Report: Client Ticket Time Detail Audit: Selectable Billing Time Increment, will later be avauilable globally. +- Roles/Permissions: Now complete and is out of beta all permission roles are strictly enforced, except for in Trips and Calendar, new enforce modules will be added for these at a later date. +- Project Templates: Ticket Template order can now be dragged and dropped. +- Global: Introduced new checkbox class to all Checkbox select columns to keep consistency and reduce space and enhance ui. +- Global: CSRF Checks everywhere instead of just deletion calls. +- Global: Renamed the rest of the unarchive post and label calls to restore. +- Files: Allow upload of .unifi extension. +- Bump Libraries: + - stripe-php from 19.0.0 to 19.4.1. + - fullcalendar from 6.1.19 to 6.1.20 + - TCPDF from 6.10.1 to 6.11.2 + ## [26.02.1] Maint Release ### Bug Fixes - Credentials: Fix Password Generator. @@ -12,7 +52,7 @@ This file documents all notable changes made to ITFlow. - Ticket Details: Deny access to client restricted agents to view tickets without client_id in uri. - Tickets: Allow agents with restricted client access to view and edit tickets without a client. - Ticket Change client: Limit selection for agents with restricted client access. -- Ticket Details: Don't display Updated at when null. +- Ticket Details: Don't display updated at when null. ### New Features & Updates - Report: Added Client Detail Auditing. diff --git a/README.md b/README.md index ab9597c0..402dbcb6 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ We track the implementation of confirmed features and bugs via [TaskFlow](https: For help using ITFlow, bugs, feature requests, and general ideas / discussions please use the community [forum](https://forum.itflow.org). ### Contributing -If you want to improve ITFlow, feel free to fork the repo and create a pull reques. Make sure to discuss significant changes or new features with fellow contributors on the forum first. This helps ensure that your contributions are aligned with project goals, and saves time for everyone. All contributions should follow our [code standards](https://docs.itflow.org/code_standards). See the [contributing guide](https://docs.itflow.org/contribute). +We have temporarily paused PRs from the community. #### Contributors diff --git a/admin/category.php b/admin/category.php index 6673cab7..7613c9af 100644 --- a/admin/category.php +++ b/admin/category.php @@ -135,11 +135,11 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()")); if ($archived) { ?> - Unarchive + href="post.php?restore_category=&csrf_token== $_SESSION['csrf_token'] ?>"> + Restore + href="post.php?delete_category=&csrf_token== $_SESSION['csrf_token'] ?>"> Delete Edit + href="post.php?archive_category=&csrf_token== $_SESSION['csrf_token'] ?>"> Archive Edit
- + Delete diff --git a/admin/database_updates.php b/admin/database_updates.php index 76235b45..86d0a061 100644 --- a/admin/database_updates.php +++ b/admin/database_updates.php @@ -4193,10 +4193,152 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) { mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.0'"); } - // if (CURRENT_DATABASE_VERSION == '2.4.0') { - // // Insert queries here required to update to DB version 2.4.1 + if (CURRENT_DATABASE_VERSION == '2.4.0') { + + mysqli_query($mysqli, " + CREATE TABLE `quote_items` ( + `item_id` int(11) NOT NULL AUTO_INCREMENT, + `item_name` varchar(200) NOT NULL, + `item_description` text DEFAULT NULL, + `item_quantity` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_price` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_subtotal` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_tax` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_total` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_order` int(11) NOT NULL DEFAULT 0, + `item_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `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, + PRIMARY KEY (`item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + "); + + mysqli_query($mysqli, " + CREATE TABLE `recurring_invoice_items` ( + `item_id` int(11) NOT NULL AUTO_INCREMENT, + `item_name` varchar(200) NOT NULL, + `item_description` text DEFAULT NULL, + `item_quantity` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_price` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_subtotal` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_tax` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_total` decimal(15,2) NOT NULL DEFAULT 0.00, + `item_order` int(11) NOT NULL DEFAULT 0, + `item_created_at` datetime NOT NULL DEFAULT current_timestamp(), + `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_recurring_invoice_id` int(11) NOT NULL, + PRIMARY KEY (`item_id`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.1'"); + } + + if (CURRENT_DATABASE_VERSION == '2.4.1') { + + // Migrate Items + mysqli_query($mysqli, " + INSERT INTO `recurring_invoice_items` ( + `item_name`, + `item_description`, + `item_quantity`, + `item_price`, + `item_subtotal`, + `item_tax`, + `item_total`, + `item_order`, + `item_created_at`, + `item_updated_at`, + `item_archived_at`, + `item_tax_id`, + `item_product_id`, + `item_recurring_invoice_id` + ) + SELECT + `item_name`, + `item_description`, + `item_quantity`, + `item_price`, + `item_subtotal`, + `item_tax`, + `item_total`, + `item_order`, + `item_created_at`, + `item_updated_at`, + `item_archived_at`, + `item_tax_id`, + `item_product_id`, + `item_recurring_invoice_id` + FROM `invoice_items` + WHERE `item_recurring_invoice_id` != 0 + "); + + mysqli_query($mysqli, " + INSERT INTO `quote_items` ( + `item_name`, + `item_description`, + `item_quantity`, + `item_price`, + `item_subtotal`, + `item_tax`, + `item_total`, + `item_order`, + `item_created_at`, + `item_updated_at`, + `item_archived_at`, + `item_tax_id`, + `item_product_id`, + `item_quote_id` + ) + SELECT + `item_name`, + `item_description`, + `item_quantity`, + `item_price`, + `item_subtotal`, + `item_tax`, + `item_total`, + `item_order`, + `item_created_at`, + `item_updated_at`, + `item_archived_at`, + `item_tax_id`, + `item_product_id`, + `item_quote_id` + FROM `invoice_items` + WHERE `item_quote_id` != 0 + "); + + mysqli_query($mysqli, " + DELETE FROM `invoice_items` + WHERE `item_recurring_invoice_id` != 0 + "); + + mysqli_query($mysqli, " + DELETE FROM `invoice_items` + WHERE `item_quote_id` != 0 + "); + + mysqli_query($mysqli, " + ALTER TABLE `invoice_items` + DROP COLUMN `item_quote_id`, + DROP COLUMN `item_recurring_invoice_id` + "); + + mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.2'"); + + } + // + // // if (CURRENT_DATABASE_VERSION == '2.4.2') { + // // Insert queries here required to update to DB version 2.4.3 // // Then, update the database to the next sequential version - // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.1'"); + // mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.4.3'"); // } } else { diff --git a/admin/document_template.php b/admin/document_template.php index 4e867642..5b2d808a 100644 --- a/admin/document_template.php +++ b/admin/document_template.php @@ -20,7 +20,7 @@