Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
248 commits
Select commit Hold shift + click to select a range
bd31513
Add db fields for ticket_quote
wrongecho Jun 22, 2025
2ca5077
Ticket
wrongecho Jun 22, 2025
500e713
clarify error message wording
wrongecho Jun 22, 2025
2b4933b
Do not Update ticket status when scheduling or cancelling a tickets s…
johnnyq Jun 23, 2025
12d8c8e
Fix Overlapping logo with company information in PDF Invoice and Quote
johnnyq Jun 23, 2025
05850f6
Fix php debug message
Jun 25, 2025
1ee50fd
Ticket merging - Hyperlink the new parent ticket in the internal comm…
Jun 25, 2025
a1b99c4
Client Portal - Don't allow tech contacts to edit themselves
Jun 25, 2025
ce8c4df
Add debug check for php-zip
Jun 25, 2025
e8a3309
Fix project search not filtering completed projects
Jun 26, 2025
6b0855c
Fix Exports while in Client Overview some were failing due to missing…
johnnyq Jun 26, 2025
ca519fe
Fix Adding a vendor from a template and adding country code to vendor…
johnnyq Jun 26, 2025
ffad0cd
Fix broken Documents in the Client Portal due to regression with spli…
johnnyq Jun 26, 2025
411a6ef
Fix Searching Closed Tickets
johnnyq Jun 26, 2025
8196706
Ticket API: Allow HTML into ticket Content and allow inserting asset_id
johnnyq Jun 26, 2025
0ca28dc
Fix Document API to not insert a new document upon update as we chang…
johnnyq Jun 26, 2025
f0bcf97
Add Assets to the client Portal viewable by Primary and technical Con…
johnnyq Jun 26, 2025
5fb1070
Show your Assigned Assets on the Client Portal Home Page
johnnyq Jun 26, 2025
3626777
Fix Item name and Description Alignment in PDF Exports
johnnyq Jun 26, 2025
45ac7f0
Add Bulk Delete Function Also when deletign a ticket delete the watch…
johnnyq Jun 27, 2025
98723b7
Added Bulk Actions Set Network, Type and Delete to Asset Interfaces
johnnyq Jun 27, 2025
4cb2f42
Added Bulk Action Set IP to DHCP in Asset Interface
johnnyq Jun 27, 2025
ec344cb
Allow entering multiple ticket watchers at once
wrongecho Jun 28, 2025
77e9d72
Add physical location modal - not working
wrongecho Jun 28, 2025
b851370
Add physical location modal - not working
wrongecho Jun 28, 2025
eb11e5b
Bugfix: Company logo not being removed properly from db
wrongecho Jun 28, 2025
19af05e
Client Portal - Add company logo to header banner
wrongecho Jun 28, 2025
bc9529c
Client Portal - Allow client choose asset during ticket creation
wrongecho Jun 28, 2025
3f21e73
Comment ticket collabs, still broken
wrongecho Jun 28, 2025
1939e06
Start using the new modal when creating tickets. This allows us to se…
wrongecho Jun 28, 2025
396a67b
- Enhanced the document retrieval process by including the document d…
MydsiIversen Jun 30, 2025
effbf24
Fix default rate and net terms if not provided in api call
Jul 1, 2025
d781130
Merge branch 'develop' of https://github.com/itflow-org/itflow into d…
Jul 1, 2025
873dc1f
Fix contact location if not provided in api call
Jul 1, 2025
8753655
Do not allow client portal logins with Contact users of a client tha…
johnnyq Jul 3, 2025
67dc012
Small wording hints on file uploads instead of upload File its just u…
johnnyq Jul 3, 2025
6af61cb
Merge pull request #1225 from itflow-org/bulk-assign-phyloc
johnnyq Jul 3, 2025
e036418
Disable Certain Bulk Actions that are directly related to a client in…
johnnyq Jul 3, 2025
e281a39
Add title Icon for Bulk Set Status
johnnyq Jul 3, 2025
dba04a4
Fix Table Header Link Buttons in Asset Details
johnnyq Jul 3, 2025
b87b801
Fix broken Table header Link buttons in contact details
johnnyq Jul 3, 2025
69a8a92
Merge pull request #1226 from MydsiIversen/Document-enhancement-clien…
johnnyq Jul 3, 2025
6bc7862
UI Dashb oard resize some Dashboard cards
johnnyq Jul 3, 2025
9b6be66
Initial work on Adding Payment Methods for Online Payments in Client …
johnnyq Jul 4, 2025
e7503e8
Initial DB work to Generalize Payment Providers, allow multiple payme…
johnnyq Jul 4, 2025
8d1bf3d
UI add modal and listing work on Payment Providers
johnnyq Jul 4, 2025
77597fd
Update wording on Add Payment Processing, we plan on using the income…
johnnyq Jul 4, 2025
ed09360
Convert new lines to brs for contact notes
johnnyq Jul 6, 2025
fa9acef
Fixed IMAP test button with error details
johnnyq Jul 6, 2025
a011dc4
POST code for AI and Payment Providers
johnnyq Jul 6, 2025
7c558ff
Add location create endpoint
Jul 7, 2025
c76da10
Add Payment Method to UI and switch Add Payment modals to use the new…
johnnyq Jul 7, 2025
7e17fdf
Add new UI for Saved Payments for payment providers
johnnyq Jul 7, 2025
a6f8349
Fix Payment Method Additons in setup
johnnyq Jul 8, 2025
93f4ea5
Rework Payment Provider AI Provider Tables and logic add cascading de…
johnnyq Jul 8, 2025
307d989
No need for a sql delete on recurring payments when deleting a saved …
johnnyq Jul 8, 2025
9bc705b
Updated Guest pay and Client Add Delete Payments, adjustedsetting sav…
johnnyq Jul 9, 2025
10fd74b
Remove unused model
johnnyq Jul 9, 2025
5f94543
Add Easy Select Auto Pay option in Client Portal Recurring Invoices, …
johnnyq Jul 9, 2025
31a89c0
Update Recurring Payment Auto pay in cron
johnnyq Jul 9, 2025
467c681
Add Saved Payment Options to recurring invoices and details for agents
johnnyq Jul 9, 2025
300aef4
Fixed Email Notify not showing for recurring invoice
johnnyq Jul 9, 2025
fe8baf2
Fix pointer not switch to a finger when hovering over add contact in …
johnnyq Jul 10, 2025
a7b2522
Fix Invoice Link in ticket details when billed
johnnyq Jul 10, 2025
35cbfdd
Rework Categories into a select box for tickets, which now makes it e…
johnnyq Jul 10, 2025
35d6b51
use table-sm for tickets to reduce padding and margin and remove tick…
johnnyq Jul 10, 2025
da3a1d2
Allow linking closed tickets to a project
Jul 14, 2025
46c4a62
Converted add payment to a dropdown under invoice to allow for the st…
johnnyq Jul 14, 2025
f72b776
Added Bulk Actions to Invoices Assign Income Category
johnnyq Jul 15, 2025
896da66
Remove the Archive button from invoices as we dont archive invoices
johnnyq Jul 15, 2025
c36b1cf
Added Income Category Filter to Invoices
johnnyq Jul 15, 2025
717e635
Add Option for Mac Address in Additonal Column and allow to filter by…
johnnyq Jul 15, 2025
dd482b2
Use getFallBack function on MAC Address if no MAC is present show a -…
johnnyq Jul 15, 2025
184aba4
Finished UI work for AI Providers and Models, AI is set to use the ne…
johnnyq Jul 15, 2025
3e7d7f3
Make Client Portal Dashboard Cards Linkable, added upaid invoices wit…
johnnyq Jul 15, 2025
5aee84e
Add Credit card icon to the pay button
johnnyq Jul 15, 2025
52dac22
Add default purchase date for csv import to prevent error when undefined
Jul 21, 2025
dfe0a0b
Add default netid for asset int csv import to prevent errors
Jul 21, 2025
50a8e67
Commented out deleting old Payment Provider Settings from DB until ne…
johnnyq Jul 21, 2025
b100498
Add Client Bulk Actions: Edit Tags, Referral, Industry, Set Hourly Ra…
johnnyq Jul 21, 2025
4c031c8
Increase the width for totals on invoices and Quotes PDF Exports
johnnyq Jul 22, 2025
38b2a94
Client Overview do not count Archived Clients entities and in service…
johnnyq Jul 22, 2025
14691fa
Fix Archived Query for domains to not show archived clients
johnnyq Jul 22, 2025
a5aae51
Fix issue in some of the client overview entities archived will not r…
johnnyq Jul 22, 2025
56c7c76
Add option to filter footer 500 records per page
johnnyq Jul 22, 2025
6221fd6
Fix recurring expense next run date logic for monthly and annual freq…
johnnyq Jul 23, 2025
719a0e5
Also Apply previous commit it editing recurring expenses
johnnyq Jul 23, 2025
a393284
Remove Building Icon next to company name in main side bar nav
johnnyq Jul 23, 2025
712804d
Preparing for Dark mode theme: Started Fixing models so they look bet…
johnnyq Jul 23, 2025
99aaeef
Move the adminlte css to be the last css to fix select2 being white i…
johnnyq Jul 23, 2025
197dd9f
Initial Work on Client Account Credit System, DB Structure, Credit Ba…
johnnyq Jul 24, 2025
0db6853
Updated Invoice, Quote Recurring Invoice UI to include a table border…
johnnyq Jul 24, 2025
4d71eb5
Remove Credit once Applied, also get total credits applied
johnnyq Jul 24, 2025
e014e51
Beta Support for Dark Mode has been added to the theme options
johnnyq Jul 24, 2025
e0a5efd
Updated Contact Asset Counts to use more optimied query and added ass…
johnnyq Jul 24, 2025
6307099
Clarified Importing contacts when inporting clients in the client imp…
johnnyq Jul 25, 2025
d115d57
Update sanitize_input Function to handle encoding issues such as Viet…
johnnyq Jul 25, 2025
219fe59
Use Badge Pill for rounded Badges in client side nav
johnnyq Jul 25, 2025
5f26f68
Clarify Email during company setup, instead of just enter email enter…
johnnyq Jul 25, 2025
d5ec601
add eg info@company.com for further clarification on company setup
johnnyq Jul 25, 2025
699546f
In Client Import Clarify CSV as Primary Contact Name instead of just …
johnnyq Jul 25, 2025
4906e06
Initialized migrating modals into entity folders and modals out of aj…
johnnyq Jul 28, 2025
0494bfc
Moved admin_ to /admin, user_ to user report_ to /reports each have t…
johnnyq Jul 28, 2025
9595070
Moved user items to user directory
johnnyq Jul 28, 2025
38e2e50
More progress on consolidating files into user and admin
johnnyq Jul 29, 2025
4ec1441
Cleanup some broken links from file dirextory consolidation
johnnyq Jul 29, 2025
9ee7621
Update more broken links from file dirextory consolidation
johnnyq Jul 29, 2025
2333d81
Update more broken links from file dirextory consolidation
johnnyq Jul 29, 2025
10fd911
Update links on the setup page as well
johnnyq Jul 29, 2025
5a76780
Move db.sql back to fix develop platform
johnnyq Jul 30, 2025
8e87c25
Update more broken links from file diretory consolidation and started…
johnnyq Jul 31, 2025
905908b
broken link updates
johnnyq Jul 31, 2025
9fe0d84
Feature: Added Client URI field to Assets which is exposed in the cli…
johnnyq Jul 31, 2025
07e2c41
Fix client uri regression broken asset details page update echos to u…
johnnyq Jul 31, 2025
41a8e41
Move reports back and rename them appropriately update broken links
johnnyq Jul 31, 2025
7cfba7f
Added redirect() function for page redirects and updated credit syste…
johnnyq Aug 1, 2025
5d52b6c
Update logic for Apply Credit on invoice Post
johnnyq Aug 1, 2025
d2dac19
Update admin, user, guest and client post to use new redirect function
johnnyq Aug 1, 2025
2cf9326
Fix broken link for edit role
johnnyq Aug 1, 2025
cc5b1c8
Add new function called flash_alert() to repace the alerting in posts…
johnnyq Aug 1, 2025
012b0f1
Update Admin posts to use new functions flash_alert and getFieldById …
johnnyq Aug 1, 2025
fae7e76
Remove logging comments as its implied in admin also if returning 1 f…
johnnyq Aug 1, 2025
ab8f516
Started Removing logging comments as its implied in user posts also i…
johnnyq Aug 1, 2025
a7e042b
Removed logging comments as its implied in asset post also if returni…
johnnyq Aug 2, 2025
76b4837
Hide invite contact letter options for now
Aug 4, 2025
fef0d87
More user post function migration and cleanup
johnnyq Aug 4, 2025
e8af173
Fix Client Billing column lweft align the label right align the amounts
johnnyq Aug 4, 2025
b4e5e3f
Fix injection with role id affecting authenticated admin accounts only
johnnyq Aug 4, 2025
e39072d
More work on moving to the redirect, flash_alert and get_field_by_id …
johnnyq Aug 4, 2025
a38d005
Finished moving to the redirect, flash_alert and get_field_by_id and …
johnnyq Aug 4, 2025
6b39c1a
Finished moving to the redirect, flash_alert and get_field_by_id and …
johnnyq Aug 4, 2025
7e55808
add some redirect to login.php, fix ticket post
johnnyq Aug 4, 2025
08dd614
Migrate Dark/light mode to a user settings instead of global setting,…
johnnyq Aug 5, 2025
e8a1d4c
Update mfa enforcement page to use new asset pathes
johnnyq Aug 5, 2025
1890985
Remove unused top nav ticket modal
johnnyq Aug 5, 2025
643a4ce
add router.php to inc_all_client.php
johnnyq Aug 5, 2025
9a0aa9c
Fix Calendar not showing when no client is selected
johnnyq Aug 5, 2025
e24ec04
Fix Post errors when repeat and Email Event is not selected
johnnyq Aug 5, 2025
2d72a6f
Implement ticket first response date/time tracking
Aug 6, 2025
13838ec
Implement ticket first response date/time tracking
Aug 6, 2025
be66a16
Fix setup redirect
johnnyq Aug 6, 2025
c8984d1
Merge pull request #1231 from itflow-org/ticket-fr
johnnyq Aug 6, 2025
44fdb6c
Broke up the check_login.php require into several files seperated by …
johnnyq Aug 6, 2025
9caa429
rename get_settings.php to load_global_settings.php and update all re…
johnnyq Aug 6, 2025
8407cd3
updated router.php to automatically determine relative path based off…
johnnyq Aug 6, 2025
c78f50a
cap the path_prefix to 3 depth directories max
johnnyq Aug 6, 2025
73b84a9
Removed dynamic depth path_prefix due to potential security issues wi…
johnnyq Aug 6, 2025
874d9dd
Cleaned up ticket details UI used card Group for top, removed respons…
johnnyq Aug 8, 2025
7172c92
Update Database updates patch in update_cli
johnnyq Aug 8, 2025
1d98eb5
Update Project Details Header to use card group class and update clie…
johnnyq Aug 8, 2025
595e609
Added Stock Ledger to tables and additonal fields for product includi…
johnnyq Aug 11, 2025
3c70995
Add UI elements for product location, used logic to seperate product …
johnnyq Aug 12, 2025
f82f3e9
Allow adding more than 9 stock
johnnyq Aug 12, 2025
337ceb7
Fix Client Net terms displaying default Net terms instead of On Recei…
johnnyq Aug 12, 2025
890e166
Thicken the left border on ticket replies for more prominent type of …
johnnyq Aug 13, 2025
535c8e9
Remove Stock if Inventory item is selected and added to an invoice an…
johnnyq Aug 15, 2025
6427235
Show Name Description Tax Price and Stock in Product Auto Complete in…
johnnyq Aug 15, 2025
37bef2d
Check Stock if product type is a product before adding the line item
johnnyq Aug 15, 2025
2333fa2
Product Category Dropdown Filter only show categories thats are assig…
johnnyq Aug 15, 2025
4ef1e91
When Show Archived is selected in clients show Drop down filters for …
johnnyq Aug 15, 2025
a0ced96
Use a WAY MORE Efficient query when filling out filter selection boxe…
johnnyq Aug 16, 2025
3bb0ef6
Left Align Billing Header
johnnyq Aug 16, 2025
236d895
Reworked the ajax-modal function to be more simplified and use less d…
johnnyq Aug 16, 2025
d37dc37
convert more ajax modals to new syntax
johnnyq Aug 16, 2025
f443ae9
convert even more ajax modals to new syntax
johnnyq Aug 16, 2025
d942bad
Fix primary contact text not showing
wrongecho Aug 16, 2025
559e0c6
Comment direct link to guest pay, we should not encourage agents to d…
wrongecho Aug 16, 2025
7ae7b89
Invoice.php - Fix undefined error
wrongecho Aug 16, 2025
8592817
Recurring tickets - fix include path
wrongecho Aug 16, 2025
27016ea
Recurring tickets - add ability to bulk recurr
wrongecho Aug 16, 2025
5c93753
Rm extra unnecessary line in overdue invoice email
wrongecho Aug 16, 2025
9fbf775
Fix file icon in file rename modal
wrongecho Aug 16, 2025
804467b
Use freeserif font instead of helvetica to properly display foreign c…
wrongecho Aug 16, 2025
98cf2f7
Use freeserif font instead of helvetica to properly display foreign c…
wrongecho Aug 16, 2025
4c604f4
Use HTML for the logo instead of pdf->image; scales much nicer
wrongecho Aug 16, 2025
4b7aa4b
Powered by
wrongecho Aug 16, 2025
a8386d3
Allow reporting on average time to first response
wrongecho Aug 16, 2025
94a4fec
Fix popping future tickets numbering
Aug 20, 2025
96c32b3
Added Stripe Config Migration to a database Update
johnnyq Aug 20, 2025
eca0925
Migrate over Payment Methods from Categories to its own table payment…
johnnyq Aug 20, 2025
7618dd3
Update Stripe to Payment Provider Migration to not transfer over clie…
johnnyq Aug 20, 2025
e694e20
Use mysqli escape string instead of sanitizeInput on stripe to paymen…
johnnyq Aug 20, 2025
85cfd6f
Fix Regression Broken Quick add modals
johnnyq Aug 21, 2025
be9e30e
Fix Show Add Payment dropdown if client has credits or saved payment …
johnnyq Aug 21, 2025
89af821
Fix Ticket Kanban CSS Path and category query
johnnyq Aug 21, 2025
4332439
Fix Regressed See More... in User Activies page
johnnyq Aug 21, 2025
7f49ece
Flash alert if no comment was entered in a ticket reply via the clien…
johnnyq Aug 21, 2025
6ccf7a0
Set Invoice Credit, Consolidated all expense modals to modals/expense…
johnnyq Aug 22, 2025
066952e
Consolidate vendor modals to modals/vendor removed ajax_ and _modal p…
johnnyq Aug 22, 2025
1145260
Consolidate trip modals to modals/trip removed ajax_ and _modal prefi…
johnnyq Aug 22, 2025
ab17de7
Consolidate client modals to modals/client and use new ajax-modal syntax
johnnyq Aug 22, 2025
67078c4
Consolidate product modals to modals/product removed ajax_ and _modal…
johnnyq Aug 22, 2025
0b93d58
Consolidate account modals to modals/account removed ajax_ and _modal…
johnnyq Aug 22, 2025
15ba385
Consolidate asset modals to modals/asset removed ajax_ and _modal pre…
johnnyq Aug 23, 2025
170d6dd
Consolidate alot of modals to modals/ENTITY removed ajax_ and _modal …
johnnyq Aug 23, 2025
91b0080
Finished Consolidating the remaining user modals to modals/ENTITY rem…
johnnyq Aug 24, 2025
41f957e
Migrated admin modals to modals/ENTITY removed ajax_ and _modal prefi…
johnnyq Aug 25, 2025
4512065
Remove function code for old way ajax-modal, moved modals over to mod…
johnnyq Aug 25, 2025
6f5ffef
Link Fixes
johnnyq Aug 25, 2025
373f157
Update function path for customAction to use the new path /custom and…
johnnyq Aug 25, 2025
0e54359
Assets: Fix Description not displaying, Fix issue with unitialized OS…
johnnyq Aug 25, 2025
f6c0f84
Asset: Multiple Bug fixes, Fix broken asset list if no assets exist, …
johnnyq Aug 25, 2025
af7f1f3
Credentials: Fix broken page if no clients exist, which also fixes do…
johnnyq Aug 25, 2025
0a6b890
Fix broken php start tag
johnnyq Aug 25, 2025
86c5b9a
Removed Budge from the side nav as this was never finished and doesnt…
johnnyq Aug 26, 2025
2a0181f
Convert Invoice and Quote Guest URL to Copy to Clipboard link instead…
johnnyq Aug 26, 2025
530a76a
Fix undefined vars in export invoice / quote pdf fix regression compa…
johnnyq Aug 27, 2025
d584c6b
Commented out Credit lines as its not ready for next release running …
johnnyq Aug 27, 2025
535078b
Fix Bad vars in PAyment Providers listing, add check to see if paymen…
johnnyq Aug 27, 2025
66cab6c
Fixed Guest Pay removed old stripe vars in place of new payment provi…
johnnyq Aug 27, 2025
da0892f
Remove Stripe check and add payment provider check in Client Portal R…
johnnyq Aug 27, 2025
1638538
Remove Old Auto Pay from recurring Invoice in favor of the saved cards.
johnnyq Aug 28, 2025
a90c4ed
Remove Old Auto Pay Modal for recurring Invoices
johnnyq Aug 28, 2025
1f99e59
Remove old Autop Pay Logic from recurring Invoices Listing
johnnyq Aug 28, 2025
fd73f13
Fixed a few table names in Stripe Migration, Removed legacy stripe an…
johnnyq Aug 28, 2025
9f50c93
Move reports out of the sub directory for now as it broke requires
johnnyq Aug 28, 2025
39d6c42
Bump and Migrate logic chartjs 2.9.4 to 4.5.0, bump stripe-php from 1…
johnnyq Aug 28, 2025
b7afbd3
Revert Bump down fontawesome-free 7.0.0 to 5.15.4, did not like the w…
johnnyq Aug 28, 2025
1517c96
Remove Budget from reports as it totally unfinished
johnnyq Aug 28, 2025
51273e9
Remove unused / unfinished browser extension from user preferences
johnnyq Aug 28, 2025
8afe2d5
Converted and combine ajax add for tags and categories, fixed quick a…
johnnyq Aug 28, 2025
469c36d
Remove AI Enable References through the UI this will be handled diffe…
johnnyq Aug 29, 2025
2beff45
Removed some simple tinyMCE inits and combined AI button into one
johnnyq Aug 29, 2025
292b074
Remove legacy Stripe Enabled from invoice Commented out Pay Via Saved…
johnnyq Aug 29, 2025
2c160d1
Take you back to dashboard rather than a redirect
wrongecho Aug 30, 2025
dadcc69
Typo
wrongecho Aug 30, 2025
595e57d
Rewording
wrongecho Aug 30, 2025
de627c1
No csrf for client side, yet
wrongecho Aug 30, 2025
45083e1
Fix if undefined
wrongecho Aug 30, 2025
a87a206
Add better error handling for dodgy whois results
wrongecho Aug 30, 2025
bc2fe2b
Fixed stripe Migration table name spelling
johnnyq Aug 30, 2025
ec94bb3
Add back Pay Invoice with saved card, currently only pays the full am…
johnnyq Sep 1, 2025
33340b8
Updated Changelog, Increased app version
johnnyq Sep 2, 2025
ed9b99e
Fix unpaid invoices on client portal but also comment it out until re…
johnnyq Sep 2, 2025
cf63a2e
Fix TinyMCE License in client portal
johnnyq Sep 2, 2025
ef1ec56
Allow the Client to easily Pay an invoice from the client portal with…
johnnyq Sep 3, 2025
fc2cca5
Added card icon
johnnyq Sep 3, 2025
2549a97
Added card icons to Saved Payments in Client Portal and spruced up ui
johnnyq Sep 3, 2025
46d93f9
Further enhanced the Saved Payments Section by splitting cards and ad…
johnnyq Sep 3, 2025
d7d6e4a
Fix paths for db and uploads dir in debug
johnnyq Sep 3, 2025
9d9bfc6
Fix Active side nav for api keys
johnnyq Sep 3, 2025
d37da2e
Fix Recurring Payment Migration for stripe
johnnyq Sep 4, 2025
cece9ad
Another attempt to fix reccuring payment migration to match the corre…
johnnyq Sep 4, 2025
2283ad0
Fix Adding Expense on recurring stripe payments in cron
johnnyq Sep 4, 2025
aa51652
Another attempt at fix automatic recurring payments expense
johnnyq Sep 4, 2025
27b3124
Update .gitignore to ignore the new custom/*
johnnyq Sep 5, 2025
f3c7c07
Add note about backing up before updating
johnnyq Sep 5, 2025
6a5ce1d
Add note about updating from the webUI
johnnyq Sep 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/*
xcustom/*
!xcustom/readme.php
post/xcustom
custom/*
!post/xcustom/readme.php
.zed
86 changes: 86 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,92 @@

This file documents all notable changes made to ITFlow.

## [25.09]

***BACK UP*** before updating.

---

### Breaking Changes and Notes
- We strongly recommend updating from the command line, however if performed via the webui and after performed it will return a 404. thats normal as the directory structure has changed, just close your browser then log back in then go back to update to perform the many database updates.
- This is a major release with significant changes. While the community has done a great job identifying bugs, some may still remain — continued testing is encouraged.
- All AI settings will be **reset** and must be reconfigured using the new AI provider backend.
- The `xcustom` directory has been renamed to `custom`. All custom libraries and post-processing scripts should now be placed here.

---

### Added / Changed
- Numerous UI improvements and refinements across the application.
- Enhanced visual clarity by thickening the left border on ticket comments to help identify comment types.
- Ticket details UI redesigned to use less space at the top of the screen.
- Introduced tracking for the **first response date/time** on tickets.
- New reporting feature: **Average time to first response** on tickets.
- Stripe integration rebuilt using the new **payment provider backend**.
- Clients can now save and manage **multiple payment methods**.
- Support for selecting saved cards for **recurring invoices** in both the client and agent portals.
- Initial database structure and logic added for **credit management** (feature not yet enabled).
- Major **backend directory restructuring**.
- Introduced **stock/inventory management**, including a stock ledger backend.
- Stock quantities now update automatically when invoice items are added or removed.
- Invoice autocomplete now includes: **name, description, price, tax, stock levels**, and links `product_id` to `item_id`.
- Added a **category filter** to invoices.
- Linked stock to related expenses.
- New product fields: **location, code, and type**.
- Products now separated into two types: **Service** and **Product**.
- **Dark mode** introduced.
- Projects: Now support linking **closed tickets**.
- Clients: Added bulk actions for tags, referral source, industry, hourly rate, email, archive, and restore.
- Invoices: Bulk action added to **assign categories**.
- Assets: New `client_uri` field, visible in both the agent and client portals.
- Client Portal: Clients can now **select an asset** during ticket creation.
- Client Portal: Company logo now **displays in the header**.
- Client Portal: Dashboard cards are now **clickable** for more detail.
- Assets: Option added to include **MAC Address** in additional columns.
- Asset Interface: Bulk actions added — set DHCP, network type, and delete.
- API:
- Added `/location` endpoint.
- Ticket content now supports **HTML formatting**.
- New option to filter and display **500 records per page** in the footer.
- Payment methods are now treated as a **separate entity** instead of being grouped under categories.
- Updated libraries:
- **TinyMCE**
- **Chart.js** (major upgrade)
- **DataTables**
- **Bootstrap**
- **FullCalendar**
- **php-stripe**

---

### Fixed
- Several security vulnerabilities patched.
- Ticket status is no longer updated when scheduling.
- Client Portal: Tech contacts can no longer edit their own details.
- Fixed overlapping logo issue in Invoice/Quote PDF exports.
- Refactored `check_login.php` into multiple files for modular login functionality.
- Removed redundant logging comments for redirects.
- Renamed `get_settings.php` to `load_global_settings.php`.
- Simplified syntax for `ajax-modal` and updated usage throughout the app.
- Fixed issue where primary contact text wasn’t displaying.
- Corrected client **Net Terms** display.
- Fixed logic for recurring expense **next run date**.
- Resolved broken **IMAP test button**.
- Archived clients can no longer log into the portal.
- Searching closed tickets no longer reverts to open tickets.
- Fixed project search filter not showing completed projects.
- Fixed issue where company logo was not being removed correctly.
- Resolved API bugs:
- Default rate and net terms.
- Contact location.
- Document endpoint.

---

### Developer Updates
- Replaced legacy code with newer functions like `redirect()`, `getFieldById()`, and `flash_alert()`.
- Significantly improved performance of queries used for filter selection boxes.


## [25.06.1]

### Fixed
Expand Down
108 changes: 108 additions & 0 deletions admin/ai_model.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?php

// Default Column Sortby Filter
$sort = "ai_model_name";
$order = "ASC";

require_once "includes/inc_all_admin.php";

$sql = mysqli_query($mysqli, "SELECT * FROM ai_models LEFT JOIN ai_providers ON ai_model_ai_provider_id = ai_provider_id ORDER BY $sort $order");

$num_rows = mysqli_num_rows($sql);

?>

<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-robot mr-2"></i>AI Models</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addAIModelModal"><i class="fas fa-plus mr-2"></i>Add Model</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_model_name&order=<?php echo $disp; ?>">
Model <?php if ($sort == 'ai_model_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_provider_name&order=<?php echo $disp; ?>">
Provider <?php if ($sort == 'ai_provider_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_model_use_case&order=<?php echo $disp; ?>">
Use Case<?php if ($sort == 'ai_model_use_case') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark">Prompt</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php

while ($row = mysqli_fetch_array($sql)) {
$provider_id = intval($row['ai_provider_id']);
$provider_name = nullable_htmlentities($row['ai_provider_name']);
$model_id = intval($row['ai_model_id']);
$model_name = nullable_htmlentities($row['ai_model_name']);
$use_case = nullable_htmlentities($row['ai_model_use_case']);
$prompt = nl2br(nullable_htmlentities($row['ai_model_prompt']));

?>
<tr>
<td>
<a class="text-dark text-bold ajax-modal" href="#"
data-modal-url="modals/ai/ai_model_edit.php?id=<?= $model_id ?>">
<?php echo $model_name; ?>
</a>
</td>
<td><?php echo $provider_name; ?></td>
<td><?php echo $use_case; ?></td>
<td><?php echo $prompt; ?></td>
<td>
<div class="dropdown dropleft text-center">
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
<i class="fas fa-ellipsis-h"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item ajax-modal" href="#"
data-modal-url="modals/ai/ai_model_edit.php?id=<?= $model_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger confirm-link" href="post.php?delete_ai_model=<?php echo $model_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>

<?php

}

if ($num_rows == 0) {
echo "<h3 class='text-secondary mt-3' style='text-align: center'>No Records Here</h3>";
}

?>

</tbody>
</table>

</div>
</div>
</div>

<?php
require_once "modals/ai/ai_model_add.php";
require_once "../includes/footer.php";
109 changes: 109 additions & 0 deletions admin/ai_provider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
<?php

// Default Column Sortby Filter
$sort = "ai_provider_name";
$order = "ASC";

require_once "includes/inc_all_admin.php";

$sql = mysqli_query($mysqli, "SELECT * FROM ai_providers ORDER BY $sort $order");

$num_rows = mysqli_num_rows($sql);

?>

<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-robot mr-2"></i>AI Providers</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addAIProviderModal"><i class="fas fa-plus mr-2"></i>Add Provider</button>
</div>
</div>
<div class="card-body">
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_provider_name&order=<?php echo $disp; ?>">
Provider <?php if ($sort == 'ai_provider_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_provider_api_url&order=<?php echo $disp; ?>">
URL <?php if ($sort == 'ai_provider_api_url') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=ai_provider_api_key&order=<?php echo $disp; ?>">
Key <?php if ($sort == 'ai_provider_api_key') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark">Models</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php

while ($row = mysqli_fetch_array($sql)) {
$provider_id = intval($row['ai_provider_id']);
$provider_name = nullable_htmlentities($row['ai_provider_name']);
$url = nullable_htmlentities($row['ai_provider_api_url']);
$key = nullable_htmlentities($row['ai_provider_api_key']);

$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('ai_model_id') AS ai_model_count FROM ai_models WHERE ai_model_ai_provider_id = $provider_id"));
$ai_model_count = intval($row['ai_model_count']);

?>
<tr>
<td>
<a class="text-dark text-bold ajax-modal" href="#"
data-modal-url="modals/ai/ai_provider_edit.php?id=<?= $provider_id ?>">
<?php echo $provider_name; ?>
</a>
</td>
<td><?php echo $url; ?></td>
<td><?php echo $key; ?></td>
<td><?php echo $ai_model_count; ?></td>
<td>
<div class="dropdown dropleft text-center">
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
<i class="fas fa-ellipsis-h"></i>
</button>
<div class="dropdown-menu">
<a class="dropdown-item ajax-modal" href="#"
data-modal-url="modals/ai/ai_provider_edit.php?id=<?= $provider_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger confirm-link" href="post.php?delete_ai_provider=<?php echo $provider_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>

<?php

}

if ($num_rows == 0) {
echo "<h3 class='text-secondary mt-3' style='text-align: center'>No Records Here</h3>";
}

?>

</tbody>
</table>

</div>
</div>
</div>

<?php
require_once "modals/ai/ai_provider_add.php";
require_once "../includes/footer.php";
8 changes: 4 additions & 4 deletions admin_api.php → admin/api_keys.php
Original file line number Diff line number Diff line change
Expand Up @@ -162,15 +162,15 @@
</form>

</div>
<?php require_once "includes/filter_footer.php";
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>

<script src="js/bulk_actions.js"></script>
<script src="../js/bulk_actions.js"></script>

<?php
require_once "modals/admin_api_key_add_modal.php";
require_once "modals/api/api_key_add.php";

require_once "includes/footer.php";
require_once "../includes/footer.php";

4 changes: 2 additions & 2 deletions admin_app_log.php → admin/app_log.php
Original file line number Diff line number Diff line change
Expand Up @@ -183,10 +183,10 @@
</tbody>
</table>
</div>
<?php require_once "includes/filter_footer.php";
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>

<?php
require_once "includes/footer.php";
require_once "../includes/footer.php";
6 changes: 3 additions & 3 deletions admin_audit_log.php → admin/audit_log.php
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@
if (empty($client_name)) {
$client_name_display = "-";
} else {
$client_name_display = "<a href='client_overview.php?client_id=$client_id'>$client_name</a>";
$client_name_display = "<a href='../user/client_overview.php?client_id=$client_id'>$client_name</a>";
}
$log_entity_id = intval($row['log_entity_id']);

Expand All @@ -292,11 +292,11 @@
</tbody>
</table>
</div>
<?php require_once "includes/filter_footer.php";
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>

<?php
require_once "includes/footer.php";
require_once "../includes/footer.php";

2 changes: 1 addition & 1 deletion admin_backup.php → admin/backup.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,5 +34,5 @@
</div>

<?php
require_once "includes/footer.php";
require_once "../includes/footer.php";

Loading