diff --git a/.gitignore b/.gitignore
index f60657bd..f83f4883 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,14 @@ plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/*
xcustom/*
!xcustom/readme.php
post/xcustom
-custom/*
!post/xcustom/readme.php
+admin/custom/*
+!admin/custom/readme.php
+agent/custom/*
+!agent/custom/readme.php
+client/custom/*
+!client/custom/readme.php
+guest/custom/*
+!guest/custom/readme.php
.zed
+
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 69983bcb..5797ed84 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,44 @@
This file documents all notable changes made to ITFlow.
+## [25.10]
+
+### Breaking Changes
+- Renamed `/user/` directory to `/agent/`.
+- Deprecation Notice: `/scripts/cron_mail_queue.php` and `/scripts/cron_ticket_email_parser.php` are being phased out. Please transition to `/cron/mail_queue.php` and `/cron/ticket_email_parser.php`. These older scripts will be removed in the November release—update accordingly. New Installs via the script will have this already configured.
+- Custom is working now. Custom code should be placed in /admin/custom/ , /agent/custom/ , /client/custom/ /guest/custom/
+We will provide example code with directory structure for each custom directory a week after this release.
+
+### Fixes
+- Resolved issue with "Restore from Setup" not functioning correctly.
+- Corrected asset name display in logs and flash messages when editing an asset in a ticket.
+- Fixed Payment Provider Threshold not being applied.
+- Fixed issue where Threshold setting was not saving properly.
+- Various minor fixes for Payment Provider issues.
+- Removed leads from the client selection list in the "New Ticket" modal.
+- Fixed issues with the MFA modal.
+- Resolved MFA enforcement bugs.
+- Fixed KeepAlive functionality to maintain user sessions longer.
+- Fixed multiple broken links caused by the `/user/` to `/agent/` path migration.
+- Fixed Custom code directories.
+
+### Added / Changed
+- Removed "ACH" as a payment method; added "Bank Transfer" instead.
+- Replaced relative paths with absolute paths for web assets.
+- Tickets can now be resolved via the API.
+- Added a filter for Archived Users and an option to restore them.
+- Introduced a modal when archiving users, allowing reassignment of open and recurring tickets to another agent.
+- Improved logic for determining the index/root page.
+- Added "Assigned Agent" column for recurring tickets.
+- Introduced "Additional Assets" option when editing assets in tickets; modal now uses the updated AJAX method.
+- Added Gibraltar to the list of supported countries.
+- Added Custom Link Option for the Admin Nav.
+- Added Custom Link Option for the Reports Nav.
+
+### Other notes
+- Major releases will happen on the first week of every Month.
+
+
## [25.09.2]
### Fixes
diff --git a/admin/audit_log.php b/admin/audit_log.php
index 3da62911..33b58ac0 100644
--- a/admin/audit_log.php
+++ b/admin/audit_log.php
@@ -266,7 +266,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
if (empty($client_name)) {
$client_name_display = "-";
} else {
- $client_name_display = "$client_name";
+ $client_name_display = "$client_name";
}
$log_entity_id = intval($row['log_entity_id']);
diff --git a/admin/custom/readme.php b/admin/custom/readme.php
new file mode 100644
index 00000000..498c1b53
--- /dev/null
+++ b/admin/custom/readme.php
@@ -0,0 +1,8 @@
+
diff --git a/admin/database_updates.php b/admin/database_updates.php
index f97ce66b..688a9daa 100644
--- a/admin/database_updates.php
+++ b/admin/database_updates.php
@@ -3992,6 +3992,40 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.4'");
}
+
+ if (CURRENT_DATABASE_VERSION == '2.3.4') {
+
+ // Add Software Keys
+ mysqli_query($mysqli, "CREATE TABLE `software_keys` (
+ `software_key_id` INT(11) NOT NULL AUTO_INCREMENT,
+ `software_key` VARCHAR(400) NOT NULL,
+ `software_key_software_id` INT(11) NOT NULL,
+ PRIMARY KEY (`software_key_id`),
+ FOREIGN KEY (`software_key_software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE
+ )");
+
+ // Software Key Assignments to Contacts
+ mysqli_query($mysqli, "CREATE TABLE `software_key_contact_assignments` (
+ `software_key_id` INT(11) NOT NULL,
+ `contact_id` INT(11) NOT NULL,
+ `software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`software_key_id`, `contact_id`),
+ FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE,
+ FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE
+ )");
+
+ // Software Key Assignments to Assets
+ mysqli_query($mysqli, "CREATE TABLE `software_key_asset_assignments` (
+ `software_key_id` INT(11) NOT NULL,
+ `asset_id` INT(11) NOT NULL,
+ `software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
+ PRIMARY KEY (`software_key_id`, `asset_id`),
+ FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE,
+ FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE
+ )");
+
+ mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.5'");
+ }
// if (CURRENT_DATABASE_VERSION == '2.3.4') {
// // Insert queries here required to update to DB version 2.3.4
diff --git a/admin/includes/inc_all_admin.php b/admin/includes/inc_all_admin.php
index ceeec4e2..fb600215 100644
--- a/admin/includes/inc_all_admin.php
+++ b/admin/includes/inc_all_admin.php
@@ -2,7 +2,6 @@
require_once "../config.php";
require_once "../functions.php";
-require_once "../includes/router.php";
require_once "../includes/check_login.php";
require_once "../includes/page_title.php";
if (!isset($session_is_admin) || !$session_is_admin) {
diff --git a/admin/includes/side_nav.php b/admin/includes/side_nav.php
index ea0fc168..ee85e322 100644
--- a/admin/includes/side_nav.php
+++ b/admin/includes/side_nav.php
@@ -1,6 +1,6 @@