Skip to content

Commit ed8a576

Browse files
authored
Merge pull request #1223 from itflow-org/develop
25.06 Release
2 parents f78a225 + 5c6a7ac commit ed8a576

File tree

165 files changed

+4672
-4188
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

165 files changed

+4672
-4188
lines changed

CHANGELOG.md

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,43 @@
22

33
This file documents all notable changes made to ITFlow.
44

5+
## [25.06]
6+
7+
### Breaking CHANGES
8+
- Old Document Verions will be deleted due to the major backend rewrite how document versions work.
9+
10+
### Added / Changed
11+
- Improved function for retrieving remote IP address for logging purposes.
12+
- Ticket categories are now sorted alphabetically.
13+
- Visiting a deleted invoice or recurring invoice now redirects to the listing page; delete option added to invoice details page.
14+
- Added "Mark as Sent" and "Make Payment" actions directly on the invoice listing page.
15+
- Introduced Ticket Category UI for recurring tickets.
16+
- In Project Details, bulk actions and sorting are now available for tickets.
17+
- Updated ticket details UI to use full card stacks with edit icons for stackable items (e.g., asset, watchers, contact).
18+
- Added a new setting to toggle AutoStart Timer in ticket details (disabled by default).
19+
- Applied gray accent theme in the client section to visually distinguish from the global view.
20+
- Introduced Ticket Due Date functionality (currently supports add/edit only; more updates coming next release).
21+
- Added settings option to display Company Tax ID on invoices.
22+
- Client overview now displays badge counts for all entities.
23+
- Overhauled UI for Invoice, Quote, and Recurring Invoice details; switched PDF generation to TCPDF PHP from PDFMake JS.
24+
- Document versioning has been moved to a separate backend table to resolve permanent link issues -- SEE Breaking CHANGES.
25+
- Migrated Document Templates, Vendor Templates, and Software/License Templates to dedicated tables.
26+
- Added functionality to mark all tasks in a ticket as complete or incomplete.
27+
- Asset CSV import now supports a purchase date field.
28+
- Recurring Payments have been restructured to auto-charge on the invoice due date instead of at generation time.
29+
- Added "Base Template" label for vendor templates when available.
30+
- Backup and restore processes now use a temporary directory; files are cleaned up automatically if operations fail.
31+
- Added confirmation prompt when accepting or declining a quote.
32+
- Other minor code UI/UX cleanups and refactoring throughout the app.
33+
34+
### Fixed
35+
- Resolved issue with enabling MFA.
36+
- Fixed UI regression where ticket listing columns would misalign.
37+
- Non-billable invoices are no longer included in calculations.
38+
- Addressed multiple minor reported security vulnerabilities.
39+
- Tickets with open tasks are no longer resolved in bulk; a warning is shown along with a count of affected tickets.
40+
41+
542
## [25.05.1]
643

744
### Added / Changed

accounts.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@
99
// Perms
1010
enforceUserPermission('module_financial');
1111

12-
//Rebuild URL
13-
$url_query_strings_sort = http_build_query($get_copy);
14-
1512
$sql = mysqli_query(
1613
$mysqli,
1714
"SELECT SQL_CALC_FOUND_ROWS * FROM accounts

admin_api.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66

77
require_once "includes/inc_all_admin.php";
88

9-
10-
//Rebuild URL
11-
$url_query_strings_sort = http_build_query($get_copy);
12-
139
$sql = mysqli_query(
1410
$mysqli,
1511
"SELECT SQL_CALC_FOUND_ROWS * FROM api_keys

admin_app_log.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@
2626
$category_filter = '';
2727
}
2828

29-
//Rebuild URL
30-
$url_query_strings_sort = http_build_query($get_copy);
31-
3229
$sql = mysqli_query(
3330
$mysqli,
3431
"SELECT SQL_CALC_FOUND_ROWS * FROM app_logs

admin_audit_log.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,6 @@
4646
$action_filter = '';
4747
}
4848

49-
//Rebuild URL
50-
$url_query_strings_sort = http_build_query($get_copy);
51-
5249
$sql = mysqli_query(
5350
$mysqli,
5451
"SELECT SQL_CALC_FOUND_ROWS * FROM logs

admin_category.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@
1313
$category = "Expense";
1414
}
1515

16-
//Rebuild URL
17-
$url_query_strings_sort = http_build_query($get_copy);
18-
19-
2016
$sql = mysqli_query(
2117
$mysqli,
2218
"SELECT SQL_CALC_FOUND_ROWS * FROM categories

admin_custom_link.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,6 @@
66

77
require_once "includes/inc_all_admin.php";
88

9-
10-
//Rebuild URL
11-
$url_query_strings_sort = http_build_query($get_copy);
12-
139
$sql = mysqli_query(
1410
$mysqli,
1511
"SELECT SQL_CALC_FOUND_ROWS * FROM custom_links

admin_document_template.php

Lines changed: 24 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,16 @@
11
<?php
22

33
// Default Column Sort by Filter
4-
$sort = "document_name";
4+
$sort = "document_template_name";
55
$order = "ASC";
66

77
require_once "includes/inc_all_admin.php";
88

9-
// Search query SQL snippet
10-
if (!empty($q)) {
11-
$query_snippet = "AND (MATCH(document_content_raw) AGAINST ('$q') OR document_name LIKE '%$q%')";
12-
} else {
13-
$query_snippet = ""; // empty
14-
}
15-
16-
// Rebuild URL
17-
$url_query_strings_sort = http_build_query($get_copy);
18-
199
$sql = mysqli_query(
2010
$mysqli,
21-
"SELECT SQL_CALC_FOUND_ROWS * FROM documents
22-
LEFT JOIN users ON document_created_by = user_id
23-
WHERE document_template = 1
24-
$query_snippet
11+
"SELECT SQL_CALC_FOUND_ROWS * FROM document_templates
12+
LEFT JOIN users ON document_template_created_by = user_id
13+
WHERE user_name LIKE '%$q%' OR document_template_name LIKE '%$q%'
2514
ORDER BY $sort $order LIMIT $record_from, $record_to"
2615
);
2716

@@ -55,18 +44,18 @@
5544
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
5645
<tr>
5746
<th>
58-
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_name&order=<?php echo $disp; ?>">
59-
Template Name <?php if ($sort == 'document_name') { echo $order_icon; } ?>
47+
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_name&order=<?php echo $disp; ?>">
48+
Template Name <?php if ($sort == 'document_template_name') { echo $order_icon; } ?>
6049
</a>
6150
</th>
6251
<th>
63-
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_created_at&order=<?php echo $disp; ?>">
64-
Created <?php if ($sort == 'document_created_at') { echo $order_icon; } ?>
52+
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_created_at&order=<?php echo $disp; ?>">
53+
Created <?php if ($sort == 'document_template_created_at') { echo $order_icon; } ?>
6554
</a>
6655
</th>
6756
<th>
68-
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_updated_at&order=<?php echo $disp; ?>">
69-
Updated <?php if ($sort == 'document_updated_at') { echo $order_icon; } ?>
57+
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_updated_at&order=<?php echo $disp; ?>">
58+
Updated <?php if ($sort == 'document_template_updated_at') { echo $order_icon; } ?>
7059
</a>
7160
</th>
7261
<th class="text-center">
@@ -78,27 +67,26 @@
7867
<?php
7968

8069
while ($row = mysqli_fetch_array($sql)) {
81-
$document_id = intval($row['document_id']);
82-
$document_name = nullable_htmlentities($row['document_name']);
83-
$document_description = nullable_htmlentities($row['document_description']);
84-
$document_content = nullable_htmlentities($row['document_content']);
85-
$document_created_by_name = nullable_htmlentities($row['user_name']);
86-
$document_created_at = nullable_htmlentities($row['document_created_at']);
87-
$document_updated_at = nullable_htmlentities($row['document_updated_at']);
88-
$document_folder_id = intval($row['document_folder_id']);
70+
$document_template_id = intval($row['document_template_id']);
71+
$document_template_name = nullable_htmlentities($row['document_template_name']);
72+
$document_template_description = nullable_htmlentities($row['document_template_description']);
73+
$document_template_content = nullable_htmlentities($row['document_template_content']);
74+
$document_template_created_by_name = nullable_htmlentities($row['user_name']);
75+
$document_template_created_at = nullable_htmlentities($row['document_template_created_at']);
76+
$document_template_updated_at = nullable_htmlentities($row['document_template_updated_at']);
8977

9078
?>
9179

9280
<tr>
9381
<td>
94-
<a class="text-bold" href="admin_document_template_details.php?document_id=<?php echo $document_id; ?>"><i class="fas fa-fw fa-file-alt text-dark"></i> <?php echo $document_name; ?></a>
95-
<div class="mt-1 text-secondary"><?php echo $document_description; ?></div>
82+
<a class="text-bold" href="admin_document_template_details.php?document_template_id=<?php echo $document_template_id; ?>"><i class="fas fa-fw fa-file-alt text-dark"></i> <?php echo $document_template_name; ?></a>
83+
<div class="mt-1 text-secondary"><?php echo $document_template_description; ?></div>
9684
</td>
9785
<td>
98-
<?php echo $document_created_at; ?>
99-
<div class="text-secondary"><?php echo $document_created_by_name; ?></div>
86+
<?php echo $document_template_created_at; ?>
87+
<div class="text-secondary"><?php echo $document_template_created_by_name; ?></div>
10088
</td>
101-
<td><?php echo $document_updated_at; ?></td>
89+
<td><?php echo $document_template_updated_at; ?></td>
10290
<td>
10391
<div class="dropdown dropleft text-center">
10492
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
@@ -109,12 +97,12 @@
10997
data-toggle="ajax-modal"
11098
data-modal-size="xl"
11199
data-ajax-url="ajax/ajax_document_template_edit.php"
112-
data-ajax-id="<?php echo $document_id; ?>"
100+
data-ajax-id="<?php echo $document_template_id; ?>"
113101
>
114102
<i class="fas fa-fw fa-edit mr-2"></i>Edit
115103
</a>
116104
<div class="dropdown-divider"></div>
117-
<a class="dropdown-item text-danger text-bold" href="post.php?delete_document=<?php echo $document_id; ?>">
105+
<a class="dropdown-item text-danger text-bold" href="post.php?delete_document_template=<?php echo $document_template_id; ?>">
118106
<i class="fas fa-fw fa-trash mr-2"></i>Delete
119107
</a>
120108
</div>

admin_document_template_details.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,19 @@
1111
$purifier_config->set('URI.AllowedSchemes', ['data' => true, 'src' => true, 'http' => true, 'https' => true]);
1212
$purifier = new HTMLPurifier($purifier_config);
1313

14-
if (isset($_GET['document_id'])) {
15-
$document_id = intval($_GET['document_id']);
14+
if (isset($_GET['document_template_id'])) {
15+
$document_template_id = intval($_GET['document_template_id']);
1616
}
1717

18-
$sql_document = mysqli_query($mysqli, "SELECT * FROM documents WHERE document_template = 1 AND document_id = $document_id");
18+
$sql_document = mysqli_query($mysqli, "SELECT * FROM document_templates WHERE document_template_id = $document_template_id");
1919

2020
$row = mysqli_fetch_array($sql_document);
2121

22-
$document_name = nullable_htmlentities($row['document_name']);
23-
$document_description = nullable_htmlentities($row['document_description']);
24-
$document_content = $purifier->purify($row['document_content']);
25-
$document_created_at = nullable_htmlentities($row['document_created_at']);
26-
$document_updated_at = nullable_htmlentities($row['document_updated_at']);
22+
$document_template_name = nullable_htmlentities($row['document_template_name']);
23+
$document_template_description = nullable_htmlentities($row['document_template_description']);
24+
$document_template_content = $purifier->purify($row['document_template_content']);
25+
$document_template_created_at = nullable_htmlentities($row['document_template_created_at']);
26+
$document_template_updated_at = nullable_htmlentities($row['document_template_updated_at']);
2727

2828
?>
2929

@@ -37,27 +37,27 @@
3737
<li class="breadcrumb-item">
3838
<a href="admin_document_template.php">Document Templates</a>
3939
</li>
40-
<li class="breadcrumb-item active"><i class="fas fa-file mr-2"></i><?php echo $document_name; ?></li>
40+
<li class="breadcrumb-item active"><i class="fas fa-file mr-2"></i><?php echo $document_template_name; ?></li>
4141
</ol>
4242

4343
<div class="card card-dark">
4444
<div class="card-header py-2">
4545

46-
<h3 class="card-title mt-2"><i class="fa fa-fw fa-file mr-2"></i><?php echo $document_name; ?></h3>
46+
<h3 class="card-title mt-2"><i class="fa fa-fw fa-file mr-2"></i><?php echo $document_template_name; ?></h3>
4747

4848
<div class="card-tools">
4949
<button type="button" class="btn btn-primary"
5050
data-toggle="ajax-modal"
5151
data-modal-size="xl"
5252
data-ajax-url="ajax/ajax_document_template_edit.php"
53-
data-ajax-id="<?php echo $document_id; ?>"
53+
data-ajax-id="<?php echo $document_template_id; ?>"
5454
>
5555
<i class="fas fa-edit mr-2"></i>Edit
5656
</button>
5757
</div>
5858
</div>
5959
<div class="card-body prettyContent">
60-
<?php echo $document_content; ?>
60+
<?php echo $document_template_content; ?>
6161
</div>
6262
</div>
6363

admin_mail_queue.php

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@
66

77
require_once "includes/inc_all_admin.php";
88

9-
//Rebuild URL
10-
$url_query_strings_sort = http_build_query($get_copy);
11-
129
$sql = mysqli_query(
1310
$mysqli,
1411
"SELECT SQL_CALC_FOUND_ROWS * FROM email_queue

0 commit comments

Comments
 (0)