4274 Commits

Author SHA1 Message Date
Johnny
20e2f22a27 Merge pull request #1268 from itflow-org/develop
Develop to Master for 26.02.1 Maint Release
2026-02-14 15:54:13 -05:00
johnnyq
12b3775041 Update Changelog 2026-02-14 15:50:27 -05:00
johnnyq
52b509fdc5 Update Changelog 2026-02-14 15:49:40 -05:00
johnnyq
f9d0a8bf43 Ticket: Dont display Updated at if null, Move Subject from top ticket bar to header in ticket details, add additional comments about the client_permission_overide 2026-02-14 15:48:40 -05:00
johnnyq
2349ef33d1 Remove 0 in access_permission_query 2026-02-14 15:07:42 -05:00
johnnyq
ccaf15268c Add a 0 IN ticket_client_id for no client tickets so agents that are restricted to certain clients and still view no clients in tickets list by using a , also restrict change clients on tickets for restricted agents 2026-02-14 15:06:17 -05:00
johnnyq
616635f951 client edit modal: Restrict Access to client restricted agents 2026-02-14 13:17:15 -05:00
johnnyq
ce7daaf1cf ticket edit modal: Restrict Access to client restricted agents 2026-02-14 12:55:34 -05:00
johnnyq
fb9f5d986d ticket Details: Restrict Access to ticket details by restricted agents 2026-02-14 12:51:58 -05:00
johnnyq
3148906cfe ticket Details: Restrict Access to ticket details by restricted Agents 2026-02-14 12:30:49 -05:00
johnnyq
6c057f4fd0 Restrict Tickets presented in ticket listing to client restricted Agents 2026-02-14 12:16:22 -05:00
johnnyq
3014bba66d Update Changelog, Bump App Release 2026-02-14 12:01:49 -05:00
johnnyq
97958d5e22 Missing Generate Password js code in Create Credential modal 2026-02-13 14:43:34 -05:00
johnnyq
1a7452cc27 Restrict Agents that are restricted to view certain clients from calendar events. 2026-02-13 14:28:45 -05:00
johnnyq
34ba5d0570 Properly get the new ticket number for logging in ticket merge 2026-02-13 14:14:01 -05:00
johnnyq
c0fe9813dc Fix Ticket Merging regressed from ticket select now use ticket_id instead of ticket_number 2026-02-13 14:09:05 -05:00
johnnyq
fd29eb7c15 Fix Transfer Asset to client due to field change from asset_important to asset_favorite 2026-02-13 13:39:41 -05:00
johnnyq
1bee085b33 Add Report for Client Detail Time Auditing 2026-02-13 13:35:02 -05:00
johnnyq
1d06e6d9c8 Revert to old ajax-modal js code for now, Fix Assets not lising in create ticket. 2026-02-11 13:33:28 -05:00
wrongecho
bdf8038148 Merge pull request #1265 from MydsiIversen/Time-API
feat: Add API endpoint to retrieve time worked by technicians
2026-02-09 14:23:02 +00:00
Mads Iversen
62fb2c91a1 feat: Add API endpoint to retrieve time worked by technicians on tickets with filtering by date and technician. 2026-02-09 12:09:56 +00:00
Johnny
376285ef62 Merge pull request #1263 from itflow-org/develop
Develop to Master for 26.02 Release Take 2
2026-02-08 12:02:43 -05:00
johnnyq
d1eeba67fc Add bulk Fav / unfav creds and added fav creds to the client overview page 2026-02-07 18:42:53 -05:00
johnnyq
2ca8112daf Revert Git change test to ticket_email_parser.php 2026-02-06 15:14:37 -05:00
johnnyq
546f10bc82 Testing Git changes on ticket_email_parser.php 2026-02-06 15:13:54 -05:00
johnnyq
ec7f1d561d Fix Version 2026-02-06 13:12:34 -05:00
johnnyq
8d54bc3a2f Another change 2026-02-06 13:03:07 -05:00
johnnyq
1d8f77f799 Update Changelog for 26.2 Release 2026-02-06 13:01:37 -05:00
johnnyq
1c6795dd55 Bump app version 2026-02-06 12:09:32 -05:00
Johnny
4d895a56e4 Merge pull request #1261 from cs2000/develop
Add full Microsoft 365 and Google OAuth mail support
2026-02-05 14:04:22 -05:00
johnnyq
bdd56c91f7 Update Credential Important to Favorite 2026-02-05 12:24:21 -05:00
johnnyq
be172b5bd9 Add star-toggle class to add asset 2026-02-05 12:15:41 -05:00
johnnyq
d224d71f59 Bump Datatables from 2.3.4 to 2.3.7 2026-02-05 11:50:33 -05:00
johnnyq
065630b975 Bump PHPMailer from 7.0.1 to 7.0.2 2026-02-05 11:46:28 -05:00
johnnyq
decea604ab Bump TinyMCE 8.2.2 to 8.3.2 2026-02-05 11:38:22 -05:00
johnnyq
004b3b2bdc Draft of ticket_by_client report v2 not yet in the side menu of reports 2026-02-05 11:31:40 -05:00
cs2000
dca0cc34e9 Revert to original file from dev branch
Accidentally comitted an older file.
2026-02-05 16:08:04 +00:00
cs2000
9afb165fc4 SonarCube Suggestion
Remove duplicates of https://login.microsoftonline.com/ and make them use a constant.
2026-02-05 10:26:51 +00:00
cs2000
6a6eb4a714 SonarCube Suggestion
Define a constant "MICROSOFT_OAUTH_BASE_URL" instead of duplicating "https://login.microsoftonline.com/" multiple times in the same file.
2026-02-05 10:22:06 +00:00
cs2000
629f4e0c81 SonarCube Suggestion
Defined a constant $settings_mail_path at the top of the file instead of duplicating "/admin/settings_mail.php" in the code multiple times.
2026-02-05 10:19:13 +00:00
cs2000
7cbe9bf7fc SonarCube Suggestion
Removed two instances of unecessary double parentheses.
2026-02-05 10:17:28 +00:00
cs2000
fc33312e79 SonarCube Suggestion
Rename multiple functions to conform to project naming rules (^[a-z][a-zA-Z0-9]*$). This is a non-functional refactor for style/CI compliance and consistency.
2026-02-05 10:15:52 +00:00
cs2000
563c0ea9c4 Changes for M365 oAuth using dev code
My bad, my changes were made previously using my installed version and not the latest changes in the dev branch, i have pulled the dev branch and merged my changes with the latest codebase.
2026-02-05 09:38:09 +00:00
cs2000
10d1a902d9 Changes for M365 oAuth now using latest dev code
My bad, my changes were made previously using my installed version and not the latest changes in the dev branch, i have pulled the dev branch and merged my changes with the latest codebase.
2026-02-05 09:37:22 +00:00
johnnyq
4079257739 Update UI/UX for Adding and editing roles, Permissions can be set upon role add nice blocker style radios buttons instead of select boxes 2026-02-04 13:12:24 -05:00
johnnyq
91aba13c0d Fix Empty col in client overview if no fabvorite assets, fix creds page rename var from important to favorite 2026-02-04 11:11:12 -05:00
cs2000
2cca4f2f0e Changes for M365 oAuth
- Added null-safe guard around folder path logging during message move failure to prevent property_exists() fatal when folder object is null.
2026-02-04 13:26:52 +00:00
cs2000
d2e8dc1439 Changes for M365 oAuth
- Fixed email queue gating for OAuth SMTP setups by treating configured config_smtp_provider as mail-enabled, even when config_smtp_host is blank.
- Restores queueing for public ticket reply emails (including “Public Comment & Email”) and related ticket notification paths.
2026-02-04 13:26:17 +00:00
cs2000
f3f9d0dd71 Changes for M365 oAuth
- Added OAuth token lifecycle helpers (expiry check, refresh, persistence).
- Updated SMTP XOAUTH2 send path to automatically refresh expired/missing access tokens for Microsoft/Google providers before sending queued mail.
2026-02-04 13:25:32 +00:00
cs2000
f6845a046f Changes for M365 oAuth
- New callback endpoint to complete Microsoft OAuth web flow.
- Validates admin session + OAuth state, exchanges authorization code for tokens, stores refresh/access tokens and expiry, and redirects with success/error feedback.
2026-02-04 13:24:50 +00:00
cs2000
a50a4f274f Changes for M365 oAuth
- Added handler to start Microsoft OAuth Authorization Code flow (oauth_connect_microsoft_mail) with state generation/validation prep.
- Added handler to test OAuth token refresh from admin UI and persist refreshed tokens/expiry.
- Updated IMAP test handler to support OAuth token refresh + XOAUTH2 authentication (in addition to legacy LOGIN).
2026-02-04 13:23:53 +00:00
cs2000
6b6d847756 Changes for M365 oAuth
- Added web-based Microsoft OAuth onboarding UI in Mail settings, including a Connect Microsoft 365 button and auto-generated callback URI display.
- Added Test OAuth Token Refresh UI section.
- Updated visibility logic so Test Email Sending and Test IMAP Connection show correctly for OAuth-based configs (not only host/password configs).
2026-02-04 13:23:03 +00:00
johnnyq
65d1f59e9b Feature: Favorites added to assets, Bulk Fav/unfav, adds favs to client overview 2026-02-03 22:23:20 -05:00
johnnyq
f39e6ccbc9 Remove old ticket merge code, rename kanban_v2 to to just kanban 2026-02-03 17:20:19 -05:00
johnnyq
747b62d78c Remove extra double quote 2026-02-03 17:09:07 -05:00
johnnyq
af0f3ac25f Update ticket Merge bulk with a dropdown select box to select a ticket instead of entering a number manually 2026-02-03 16:35:20 -05:00
johnnyq
6aefe99c2f Update ticket Merge with a dropdown select box to select a ticket instead of entering a number manually 2026-02-03 16:08:33 -05:00
johnnyq
61c5595a68 Fix Get type on add asset 2026-02-02 16:05:38 -05:00
johnnyq
3d11611699 Attempt to Fix duplicate data entries by fast clicking submit in modals using ajax_modal.js include 2026-01-31 15:14:01 -05:00
johnnyq
38b4ed4b96 Tidy check_login for client portal 2026-01-30 14:24:34 -05:00
johnnyq
34308a5f9a check if archived and active for client login as well along with loading extended client user session vars in /client/includes/check_login.php 2026-01-30 14:10:59 -05:00
johnnyq
118cc10804 During load user session check if user is archived and active, prevents users from making further actions if they are disabled or archived but are still logged in 2026-01-30 13:36:18 -05:00
johnnyq
ae3386f2d5 Fix Vendor phone formatting in Ticket details 2026-01-29 16:36:10 -05:00
johnnyq
bf1ccc62f5 Fix Collected Tax Report, was not adding totals OCT-Dec was misaligned and Grand Total wasnt displaying 2026-01-29 14:02:50 -05:00
johnnyq
1ce4dd932e Updated PL report - changed Gross Profit to Gross Revenue as is more accurate for taxation 2026-01-29 13:55:09 -05:00
johnnyq
ff0bb49926 Tidy up Ticket to Invoice Description 2026-01-29 13:13:24 -05:00
johnnyq
018642cbb8 Fix Ticket View / filtering 2026-01-28 23:33:12 -05:00
johnnyq
bf1d0655c4 Update Ticket list ui smaller badge for ticket and smaller task progress bar and more natural dates 2026-01-28 22:52:56 -05:00
johnnyq
874b07f4d7 More UI/UX updated to ticket details shrink padding on right cards, update wordings, changed header paddings, made unassigned a clickable badge no longer red, swapped trash cans for times icons, much cleaner overall 2026-01-28 22:06:50 -05:00
johnnyq
19fa210743 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2026-01-28 18:16:54 -05:00
johnnyq
c8a6513d1c Fix new times on new date time displays in ticket details 2026-01-28 18:16:38 -05:00
wrongecho
01288c8452 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2026-01-28 23:10:54 +00:00
johnnyq
a60d3bb3a0 More Ticket Details UI/UX Sprucing better label naming etc 2026-01-28 17:41:14 -05:00
johnnyq
0470159c55 Added function formatDuration to format times like worked etc, updated Time worked in Ticket details to use the new function and some other minor ui/ux cleanups in ticket details 2026-01-28 16:08:39 -05:00
wrongecho
e1a93035fd Undo client scoping uses = instead of LIKE in tickets resolve.php --- see forum thread 2667 2026-01-28 14:57:28 +00:00
wrongecho
c0b7a26905 API bugfixes before release:
- apiEncryptLoginEntry should be apiEncryptCredentialEntry
- Client scoping uses = instead of LIKE in tickets resolve.php
2026-01-28 14:48:41 +00:00
johnnyq
704d770ec2 Fix Icon to Chevron down if Expand all folders is clicked 2026-01-27 16:32:17 -05:00
johnnyq
d42d2d99b1 Remember folders expanded by Passing folders_expanded var in breadcrumb links and search in files 2026-01-27 16:27:04 -05:00
johnnyq
ebfcc15927 Feature: File Folders are collapsed by default with a global option to exapand all folders or expand individual folder by click 2026-01-27 16:15:18 -05:00
johnnyq
4693aa3c93 Render root in display_folders function in files instead of it being seperate 2026-01-27 15:25:20 -05:00
wrongecho
07df657848 Bugfix: newline char showing in parsed emails 2026-01-27 17:25:53 +00:00
wrongecho
ef9436a1fb Bugfix: Ticket edit modal not setting assigned agent 2026-01-27 12:32:41 +00:00
johnnyq
9318f42ce0 Remove Folder option in edit document modal as this is reserved for move to folder modal 2026-01-24 01:37:00 -05:00
johnnyq
85c37d78a8 Do not update document_updated_at field if document is moved, toggle visibity, renamed, archived or restored same with bulk 2026-01-24 01:27:50 -05:00
johnnyq
ff02ab0cea Show Document Updated at instead of created at. This fixes where it should show the initial document creation date instead of the most updated date, also renamed uploaded column to updated 2026-01-23 13:06:06 -05:00
johnnyq
bd8bf026f0 Allow svg email attachemment for mail parser 2026-01-23 11:24:26 -05:00
johnnyq
644dc95380 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2026-01-21 12:40:43 -05:00
johnnyq
f4935efed3 Remove deprecated quick adds to the client overview 2026-01-21 12:40:30 -05:00
wrongecho
1712d34846 Kanban - move to v2 (rewritten style) 2026-01-21 13:15:23 +00:00
johnnyq
f0f1134be6 Fix phone number formatting is both asset details page and modal 2026-01-19 17:26:40 -05:00
johnnyq
e0f7460e08 If not client_id then do not include &client_id= in ticket uris as this would cause ticket viewing to break if client_id is 0. 2026-01-19 17:01:38 -05:00
johnnyq
ae1d71dcd7 append client_id to the uri for agent ticket links so that the when clicked will take them to the client section and show client header along with the bread crumbs link of client tickets 2026-01-19 16:24:31 -05:00
johnnyq
3cfe38c948 updated UI for contact details so menu is on the left instead of top. Also load the first tab based off the count 2026-01-17 17:35:05 -05:00
johnnyq
c1f0b63101 Fix login not passing master key if agent is client and agent and if MFA is enabled 2026-01-17 17:07:22 -05:00
johnnyq
0a658d7cab Fix Document Update API 2026-01-17 13:17:17 -05:00
johnnyq
3ed2582a9b Remove TaxID from packing slip 2026-01-15 14:09:03 -05:00
johnnyq
2ea68776f6 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2026-01-15 13:13:25 -05:00
johnnyq
c1ff22298f Remove xcustom from .gitignore as its been superceded by custom 2026-01-15 13:13:15 -05:00
wrongecho
e94d2f93ea Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2026-01-15 17:35:35 +00:00
wrongecho
e7f6f8a4c7 Mail Parser - NDR Parsing 2026-01-15 17:35:13 +00:00
johnnyq
4ffe75683b Merge branch 'develop' of github.com:itflow-org/itflow into develop 2026-01-15 12:28:34 -05:00
johnnyq
687920743d Fix user_id not being set in audit logs for agent and client logins, also fix issie where user_id wasnt being set in client portal. 2026-01-15 12:28:20 -05:00
wrongecho
1a93149643 Basic asset history tracking (transfers) - See https://tasks.dev.itflow.org/task_details.php?task_id=19 2026-01-15 14:58:23 +00:00
wrongecho
11d6654763 Basic asset history tracking - See https://tasks.dev.itflow.org/task_details.php?task_id=19 2026-01-15 14:49:41 +00:00
wrongecho
512d65c17a Keep asset PO/ref when copying 2026-01-15 14:22:22 +00:00
wrongecho
5a274061f3 Invoice - add a basic picking/packaging slip 2026-01-15 13:58:53 +00:00
wrongecho
a398ac7a8d Mail Parser - Support flowed text 2026-01-15 11:54:37 +00:00
wrongecho
41df4c4b9f API Keys - Revoke then Delete 2026-01-15 11:37:17 +00:00
wrongecho
7e7909cec1 Mail Parser - Do not automatically send new ticket notifications to noreply/donotreply addresses 2026-01-15 10:38:25 +00:00
wrongecho
7322bd66df Invoices - Show agent names in history 2026-01-15 10:19:56 +00:00
wrongecho
39affa5528 Show trips on main nav for everyone if accounting enabled 2026-01-15 10:04:48 +00:00
wrongecho
374111c88d Add digiBandit as sponsor 2026-01-15 09:28:52 +00:00
wrongecho
72fc0015bf Add digiBandit as sponsor 2026-01-15 09:28:03 +00:00
johnnyq
7ab406b3f5 Convert mysqli_fetch_assoc to mysqli_fetch_row in setup for table import 2026-01-14 18:02:11 -05:00
johnnyq
df280cd574 Fix missing isset in view in tickets.php 2026-01-14 17:36:06 -05:00
johnnyq
0a30300bde replace all instances of mysqli_fetch_array with mysqli_fetch_assoc for better performance and memory usage 2026-01-14 17:30:23 -05:00
johnnyq
cb8b99d6ae up the permissions to added edit Payment 2026-01-12 18:12:20 -05:00
johnnyq
1d3f29d385 added edit Payment 2026-01-12 18:11:41 -05:00
johnnyq
c154113474 Do not add Signature on ticket comment if Public only when reply is emailed 2026-01-12 15:18:22 -05:00
johnnyq
e02a6fc5e6 Use mysqli_fetch_assoc in login 2026-01-12 12:30:12 -05:00
johnnyq
78040573d1 Fix Remove Powered by ITFlow on Login Screen when WhiteLabel is enabled 2026-01-12 12:27:44 -05:00
wrongecho
981f9ace04 TinyMCE - add all options to mobile (we may regret this) 2026-01-12 16:12:06 +00:00
wrongecho
208f7ac8f0 Tickets Kanban
- Keep the selected view (kanban/list) when applying other filters
- Allow filtering tickets by project (main and kanban v2)
2026-01-12 16:11:36 +00:00
wrongecho
661f8db10b Tickets Kanban
- Keep the selected view (kanban/list) when applying other filters
- Allow filtering tickets by project (main and kanban v2)
2026-01-12 16:04:02 +00:00
wrongecho
b48168ffec Rewrite kanban in more procedural code to match existing codebase (as a v2, delete old and rename once we're happy) 2026-01-12 15:36:06 +00:00
wrongecho
908ebb46d9 Merge pull request #1258 from itflow-org/ticket-task-approvals
Ticket task approvals
2026-01-12 12:27:24 +00:00
wrongecho
58bcb38617 Add task approval system (tidy) 2026-01-12 12:21:10 +00:00
johnnyq
1de023f9df Fix Role Archiving, Roles can only be archived if no users are assigned to the role 2026-01-11 16:46:53 -05:00
johnnyq
5815ef2f75 Added bulk delete, archive and restore and invidual file/document restore functions to files 2026-01-10 20:38:04 -05:00
johnnyq
e5dab8b1ca Update files to use mysqli_fetch_assoc for better performance and memory optimization. Add title for List View and Grid View 2026-01-10 19:12:22 -05:00
johnnyq
56c4b7fbe6 Add show archived logic to files 2026-01-10 19:03:28 -05:00
johnnyq
365b65e5b2 fix Bulk Delete Documents and Files 2026-01-10 16:27:12 -05:00
johnnyq
2193cd8d3e switched from mysqli_fetch_array to mysqli_fetch_assoc in client modals 2026-01-10 16:09:03 -05:00
johnnyq
8b221bc055 switched from mysqli_fetch_array to mysqli_fetch_assoc in clients listing page. This will have a major query speed and memory optimization impact 2026-01-10 15:54:19 -05:00
wrongecho
77e4d2b566 Add task approval system 2026-01-09 17:14:44 +00:00
wrongecho
88a29b7599 Bugfix: Mail queue loop not sending invoices to all billing contacts 2026-01-09 16:56:11 +00:00
wrongecho
64525750b6 Fix readme demo creds 2026-01-09 13:56:29 +00:00
wrongecho
30499123f1 Bugfix: Portal not showing contact user id in session 2026-01-09 13:50:46 +00:00
johnnyq
79703042ff Update client table responsiveness viewpoint to fix issue when window is a certain width on the desktop 2025-12-30 16:58:44 -05:00
johnnyq
ccd5605d97 Remove unused code 2025-12-29 18:03:53 -05:00
johnnyq
908277065b Fix Ticket Template auto filling for v1 ticket creation 2025-12-29 17:47:24 -05:00
johnnyq
f2d4eb0486 Fix Ticket Template auto filling 2025-12-29 17:46:23 -05:00
johnnyq
f784b659e8 Remove extra agent client wording 2025-12-20 15:05:47 -05:00
johnnyq
e60a7a59f9 Fix Login flow where user agent and client exists and agent has MFA but will not let them continue, also update some wording and button colors. Also dont show email password fields again after success and login as agent and client is shown. 2025-12-20 14:30:57 -05:00
johnnyq
cab81ca170 Fix Billable sort 2025-12-18 20:39:47 -05:00
johnnyq
a82e2c7ea1 Billable and non billable status use icons check and minus 2025-12-18 20:38:15 -05:00
johnnyq
a277380441 Set API key back to 32 Chars 2025-12-18 20:03:33 -05:00
johnnyq
ad5710b1d8 Fix Invoice CSV Exporting 2025-12-18 20:00:56 -05:00
johnnyq
3e3531a6ce Set API Key to 32 Chars 2025-12-18 14:28:24 -05:00
johnnyq
a79ce23ae5 Fix randomString() to generate cryptographically secure URL-safe tokens, reduced url keys to 32 Characters for performance and easy copy and paste and compatibility while still mainitaining ubreakable cryptographic keys 2025-12-18 14:24:53 -05:00
Johnny
163aa3062e Merge pull request #1254 from itflow-org/develop
Develop to Master for 25.12.1 Maint Release
2025-12-14 14:03:56 -05:00
johnnyq
32f996d034 If login key is set and it is not provided show Client Email instead of just Email for placeholder 2025-12-14 13:42:38 -05:00
johnnyq
312eb4dffc Allow use of login key only for agents 2025-12-14 13:16:54 -05:00
johnnyq
1916456c84 Fix White Label not displaying on the login page 2025-12-14 13:04:53 -05:00
johnnyq
9b8d37b577 Updated changelog 2025-12-13 15:47:28 -05:00
johnnyq
05018e5f17 Added Reset favicon 2025-12-13 15:45:02 -05:00
johnnyq
72ef918452 Update changelog and bump app version to 25.12.1 2025-12-12 16:51:34 -05:00
johnnyq
27fde82aff Fixed Adding Payment provider not adding an account, now adding you can customize the income/expense account, expense category, and Expense vendor. Moved Saved Payment Provider Methods into Payment Providers as a link instead of on the admin side nav. Same with AI Provider and AI Models. 2025-12-12 16:42:09 -05:00
johnnyq
b27ffe6635 Refine DB Helpers 2025-12-10 18:32:46 -05:00
johnnyq
84cc4a094a Add DB helpers to make MySQLi Prepared statements less bloated and require less code 2025-12-10 17:09:34 -05:00
johnnyq
e75600ee05 Fix New ticket button in contact details in the related tickets section 2025-12-10 13:18:41 -05:00
johnnyq
871ad2ea7e Update legacy client login links to use the new unified login method 2025-12-10 12:21:12 -05:00
wrongecho
8b5f2e0f3f Update + credit 2025-12-10 08:54:24 +00:00
johnnyq
58d6ab7342 Unify Agent and Client login, if same user exists as a client and an agent then offer a selection of client portal or agent portal 2025-12-09 13:39:16 -05:00
Johnny
03570ecd04 Merge pull request #1250 from itflow-org/develop
Develop to Master for 25.12 release
2025-12-06 14:36:09 -05:00
johnnyq
ca5fb2e010 refined php-xml ext notice 2025-12-06 13:46:09 -05:00
johnnyq
da561b296e Added php-xml as a requirement 2025-12-06 13:38:40 -05:00
johnnyq
523da0dea0 Added a few more things to the changelog 2025-12-06 12:35:20 -05:00
johnnyq
0e4cc76a84 Bump Version for 25.12 updated changelog 2025-12-06 12:18:11 -05:00
johnnyq
7e39a7ed89 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-12-05 12:46:52 -05:00
johnnyq
4a26ea7ed9 Hide Permission Modules on sidenav admin menu as this is not ready for custom modules 2025-12-05 12:46:44 -05:00
wrongecho
7c83ba15b9 Mail queue - minor comment syntax error 2025-12-03 15:43:55 +00:00
wrongecho
10bfbed4bb Mail queue - introduce a --no-mx-validation flag to bypass recipient domain MX validation 2025-12-03 15:30:26 +00:00
wrongecho
81550bd7a8 Ticket merge input - strip text 2025-12-03 15:13:52 +00:00
johnnyq
a430bb917e Add CSV Escaping to the Sample Export CSV Files 2025-12-02 15:18:20 -05:00
johnnyq
e1a579387f Convert all Import / Export Modals to Ajax and a few other lingering modals that were not converted yet 2025-12-02 15:04:05 -05:00
johnnyq
fe8df66c67 Migrate Import/export clients to ajax-modals 2025-12-01 20:33:01 -05:00
johnnyq
5bb410f80c Converted all Document Link Modals to the new ajax-modal, also switched trash icons for unlink icons in document details 2025-12-01 17:16:59 -05:00
johnnyq
29b79b9d4e Bump TinyMCE from 8.2.0 to 8.2.2 2025-11-28 17:37:38 -05:00
johnnyq
0f8a8d1464 Bump TCPDF from 6.10.0 to 6.10.1 2025-11-28 17:34:16 -05:00
johnnyq
cc92a4b7ee Bump stripe-php from 18.1.0 to 19.0.0 2025-11-28 17:31:04 -05:00
johnnyq
3ffef6df51 Remove library phpMimeParser as its no longer needed and php-imap webklex is not doing this function 2025-11-28 17:27:05 -05:00
johnnyq
78e4787b99 Bump PHPMailer from 7.0.0 to 7.0.1 2025-11-28 17:24:12 -05:00
johnnyq
540512a156 remove folder location vars as no longer needed as files and documents have been merged 2025-11-28 15:26:26 -05:00
johnnyq
7737dbc65d Migrate Invoice to Recurring Invoice to an ajax modal 2025-11-28 15:15:01 -05:00
johnnyq
faa94d888d Convert Quote to Invoice to use ajax-modal 2025-11-28 14:44:47 -05:00
johnnyq
99e2487d2b Fix dupe race condition with ticket, invoice, quote, project, recurring ticket numbering when being created in parallel Atomically update and get the next ticket number in one SQL query everywhere. 2025-11-28 14:14:46 -05:00
johnnyq
f09d8ffe05 Fix dupe ticket numbering when being created in parallel Atomically update and get the next ticket number in one SQL query. 2025-11-28 13:07:56 -05:00
johnnyq
c486e3fe62 Conver the what should be the last bulk asset interfaces modals to the new ajax 2025-11-27 14:13:33 -05:00
johnnyq
ba2d6b6709 Convert Bulk Edit Product Category modal to ajax 2025-11-27 13:41:53 -05:00
johnnyq
a388a279bc Convert Bulk Edit Product Category modal to ajax 2025-11-27 13:40:09 -05:00
johnnyq
5a64b19a06 Convert Document from Template modal to ajax 2025-11-27 13:17:14 -05:00
johnnyq
53178b8d20 Updated bulk action js to pass the checkboxe names into the get array this allows the use of multiple checkbox name arrays to be passed at once instead of just selected_ids had to update each bulk model from selected_ids to to the array that was passed. This was important so we could mix files and documents together 2025-11-27 12:48:59 -05:00
wrongecho
0347382a34 Invoices - Allow specifying discount during creation 2025-11-27 09:53:35 +00:00
johnnyq
840460afe7 Update Bulk Action JS to accept and pass multiple custom name selector arrays but default to selected_ids if data-bulk-names is not specified 2025-11-26 16:12:19 -05:00
johnnyq
c851e54e1d Fix Decimal not showing on the iphone for specific fields associated to price cost percentage etc 2025-11-26 13:54:24 -05:00
johnnyq
5ef53b569c Create upload folders for recurring tickets and ticket_templates 2025-11-24 13:09:01 -05:00
johnnyq
698b4166e8 Add back deleted client edit in post 2025-11-24 11:27:01 -05:00
johnnyq
1a9a36829b Process base64 Images for document creation and editing for the API and Client Portal 2025-11-24 00:14:27 -05:00
johnnyq
155b8598ff Introduce cleanupUnusedImages function to delete referenced files that have been deleted when editing content which as been added to document template edit. Did not do this for documents as they are versioned and images will remain until the document is fully deleted 2025-11-23 15:36:11 -05:00
johnnyq
4153c91f84 Add function copyDirectory so when creating a document from a template copy the document_template folder to documents folder and update links 2025-11-23 15:26:29 -05:00
johnnyq
a99b19a1b5 Update add and edit Document template to extract base64 images and place them into files instead also delete the document_template/document_template_id folder when deleting a document template 2025-11-23 15:09:03 -05:00
johnnyq
18429fda2c Remove all side nav Quick adds 2025-11-23 14:53:39 -05:00
johnnyq
435da991ec Add custom folder to uploads for custom uploading for custom modules 2025-11-23 14:32:57 -05:00
johnnyq
ebd9aae924 Add Document Templates to uploads dir 2025-11-23 14:30:50 -05:00
johnnyq
414a84d5ec Focus on Author and Date values 2025-11-23 14:24:20 -05:00
johnnyq
a3b2517603 Fix up UI on document details header 2025-11-23 14:10:45 -05:00
johnnyq
43535082f6 Cleanup UI for document details title header 2025-11-23 14:02:01 -05:00
johnnyq
e73af9980e Also Delete Documents/Document_id folder during bulk delete 2025-11-23 13:43:12 -05:00
johnnyq
0bdd5784ee use saveBase64Image function for edit document as well and when document is deleted, delete the corresponding folder uploads/documents/document_id 2025-11-23 13:35:45 -05:00
johnnyq
48719ce29c Add Exclude uploads/documents to gitignore 2025-11-23 13:05:56 -05:00
johnnyq
29839d3b23 Implemented saveBase64Images() to convert base64 <img> tags into real files stored under /uploads/<module>/<id>/ with secure filenames. Added wrapper functions and updated document creation to use processed image paths. 2025-11-23 13:03:03 -05:00
johnnyq
185ea7d6ac Fix 'Email from at' On tickets that come from emails, was cuasing dup html head body tags causing htmlPurifier to strip it in ticket viewing, so we removed html body and head tags also remove orginal reply on reply ticket emails this removed ##- Please type your reply above this line -## and anything after it. Also removed the custom CSS that was embedded for all email sent out from ITFlow 2025-11-22 17:40:44 -05:00
johnnyq
ac7623d4f5 Update Add Client to use prepared statments 2025-11-21 20:53:04 -05:00
johnnyq
3d119261cc Add cleanInput function without mysqli_escape_string and converted add and edit payment method to Procedural mysqli Prepared Statments 2025-11-21 19:54:50 -05:00
wrongecho
169619c9b9 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-11-18 13:08:17 +00:00
wrongecho
b991f787a2 Introduce subject-based automatic ticket merging/reply detection where e-mail is sent from a known contact or domain and the subject is a 95% match for a ticket opened in the last 7 days for that client 2025-11-18 13:08:02 +00:00
johnnyq
215fc6803e Fix Bulk Ticket Merging due to missing modal footer 2025-11-17 15:27:23 -05:00
johnnyq
a79c1c8246 Remove Duplicate get_query_strings code as this is all handled in the the filter header 2025-11-17 14:55:05 -05:00
johnnyq
1aa6419b1b Fix Broken Updating asset noted in asset details modal 2025-11-17 13:51:19 -05:00
Johnny
c7ef3627ce Merge pull request #1247 from itflow-org/develop
Merge Develop into Master for v25.11.1 release
2025-11-17 12:22:24 -05:00
johnnyq
02694f6720 Fix Broken Links in Email to Agent via Client Portal Ticket Update, update changelog 2025-11-17 12:10:10 -05:00
johnnyq
f50aabb570 Update Changelog 2025-11-17 11:59:43 -05:00
johnnyq
19b8d09bfd Update Ticket Detail card to use the adminlte's Card Collapse 2025-11-17 11:55:03 -05:00
johnnyq
66fb999a8c Update Test IMAP to use a Raw connection instead of depending on the Deprecated php-imap extension 2025-11-17 11:29:05 -05:00
johnnyq
0c5883b61b Use btn-tool for side references in Ticket details and some cleanup 2025-11-16 20:56:30 -05:00
johnnyq
ef66d5172c Move Ticket edit from top Right Menu to Ticket Details Section 2025-11-16 20:27:58 -05:00
johnnyq
118f9a34d8 Update Changelog 2025-11-16 20:02:26 -05:00
johnnyq
b61dfac569 Ticket Details Checks, Dont display Add/edit relations if no cliet in selected, dont show relations in ticket edit if no client assigned to ticket, also dont display public and email response type if no contact_email exists 2025-11-16 19:56:59 -05:00
johnnyq
79160f9b5c Dont show Client Tickets in Ticket Details Breadcrumbs if not client is assigned a ticket 2025-11-16 19:35:42 -05:00
johnnyq
d2523cff4a Add Tag Displays in edit and listing, remove unused type column 2025-11-16 18:41:30 -05:00
johnnyq
1839599769 Added Tag Type Filter Nav to tags 2025-11-16 18:21:01 -05:00
johnnyq
29e1b56e78 Hide contract side nav as its not yet complete 2025-11-16 17:58:07 -05:00
johnnyq
47e647c712 Update Changelog and bunp App Version 2025-11-16 17:55:13 -05:00
johnnyq
a87b0b0447 Fix regression in dashboard has client 2025-11-16 17:40:06 -05:00
johnnyq
96b8fcad3a Fix Pay With a Saved Card in Invoice Listing if Saved Cards are on files for that client 2025-11-16 17:34:37 -05:00
johnnyq
cf0fa0024c Update Wording on delete provider 2025-11-16 17:16:46 -05:00
johnnyq
aba5ed9271 Add Back Delete Payment Provider, the db will cascade delete all related recurring payments, related saved cards and client payment provider relation 2025-11-16 17:12:02 -05:00
johnnyq
63141f3578 Composer updates 2025-11-16 16:00:57 -05:00
johnnyq
612041635d Updated symfony/http-foundation from 7.3.3 to 7.3.7 2025-11-16 15:49:11 -05:00
johnnyq
efcc0fd5cb Add Where clause to only accept saved payment by logged in session_client_id in Client Portal 2025-11-16 15:33:45 -05:00
johnnyq
b0724f5b66 Add TOTP Secret to Export / Offboard Client Documentation PDF 2025-11-15 19:17:03 -05:00
johnnyq
66a2b4b6d2 Afer Ticket Merge Redirect to new ticket Details 2025-11-15 17:09:46 -05:00
johnnyq
77b4dfa50a Add UserID: on hover in users 2025-11-15 16:59:39 -05:00
johnnyq
1e6e7fd6d8 If ticket doesn't have a client dont show client section 2025-11-15 16:51:31 -05:00
johnnyq
46a1b673ba Fix Add Ticket Watcher 2025-11-13 00:01:35 -05:00
johnnyq
7230325e62 Migrate Ticket Template add to ajax-modal, add category type option if not defined, add product type if not defined 2025-11-12 17:04:53 -05:00
johnnyq
af8e733cfb Added Quick Add Links to the majority of Side bars navs 2025-11-12 16:27:03 -05:00
johnnyq
26ab43c57f Fix Mail Queue link when sending a test email, updated the quote send email wording to Quote sent 2025-11-12 14:50:05 -05:00
johnnyq
15ed4ef1ce Fix unable to delete Vendor Templates 2025-11-12 14:35:06 -05:00
johnnyq
0ac76766bd Add Asset Tags Display in Contact Details, asset details, along with their detail modals 2025-11-11 21:05:59 -05:00
johnnyq
abb97ad99f [Feature] Added Asset Tags 2025-11-11 19:57:51 -05:00
johnnyq
6cdc26b55b Fix broken edit payment methods due to missing hidden field 2025-11-09 12:24:04 -05:00
Johnny
d1dcc5fb7e Merge pull request #1246 from itflow-org/develop
Develop to Master for Release
2025-11-08 13:47:43 -05:00
johnnyq
9f19fd3c75 Fix Folder in Document API End point 2025-11-08 13:10:35 -05:00
johnnyq
61dedb7e7b Removed old Cron Files from /scripts/ removed old sendmail function along with PHPMailer requirments in functions.php, removed debug php ext check for php-mime-mail-parser and php-imap 2025-11-08 12:56:16 -05:00
johnnyq
65d2b8b2cb UJpdate App Version and Changelog for release 2025-11-08 12:44:58 -05:00
johnnyq
1d3f206660 Addec Contract Templates Listing add modal and add post code 2025-11-07 17:55:19 -05:00
johnnyq
ab46899e72 [FEATURE] Client Contracts, initial DB Schema, rates and net terms along with SLA Reponse / Resolution times will eventually be moved over to this 2025-11-07 16:49:35 -05:00
johnnyq
723a423b06 After ticket Creation Redirect to ticket details with Client Side bar and Top bar, Remove Currency code from Client Add / Edit defaults to company currency for now 2025-11-07 14:27:22 -05:00
johnnyq
a837b97870 Migrated the last of the bulk modals to the new ajax-modal 2025-11-06 22:49:44 -05:00
johnnyq
8be0789f25 Converted even more bulk modals to the new ajax-modal 2025-11-06 20:36:30 -05:00
wrongecho
99d017144d Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-11-06 16:58:35 +00:00
wrongecho
891f71006b Mail queue - Recipient domain MX validation before sending 2025-11-06 16:58:18 +00:00
wrongecho
d25017216a substr to conform to db columns for logs 2025-11-06 16:57:14 +00:00
wrongecho
83b7c7b054 substr to conform to db columns 2025-11-06 16:49:14 +00:00
wrongecho
283c2a17df sanitize after substr 2025-11-06 16:44:34 +00:00
johnnyq
44de049f3b Remove image optimization on upload for now as this will later be added a cron task 2025-11-06 11:44:22 -05:00
wrongecho
920d08f039 Note 2025-11-06 16:27:46 +00:00
johnnyq
0cf1e338c2 Added data-bulk to the ajax modal to allow for bulk GET collection of selected ids that have a class of bulk-select, converted expense and client bulk modals to use the the new ajax-modal 2025-11-06 11:26:08 -05:00
wrongecho
293a2b800e Merge pull request #1244 from Flos/fix-timer-sleeping-chrome-tab-and-initialise-on-reload
Fix ticket timer, to initialise on reload and after tab sleeping
2025-11-06 16:18:46 +00:00
wrongecho
650a099e19 Contacts API - Prevent more than 1 primary contact being set per client 2025-11-06 16:00:21 +00:00
wrongecho
46c2c8616e Clients API - Add - abbreviation support 2025-11-06 15:35:43 +00:00
wrongecho
6295a5c878 Clients API - Update endpoint 2025-11-06 15:34:19 +00:00
wrongecho
39d8e19e16 Clients API - Archiving & Un-archiving 2025-11-06 15:21:45 +00:00
wrongecho
9d3a44d110 Contacts API - Archiving & Un-archiving 2025-11-06 15:10:25 +00:00
wrongecho
54d46719c2 Certificates API - Create endpoint 2025-11-06 14:46:08 +00:00
wrongecho
dbed2c17db Certificates - Bugfix missing js to fetch details 2025-11-06 14:44:24 +00:00
wrongecho
f772ef2efd Certificates - Better empty date handling in agent ui 2025-11-06 14:44:03 +00:00
wrongecho
2f28f96f8d Log the API endpoint/URL path for API auth failures to assist with debugging 2025-11-06 14:43:32 +00:00
wrongecho
1f2bcf7c34 Domains - show a dash instead of blank where there is no expiry 2025-11-06 12:29:07 +00:00
wrongecho
a9a5850fd4 Domains - only show time to expire when there is an expiry date set (otherwise it shows epoch 56 years ago) 2025-11-06 12:19:28 +00:00
wrongecho
09f3bfd8f4 When fetching domain records, quit if no SOA record exists (prevents most sub-domains) 2025-11-06 11:57:08 +00:00
wrongecho
3813fbf8f2 When adding a domain, flag if no SOA record exists (prevents most sub-domains) 2025-11-06 10:41:52 +00:00
wrongecho
16001f8d4e When adding a contact, flag duplicate or invalid e-mail addresses 2025-11-05 22:22:28 +00:00
wrongecho
49d3dbad9a Fix client delete 2025-11-05 10:24:39 +00:00
johnnyq
56f32a4da2 Finished migrating the last of the admin add modals to ajax-modal 2025-11-05 01:54:49 -05:00
johnnyq
a297b8d6d8 Migrate many admin Add modals to the new ajax-modal 2025-11-05 01:39:22 -05:00
johnnyq
d365f48192 Minor ticket details sprucing little more padding on top ticket details and move subject to top with Ticket number 2025-11-04 19:25:07 -05:00
johnnyq
df6d955261 Migrate Schedule Ticket and Merge Ticket to ajax modal also spruce up Schedule Inteface and cleanup code 2025-11-04 18:37:43 -05:00
johnnyq
9fcaf9f5cc [Feature] Updated Invoice Ticket to include more details in the description, predefined along with optional Invoice Title, helper texts below qty and price to show how it gets its information, fixed ticket number not showing in ticket reply when adding ticket to an existing invoice. Add to Existing Invoice is default if open invoices exist, migrated many more ticket related modals to use ajax-modal 2025-11-04 17:48:21 -05:00
johnnyq
43a7b7faa5 [Feature] Allow searching quote via Global Search 2025-11-03 17:08:55 -05:00
johnnyq
69253385c5 Update Invoice, Quote, Recurring Invoice Hyperlinks to take you directly to the client view instead of keeping you in global view. We also did this with tickets in the previous commit 2025-11-03 16:29:41 -05:00
johnnyq
cea7d61481 Updated Bread crumbs in ticket, quote invoice to show All as the first breadcrumb 2025-11-03 15:43:56 -05:00
johnnyq
41f9a2e6e2 Migrated add revenue, trip, quote, invoice, recurring invoice, product, document, folder, file, project, and asset interface over to the new ajax-modal 2025-11-03 14:06:44 -05:00
johnnyq
31d3659098 Migrated product add to the new ajax-modal 2025-11-02 23:20:42 -05:00
johnnyq
c12bfb157e Migrate Add Ticket, Recurring Ticket, Project and Vendor to the new ajax-modal 2025-11-02 22:54:48 -05:00
johnnyq
a55dabb1cd Migrate credemtial, software, network, certificate, domain, service Add modals to the new ajax-modal 2025-11-02 19:39:34 -05:00
johnnyq
06fec3c280 Migrate add locaiton to new ajax-modal 2025-11-02 18:07:39 -05:00
johnnyq
f733a27ad7 Bump DataTable from 2.3.3 to 2.3.4, TinyMCE 8.0.2 to 8.2.0, Stripe-PHP 17.6.0 to 18.1.0, PHPMailer from 6.10.0 to 7.0.0, chartjs from 4.5.0 to 4.5.1 2025-11-02 16:44:59 -05:00
johnnyq
7ea39eb545 Fix non existent record in contact details, document details, document template, ticket template also add limit 1 2025-11-02 13:32:44 -05:00
johnnyq
a85f898ef5 Fix No records exist if client_id in the uri is non existent 2025-11-02 13:13:51 -05:00
johnnyq
519975f3cf Fix Include footer link in project details when no record exists 2025-11-02 12:49:24 -05:00
Johnny
0e9a071e96 Merge pull request #1245 from itflow-org/undefined-asset-handling
Better error handling for undefined/non-existent asset IDs
2025-11-02 12:42:25 -05:00
wrongecho
3917e66fd8 Better error handling for undefined/non-existent asset IDs 2025-11-02 17:17:37 +00:00
wrongecho
9f48e2d9f0 Better error handling for undefined/non-existent asset IDs 2025-11-02 17:14:01 +00:00
wrongecho
215eadcf2b Better error handling for undefined/non-existent asset IDs 2025-11-02 17:12:03 +00:00
Flos
b09e4938b7 Fix ticket timer, to initialise on reload and after tab sleeping
When the tab was reloaded, the timer was not initialized again.
When the tab was in background and the tab was sleeping, the timer showed the wrong time
2025-11-01 23:23:25 +01:00
johnnyq
d3d706ea68 Added ticket details to the search query in global search tickets 2025-11-01 16:28:23 -04:00
johnnyq
8268761ef4 Add Recurring Invoice Reference along with a link in Invoices 2025-11-01 16:17:11 -04:00
wrongecho
2850c35bdc Flag duplicate clients/leads when using the client_add modal 2025-11-01 18:48:23 +00:00
wrongecho
24d8635dac Invoice product autocomplete - search product code as well as name 2025-11-01 17:59:12 +00:00
johnnyq
8314a115bb Migrate Add Asset to the new ajax-modal 2025-10-30 19:05:37 -04:00
johnnyq
b8e2423dbd Mugrated Payment Modals from invoice folder to payment modal folder 2025-10-30 14:46:49 -04:00
johnnyq
52c67f4139 Remove unused budget code 2025-10-30 14:29:51 -04:00
johnnyq
e895156d03 Fix TinyMCE not working on bulk create tickets and sort Categories ASC and fix assign to 2025-10-30 14:06:09 -04:00
johnnyq
89abc18465 Migrated Contact Add to the ajax-modal 2025-10-30 13:58:10 -04:00
johnnyq
355dfbbb25 [Feature] Create Recurring Ticket - Add Asset Type Optgroups on asset selection along with make, model and assigned contact 2025-10-29 19:14:21 -04:00
johnnyq
6d15640ae4 [Feature] Recurring Ticket - Add Three Day and Biweekly to the Frequency options 2025-10-29 18:15:21 -04:00
johnnyq
ad4ab5a54c Fix in old add ticket 2025-10-29 17:50:37 -04:00
johnnyq
3c5c86c4c5 Fix Issue with user not showing up in add ticket and recurring ticket, Also fixed the sort from DESC to ASC in some areas with user select 2025-10-29 17:49:39 -04:00
johnnyq
09b91c8826 [Feature] Recurring Tickets - Add Category, Assigned Agent and Billable Status filters 2025-10-29 17:13:52 -04:00
johnnyq
13ea48bff8 Seperate out recurring expenses and expenses into their own post file 2025-10-29 16:21:56 -04:00
johnnyq
26bb430d6e Seperate out posts into payment, invoice and recurring invoice instead of them all being under invoice post file 2025-10-29 16:18:32 -04:00
johnnyq
82da54740f Moved recurring ticket posts to its own post file 2025-10-29 15:58:04 -04:00
johnnyq
e02b10d12a [Feature] Added Billable column in recurring ticket list view along with bulk actions to set priority, agent, billable status, category and next run date 2025-10-29 15:51:14 -04:00
johnnyq
1573045157 Sort recurring tickets by Next Run Date instead of subject, and Swap Client column with Netrun column so Client column is last and next run date is first 2025-10-29 12:25:02 -04:00
johnnyq
bf31c333a6 Migrate Add Client Modal to the new Ajax Modal 2025-10-28 16:56:27 -04:00
johnnyq
4229bca978 Major UI Work on Contact Details Modal Always Display common details at the top with the nav underneath. 2025-10-25 18:16:56 -04:00
johnnyq
13bd929755 Tidy up the contact details modal 2025-10-25 14:44:20 -04:00
johnnyq
7f6c0346af Add https:// prefix to vendor website field in vendor details modal 2025-10-25 13:09:25 -04:00
johnnyq
0387e66066 Added Sortable Task Count in Ticket Templates Listing view 2025-10-25 12:54:58 -04:00
johnnyq
04bae8dc37 Add Archive and Delete buttons to document details along with button titles to state what the button does, also added a from var to fix redirect behavior if deleting from document details go back to documents listing 2025-10-24 14:46:09 -04:00
johnnyq
559506fc90 Added Access Modules to view current modules and to allow custom modules for the future for use in custom code directories 2025-10-23 15:55:54 -04:00
johnnyq
f2b6d481a1 Feature: Add new date range picker to admin area mail queue audit log, app log 2025-10-23 13:30:22 -04:00
johnnyq
c66aa92365 Update All Side Nav Links to be absolute so the side bar includes can be navigatable when navs are included in custom code 2025-10-23 13:07:02 -04:00
johnnyq
e24ef68d8d Fix Deleting Recurring Ticket from asset details page due to missing CSRF Check token 2025-10-22 17:11:26 -04:00
johnnyq
0cacf83ae5 Fix Sending Email when Forcing a Recurring Invoice into an Invoice 2025-10-22 16:28:53 -04:00
johnnyq
2dc66b329b Fix Ajax Modal Link to referral category in Add Bulk Referral 2025-10-22 15:26:15 -04:00
johnnyq
10dc8ea2bf Wording update for client bulk modals 2025-10-22 14:53:43 -04:00
johnnyq
303f9174c9 Added Bulk Create Tickets for Clients 2025-10-22 14:50:50 -04:00
johnnyq
c5dd5f2b6f Add Clause to not collapse advanced filter on all time aka if date from is set to the default 1970-01-01 2025-10-20 18:16:39 -04:00
johnnyq
ab77705ca2 Feature: Replace old date range to Date Range Picker JS for better date from/to handling 2025-10-20 18:04:00 -04:00
johnnyq
10c89ebf73 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-10-16 11:43:37 -04:00
johnnyq
ecce994921 Used status var unstead of get status var for checkall 2025-10-16 11:43:26 -04:00
wrongecho
5dd4f5ea62 New mail parser:
- bugfix .eml not being generated
- include the message when notifying the tech of a reply
2025-10-16 16:32:37 +01:00
wrongecho
93bb5db019 typo 2025-10-15 21:56:21 +01:00
wrongecho
65ff008ccf Bugfix - Email not including ticket guest key 2025-10-15 15:36:07 +01:00
wrongecho
f0c48d23fe Add html code plugin + button to tinymceticket 2025-10-15 15:27:56 +01:00
wrongecho
975b52a43d Time tracking - show H/M/S placeholders if timer auto-start is disabled 2025-10-15 12:29:26 +01:00
wrongecho
079b0d5024 Asset import - allow importing notes 2025-10-15 10:32:16 +01:00
wrongecho
99ccb12b8c Allow importing TOTP credential info 2025-10-15 10:31:59 +01:00
wrongecho
0bb7d24e07 Allow importing TOTP credential info 2025-10-15 10:18:44 +01:00
wrongecho
b7a9f9ea38 When exporting credential info, include the TOTP secret 2025-10-15 10:12:14 +01:00
wrongecho
21aee98f9f Fix checkAll ticket box not showing when status wasn't set - should only be hidden for the closed view 2025-10-15 09:57:32 +01:00
wrongecho
9a5a4be64a When archiving a client, cancel recurring invoices 2025-10-15 09:20:08 +01:00
wrongecho
db7f8501d0 When archiving a client, cancel recurring invoices 2025-10-15 09:18:53 +01:00
johnnyq
61d15cbf9e Remove non existent seatch column recurring ticket prefix 2025-10-14 16:07:08 -04:00
johnnyq
39c9c695f1 Allow searching tickets with ticketprefix and number combo in Global search 2025-10-14 15:59:29 -04:00
johnnyq
d97654581b Add 30 Day wording to Expiring Domain and Certificates in dashboard 2025-10-12 13:34:27 -04:00
johnnyq
2ee70fd3a8 Update .htaccess 2025-10-09 19:23:48 -04:00
johnnyq
b336ec4188 Revert setup restore to a saner version 2025-10-09 19:14:31 -04:00
johnnyq
c77e1be1c3 Try to fix uploads 2025-10-09 19:00:02 -04:00
johnnyq
986f688468 another Attempt at restore 2025-10-09 18:49:54 -04:00
johnnyq
1d9429b762 Another attempt at restore 2025-10-09 18:27:35 -04:00
johnnyq
d122d90a47 Remove CSRF check 2025-10-09 18:11:16 -04:00
johnnyq
2c534d4d20 Attempt to fix uploads and writing to config file during setup 2025-10-09 18:10:21 -04:00
johnnyq
b7e0e5c5eb Fix setup complete flag 2025-10-09 13:00:00 -04:00
johnnyq
2915b12181 Remove temp CSRF check on setup 2025-10-09 12:43:28 -04:00
johnnyq
ed589ef65b Update Backup / Restore, now streams backup and restore to disk instead of memory causing memory to run out, sets timeout limit to unlimited, checks backup file contents for anything bad, use php instead shell exec for import of db, added .htaccess for apache to prevent php execution in /uploads/ directory as this is intended for file download only 2025-10-09 12:28:38 -04:00
Johnny
0d5bfdafdf Merge pull request #1242 from itflow-org/develop
Develop to Master
2025-10-08 17:39:41 -04:00
johnnyq
fbf3346052 Update Changelog 2025-10-08 17:30:19 -04:00
johnnyq
3ff206f84d Add .htaccess in cron 2025-10-08 17:25:03 -04:00
johnnyq
a3b0fce961 Fix login_microsoft 2025-10-08 17:19:17 -04:00
johnnyq
8130280b35 Fix edit from contact details modal 2025-10-08 17:12:23 -04:00
johnnyq
fea3020d9a Add powered by ITFlow in Guest Section 2025-10-08 15:29:06 -04:00
johnnyq
1eb9d163fa Updated Changelog 2025-10-08 14:50:34 -04:00
johnnyq
e3e7c2e38b Add Signature in ticket reply POST dont add a signature if Internal 2025-10-08 14:48:13 -04:00
johnnyq
27e1d6a9cd remove net terms in quote add jquery to guest header 2025-10-08 01:18:55 -04:00
johnnyq
2ec4cdc4fb Ceated inc_all_guest.php and modulaized the guest header.php removed guest footer and used the global footer.php as they were very similar 2025-10-08 01:00:48 -04:00
johnnyq
35a7506c26 Copy crons from /scripts to /cron, added custom directories for api/v1/, /setup, /cron and /scripts 2025-10-07 13:55:54 -04:00
johnnyq
16242be74e Update Client Nav to use Absolute links and updated more of the inc_alls to use Document Server Root 2025-10-07 13:44:08 -04:00
johnnyq
3fcbe440d3 Fix Missing Missing Country code in Guest View Ticket 2025-10-07 12:34:26 -04:00
johnnyq
4ef0755039 Update Guest header and footer to use Server Document Root var 2025-10-06 17:07:19 -04:00
johnnyq
a4ed906dd1 Update modal footer and header to user SERVER Document root with absolute path intead of relative 2025-10-06 15:13:52 -04:00
johnnyq
416a8d9a94 Fix to properly redirect to the setup page if config_enable_setup is not set or is 1 2025-10-06 14:19:49 -04:00
wrongecho
d8803aaac2 prevent open redirects upon agent login 2025-10-06 16:32:42 +01:00
wrongecho
01f6615ca0 rm test 2025-10-06 16:13:08 +01:00
johnnyq
fd93ee3263 Allow HTML for signatures 2025-10-04 19:20:34 -04:00
johnnyq
32bfd298a1 Added Project Edit Function for Ticket 2025-10-03 17:37:25 -04:00
johnnyq
5de2e7a3bd If imap Encryption is blank then use notls in the ticket mail parser 2025-10-03 11:36:27 -04:00
johnnyq
6e8c133a99 Fix Regressions in Vendor Templates updated path from ../user/post to ../agent/post 2025-10-03 11:25:48 -04:00
johnnyq
956f18430b Fix Microsoft SSO Login in Client Portal, fix ticket templates due to regression from changing from user to agent 2025-10-03 11:12:48 -04:00
johnnyq
76c9933baf Update imap and smtp providers to allow empty string if empty do not execute mail queue 2025-10-02 14:28:43 -04:00
johnnyq
6c6a988c2b Fix custom Favicon 2025-10-02 11:42:30 -04:00
Johnny
d829e39b66 Merge pull request #1240 from itflow-org/develop
Develop to Master for 25.10 release
2025-10-01 15:28:06 -04:00
johnnyq
0e401df3c0 Setting 0 for the Payment Provider threshold disables the invoice amount check 2025-10-01 15:23:00 -04:00
johnnyq
9072c37e95 Set payment provider default Threshold to 9999.00 when adding a payment provider 2025-10-01 15:06:14 -04:00
johnnyq
2eff11efbf Added Custom Link option to Reports Nav 2025-10-01 14:35:18 -04:00
johnnyq
6a7a02d220 Add Custom Links Admin Nav option 2025-10-01 13:48:52 -04:00
johnnyq
d6349bbc5c Mention new installs already configuring the new cron jobs 2025-10-01 11:37:13 -04:00
johnnyq
9a2f887db1 Update Changelog increase app version to 25.10 2025-10-01 11:34:43 -04:00
johnnyq
71d30ff95f Enforce Payment Provider Max Threshold for Stripe Paymented in Guest Invoice and Unpaid Invoices 2025-09-30 12:14:24 -04:00
johnnyq
3135247936 Add Gibraltar to the countries list array 2025-09-25 17:35:02 -04:00
johnnyq
0d629221fe Add Software keys and software key assignment for contacts and assets table to the database schema 2025-09-25 17:24:42 -04:00
johnnyq
181ea4b487 Remove dead router.php require 2025-09-25 13:43:47 -04:00
johnnyq
fa769665df Update report links in dashboard 2025-09-25 13:38:51 -04:00
johnnyq
00f5198bed Update appNotidfy links to use Absolute paths, updated gitignore 2025-09-25 13:31:16 -04:00
johnnyq
785a291614 Remove unessesary vars in edit ticket asset modal 2025-09-24 14:56:50 -04:00
johnnyq
92209c7125 Updated edit ticket asset to new ajax-modal and add additonal assets field 2025-09-24 14:51:34 -04:00
johnnyq
690007be5c More Relative to Absolute web asset paths updates 2025-09-24 13:09:25 -04:00
johnnyq
e6bcf0e12f Started updating href paths to absolute paths instead of relative paths as itflow should be installed in document root anyway and not a sub-directory 2025-09-24 12:56:01 -04:00
wrongecho
ca6a903b8f Keepalive
- Fix directory path
- Remove duplicate file
- Add to client portal
2025-09-24 08:39:45 +01:00
johnnyq
50f790dd6c Fix MFA Enforcement 2025-09-23 20:30:25 -04:00
johnnyq
ed6aa843b7 Fix Activity log link 2025-09-23 19:41:02 -04:00
johnnyq
52a27699f1 fix mfa model 2025-09-23 19:39:49 -04:00
johnnyq
dba08714bf moved user preferences and user settings into /agent/user/ directory 2025-09-23 19:17:14 -04:00
johnnyq
edabc5c33f rename /user/ to /agent/ and update links to use agent/ instead 2025-09-23 18:04:23 -04:00
johnnyq
6b6c70f1df added extra ../ to href for css and js in header and footer to allow code to be placed deeper within the directory structure moved reports to /user/reports, this should also fix the new custom directories 2025-09-23 17:05:12 -04:00
johnnyq
93061eb695 Add Assigned Agent column to Recurring Tickets 2025-09-23 15:43:45 -04:00
johnnyq
1f9133c188 Added Viewing Archived Users and the Ability to Restore alonf with reassigning tickets of that user during the archive process 2025-09-23 15:36:45 -04:00
wrongecho
e7dcc6df3c Tickets API - Add ability to resolve ticket in post request with only a ticket ID and client ID via resolve.php endpoint 2025-09-23 09:28:27 +01:00
wrongecho
fbd58b4723 Bugfix: Change working directory back after 2025-09-23 09:27:04 +01:00
wrongecho
e992138456 Better logic for the index/root page:
- If app user, send to their start page
- If a client contact, send back to the client area
- If not logged in at all, make them
2025-09-23 08:45:06 +01:00
wrongecho
058f79d0a1 Fix file paths in cron notifs to new structure 2025-09-23 08:38:29 +01:00
johnnyq
5c448c05a9 Update .gitignore and add custom directories to /admin /client /guest /user Example Documentation coming soon 2025-09-22 19:33:40 -04:00
wrongecho
e966cd3068 New tickets v2 - Exclude leads 2025-09-22 12:04:11 +01:00
wrongecho
6d3351b2f7 Payment providers bug-fixing 2025-09-22 11:53:49 +01:00
wrongecho
61a1d61901 Bugfix - remove capital in html field name - Threshold => threshold 2025-09-22 11:23:18 +01:00
johnnyq
4ff3231451 Fix Incorrect Asset Name in Logging and Flash Alert when editing an asset in a ticket, remove ACH and Add Bank Transfer to Setup 2025-09-20 15:56:50 -04:00
johnnyq
ce832d2805 Fix Broken Restore from Backup on Setup Page 2025-09-19 16:02:55 -04:00
Johnny
b11730303e Merge pull request #1238 from itflow-org/develop
Develop
2025-09-19 14:00:02 -04:00
johnnyq
565f9ab314 Update Changelog and App Version 2025-09-19 13:47:36 -04:00
Johnny
9435434cf9 Merge pull request #1237 from git-kup/develop
Update invoice.php - removed extra unnecessary wording
2025-09-17 00:03:41 -04:00
git-kup
a58ca6f66d Update invoice.php - removed extra unnecessary wording
it always bugged me that the alert message is so bloated. i almost never go to the mail queue after sending each invoice it just doesn't make any sense
2025-09-16 19:36:25 -04:00
johnnyq
c769bbc405 Created new Mail Queuer to take advantage of OAUTH2 for M365 and Google Workspaces not enabled by default 2025-09-16 15:43:54 -04:00
Johnny
0379143829 Merge pull request #1236 from cynicalgeek/develop
Update to use payment_methods table
2025-09-16 11:46:30 -04:00
cynicalgeek
ee235cf231 Update to use payment_methods table 2025-09-16 01:38:11 -07:00
johnnyq
04b29d43df Update Agent ticket access path in emails to new /user/ path 2025-09-15 17:28:58 -04:00
johnnyq
dc0715da57 Added SMTP Provider and the ability to share OAUTH keys with IMAP for M365 Mail Auth 2025-09-15 17:23:00 -04:00
johnnyq
902323a75b Fix Broken gloabl search when in Admin section 2025-09-12 17:32:44 -04:00
johnnyq
3a5b18f3dd Added Beta support for Microsoft IMAP OAUTH2 must use new mail parser for it to work cron/ticket_email_parser.php 2025-09-12 15:56:44 -04:00
johnnyq
ce7d84aa2f Reintroduce Webklex IMAP for ticket processing as PHP-IMAP is no longer being developed. This is optional for now and considered beta can be found in cron/ticket_email_parser.php 2025-09-10 14:27:46 -04:00
johnnyq
981fb9585d Updated All Exports to include your company name if exporting all and if exporting just from a client prepend the client name to file, introduced a sanitize_filename function and used it for the exports to always get a clean file name that works on every OS 2025-09-10 12:50:10 -04:00
johnnyq
23b2dcba70 Renamed post file user back to users 2025-09-09 17:47:16 -04:00
johnnyq
e4a437f54c added escape parameters to fputcsv to satisfy php 8.4 Depracations 2025-09-09 17:45:09 -04:00
johnnyq
d4167f9595 Fix Missing first row on interface export, started adding escape parameters to fputcsv to satisfy php 8.4 Depracations and fixed export all quotes 2025-09-09 16:54:18 -04:00
johnnyq
88475a2b76 Fix Mispelling causing Adding new certificate to break 2025-09-09 12:50:27 -04:00
johnnyq
c26ce4b7dc Spruced up UI and eliminated checkbox to grant consent on Stripe consent in client Portal instead button acts a consent 2025-09-08 17:36:09 -04:00
johnnyq
5960e7cbd9 Fix Broken Add Payment link in reccuring invoice in the client portal 2025-09-08 17:23:51 -04:00
johnnyq
68872ab9fb Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-09-08 13:06:49 -04:00
johnnyq
64f12b42b8 Fix Footer path in used edit causing edit user not to function, also removed the old ajax used edit modal 2025-09-08 13:06:33 -04:00
wrongecho
8c0d542d7d Better logic handling for the default page redirects 2025-09-08 15:40:59 +01:00
wrongecho
c016b67c3a Fix typo in sql query field, matching develop back to master because we screwed up the flow 2025-09-08 15:26:57 +01:00
Johnny
49d127e957 Merge pull request #1235 from expxx/patch-1
fix: spelling error with `vendor_descripion` -> `vendor_description`
2025-09-07 21:04:14 -04:00
Cam
e7353c4757 fix: spelling error with vendor_descripion 2025-09-07 18:26:00 -06:00
Johnny
3106685972 Merge pull request #1234 from itflow-org/develop
v25.09.1
2025-09-07 11:44:10 -04:00
johnnyq
2b7017fae2 Fix dark mode for AI Ticket Summary 2025-09-07 11:38:03 -04:00
johnnyq
da0b01e23f Center Generating Summary in AI Summary 2025-09-07 11:30:43 -04:00
johnnyq
d450ea4beb Fix Installer Database not installing due to bad file name 2025-09-07 11:06:26 -04:00
johnnyq
9210734911 Also take in consideration of the ticket source, category and priority 2025-09-06 19:41:16 -04:00
johnnyq
ebae80bb7e Ticket Summeries are now in HTML form wit ha breakdown of the Main Issue, Actions Taken and Resolution or Next Steps. It also takes into consideration of the current ticket status and Who replyied for the ticket replys / comments 2025-09-06 19:31:44 -04:00
johnnyq
dcade3a5c7 Update the AI Ticket Summary Prompt 2025-09-06 17:57:58 -04:00
johnnyq
f51c3e9e3f Text Wrap client tags so table doesnt go off the page with clients with many tags 2025-09-05 19:29:21 -04:00
johnnyq
b34298e45b Hide Add Credit button in Client Top Head Dropdown also hide credits in client listing if no credit balance 2025-09-05 19:17:02 -04:00
johnnyq
9fa78897bc Fix extra spacing between icon and Assigned Contact Name iin ticket details 2025-09-05 19:05:06 -04:00
johnnyq
9642babb7e Fix issue with AI Settings displaying in Admin Menu if the module invoice/accouting module is turned off 2025-09-05 19:00:17 -04:00
johnnyq
d2d1aed393 Fix long Invoice/Quote notes overflowing into the invoice/quote footer by removing a rowspan class, adjusted the page margins from 15 to 10 and adjusted the invoice/quote notes to use font size 9 instead of 10 2025-09-05 18:48:35 -04:00
Johnny
58d43063ec Merge pull request #1233 from itflow-org/develop
25.09 Release
2025-09-05 13:24:54 -04:00
johnnyq
6a5ce1dce3 Add note about updating from the webUI 2025-09-05 13:09:02 -04:00
johnnyq
f3c7c0761b Add note about backing up before updating 2025-09-05 13:05:46 -04:00
johnnyq
27b3124f77 Update .gitignore to ignore the new custom/* 2025-09-05 12:57:19 -04:00
johnnyq
aa516529e7 Another attempt at fix automatic recurring payments expense 2025-09-04 17:56:00 -04:00
johnnyq
2283ad0eb2 Fix Adding Expense on recurring stripe payments in cron 2025-09-04 17:44:34 -04:00
johnnyq
cece9ad46c Another attempt to fix reccuring payment migration to match the correct client_id; 2025-09-04 16:29:55 -04:00
johnnyq
d37da2e8ff Fix Recurring Payment Migration for stripe 2025-09-04 16:07:38 -04:00
johnnyq
9d9bfc65d5 Fix Active side nav for api keys 2025-09-03 18:46:01 -04:00
johnnyq
d7d6e4ac6f Fix paths for db and uploads dir in debug 2025-09-03 18:42:32 -04:00
johnnyq
46d93f986e Further enhanced the Saved Payments Section by splitting cards and add card into 2 columns 2025-09-03 17:45:11 -04:00
johnnyq
2549a97a7e Added card icons to Saved Payments in Client Portal and spruced up ui 2025-09-03 17:40:09 -04:00
johnnyq
fc2cca5fdb Added card icon 2025-09-03 17:14:53 -04:00
johnnyq
ef1ec56270 Allow the Client to easily Pay an invoice from the client portal with a saved card 2025-09-03 17:09:17 -04:00
johnnyq
cf63a2e7d1 Fix TinyMCE License in client portal 2025-09-02 14:57:09 -04:00
johnnyq
ed9b99e2f0 Fix unpaid invoices on client portal but also comment it out until ready for next release 2025-09-02 14:52:38 -04:00
johnnyq
33340b80f9 Updated Changelog, Increased app version 2025-09-02 13:14:18 -04:00
johnnyq
ec94bb3d2a Add back Pay Invoice with saved card, currently only pays the full amount, would like to integrate into add payment modal and add payment post eventually 2025-09-01 16:19:33 -04:00
johnnyq
bc2fe2bec8 Fixed stripe Migration table name spelling 2025-08-30 11:19:28 -04:00
Marcus Hill
a87a206c04 Add better error handling for dodgy whois results 2025-08-30 16:16:55 +01:00
Marcus Hill
45083e19b0 Fix if undefined 2025-08-30 15:58:19 +01:00
Marcus Hill
de627c19c5 No csrf for client side, yet 2025-08-30 15:51:14 +01:00
Marcus Hill
595e57dcdd Rewording 2025-08-30 15:51:05 +01:00
Marcus Hill
dadcc69900 Typo 2025-08-30 15:35:31 +01:00
Marcus Hill
2c160d1ac9 Take you back to dashboard rather than a redirect 2025-08-30 15:31:49 +01:00
johnnyq
292b074d8c Remove legacy Stripe Enabled from invoice Commented out Pay Via Saved card this will have to wait for next release 2025-08-29 13:44:22 -04:00
johnnyq
2beff45811 Removed some simple tinyMCE inits and combined AI button into one 2025-08-29 12:51:14 -04:00
johnnyq
469c36da46 Remove AI Enable References through the UI this will be handled differently 2025-08-29 12:26:56 -04:00
johnnyq
8afe2d52a0 Converted and combine ajax add for tags and categories, fixed quick add links 2025-08-28 16:57:08 -04:00
johnnyq
51273e9151 Remove unused / unfinished browser extension from user preferences 2025-08-28 15:39:00 -04:00
johnnyq
1517c96841 Remove Budget from reports as it totally unfinished 2025-08-28 14:38:49 -04:00
johnnyq
b7afbd3500 Revert Bump down fontawesome-free 7.0.0 to 5.15.4, did not like the way the new icons looked with the app at all 2025-08-28 14:25:14 -04:00
johnnyq
39d6c42c71 Bump and Migrate logic chartjs 2.9.4 to 4.5.0, bump stripe-php from 17.2.1 to 17.6.0, fontawesome-free from 5.15.4 to 7.0.0, fullcalendar from 6.1.17 to 6.1.19, TinyMCE from 7.9.1 to 8.0.2, bootsatrap js bundle from 4.6.1 to 4.6.2, DataTables from 2.3.1 to 2.3.3 2025-08-28 13:57:42 -04:00
johnnyq
9f50c9355a Move reports out of the sub directory for now as it broke requires 2025-08-28 11:46:20 -04:00
johnnyq
fd73f132bc Fixed a few table names in Stripe Migration, Removed legacy stripe and AI settings 2025-08-28 11:44:29 -04:00
johnnyq
1f99e592b7 Remove old Autop Pay Logic from recurring Invoices Listing 2025-08-27 20:09:12 -04:00
johnnyq
a90c4eded8 Remove Old Auto Pay Modal for recurring Invoices 2025-08-27 20:05:47 -04:00
johnnyq
1638538fb4 Remove Old Auto Pay from recurring Invoice in favor of the saved cards. 2025-08-27 20:04:49 -04:00
johnnyq
da0892f9e3 Remove Stripe check and add payment provider check in Client Portal Recurring Invoices to create auto payments 2025-08-27 18:23:58 -04:00
johnnyq
66cab6c1ab Fixed Guest Pay removed old stripe vars in place of new payment provider vars 2025-08-27 17:38:41 -04:00
johnnyq
535078b0ab Fix Bad vars in PAyment Providers listing, add check to see if payment provider already exists 2025-08-27 16:27:54 -04:00
johnnyq
d584c6b1e8 Commented out Credit lines as its not ready for next release running into way to many pitfalls will focus more on next release 2025-08-27 16:02:00 -04:00
johnnyq
530a76a9a2 Fix undefined vars in export invoice / quote pdf fix regression company logo path in export invoice / quote 2025-08-27 11:53:58 -04:00
johnnyq
2a0181fd92 Convert Invoice and Quote Guest URL to Copy to Clipboard link instead of open links 2025-08-26 12:17:45 -04:00
johnnyq
86c5b9a55d Removed Budge from the side nav as this was never finished and doesnt really do anything, will work on it at a later date 2025-08-25 23:51:48 -04:00
johnnyq
0a6b890250 Fix broken php start tag 2025-08-25 17:33:40 -04:00
johnnyq
af7f1f30ad Credentials: Fix broken page if no clients exist, which also fixes dont show share modal if GET client_id is not set 2025-08-25 17:32:15 -04:00
johnnyq
f6c0f840fe Asset: Multiple Bug fixes, Fix broken asset list if no assets exist, fix bulk Asset Ticket creation to use the client_id of the associated asset, allow to assign to all open projects. Fix Transfer client where client_id is not defined in client overview section 2025-08-25 16:59:15 -04:00
johnnyq
0e54359db8 Assets: Fix Description not displaying, Fix issue with unitialized OS var, fix client asset uri using asset_uri_2 2025-08-25 14:07:55 -04:00
johnnyq
373f1574bd Update function path for customAction to use the new path /custom and not /xcustom 2025-08-25 12:58:57 -04:00
johnnyq
6f5ffef22f Link Fixes 2025-08-25 12:50:01 -04:00
johnnyq
451206525e Remove function code for old way ajax-modal, moved modals over to modal_header/footer and removed _new 2025-08-25 00:07:51 -04:00
johnnyq
41f957ea3b Migrated admin modals to modals/ENTITY removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-24 23:50:38 -04:00
johnnyq
91b0080428 Finished Consolidating the remaining user modals to modals/ENTITY removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-24 00:38:48 -04:00
johnnyq
170d6dd7e5 Consolidate alot of modals to modals/ENTITY removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-23 18:48:21 -04:00
johnnyq
15ba385398 Consolidate asset modals to modals/asset removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-22 21:54:26 -04:00
johnnyq
0b93d58a32 Consolidate account modals to modals/account removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-22 18:51:39 -04:00
johnnyq
67078c4552 Consolidate product modals to modals/product removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-22 18:22:04 -04:00
johnnyq
ab17de7efd Consolidate client modals to modals/client and use new ajax-modal syntax 2025-08-22 18:06:37 -04:00
johnnyq
1145260619 Consolidate trip modals to modals/trip removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-22 17:49:46 -04:00
johnnyq
066952ed04 Consolidate vendor modals to modals/vendor removed ajax_ and _modal prefixes from file names and use new ajax-modal syntax 2025-08-22 17:36:07 -04:00
johnnyq
6ccf7a0fb8 Set Invoice Credit, Consolidated all expense modals to modals/expense removed ajax_ and _modal prefixes from file name create new modal header and footer to include another parent directory eventually will consolidate all, this was just an example 2025-08-22 16:59:31 -04:00
johnnyq
7f49ecefb1 Flash alert if no comment was entered in a ticket reply via the client portal 2025-08-21 18:35:16 -04:00
johnnyq
43324391ff Fix Regressed See More... in User Activies page 2025-08-21 18:15:28 -04:00
johnnyq
89af8216b8 Fix Ticket Kanban CSS Path and category query 2025-08-21 18:13:31 -04:00
johnnyq
be9e30e6d8 Fix Show Add Payment dropdown if client has credits or saved payment methods 2025-08-21 18:04:49 -04:00
johnnyq
85cfd6fb7c Fix Regression Broken Quick add modals 2025-08-21 17:54:10 -04:00
johnnyq
e694e20025 Use mysqli escape string instead of sanitizeInput on stripe to payment provider migration just incase 2025-08-20 14:18:34 -04:00
johnnyq
7618dd335a Update Stripe to Payment Provider Migration to not transfer over clients with a NULL or blank stripe payment method 2025-08-20 14:12:39 -04:00
johnnyq
eca09253d3 Migrate over Payment Methods from Categories to its own table payment_methods 2025-08-20 13:53:38 -04:00
johnnyq
96c32b3275 Added Stripe Config Migration to a database Update 2025-08-20 13:30:46 -04:00
wrongecho
94a4fec3c6 Fix popping future tickets numbering 2025-08-20 16:43:45 +01:00
Marcus Hill
a8386d3937 Allow reporting on average time to first response 2025-08-16 21:44:17 +01:00
Marcus Hill
4b7aa4bece Powered by 2025-08-16 16:37:24 +01:00
Marcus Hill
4c604f4009 Use HTML for the logo instead of pdf->image; scales much nicer 2025-08-16 16:25:51 +01:00
Marcus Hill
98cf2f7a5a Use freeserif font instead of helvetica to properly display foreign characters 2025-08-16 15:54:28 +01:00
Marcus Hill
804467b1ba Use freeserif font instead of helvetica to properly display foreign characters 2025-08-16 15:52:54 +01:00
Marcus Hill
9fbf775299 Fix file icon in file rename modal 2025-08-16 15:30:10 +01:00
Marcus Hill
5c93753b7e Rm extra unnecessary line in overdue invoice email 2025-08-16 15:17:48 +01:00
Marcus Hill
27016eaa28 Recurring tickets - add ability to bulk recurr 2025-08-16 14:31:36 +01:00
Marcus Hill
859281784a Recurring tickets - fix include path 2025-08-16 14:31:01 +01:00
Marcus Hill
7ae7b8904c Invoice.php - Fix undefined error 2025-08-16 14:30:37 +01:00
Marcus Hill
559e0c6350 Comment direct link to guest pay, we should not encourage agents to do this 2025-08-16 13:47:47 +01:00
Marcus Hill
d942badec8 Fix primary contact text not showing 2025-08-16 13:42:29 +01:00
johnnyq
f443ae9203 convert even more ajax modals to new syntax 2025-08-16 02:06:42 -04:00
johnnyq
d37dc37c2d convert more ajax modals to new syntax 2025-08-16 01:40:40 -04:00
johnnyq
236d895498 Reworked the ajax-modal function to be more simplified and use less data attributes 2025-08-16 01:02:16 -04:00
johnnyq
3bb0ef6f39 Left Align Billing Header 2025-08-15 22:55:40 -04:00
johnnyq
a0ced96d1d Use a WAY MORE Efficient query when filling out filter selection boxes by using EXIST instead of DISTINCT selections 2025-08-15 20:39:23 -04:00
johnnyq
4ef1e91c78 When Show Archived is selected in clients show Drop down filters for them as well in Idustry and Referral 2025-08-15 19:32:09 -04:00
johnnyq
2333fa2d9b Product Category Dropdown Filter only show categories thats are assigned to the products not all the categories 2025-08-15 19:26:42 -04:00
johnnyq
37bef2d824 Check Stock if product type is a product before adding the line item 2025-08-15 19:12:45 -04:00
johnnyq
6427235aec Show Name Description Tax Price and Stock in Product Auto Complete in Invoice 2025-08-15 18:25:23 -04:00
johnnyq
535c8e9f7b Remove Stock if Inventory item is selected and added to an invoice and return stock when Invoice Item related to a product is deleted 2025-08-15 17:32:44 -04:00
johnnyq
890e166d1c Thicken the left border on ticket replies for more prominent type of reply 2025-08-13 13:35:29 -04:00
johnnyq
337ceb7477 Fix Client Net terms displaying default Net terms instead of On Receipt if selected 2025-08-11 21:51:05 -04:00
johnnyq
f82f3e9b8c Allow adding more than 9 stock 2025-08-11 21:40:42 -04:00
johnnyq
3c709955e3 Add UI elements for product location, used logic to seperate product from service, also added the ability to add stock for a product and linking stock to an expense with notation, still need to work on taking away from stock 2025-08-11 21:18:55 -04:00
johnnyq
595e6090c7 Added Stock Ledger to tables and additonal fields for product including type, code and location 2025-08-11 18:19:45 -04:00
johnnyq
1d98eb5160 Update Project Details Header to use card group class and update client ui to not show header button texts in mobile view, added no text wrap to location and contact column 2025-08-08 16:09:46 -04:00
johnnyq
7172c92f02 Update Database updates patch in update_cli 2025-08-08 15:09:03 -04:00
johnnyq
874d9ddbc3 Cleaned up ticket details UI used card Group for top, removed responses in ticket replies section, uncarded the ticket commend editor giving much more room, moved summarize to 3 dots 2025-08-07 20:38:23 -04:00
johnnyq
73b84a9690 Removed dynamic depth path_prefix due to potential security issues with it 2025-08-06 18:12:13 -04:00
johnnyq
c78f50ab8c cap the path_prefix to 3 depth directories max 2025-08-06 18:03:51 -04:00
johnnyq
8407cd3ea5 updated router.php to automatically determine relative path based off directory depth and use var path_prefix instead of prepend_uri var these vars are only used in header and footer php files for now 2025-08-06 18:02:25 -04:00
johnnyq
9caa42975d rename get_settings.php to load_global_settings.php and update all requires 2025-08-06 17:48:23 -04:00
johnnyq
44fdb6c24f Broke up the check_login.php require into several files seperated by function and then required them in the check_login 2025-08-06 17:16:30 -04:00
Johnny
c8984d1bc9 Merge pull request #1231 from itflow-org/ticket-fr
Implement ticket first response date/time tracking
2025-08-06 16:19:27 -04:00
johnnyq
be66a1690f Fix setup redirect 2025-08-06 12:52:02 -04:00
wrongecho
13838ec8d6 Implement ticket first response date/time tracking 2025-08-06 10:45:28 +01:00
wrongecho
2d72a6fd12 Implement ticket first response date/time tracking 2025-08-06 10:38:52 +01:00
johnnyq
e24ec04a75 Fix Post errors when repeat and Email Event is not selected 2025-08-05 18:39:24 -04:00
johnnyq
9a0aa9ce97 Fix Calendar not showing when no client is selected 2025-08-05 18:36:23 -04:00
johnnyq
643a4ce666 add router.php to inc_all_client.php 2025-08-05 18:18:46 -04:00
johnnyq
189098541e Remove unused top nav ticket modal 2025-08-05 18:17:14 -04:00
johnnyq
e8a1d4c66c Update mfa enforcement page to use new asset pathes 2025-08-05 14:05:09 -04:00
johnnyq
08dd6147f2 Migrate Dark/light mode to a user settings instead of global setting, created new include called router.php to dynamically prepend ../../ to asset pathes based off currect directory depth 2025-08-05 13:32:19 -04:00
johnnyq
7e55808a05 add some redirect to login.php, fix ticket post 2025-08-04 18:16:13 -04:00
johnnyq
6b39c1a280 Finished moving to the redirect, flash_alert and get_field_by_id and maing sure validate_csrf is on top and some other cleanups for guest and client posts 2025-08-04 18:07:26 -04:00
johnnyq
a38d0054df Finished moving to the redirect, flash_alert and get_field_by_id and maing sure validate_csrf is on top and some other cleanups for user posts 2025-08-04 17:41:32 -04:00
johnnyq
e39072d3bc More work on moving to the redirect, flash_alert and get_field_by_id and maing sure validate_csrf is on top and some other cleanups, along with more work on credits 2025-08-04 17:01:19 -04:00
johnnyq
b4e5e3fda7 Fix injection with role id affecting authenticated admin accounts only 2025-08-04 12:06:05 -04:00
johnnyq
e8af173b4f Fix Client Billing column lweft align the label right align the amounts 2025-08-04 11:36:30 -04:00
johnnyq
fef0d8761f More user post function migration and cleanup 2025-08-04 11:27:24 -04:00
wrongecho
76b48378ab Hide invite contact letter options for now 2025-08-04 11:45:54 +01:00
johnnyq
a7e042b5f4 Removed logging comments as its implied in asset post also if returning 1 field for logging use getFieldById Function flipped it so it validate CSRF before role permission check, replaced header redirect with new redirect function and elimnasted the extra exit() afer redirect as its done in the function, also used the flash_alert function 2025-08-02 12:51:40 -04:00
johnnyq
ab8f51622f Started Removing logging comments as its implied in user posts also if returning 1 field for logging use getFieldById Function flipped it so it validate CSRF before role permission check 2025-08-01 18:30:32 -04:00
johnnyq
fae7e76721 Remove logging comments as its implied in admin also if returning 1 field for logging use getFieldById Function 2025-08-01 18:08:02 -04:00
johnnyq
012b0f1a77 Update Admin posts to use new functions flash_alert and getFieldById which greatly cleans up and reduces the code also removed logging comments as implied by the function logAction 2025-08-01 17:21:35 -04:00
johnnyq
cc5b1c8040 Add new function called flash_alert() to repace the alerting in posts, updated accounts post to use new function 2025-08-01 15:51:29 -04:00
johnnyq
2cf932600e Fix broken link for edit role 2025-08-01 15:32:43 -04:00
johnnyq
d2dac1915d Update admin, user, guest and client post to use new redirect function 2025-08-01 15:25:52 -04:00
johnnyq
5d52b6c4ec Update logic for Apply Credit on invoice Post 2025-08-01 15:17:50 -04:00
johnnyq
7cfba7f2ef Added redirect() function for page redirects and updated credit system fields to include credit_note, credit_invoice_id and type for better reporting 2025-08-01 13:37:23 -04:00
johnnyq
41a8e41463 Move reports back and rename them appropriately update broken links 2025-07-31 18:48:33 -04:00
johnnyq
07e2c41eb7 Fix client uri regression broken asset details page update echos to use php short hand for easier code reading 2025-07-31 16:10:33 -04:00
johnnyq
9fe0d8417b Feature: Added Client URI field to Assets which is exposed in the client portal can be used for remote desktop links etc 2025-07-31 15:54:07 -04:00
johnnyq
905908bcf1 broken link updates 2025-07-30 20:59:20 -04:00
johnnyq
8e87c25de1 Update more broken links from file diretory consolidation and started migrating some js and ajax and css from root to /user /admin etc that pertain to the section 2025-07-30 20:08:28 -04:00
johnnyq
5a76780cd9 Move db.sql back to fix develop platform 2025-07-29 21:40:50 -04:00
johnnyq
10fd911dcc Update links on the setup page as well 2025-07-29 18:59:42 -04:00
johnnyq
2333d81276 Update more broken links from file dirextory consolidation 2025-07-29 18:34:51 -04:00
johnnyq
9ee76213e1 Update more broken links from file dirextory consolidation 2025-07-29 14:32:43 -04:00
johnnyq
4ec1441189 Cleanup some broken links from file dirextory consolidation 2025-07-28 23:29:46 -04:00
johnnyq
38e2e50a29 More progress on consolidating files into user and admin 2025-07-28 22:48:44 -04:00
johnnyq
95950700d8 Moved user items to user directory 2025-07-28 17:57:06 -04:00
johnnyq
0494bfc1cf Moved admin_ to /admin, user_ to user report_ to /reports each have their own post includes modals directories created seperate headers and footer. Also did the same for xcustom, more work to me done 2025-07-28 13:32:28 -04:00
johnnyq
4906e06bf1 Initialized migrating modals into entity folders and modals out of ajax and start working on moving admin items to new admin directory 2025-07-27 21:24:14 -04:00
johnnyq
699546f531 In Client Import Clarify CSV as Primary Contact Name instead of just Contact Name same with Location name use Primary Location Name, makes it much clearer when importing clients 2025-07-25 14:21:55 -04:00
johnnyq
d5ec601d75 add eg info@company.com for further clarification on company setup 2025-07-25 13:36:07 -04:00
johnnyq
5f26f68a04 Clarify Email during company setup, instead of just enter email enter company email for the placeholder https://youtu.be/Ul10HXaPwNk?t=2079 2025-07-25 13:34:05 -04:00
johnnyq
219fe59aa2 Use Badge Pill for rounded Badges in client side nav 2025-07-25 12:44:43 -04:00
johnnyq
d115d57d1a Update sanitize_input Function to handle encoding issues such as Vietnamese. Instead of Blindly just converting to UTF-8 check the input to see if its already UTF-8 2025-07-25 12:35:13 -04:00
johnnyq
6307099bc1 Clarified Importing contacts when inporting clients in the client import modal window 2025-07-25 12:18:17 -04:00
johnnyq
e0a5efdfaf Updated Contact Asset Counts to use more optimied query and added asset counts to client listing 2025-07-24 17:28:10 -04:00
johnnyq
e014e516e6 Beta Support for Dark Mode has been added to the theme options 2025-07-24 14:58:06 -04:00
johnnyq
4d71eb5de0 Remove Credit once Applied, also get total credits applied 2025-07-24 13:24:59 -04:00
johnnyq
0db6853fde Updated Invoice, Quote Recurring Invoice UI to include a table border and added hover effects to line items 2025-07-24 13:02:57 -04:00
johnnyq
197dd9f299 Initial Work on Client Account Credit System, DB Structure, Credit Balance Calculation, added Apply Credit and add Credit with Expire dates, Added DB Structure for Discount Codes, UI Rewrite on client top header now using grouped cards, more dark mode work as well 2025-07-24 11:31:45 -04:00
johnnyq
99aaeefe8e Move the adminlte css to be the last css to fix select2 being white in dark-mode 2025-07-23 17:32:51 -04:00
johnnyq
712804d2a8 Preparing for Dark mode theme: Started Fixing models so they look better in dark mode 2025-07-23 17:02:20 -04:00
johnnyq
a393284acd Remove Building Icon next to company name in main side bar nav 2025-07-23 13:24:48 -04:00
johnnyq
719a0e5efa Also Apply previous commit it editing recurring expenses 2025-07-23 13:20:06 -04:00
johnnyq
6221fd67e1 Fix recurring expense next run date logic for monthly and annual frequencies 2025-07-23 11:47:31 -04:00
johnnyq
56c7c76ac6 Add option to filter footer 500 records per page 2025-07-22 16:15:09 -04:00
johnnyq
a5aae51b1a Fix issue in some of the client overview entities archived will not remain selected after query, fixed issue where clients would not show in overview if in archived 2025-07-22 16:13:04 -04:00
johnnyq
14691fa367 Fix Archived Query for domains to not show archived clients 2025-07-22 15:51:57 -04:00
johnnyq
38b2a94231 Client Overview do not count Archived Clients entities and in services do not show services of archived clients 2025-07-22 15:46:17 -04:00
johnnyq
4c031c8f83 Increase the width for totals on invoices and Quotes PDF Exports 2025-07-21 21:31:39 -04:00
johnnyq
b100498dd7 Add Client Bulk Actions: Edit Tags, Referral, Industry, Set Hourly Rate, Send Bulk Email, Archive. Also added restore option to restore a client 2025-07-21 18:27:31 -04:00
johnnyq
50a8e67917 Commented out deleting old Payment Provider Settings from DB until next release 2025-07-21 13:29:29 -04:00
wrongecho
dfe0a0b1c7 Add default netid for asset int csv import to prevent errors 2025-07-21 09:18:30 +01:00
wrongecho
52dac2252a Add default purchase date for csv import to prevent error when undefined 2025-07-21 08:11:57 +01:00
johnnyq
5aee84e84f Add Credit card icon to the pay button 2025-07-15 18:27:09 -04:00
johnnyq
3e7d7f3801 Make Client Portal Dashboard Cards Linkable, added upaid invoices with ui for option to enter card manually, pay with saved card or pay entire balance 2025-07-15 18:23:20 -04:00
johnnyq
184aba4de4 Finished UI work for AI Providers and Models, AI is set to use the new AI Provider and Models 2025-07-15 16:19:23 -04:00
johnnyq
dd482b246f Use getFallBack function on MAC Address if no MAC is present show a - placeholder 2025-07-15 13:56:54 -04:00
johnnyq
717e6351e7 Add Option for Mac Address in Additonal Column and allow to filter by MAC 2025-07-15 13:54:25 -04:00
johnnyq
c36b1cf50f Added Income Category Filter to Invoices 2025-07-15 13:34:05 -04:00
johnnyq
896da66caf Remove the Archive button from invoices as we dont archive invoices 2025-07-15 13:26:13 -04:00
johnnyq
f72b7763c1 Added Bulk Actions to Invoices Assign Income Category 2025-07-15 13:24:28 -04:00
johnnyq
46c4a62046 Converted add payment to a dropdown under invoice to allow for the standard manaual add payment and to pay with a saved card or by entering a card manully 2025-07-14 17:36:03 -04:00
wrongecho
da3a1d2ce4 Allow linking closed tickets to a project 2025-07-14 15:13:36 +01:00
johnnyq
35d6b51770 use table-sm for tickets to reduce padding and margin and remove ticket_compact_view 2025-07-10 16:11:02 -04:00
johnnyq
35cbfdd736 Rework Categories into a select box for tickets, which now makes it easier to see what category your viewing and one less click as the form auto submits upon selection 2025-07-10 16:04:52 -04:00
johnnyq
a7b2522c87 Fix Invoice Link in ticket details when billed 2025-07-09 20:10:08 -04:00
johnnyq
fe8baf2ca4 Fix pointer not switch to a finger when hovering over add contact in ticket details 2025-07-09 20:06:22 -04:00
johnnyq
300aef413c Fixed Email Notify not showing for recurring invoice 2025-07-09 19:32:24 -04:00
johnnyq
467c681117 Add Saved Payment Options to recurring invoices and details for agents 2025-07-09 19:23:12 -04:00
johnnyq
31a89c0641 Update Recurring Payment Auto pay in cron 2025-07-09 17:05:56 -04:00
johnnyq
5f94543d9b Add Easy Select Auto Pay option in Client Portal Recurring Invoices, fix guest pay 2025-07-09 15:58:13 -04:00
johnnyq
10fd74b4c4 Remove unused model 2025-07-09 01:46:56 -04:00
johnnyq
9bc705bfa1 Updated Guest pay and Client Add Delete Payments, adjustedsetting saved payment per recurring invoice 2025-07-09 01:45:56 -04:00
johnnyq
307d9892b2 No need for a sql delete on recurring payments when deleting a saved payment method as SQL cascadely deletes the recurring payment if saved payment method is deleted 2025-07-08 14:10:27 -04:00
johnnyq
93f4ea51fd Rework Payment Provider AI Provider Tables and logic add cascading deletes 2025-07-08 14:07:10 -04:00
johnnyq
a6f83493f8 Fix Payment Method Additons in setup 2025-07-07 23:22:35 -04:00
johnnyq
7e17fdf851 Add new UI for Saved Payments for payment providers 2025-07-07 18:25:23 -04:00
johnnyq
c76da10747 Add Payment Method to UI and switch Add Payment modals to use the new table 2025-07-07 16:37:51 -04:00
wrongecho
7c558ff842 Add location create endpoint 2025-07-07 13:47:17 +01:00
johnnyq
a011dc4dea POST code for AI and Payment Providers 2025-07-06 17:01:28 -04:00
johnnyq
fa9acef279 Fixed IMAP test button with error details 2025-07-06 12:47:26 -04:00
johnnyq
ed0936059b Convert new lines to brs for contact notes 2025-07-06 11:50:12 -04:00
johnnyq
77597fd7a9 Update wording on Add Payment Processing, we plan on using the income/expense account to be named after provider name and category be processing fees and the vendor named after the provider name if payment processing expense is enabled 2025-07-04 18:07:59 -04:00
johnnyq
8d1bf3d245 UI add modal and listing work on Payment Providers 2025-07-04 17:48:54 -04:00
johnnyq
e7503e8f55 Initial DB work to Generalize Payment Providers, allow multiple payment providers and client payment methods, also to move payment methods to its own table instead of in categories, started work on ai provider ui models 2025-07-04 16:52:30 -04:00
johnnyq
9b6be66623 Initial work on Adding Payment Methods for Online Payments in Client on Agent Side and initial work on AI Providers with multiple model support assigned to various sections and custom prompts 2025-07-04 15:42:26 -04:00
johnnyq
6bc7862232 UI Dashb oard resize some Dashboard cards 2025-07-03 18:14:20 -04:00
Johnny
69a8a9246d Merge pull request #1226 from MydsiIversen/Document-enhancement-clientside
Enhanced the document function on the client side
2025-07-03 17:42:24 -04:00
johnnyq
b87b801b04 Fix broken Table header Link buttons in contact details 2025-07-03 16:24:51 -04:00
johnnyq
dba04a407a Fix Table Header Link Buttons in Asset Details 2025-07-03 16:19:55 -04:00
johnnyq
e281a39512 Add title Icon for Bulk Set Status 2025-07-03 16:08:15 -04:00
johnnyq
e0364183e2 Disable Certain Bulk Actions that are directly related to a client in client overview section instead are shown in the client section 2025-07-03 16:03:57 -04:00
Johnny
6af61cbb3c Merge pull request #1225 from itflow-org/bulk-assign-phyloc
Add physical location modal - not working
2025-07-03 15:11:42 -04:00
johnnyq
67dc012caa Small wording hints on file uploads instead of upload File its just upload and added the title of the upload modal from upload files to upload file(s) 2025-07-03 14:44:30 -04:00
johnnyq
8753655c9c Do not allow client portal logins with Contact users of a client that is archived 2025-07-03 14:18:14 -04:00
wrongecho
873dc1f76d Fix contact location if not provided in api call 2025-07-01 11:50:20 +01:00
wrongecho
d781130b49 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-07-01 10:52:05 +01:00
wrongecho
effbf241e6 Fix default rate and net terms if not provided in api call 2025-07-01 10:51:56 +01:00
Mads Iversen
396a67b198 - Enhanced the document retrieval process by including the document description in the SQL query.
- Implemented file upload capabilities, allowing users to attach files to documents with support for various formats (PDF, Word, text).
- Created modals for adding new documents and uploading files, improving user experience.
- Added functions for formatting file sizes and retrieving appropriate icons based on file extensions.
- Updated the document display logic to handle attached files, providing inline previews for PDFs and images.
2025-06-30 14:41:12 +02:00
Marcus Hill
1939e06a24 Start using the new modal when creating tickets. This allows us to select both the client and contact, along with a client-specific asset, location and vendor 2025-06-28 17:56:55 +01:00
Marcus Hill
3f21e73b2e Comment ticket collabs, still broken 2025-06-28 15:55:13 +01:00
Marcus Hill
bc9529c488 Client Portal - Allow client choose asset during ticket creation 2025-06-28 15:49:17 +01:00
Marcus Hill
19af05ebee Client Portal - Add company logo to header banner 2025-06-28 14:28:25 +01:00
Marcus Hill
eb11e5b2f8 Bugfix: Company logo not being removed properly from db 2025-06-28 14:27:51 +01:00
Marcus Hill
b85137096d Add physical location modal - not working 2025-06-28 13:42:00 +01:00
Marcus Hill
77e9d72f92 Add physical location modal - not working 2025-06-28 13:37:44 +01:00
Marcus Hill
ec344cbaa7 Allow entering multiple ticket watchers at once 2025-06-28 12:30:42 +01:00
johnnyq
4cb2f42d71 Added Bulk Action Set IP to DHCP in Asset Interface 2025-06-27 01:45:25 -04:00
johnnyq
98723b76cf Added Bulk Actions Set Network, Type and Delete to Asset Interfaces 2025-06-27 01:31:23 -04:00
johnnyq
45ac7f084b Add Bulk Delete Function Also when deletign a ticket delete the watchers and attachments and remove the ticket id from uploads/tickets/ticket_id 2025-06-26 23:16:08 -04:00
johnnyq
3626777bd1 Fix Item name and Description Alignment in PDF Exports 2025-06-26 19:12:25 -04:00
johnnyq
5fb1070567 Show your Assigned Assets on the Client Portal Home Page 2025-06-26 18:45:23 -04:00
johnnyq
f0bcf975b6 Add Assets to the client Portal viewable by Primary and technical Contacts 2025-06-26 18:18:36 -04:00
johnnyq
0ca28dc630 Fix Document API to not insert a new document upon update as we changed the way documents and document versions are handled 2025-06-26 17:30:34 -04:00
johnnyq
8196706538 Ticket API: Allow HTML into ticket Content and allow inserting asset_id 2025-06-26 17:13:27 -04:00
johnnyq
411a6efeb5 Fix Searching Closed Tickets 2025-06-26 17:05:38 -04:00
johnnyq
ffad0cdec9 Fix broken Documents in the Client Portal due to regression with splitting document templates 2025-06-26 16:45:00 -04:00
johnnyq
ca519fe4e1 Fix Adding a vendor from a template and adding country code to vendor template 2025-06-26 16:27:11 -04:00
johnnyq
6b0855cff8 Fix Exports while in Client Overview some were failing due to missing client_id var and some were not logging the client_id if in the client section 2025-06-26 15:49:49 -04:00
wrongecho
e8a3309822 Fix project search not filtering completed projects 2025-06-26 13:13:25 +01:00
wrongecho
ce8c4dfc4c Add debug check for php-zip 2025-06-25 20:40:08 +01:00
wrongecho
a1b99c46c7 Client Portal - Don't allow tech contacts to edit themselves 2025-06-25 09:44:57 +01:00
wrongecho
1ee50fdfde Ticket merging - Hyperlink the new parent ticket in the internal comment for quicker access 2025-06-25 09:23:02 +01:00
wrongecho
05850f61d2 Fix php debug message 2025-06-25 09:11:19 +01:00
johnnyq
12d8c8e959 Fix Overlapping logo with company information in PDF Invoice and Quote 2025-06-23 19:43:41 -04:00
johnnyq
2b4933bd5c Do not Update ticket status when scheduling or cancelling a tickets schedule 2025-06-23 18:15:05 -04:00
Marcus Hill
500e713764 clarify error message wording 2025-06-22 10:01:10 +01:00
Marcus Hill
2ca50776ec Ticket
- Move ticket metadata/details into their own card (source, category, time, closure details, etc)
- Start adding support for ticket_quote
2025-06-22 10:00:53 +01:00
Marcus Hill
bd31513e5d Add db fields for ticket_quote 2025-06-22 09:59:23 +01:00
Johnny
6df04390bb Merge pull request #1224 from itflow-org/develop
25.6.1 Release
2025-06-22 01:52:33 -04:00
johnnyq
49511276fd Bump Release to 25.06.1 - updated changelog 2025-06-21 18:42:19 -04:00
johnnyq
c4e91df1ed Fix Regression that broke setup, set company currency default to USD if not set 2025-06-21 18:33:48 -04:00
Johnny
ed8a576ac3 Merge pull request #1223 from itflow-org/develop
25.06 Release
2025-06-20 15:34:32 -04:00
johnnyq
5c6a7acb7d Fix Updated at date in Documents 2025-06-20 15:25:42 -04:00
johnnyq
850db54a3b Bump ITFlow version to 25.6 and updated changelog 2025-06-20 15:10:46 -04:00
johnnyq
985593b7c2 Add Confirm Modal to Accept Decline Quote 2025-06-19 16:39:22 -04:00
johnnyq
857b5d1bfd Remove redundant php open tag 2025-06-19 00:27:33 -04:00
johnnyq
498e86aa7a Refactor Restore ITFlow Backup code in setup to utilize Sys Temp Directory 2025-06-19 00:26:23 -04:00
johnnyq
79d0fd28b0 Fix Backup function 2025-06-19 00:17:52 -04:00
johnnyq
426ca90515 Add Function to cleanup temp backup files if backup times out or error out 2025-06-19 00:13:56 -04:00
johnnyq
e7328f1be5 Use tmp directory to zip and backup itflow instance 2025-06-19 00:06:54 -04:00
johnnyq
baccc8051e Fix Extra spacing before Contact Name in client listing 2025-06-18 23:13:06 -04:00
johnnyq
f1c7690270 Also add contact_id to the compact ticket listing 2025-06-18 22:34:27 -04:00
johnnyq
d700d1530b Add missing contact_id in ticket listing 2025-06-18 22:32:55 -04:00
johnnyq
b60f44eede Allow the Contact to be clickable in ticket compact listing too 2025-06-18 18:06:59 -04:00
johnnyq
54ab788e93 Allow the Contact to be clickable in ticket listing and direct to the client contact details page 2025-06-18 18:05:28 -04:00
johnnyq
ac2dd04959 Moved Has Base Vendor Template Icon to the the end of the Vendors Table listing 2025-06-18 16:56:40 -04:00
johnnyq
9a449c35ac Fix No content in Edit Recurring Invoice Note Modal 2025-06-18 16:18:01 -04:00
johnnyq
2ff5d2f87c Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-06-18 15:32:38 -04:00
johnnyq
8f704dade8 Recurring Payments now make the payment on the invoice Due Date instead of when the recurring invoice is generated 2025-06-18 15:32:22 -04:00
wrongecho
3b3e323ce5 Assets - Import CSV now takes purchase date too (MUST be in format YYYY-MM-DD, Excel is annoying and will silently reformat this at random) 2025-06-18 14:48:13 +01:00
wrongecho
43ec144bf0 Fix more debug errors 2025-06-18 14:47:21 +01:00
wrongecho
d5f94819d0 Fix 'Passing null to parameter' debug message 2025-06-18 14:11:18 +01:00
johnnyq
98aa7e4993 Remove url_query_strings_sort var as this functionality has been moved to the filter header that all listing pages share 2025-06-18 01:42:21 -04:00
johnnyq
7c61911dba Added Document Template Delete function 2025-06-18 00:55:57 -04:00
johnnyq
2bb107a5d7 Add Functionality to mark all tasks as complete or incomplete in a ticket 2025-06-18 00:48:18 -04:00
johnnyq
0c4a2aedb7 Show Puzzle Piece Icon if a Vendor has a base vendor template assigned to it 2025-06-18 00:16:19 -04:00
johnnyq
e7e7272002 Migrated Vendor Templates to its own table, lots of code modifications here 2025-06-17 22:44:54 -04:00
johnnyq
f672991089 Remove Document Template field from a few more files 2025-06-17 19:09:43 -04:00
johnnyq
473fa2671d Migrate Document templates to its own table 2025-06-17 19:00:56 -04:00
johnnyq
85e1515080 Move Document Versions to a seperate table much more efficient and allow to reference same document using a link Note this update will delete previous document versions 2025-06-17 17:58:20 -04:00
johnnyq
84437a2732 Bump TCPDF from 6.9.4 to 6.10.0 and TinyMCE from 7.9.0 to 7.9.1 2025-06-17 14:44:06 -04:00
johnnyq
71911f418f Remove Unessesary Code 2025-06-17 14:32:35 -04:00
johnnyq
2741f78bd8 Fully Migrated Quote and Invoice to use TCPDF and elimiated PDFMake 2025-06-17 14:22:57 -04:00
johnnyq
012e54161a Converted PDF Invoice from PDFMake to TCPDF 2025-06-16 18:40:05 -04:00
johnnyq
409084c499 Update UI on Quote, Recurring Invoice and Guest views to match new optimized Invoice UI Layout 2025-06-16 15:49:38 -04:00
johnnyq
27595b2c4a UI Add Ticket to Invoice - Removed Warning about Draf Invoices increase modal size to large and move input to a row to reduce uneessary veritical space being occupied. 2025-06-16 13:13:48 -04:00
johnnyq
62b6535625 UI Invoice make footer text secondary color 2025-06-15 15:42:13 -04:00
johnnyq
e593f438b3 UI Work on Client Overview Increase Quick Notes and Recent Activities width and added contact photos or initials to important contacts 2025-06-15 15:36:54 -04:00
johnnyq
44d46a2cc5 UI Overhaul to invoice Details Page 2025-06-15 15:06:53 -04:00
johnnyq
66e30dd1a8 Added Badge Counts in Client Overview Section 2025-06-13 16:05:49 -04:00
johnnyq
4c74351d21 Added Company Tax ID Field and Option to Show Tax ID on Invoices 2025-06-13 15:51:09 -04:00
johnnyq
5d2b14259c Added Ticket Due Date basic functionality to tickets 2025-06-12 17:13:17 -04:00
johnnyq
878d5444e1 Use Gray Accent color when in client view and use configured theme for Global view, this will help differentiate the view that you are in 2025-06-12 15:00:47 -04:00
johnnyq
ec24ec60c6 Disable Ticket Auto Timer by default 2025-06-12 13:49:11 -04:00
johnnyq
9c096d1f65 Add Setting option to enable or disable ticket autotimer 2025-06-12 13:44:21 -04:00
johnnyq
dba3e895da UI/UX update in ticket details switch to full card stacks with edit icons for the stackable reference items on the right like asset watchers contact etc 2025-06-11 22:28:38 -04:00
johnnyq
07726322df Project Details: Add Bulk Actions to tickets and allow tickets to be sorted 2025-06-11 20:47:27 -04:00
johnnyq
bef18c0d72 Do not Resolved Tickets in Bulk that have Open tasks, display warning and count of ticket not resolved because of open tasks 2025-06-11 18:48:23 -04:00
johnnyq
7c3332570a Add Ticket Category UI for Recurring Tickets 2025-06-11 18:11:08 -04:00
johnnyq
a3d4a52188 Add Mark Sent when invoice is draft to Action Dropdown for invoice listings 2025-06-11 17:29:38 -04:00
johnnyq
5530e89f41 Add one more Non-Billable Check in invoices 2025-06-11 17:18:28 -04:00
johnnyq
a3554b3dfd Add one more Non-Billable Check in invoices 2025-06-11 17:16:03 -04:00
johnnyq
674da36cd1 Do Not calculate Non-Billable Invoices towards a clients balance Convert Add Payment Modal to AJAX and add it as an option from the invoice listing page 2025-06-11 17:12:37 -04:00
johnnyq
18ce12f60d Add Option if visiting a deleted invoice / recurring to return to the listing page and added delete to invoice details page 2025-06-11 15:57:52 -04:00
johnnyq
a462ab36f8 Ticket add / edit / builk sort categories alphabeticaly 2025-06-11 14:56:23 -04:00
Johnny
8aa41edc3e Merge pull request #1222 from itflow-org/functions-ip-addr-leftmost
Update how functions.php gets the remote IP address for logging
2025-06-11 14:01:12 -04:00
wrongecho
4e0252553a rm extra ; 2025-06-11 08:18:32 +01:00
johnnyq
8745d09890 Add sanitize the remaining uris that allow uri type:// refactored service details 2025-06-10 12:11:58 -04:00
wrongecho
ac3a02baea Disallow turning on login key without a secret 2025-06-10 09:19:29 +01:00
wrongecho
f2bbc170da Update how functions.php gets the remote IP address for logging
- Builds on PR #1210 to always get the leftmost IP address
- Cloudflare (HTTP_CF_CONNECTING_IP) must now be explicitly defined, otherwise people could add the HTTP_CF_CONNECTING_IP header to a non-Cloudflare host and spoof IPs
- Tidy up the if/else logic a little
2025-06-10 09:03:00 +01:00
johnnyq
d79a17adb0 Added sanitize_url function to strip out unsupported URI Schemas schema:// if not on the allow list it will show unsupport://URL 2025-06-09 20:28:10 -04:00
johnnyq
680dbb04ce Fix UI Regression with Indenting Columns in Tickets listing when Open and Closed tickets are filters 2025-06-09 13:30:13 -04:00
johnnyq
6c8403fa09 Move MFA Modal out of the Password Reset Form 2025-06-09 12:52:07 -04:00
johnnyq
fec8eaef70 Remove xml from the allowed upload list, if you must zip it up 2025-06-07 01:28:13 -04:00
johnnyq
5f007029b4 Fix Category 2025-06-07 00:58:56 -04:00
johnnyq
4e76ceaa0f Simplify Category filter logic in tickets catrgory is an int not a string duh 2025-06-07 00:46:11 -04:00
johnnyq
08e467baa9 Encode Page Title 2025-06-06 21:48:24 -04:00
Johnny
f78a2250f1 Merge pull request #1221 from itflow-org/develop
Develop to Master for 25.05.1 Release
2025-06-02 14:39:50 -04:00
johnnyq
84e8a459c8 update Changelog 2025-06-02 14:24:52 -04:00
johnnyq
b777f80249 Increment Minor Version and update Changelog 2025-06-02 14:19:04 -04:00
johnnyq
73da203dbb Added Cards for Account Balance, Recurring Monthly for Billing Contacts and Domains Expiring for Technical Contacts to Client Portal 2025-05-31 17:47:08 -04:00
johnnyq
55a31865d0 Updated Client Overview Entities to not show Archived client's Entities even though the entity may not be archived, also added Archive Searching to network and certificates also added unarchive capabilities to them as well 2025-05-30 16:15:12 -04:00
wrongecho
350697869b Fix invoice top banner not showing 2025-05-30 17:31:54 +01:00
Johnny
939b07422d Merge pull request #1220 from itflow-org/develop
Merge Develop into Master for 25.05 Release
2025-05-29 14:30:25 -04:00
wrongecho
88369d480a Reword changelog 2025-05-29 18:42:25 +01:00
wrongecho
cf083e94e6 Fix 2025-05-29 18:40:51 +01:00
wrongecho
11e8f5acfc Bump app version 2025-05-29 18:37:39 +01:00
wrongecho
77b3a89eb2 Reword changelog 2025-05-29 18:37:16 +01:00
johnnyq
f572f4265a Updated Changelog 2025-05-29 13:31:40 -04:00
johnnyq
0b66c8e1be Better naming of Indetity Providers instead of Integrations to make way for more Indentity Provider like Google and custom SSO for the future 2025-05-29 13:29:27 -04:00
johnnyq
a8328a3f56 Add more text-nowrap to more table headers 2025-05-29 11:45:45 -04:00
johnnyq
8b42b17121 Added more text no wrap to table headers 2025-05-29 00:18:37 -04:00
johnnyq
db418ce662 Mobile UI/UX - Hide long New Button names and use plus icon only in mobile view, proper form group spacing in mobile as well 2025-05-28 23:39:44 -04:00
johnnyq
96fe566e08 Add location country even when client id uri is not set 2025-05-28 22:03:55 -04:00
johnnyq
a00f26d8a4 UI/UX Draggables now switch to a hand on hover, updated the UI in invoice quote and reccuring invoice so buttons do not wrap and are grouped. Seperated the Dragable button using a button link, did the same for tasks in tickets 2025-05-28 21:22:21 -04:00
johnnyq
eeef63d1c3 Updated Changelog 2025-05-28 19:36:52 -04:00
johnnyq
0b88ea85ae Display Country in Invoices, Quotes, Recurring Invoices, Clients, locations, client top head, and allow searching via country in Locations and Clients 2025-05-28 19:27:11 -04:00
johnnyq
c564118156 Fix Dupe GET VARS in tickets Removed extra Rebuild URL as this has been done in the filter header for some time now 2025-05-28 18:34:50 -04:00
johnnyq
01a7dc2068 Allow both Client and Contact to be sorted in same column in ticket list 2025-05-28 18:29:02 -04:00
johnnyq
bb44ecec3f Trips UI/UX - Move Client at the end column for consistency 2025-05-28 18:13:44 -04:00
johnnyq
b7b24d7de6 UI/UX Expenses - Combined Category and Description Column with secondary text seperation and expanded Truncation of Description from 50 chars to 60 chars 2025-05-28 18:08:08 -04:00
johnnyq
dcca93e34f Only show 8 notifications at a time instead of 10 2025-05-28 17:43:03 -04:00
johnnyq
4124188505 Ticket UI/UX allow the ticket toolbar to be a little more Mobile friendly 2025-05-28 17:39:32 -04:00
johnnyq
eb5d59623b Don't show Checkbox columns when ticket is closed, compact ticket list now matches round pills for status and priority 2025-05-28 17:02:50 -04:00
Marcus Hill
8631c06731 Stripe - Remove the locally stored payment identifiers (expiry/last 4) from the database when the client removes the stripe pm 2025-05-27 19:29:03 +01:00
Marcus Hill
40eb40fd86 Cron mail queue - fix $config_smtp_encryption being set to None in IF statement 2025-05-27 14:46:50 +01:00
Marcus Hill
c486682a0e Cron mail queue - fix app_log_type not being one of available enums 2025-05-27 14:05:09 +01:00
Marcus Hill
336da073f1 Admin mail settings
- Disable the IMAP test button as it doesn't work yet
- Remove word 'successfully' when testing SMTP as we're only adding the message to the queue, it wasn't sent yet
2025-05-27 14:00:25 +01:00
Marcus Hill
d2e187a239 Update security supported versions 2025-05-26 20:34:01 +01:00
johnnyq
f69de29353 Get a more accurate count of Tables rows in Debug using count instead of relying on show table status as this is not accurate all the time. 2025-05-24 13:45:27 -04:00
johnnyq
61de8bc792 Redirect to login when itflow restore completes 2025-05-24 13:30:49 -04:00
johnnyq
d31f19707b DB Dump 2025-05-24 13:23:41 -04:00
johnnyq
811312466f If Restore from Backup is chosen show message must configure database first if DB and config dont exist 2025-05-24 13:09:16 -04:00
johnnyq
5ecfb3e962 Update setup to include welcome as an option and do not hide the side nav items if db is already created. 2025-05-24 12:40:33 -04:00
johnnyq
77be5af4e5 Update setup to include restore option but place it in its own nav section for seperation. Also if DB and config is configured skip and do not show checks or database in the side nav 2025-05-24 12:28:34 -04:00
johnnyq
c512a716d2 Fix extra spacing in modal footer in notifications 2025-05-23 19:09:36 -04:00
johnnyq
14f5630caf Fix Invoice Header Button 2025-05-23 18:34:25 -04:00
johnnyq
8532bdc172 More UI updates to Guest Pay 2025-05-23 18:25:09 -04:00
johnnyq
9d74bf8e19 Use cards in Guest Pay Invoice 2025-05-23 17:45:06 -04:00
johnnyq
f75445b4d0 Limit Stripe Payments to just Credit Cards 2025-05-23 17:18:22 -04:00
johnnyq
e04fa1b696 Add stripe_pm_created_at 2025-05-23 17:13:05 -04:00
johnnyq
e07dfb5f67 db structure 2025-05-23 15:42:47 -04:00
johnnyq
3d1af05fc2 Updated DB to store Payment details 2025-05-23 15:41:52 -04:00
johnnyq
0e38925d74 Update Changelog 2025-05-22 18:00:08 -04:00
johnnyq
c0f3343412 Client Portal Add Recurrung Invoices with option to Enable or Disable Auto Pay per recurring Invoice if Stripe is enabled and Client has a payment method. Also when removing saved auto payment methods delete all recurring payments for that client that are Stripe method also added this to the admin settings 2025-05-22 17:58:51 -04:00
johnnyq
6a368840fa Bump stripe-php from 16.4.0 to 17.2.1 2025-05-22 12:37:35 -04:00
johnnyq
5361391b3b Update changelog with the bumps 2025-05-22 12:24:49 -04:00
johnnyq
b80662bb24 Bump FullCalendar from 6.1.15 to 6.1.17 2025-05-22 12:16:16 -04:00
johnnyq
4c272b6b8d Bump DataTables from 2.2.2 to 2.3.1 2025-05-22 12:08:47 -04:00
johnnyq
96abdef3ad Bump TCPDF from 6.8.2 to 6.9.4 2025-05-22 12:04:48 -04:00
johnnyq
0b04bc79e9 Bump tinyMCE from 7.7.1 to 7.9.0 2025-05-22 11:57:54 -04:00
johnnyq
cefbbdc3a8 Bump phpMailer from 6.9.2 to 6.10.0 2025-05-22 11:46:09 -04:00
johnnyq
83ffe05a99 Update Changelog 2025-05-22 11:38:24 -04:00
johnnyq
b6f73083ef SMTP Option Encryption None now works as intended 2025-05-22 11:37:14 -04:00
johnnyq
693736023e Update changelog 2025-05-21 21:02:55 -04:00
johnnyq
fed87c93ab Migrated contact link models to the new ajax models this fixes the issue of the overlapping var contact_name and improves page load and performance in contact details 2025-05-21 12:18:42 -04:00
johnnyq
f53b77b556 Migrated asset link models to the new ajax models this fixes the issue of the overlapping var asset_name and improves page load and performance in asset details 2025-05-21 11:51:18 -04:00
wrongecho
b858d82b0b Show archived categories properly 2025-05-20 14:51:12 +01:00
wrongecho
ccb2af6d17 Fix category name/type logging when archiving/deleting a category 2025-05-20 14:50:27 +01:00
wrongecho
8d937ac8f5 Fix add asset modal icon not showing 2025-05-20 11:39:35 +01:00
wrongecho
2786fb65ed Don't show archived ticket categories in the tickets.php filter options 2025-05-20 11:39:09 +01:00
wrongecho
025532f579 Fix quote top navbar options not showing following perms work 2025-05-20 11:29:26 +01:00
wrongecho
5bd03be1ad Ticket tasks - set maxlength html attribute 2025-05-14 16:05:43 +01:00
wrongecho
40086f1ce0 Quotes / Invoicing - More role/perms enforcement 2025-05-14 11:07:25 +01:00
wrongecho
be66ad9a4c Quotes / Invoicing
- Ability to manually mark a quote as invoiced (weird css fix for this, we can remove the custom css if we make the parent button just a dropdown, but don't want to introduce extra clicks)
- When converting a quote to an invoice, show the new invoice number in the quote history
- Quotes can now be sent from the main Send dropdown, instead of having to use the send button in the options menu / main quotes.php page
2025-05-14 10:41:32 +01:00
Marcus Hill
0df5c01bb7 Project - Require CSRF token to delete a project 2025-05-11 12:25:13 +01:00
Marcus Hill
b85fa38b67 Project - Show client abbreviation in open ticket link modal 2025-05-11 12:19:34 +01:00
Marcus Hill
546246d7c5 Project - Allow editing client after creation 2025-05-11 12:14:20 +01:00
Marcus Hill
d5536e78f4 Ajax contacts - Enforce client access restrictions when getting client contacts 2025-05-11 12:01:23 +01:00
Marcus Hill
908738b7ca Ajax active clients - enforce client access restrictions (e.g. when changing ticket client) 2025-05-11 11:57:16 +01:00
Marcus Hill
797e02bffa Hide Credentials in side nav if no perms to view 2025-05-11 11:48:47 +01:00
Marcus Hill
d856685782 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-05-11 11:46:00 +01:00
Marcus Hill
1400983d8c Projects/Tickets
- Hide new project button for users that only have support read access
- Hide new ticket button for users that only have support read access
- Enforce client access restrictions for viewing project details based off project client
- Prevent selecting the 'Select tickets' text when linking ticket
2025-05-11 11:45:47 +01:00
johnnyq
2a43c5d868 Remove DB Check 2025-05-08 16:46:25 -04:00
johnnyq
a67675c649 Remove 500 Records per page option to reduce Resource strain, 100 records per page is max 2025-05-08 16:08:28 -04:00
johnnyq
fc344ef636 add notification paging 2025-05-07 19:23:11 -04:00
johnnyq
2ffb2be083 Update the backup code to be a full backup zip file download of uploads and db dump along with version meta data file. Also allow to restore a single file in setup currently hidden 2025-05-07 15:37:57 -04:00
johnnyq
069772f27d Add Upload uploads.zip file to restore files as well 2025-05-07 14:54:25 -04:00
johnnyq
241ec50802 Add hidden option to restore dumped ITFlow Database during Setup 2025-05-07 14:32:51 -04:00
johnnyq
b943c9cd89 Remove Influencer as a referral 2025-05-06 19:50:51 -04:00
johnnyq
80625f8c3f Remove Unused vars in setup, added jpeg to the allow extension for user avatars 2025-05-06 19:36:31 -04:00
johnnyq
58435d3460 Add Next Button if Database is already configured 2025-05-06 17:18:54 -04:00
johnnyq
7a7ac4a47f Fix Edit Blank Recurring ticket in Asset Details 2025-05-06 13:16:56 -04:00
Marcus Hill
429dfa5ca4 Allow file upload extensions: .bat, .stk 2025-05-04 21:38:11 +01:00
wrongecho
e1f212d30d Start recording ticket source (API, Email, Portal, Agent) 2025-04-28 14:51:38 +01:00
wrongecho
670450bcfb Ticket statuses - Allow ordering from admin settings, this can replace the need to move the Kanban columns 2025-04-23 10:22:33 +01:00
Johnny
83e15e9e4a Merge pull request #1216 from itflow-org/develop
Develop to Master 25.03.6
2025-04-21 17:28:14 -04:00
johnnyq
b309081d75 Allow to search by project reference number 2025-04-21 17:16:35 -04:00
johnnyq
f1a7b35aa6 Update Changelog and App Version fix date to 2025-04-21 17:00:32 -04:00
Marcus Hill
469c5ef06d Update client pdf export
- Fix HTML formatting for the cover div, other div styling is still broken
- Adjust layout of cover info and add MSP logo
- Add software purchase and expiry dates
2025-04-19 16:30:00 +01:00
Marcus Hill
07cbe561bd Add stupidly bigger update warning to update page. Add reminder note to check ITFlow backup (one in every ten page loads) 2025-04-19 15:14:40 +01:00
Johnny
b69a70cfc3 Merge pull request #1213 from itflow-org/develop
Develop to Master - 25.03.5 Release
2025-04-18 19:08:18 -04:00
johnnyq
923001928c Update Changelog and version 2025-04-18 18:08:40 -04:00
johnnyq
75ed461c67 Asset and Contact Links now goto the details page instead of the details modal 2025-04-16 18:51:53 -04:00
johnnyq
691aebce91 Revert Fix 2025-04-13 15:15:18 -04:00
johnnyq
846947ff49 Change the button handlebar class 2025-04-13 15:11:37 -04:00
johnnyq
65e107d154 Totally remove Dragula in Favor of the modern SortableJS library, updated the Kanban 2025-04-13 15:01:52 -04:00
johnnyq
19b809b699 Added SortableJS Library, and updated Invoice, Quote and Recurring to use it. Added Grab Bar Icons next to action buttons. Will now sort in Mobile much more efficiently, update ajax vars for recurring invoice 2025-04-13 13:29:16 -04:00
johnnyq
60fe02bb47 Comment 2025-04-13 11:57:26 -04:00
johnnyq
3e708059c6 Fix not showing File folders instead of Document Folders when creating a document. 2025-04-13 11:55:14 -04:00
johnnyq
424104bb66 Default Date between max date to 9999-12-31 instead of current date for filtered listings, this fixes the issue if you post date an entity it would not show in the listing by default unless you selected a a great to date in the filter 2025-04-12 12:08:30 -04:00
johnnyq
62696b9ebe Fix Mobile Country Code in contact list 2025-04-12 11:58:32 -04:00
Johnny
87403e8c2d Merge pull request #1209 from itflow-org/index-redirect
Redirect the blank index page to the start page
2025-04-12 11:54:05 -04:00
wrongecho
7a5a607ff6 Redirect the blank index page to the start page 2025-04-11 14:53:02 +01:00
wrongecho
a195774726 Update README.md
Add JetBrains to sponsors, as they provide FOSS licenses of PhpStorm to us
2025-04-11 14:31:01 +01:00
johnnyq
8d0da7b55b Fix Entity Linking in Asset and contact details 2025-04-09 14:00:51 -04:00
Johnny
58c315cd09 Merge pull request #1207 from TamirSlo/fix-dashboard-db-update-1-9-7
Fix Dashboard following DB Update 1.9.7
2025-04-08 17:00:40 -04:00
Johnny
dd6c4602db Merge pull request #1194 from ssteeltm/develop
fix: missing kanban ticket settings
2025-04-08 16:59:07 -04:00
Tamir Slobodskoy
d413e0c8ff Fix Copy Trip Modal 2025-04-08 05:27:56 +01:00
Tamir Slobodskoy
b356658635 Fix Dashboard following DB Update 1.9.7 2025-04-08 05:02:46 +01:00
Johnny
d92f0fc49b Merge pull request #1206 from itflow-org/develop
Develop to Master for 25.03.4 Release
2025-04-07 13:31:20 -04:00
johnnyq
f206a28cf7 Update Changelog and App version to 25.03.4 2025-04-07 13:07:03 -04:00
johnnyq
70cb0ac635 Add the ability to remove additional assets from the ticket details screen 2025-04-07 12:58:55 -04:00
johnnyq
a0ece18876 Allow to remove additional assets in a ticket 2025-04-07 11:59:56 -04:00
wrongecho
4a22b03952 Global search - assets
When global search returns an asset, include a hyperlink to the asset details as part of the asset name
2025-04-04 15:12:32 +01:00
wrongecho
5ebf797c90 rm asset_mac - no longer in assets table 2025-04-04 15:08:04 +01:00
wrongecho
a20759f1f2 rm asset_mac - no longer in assets table 2025-04-04 15:07:47 +01:00
wrongecho
c273cab36e Portal - View all ticket bugfix
View all tickets should display the ticket_number rather than the database ID
2025-04-04 14:50:36 +01:00
johnnyq
8306a04eda Add Purchase Reference to Copy Asset 2025-04-03 15:07:56 -04:00
johnnyq
f078203136 Fix Database Export, was not properly exporting utf8, html data and such. Also disable foreign key contraint check in the export then renable it in the end. This fixes the issue with importing the database into phpmyadmin or using the mysql command 2025-04-03 15:01:47 -04:00
johnnyq
15e89c3c4e Fix Bulk Assign ticket to only show ITflow users and not client users 2025-04-01 17:23:44 -04:00
Johnny
595c4f1440 Merge pull request #1205 from itflow-org/develop
Develop to Master for 25.03.3 release
2025-04-01 11:45:41 -04:00
johnnyq
91a523dc23 Update Changelog 2025-04-01 11:40:24 -04:00
johnnyq
8567c97c09 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-04-01 11:33:16 -04:00
johnnyq
3621e99c61 Update Changelog and app version 2025-04-01 11:33:04 -04:00
Johnny
d99b9cbe68 Merge pull request #1204 from itflow-org/fix-assign2
Ticket assign
2025-04-01 10:56:56 -04:00
Johnny
e319768fd3 Merge pull request #1203 from itflow-org/fix-bulk-assign
Tickets - Fix bulk assign
2025-04-01 10:56:27 -04:00
Johnny
c30ffcf096 Merge pull request #1202 from itflow-org/user-activity
User activity
2025-04-01 10:55:17 -04:00
wrongecho
7286248fef Ticket assign
Remove the role check altogether, its the old way of doing the roles anyway
2025-04-01 09:12:24 +01:00
wrongecho
dc49f80cc3 Tickets - Fix bulk assign
Fix bulk assigning tickets to agents
2025-04-01 09:03:33 +01:00
wrongecho
1ae2da8054 User activity
Hide the See More button if the user can't actually access the logs due to not being an admin
2025-04-01 08:46:22 +01:00
johnnyq
090f4cb560 Fix adding location phone extension when addign a client 2025-03-31 19:33:07 -04:00
johnnyq
0914716b8e Allow user to redact client replied tickets 2025-03-31 18:42:56 -04:00
johnnyq
ab463c1773 Tidy Phone Country code add + placeholder 2025-03-31 17:30:33 -04:00
johnnyq
36af4d11fc Few more phone fixes 2025-03-31 16:52:47 -04:00
johnnyq
14d8dc6fa6 Fix php errors thrown when formatPhone is blank 2025-03-31 16:35:36 -04:00
johnnyq
2032b48ad3 DB Update Set Country codes to default to NULL and not 1 Nullify all current country codes 2025-03-31 12:06:36 -04:00
Johnny
2af795f548 Merge pull request #1201 from itflow-org/fix-users
Fix users
2025-03-31 11:22:47 -04:00
Johnny
7b4edb2948 Merge pull request #1200 from itflow-org/recurring-invoices
Recurring invoices
2025-03-31 11:22:30 -04:00
wrongecho
17a906fd03 Users bugfixes
- Fix syntax error when adding user, thanks @fleetlognorge
- Fix old reference to scheduled_tickets
2025-03-31 08:35:42 +01:00
wrongecho
af46a1fd96 Fix syntax error when adding user, thanks @fleetlognorge 2025-03-31 08:32:14 +01:00
wrongecho
393c0b8c11 Recurring invoices
- Fix the delete link
- Cron should only flag recurring invoices that with a next-run in the past if the recurring invoice is active
2025-03-31 08:28:22 +01:00
johnnyq
e92f2f714d Fix Ticket Assign to 2025-03-30 20:48:12 -04:00
johnnyq
42606067c0 If no country code is entered display the number only no spaces hyphens or perenthesis 2025-03-30 12:22:43 -04:00
johnnyq
98bb65509d Fix setting country code in company details 2025-03-30 11:45:27 -04:00
johnnyq
a2599e5d43 Fix network location edit 2025-03-30 02:14:06 -04:00
Johnny
0390b1bc2a Merge pull request #1198 from itflow-org/develop
Develop to Master
2025-03-29 18:23:37 -04:00
johnnyq
531f3ec741 Update app version and changelog 2025-03-29 18:18:52 -04:00
johnnyq
127afdca0d DB.sql revert 2 2025-03-29 18:16:25 -04:00
johnnyq
c4df5bf988 DB.sql revert 2025-03-29 18:12:32 -04:00
Johnny
30234e044d Merge pull request #1197 from itflow-org/develop
Merge Develop into Master
2025-03-29 17:47:08 -04:00
johnnyq
1e98ee8916 Update app version and Changelog hotfix 2025-03-29 17:43:00 -04:00
johnnyq
d5665c2577 Update db.sql to match the mediumtext of the updates 2025-03-29 17:35:53 -04:00
johnnyq
762ec51a19 Fix issue with missing phone numbers 2025-03-29 16:41:40 -04:00
johnnyq
309ad724ec Fix client export to only show licnesed software by the selected client only 2025-03-29 16:22:48 -04:00
Johnny
34397fe468 Merge pull request #1196 from itflow-org/develop
Merge Develop into Master
2025-03-29 15:51:47 -04:00
johnnyq
2f82647f5e One more chnagelog update 2025-03-29 15:35:40 -04:00
johnnyq
7d7854424c Refined and updated changelog 2025-03-28 13:15:33 -04:00
johnnyq
eaeadbe933 Fix users list 2025-03-28 12:01:39 -04:00
johnnyq
cf3f0cee6c Revert Users listing 2025-03-28 11:48:23 -04:00
ssteeltm
a5f7b7fa9c fix: missing kanban ticket settings 2025-03-28 12:00:48 -03:00
johnnyq
9f7c289e94 Fix AI Promps 2025-03-27 22:25:01 -04:00
johnnyq
c2bba7a919 Allow to close a project with resolved tickets 2025-03-27 14:21:56 -04:00
johnnyq
4bb37a7198 Removed absent task_description var from projects 2025-03-27 13:41:15 -04:00
johnnyq
231694aabe Fix Invoice Vars in ticket, return empty string instead of null for getFieldByID() 2025-03-27 13:38:22 -04:00
johnnyq
2fb75e6d67 Uncommented out temp comment check cli runtime 2025-03-27 12:40:43 -04:00
Johnny
810af638a3 Merge pull request #1193 from itflow-org/cron-recurring-notify
Recurring items with next-run dates in the past
2025-03-27 12:39:27 -04:00
johnnyq
9223b8cfb1 Fixed some renamed vars 2025-03-27 12:29:55 -04:00
wrongecho
b7df21a663 Notify if a recurring ticket, invoice or expense has a next run date in the past - it needs to be manually adjusted for cron to pick it up again. Also, bugfix bulk recurring ticket delete. 2025-03-27 16:29:39 +00:00
johnnyq
7d47ed4dbd Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-03-27 12:01:24 -04:00
johnnyq
65eaf92862 Fixed a few debug errors where client was not checked to see if it was set in some of the create modals, replaced old url_query_strings_sb var to the correct new var url_query_strings_sort. 2025-03-27 12:01:10 -04:00
wrongecho
8a01bc0d7d Recurring ticket - remove rogue 's' from 'Contact' tab 2025-03-27 15:54:10 +00:00
Johnny
1a8a3781dc Merge pull request #1192 from itflow-org/certs-exp-colours
Certificates page and sidebar - colours/badges
2025-03-27 11:39:49 -04:00
wrongecho
eadfdc41c4 Tickets api - allow setting the billable status when creating a ticket 2025-03-27 14:45:44 +00:00
wrongecho
421abd4c5b Tickets api - bugfix 500 error 2025-03-27 14:34:36 +00:00
wrongecho
ae1a0dcc73 Certificates page and sidebar - Only show yellow on certificates 7 days (blanket, not just for LE) 2025-03-27 12:27:08 +00:00
johnnyq
63b8804e2d Migrated client pdf export to TCPDF from pdfMake 2025-03-26 21:13:00 -04:00
johnnyq
634afcc089 Added TCPDF for PDFs and allow document export to PDF 2025-03-26 19:35:27 -04:00
johnnyq
90f5c8ad57 Simplify getFallBack function to just fallback on - instead N/A 2025-03-26 18:39:45 -04:00
johnnyq
12fd45c144 Dont include Archived Assets, contacts or software is the software license export report 2025-03-26 18:28:33 -04:00
johnnyq
382258a27c Add User and Asset Assigned Licenses to Client PDF Export 2025-03-26 18:17:45 -04:00
johnnyq
b5fa8ab4de Added Search by client Abbreviation to client and global search 2025-03-26 17:56:40 -04:00
johnnyq
bbb0db2f4f Update Changelog 2025-03-26 17:53:33 -04:00
johnnyq
5b89e3dbee Add Phone Country code in even more places 2025-03-26 14:04:47 -04:00
johnnyq
07b29a7bdc Add Phone Country code in more places for proper phone number formatting 2025-03-26 13:36:56 -04:00
johnnyq
3286343026 Update DB to remove phone_mask 2025-03-26 11:14:05 -04:00
johnnyq
6a26b611fa Remove Phone Masking option in favor of Country Codes 2025-03-26 11:10:51 -04:00
johnnyq
218fd2dcdc Update formatPhoneNumber php function to include other country formatting, updated phone inputs to incoude country code 2025-03-25 18:45:24 -04:00
johnnyq
4c85db5e49 Remove legacy redact function in favor of tinymce integration redact 2025-03-24 13:22:41 -04:00
johnnyq
85ae42190a Feature: Added User Signature preferences, currently appends signature to ticket replies / comments 2025-03-24 12:49:47 -04:00
johnnyq
df8a755462 Wrap a wait before the DOM is loaded before loading anything calling anything in app.js 2025-03-23 18:08:14 -04:00
johnnyq
53713a0318 Add back batch payment when in client view for invoices 2025-03-22 21:01:55 -04:00
johnnyq
61aa477cbf Fix Tags 2025-03-22 20:49:37 -04:00
johnnyq
c2adb92d28 Rework tag filter a bit to use array_map instead of looping through the get vars, update string wording to tag_filter and only show tags in the tag filter that are relatd to an entity and also include tags in the get var fixes 2025-03-22 18:32:56 -04:00
johnnyq
19b2b08eac Update locations filter to still include the a location that is not assigned to an entity if present in the url this fixes the issue where for example in client contact you select a location to filter only 1 contact is shown you goto edit the contacts location then submit it pushes you back with no results and all locations is present but in the uri the old location is still present 2025-03-22 15:49:35 -04:00
johnnyq
504346256f Only show locations if an entity references the locations. Previously, all locations were listed in the location filter, even if no entites were assigned to them. 2025-03-22 15:16:53 -04:00
johnnyq
34e92d2223 Update Tags filter to only show tags available 2025-03-22 14:55:13 -04:00
johnnyq
573953704c Limit Client Selection to clients that have an emtity in client filters 2025-03-22 14:11:27 -04:00
johnnyq
0b9f10985d Add Client Select Filters the remaining entities also when creating an entity auto select the client based off the the client selected in the client dropdown filter 2025-03-22 13:50:03 -04:00
johnnyq
8e3dd42a32 Allow start interface to be named 0 2025-03-21 21:54:55 -04:00
johnnyq
0647933df7 Added JS Library to handle Country based Phone formatting inputs intl-tel-input 2025-03-21 12:59:56 -04:00
johnnyq
93f4da3962 Added Phone Country Code fields defaulting to +1 for US will add logic in code later for phone number formatting 2025-03-21 12:48:00 -04:00
johnnyq
f72351ea88 UI tidy 2025-03-21 11:58:16 -04:00
johnnyq
d3c4c8c846 Comment Query 2025-03-20 18:18:33 -04:00
johnnyq
cf047024a1 Add Projects to client side nav and seperated the logic between client and global view of projects 2025-03-20 18:17:26 -04:00
johnnyq
ad3ed68932 Add the ability to Create a ticket inside a project then auto assign it to the project 2025-03-20 17:05:47 -04:00
Johnny
62b8ee9d30 Merge pull request #1190 from itflow-org/cron-certificate-notifs
Cron certificate notifs
2025-03-20 13:51:35 -04:00
johnnyq
eedd92c894 Fix creating a ticket and selecting a template it would use template name instead of the subject for the ticket 2025-03-20 13:47:11 -04:00
johnnyq
622d5e5a44 Delete unused add asset ajax modal 2025-03-20 13:00:51 -04:00
johnnyq
475d653979 You can now upload and create documents, credentials in contact and asset details sections 2025-03-20 12:58:00 -04:00
johnnyq
19a6f8f422 Use nearest text area instead of a static ID for AI rewording, started adding entity creations in contact details and auto selecting the contact when in contact details page 2025-03-20 11:39:50 -04:00
wrongecho
e69d69760d Cron - Only notify on certificates expiring in 45 days if they are valid for longer than 90 (i.e. not LE) 2025-03-20 13:53:53 +00:00
johnnyq
06de349fac Expanded the Redact tool into ticket details area, generalized it to allow redaction in other areas as well 2025-03-19 15:35:02 -04:00
johnnyq
c3ec83f640 Updated changelog also added redact to open tickets 2025-03-19 13:20:55 -04:00
wrongecho
37c20e4e0d Hyperlink the report_time_by_tech report. Need to add a monthly version. 2025-03-19 14:07:07 +00:00
wrongecho
400ba5bb20 Started changelog 2025-03-19 14:02:30 +00:00
wrongecho
a1ea5214a9 Sonarcloud fixes 2025-03-19 13:54:15 +00:00
wrongecho
aae633c4ac Merge pull request #1189 from itflow-org/ticket-redaction
Add ticket redaction feature
2025-03-19 13:53:15 +00:00
johnnyq
ec8d7a36a8 Only store optimized WebP images, so only 1 image is stored and used for thumnails and viewing, removed fields has_preview and has_thumbnail as these are no longer needed, fixed issue when optimizing portrait images the bottom half would get cropped out 2025-03-18 16:48:05 -04:00
wrongecho
21dc26b06f Merge branch 'develop' into ticket-redaction 2025-03-18 09:42:29 +00:00
wrongecho
6a8d2cf1d4 Add ticket redaction feature 2025-03-18 09:40:39 +00:00
johnnyq
b803ba4c55 Use MD5 hashing instead of SHA256 on file uploads which is way faster and still provides a unique file reference 2025-03-17 15:10:39 -04:00
johnnyq
4378fc2719 Removed redundant hash field from files table as the reference already stores this value 2025-03-17 14:59:37 -04:00
johnnyq
244e1290b4 Convert service_domains to use InnoDB instead of MyISAM 2025-03-15 18:35:21 -04:00
johnnyq
5a64bd3a32 Ensure all Tables and fields use CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci 2025-03-15 18:28:48 -04:00
johnnyq
cc0b2126ba Removed most Associated deletions when deleting a client as most of this is performed through SQL now using cascade deleting 2025-03-14 19:45:59 -04:00
johnnyq
97f92e508e Remove Associated Deletions as these are handled by the database cascade deletions 2025-03-14 18:37:56 -04:00
johnnyq
09fbe4e4ad Update more multi to multi link tables to use cascading delete and foreign key relation 2025-03-14 18:18:44 -04:00
johnnyq
508af6a80f Fix some Database update logic 2025-03-14 17:15:10 -04:00
johnnyq
073f816dbd Do not allow cascade deletion for rack devices as this table is optional to reference an asset and will cause issues when adding a devoce without a selected asset 2025-03-14 15:33:00 -04:00
johnnyq
bf327afd19 Bump DataTables from 2.2.1 to 2.2.2 2025-03-14 13:35:48 -04:00
johnnyq
8fb8ce319e Added copy to clipboard for contact and asset ajax modal credentials fixed issue with clipboard because jquery ui was declared last mved it up 2025-03-14 13:28:00 -04:00
johnnyq
eabfef22be Turned caching back on for Ajax Modals Function Fix some PHP Error, update credential vars in assets and contacts 2025-03-14 12:31:18 -04:00
johnnyq
06c31e0808 Update Asset reference SQL Tables to use Foreign keys and cascading delete, and remove orphaned data from the foreign tables to prevent integrity errors during update 2025-03-13 21:35:39 -04:00
johnnyq
509fb5cfed Bump TinyMCE from 7.6.1 to 7.7.1 2025-03-13 19:41:21 -04:00
johnnyq
f1aa66119a Update pointers to the includes folder 2025-03-13 18:12:18 -04:00
johnnyq
7150b1545a Moved files check_login.php, get_settings.php, settings_localization_array.php, inc_set_timezone.php into the includes folder, we also moved /client/check_login.php into client/includes/ 2025-03-13 17:55:31 -04:00
johnnyq
59bbbe4a8d Removed Patch panel tables as they share similarities with assets and assets interfaces, rename events to calendar events and event attendees to calendar even attendees 2025-03-13 16:34:38 -04:00
johnnyq
f64641cfdd Fix regression OTP in guest view item 2025-03-12 23:03:28 -04:00
johnnyq
f1783a6110 update credential model 2025-03-12 22:35:13 -04:00
johnnyq
c8c1155c9c Update the API for the new cred var names 2025-03-12 22:33:06 -04:00
johnnyq
338a08da6c Fix credential vars in Services post 2025-03-12 22:10:48 -04:00
johnnyq
15aed891f4 Fix credential vars in Services 2025-03-12 22:04:55 -04:00
johnnyq
c1c54780cb Update client export pdf for new table field names 2025-03-12 21:39:47 -04:00
johnnyq
e93704bbdb Completely renamed everything login to credential including tables added cascading deletion to the multi to multi tables 2025-03-12 21:28:50 -04:00
johnnyq
c0db914213 Added Recurring Ticket Reference to Tickets 2025-03-12 13:56:36 -04:00
johnnyq
b78e31e518 Fix Recurring Income by Client Report with the updated recurring invoice vars 2025-03-12 11:36:51 -04:00
johnnyq
2533f0ced1 Fix Create Auto Payment after renaming recurring to recurring invoices 2025-03-11 22:54:44 -04:00
johnnyq
c7f4e48a27 A Few more places to update recurring invoice vars 2025-03-11 22:38:13 -04:00
johnnyq
87c1a95b06 Few more places for recurring invoice vars 2025-03-11 22:26:52 -04:00
johnnyq
4efb39358a Missed recurring_invoice details and fixes up a few other places for recurring invoice vars 2025-03-11 22:24:19 -04:00
johnnyq
619b93a545 Renamed Recurring to recurring_invoices updated a large portion of code, and updated many other fields to reflect recurring_invoice and not just recurring 2025-03-11 22:08:37 -04:00
johnnyq
a0598997d7 Update Recurring Tickets in a few more places 2025-03-11 19:55:08 -04:00
johnnyq
d0b8095bba Feature: Added additional assets to Recurring Tickets as well 2025-03-11 19:36:39 -04:00
johnnyq
daab1bca3d Rename the remain items from Scheduled Tickets to Recurring Tickets 2025-03-11 18:32:24 -04:00
johnnyq
a0a2fddd90 Feature: Additonal Assets can now be assigned to a single Ticket 2025-03-11 17:41:40 -04:00
johnnyq
f61c30bd5a Started work on additional assets per ticket, added table ticket_assets, Fixed Legacy Check User Role Functions 2025-03-11 15:10:23 -04:00
johnnyq
4921d1eb19 More Work on Client Users section, added User Icon Indicator in contact if a user account exists 2025-03-11 13:59:01 -04:00
johnnyq
28c8b1a6da Fix missing attachments on ticket replies via the ticket email parser 2025-03-10 19:17:40 -04:00
johnnyq
3f0a6df717 Organize color theme settings into similar color rows 2025-03-10 18:46:08 -04:00
johnnyq
07c8398e0d Update user_roles naming in setup and setup_cli 2025-03-10 18:06:47 -04:00
johnnyq
82c7a64a25 Added Bulk Delete Asset Functionality and also deleted more asset reference tables as we are not using cascade delete yet 2025-03-10 17:35:16 -04:00
johnnyq
164a6a5604 Started Standard user view and client user view in users 2025-03-10 16:51:10 -04:00
johnnyq
9b6ea851e7 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 2025-03-10 15:57:16 -04:00
johnnyq
3804e18e53 When cron or manually generating invoice from a Recurring Invoice insert referencing recurring Invoice ID into the invoice 2025-03-10 12:34:31 -04:00
johnnyq
244a47efad Added Recurring Invoice Reference ID to Invoices and Product ID reference to Invoice Items 2025-03-10 12:26:14 -04:00
Johnny
89e59b2448 Merge pull request #1184 from itflow-org/tck-time-by-tech
Add work/time by technician report
2025-03-09 12:31:34 -04:00
Johnny
bf9c2f6de7 Merge pull request #1182 from itflow-org/tck-fr-at
Add database field for ticket_first_response_at.
2025-03-09 12:31:07 -04:00
Johnny
ff80a3db3f Merge pull request #1186 from itflow-org/develop
v25.02.4 - Stable Minor Release
2025-03-08 18:11:38 -05:00
johnnyq
c7d00d7b0d Fixed Changelog 2025-03-08 17:53:20 -05:00
johnnyq
1c6e74b08e Update Changelog put back the missing parts for 25.02.3 2025-03-08 17:40:36 -05:00
johnnyq
f8d054f8aa Bump minor version and update the Changelog 2025-03-08 17:25:10 -05:00
wrongecho
e5dc50ec35 Add time by technician report 2025-03-07 22:57:18 +00:00
johnnyq
e0dfaf2d22 Fixed a few var errors in ajax contact details 2025-03-07 16:58:52 -05:00
johnnyq
757a62c35b Fix Ticket Count under contact listing 2025-03-07 16:44:38 -05:00
johnnyq
52a62fc23c Fix Client URL in recurring Invoices 2025-03-07 14:47:47 -05:00
wrongecho
44b70d7161 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 2025-03-07 13:28:35 +00:00
johnnyq
ad9e4b4fb4 Added new php function to retrieve and escape a single record from a specified table using an id getFieldById(table, id, field_to_retrieve, escape_method) escape method defaults to SQL but html and json and int can be specified 2025-03-04 13:45:21 -05:00
johnnyq
4fdd5ae769 Fix Bug adding software license if no vendor is selected 2025-03-04 00:13:21 -05:00
Johnny
9f2b9e3b3e Merge pull request #1181 from itflow-org/develop
v25.02.3 - Stable Minor Release
2025-03-03 15:57:26 -05:00
johnnyq
2c074e9dc4 Spelling 2025-03-03 15:55:01 -05:00
johnnyq
0fad31d683 Update changelog new minor release 2025-03-03 15:53:58 -05:00
johnnyq
b154930a4c Fix Notifications 2025-03-03 15:36:32 -05:00
Johnny
359b04e7d1 Merge pull request #1180 from itflow-org/develop
v25.02.2 Maint / Small Feature Release
2025-03-03 15:22:57 -05:00
johnnyq
cc00e3bf75 Add Periods to the changelog 2025-03-03 15:19:18 -05:00
johnnyq
0454685039 Update Changelog 2025-03-03 15:09:40 -05:00
johnnyq
b5eb325c5e Fix Dismissed Notification Search Filter 2025-03-03 15:00:33 -05:00
johnnyq
ed6276a3e4 Add Active Inactive filter to recurring invoices 2025-03-03 14:56:04 -05:00
johnnyq
5da1310e34 Combine Notifications dismissed and notifications into 1 and add link to Notifications Ajax modal 2025-03-03 14:36:38 -05:00
wrongecho
a69b09c9e6 Bugfix: When exporting to CSV, the first asset isn't shown 2025-03-03 09:42:45 +00:00
wrongecho
8da3bb15e9 Add physical location field to asset csv import/export 2025-03-03 09:29:28 +00:00
wrongecho
8488445bf4 Start March changelog 2025-03-03 09:06:07 +00:00
wrongecho
546d21adac Fix client notes on edit modal 2025-03-03 09:03:49 +00:00
johnnyq
580f50b187 Added Link button to WYSIWYG Document Creation and editing 2025-03-03 00:22:51 -05:00
johnnyq
4744276f2a Don't count Non-Billable Invoices in overdue count 2025-03-03 00:07:22 -05:00
johnnyq
6106b8aebb Fix broken client link for the report clients with a balance 2025-03-02 21:03:02 -05:00
Johnny
dd2b203321 Merge pull request #1178 from itflow-org/43-ssl-history
Add SSL certificate history tracking
2025-03-02 11:22:34 -05:00
Marcus Hill
7994c9c7a8 Add SSL certificate history tracking 2025-03-02 10:15:26 +00:00
Marcus Hill
ae59aa3326 Add SSL certificate history tracking 2025-03-02 10:12:47 +00:00
Marcus Hill
0ab9a1c97d Temp fix warnings on num_domains expiring / num_domains_expired vars not defined yet 2025-03-02 09:50:50 +00:00
Marcus Hill
2908568e2a Fix certificates not showing notes 2025-03-02 09:40:21 +00:00
Marcus Hill
2b673a1b6c Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-03-02 09:26:28 +00:00
Marcus Hill
bece8abfe2 Prune db updates older than a year 2025-03-02 09:26:16 +00:00
johnnyq
ac2b355399 updated Changelog and bumped app version to 25.02.2 2025-03-01 21:21:03 -05:00
Johnny
7e658ee1f2 Merge pull request #1177 from itflow-org/develop
Release v25.02.1
2025-03-01 12:29:14 -05:00
Johnny
bbee81c3bb Merge pull request #1176 from Whit3XLightning/Whit3XLightning-patch-2
Update folder_create_modal.php
2025-03-01 12:11:59 -05:00
johnnyq
45b61ba335 Updated Changelog 2025-03-01 12:09:43 -05:00
johnnyq
32e6345cbc Add Paid to the top of a pdf invoice if paid 2025-03-01 12:03:48 -05:00
Tallyn Morse
afff46972a Update folder_create_modal.php
$folder['folder_name']; did not exist in the scope of where folder_create_modal.php was being required in the client_files.php and client_documents.php leading to null array pointer exception. While dirty the new way will reliably retrieve the name of the current folder the user is browsing to correctly name the modal.
2025-02-28 23:26:39 -06:00
johnnyq
d197995226 Updated Changelog, and Updated version to 25.02.1 2025-02-28 15:24:47 -05:00
johnnyq
09fa23519d Use Generated Thumbnail images if available in Gallery view for files, add options to download Original, Preview (Optimized) or Thumbnail 2025-02-28 14:43:03 -05:00
johnnyq
9da736daee Enhance the file picture upload optimization to read EXIF data when available and correctly adjust the image orientation for the optimized version. 2025-02-28 13:55:32 -05:00
johnnyq
410d1e0f86 Add Fade Animation to ajax modals 2025-02-28 13:34:26 -05:00
johnnyq
12ad7962c0 Wrap text in notifications 2025-02-28 13:31:53 -05:00
Johnny
397ebc5112 Merge pull request #1175 from ssteeltm/fix-kanban-dragging-touch
fix: kanban cards dragging when on touch devices
2025-02-27 23:25:58 -05:00
ssteeltm
d48823925a fix: kanban cards dragging when on touch devices 2025-02-27 18:36:34 -03:00
johnnyq
6f49f16f6b Fix Links cannot contain directories that exist https://forum.itflow.org/d/1568-bulk-send-email-links-cannot-contain-directories-that-exist 2025-02-27 15:21:04 -05:00
johnnyq
c2664a2888 Add .zed to the .gitignore 2025-02-27 11:46:29 -05:00
johnnyq
4529a56d7b Fix Sort Newest to oldest in notifications 2025-02-27 11:22:02 -05:00
johnnyq
fded8177c5 Added contact and Asset Indicators with quick links to credentials page 2025-02-26 16:00:22 -05:00
johnnyq
e670a9847a Added Indicator Counts for assets, credentials, licenses, tickets and documnent in Contacts Listing 2025-02-26 15:35:14 -05:00
johnnyq
8aada99f06 Added Edit to asset and contact details ajax modal for quick edits, added more links to the vendor details ajax modal 2025-02-26 13:46:04 -05:00
johnnyq
04e624cc14 Added Purchase Reference to Software Licneses 2025-02-26 12:59:03 -05:00
johnnyq
55ebe70808 Add Vendor Details Popup, works with Domain Vendors right now, Added fallBack function when no text is present use a placeholder 2025-02-25 18:16:03 -05:00
johnnyq
f23afdd85c Added Quick Category/Tag Add throughout utilizes the new ajax modal 2025-02-25 17:05:34 -05:00
johnnyq
bac76871c1 Added vendor UI select elements for software 2025-02-24 21:36:30 -05:00
johnnyq
56cbcf2921 Removed Single Link Vendor Login and single link software login. These are unused will be moved to multi to multi relationship, also added vendor_id to software to reference a vendor 2025-02-24 21:24:57 -05:00
johnnyq
f2dc25aedb Added Link to and unlink Items in Asset Details 2025-02-24 19:08:00 -05:00
johnnyq
2367ca2255 Remove expire record limits and only include items expiring within 45 days instead of 90 in client overview 2025-02-24 17:24:43 -05:00
johnnyq
f28c1ce398 In-App alerts are spawned 1,7 and 45 days instead of 1,7,14,30 and 90 2025-02-24 17:03:29 -05:00
johnnyq
6cc6e80f92 Fixed ticket link for agent email notifications on scheduling tickets 2025-02-24 16:19:22 -05:00
johnnyq
9aeda2ce53 Set Array instead of selecting Days to Expire in client overview 2025-02-24 13:18:32 -05:00
johnnyq
a08393b4d4 Fix Redirect Link when scheduling tickets that conflict with other scheduled tickets 2025-02-24 12:52:35 -05:00
johnnyq
02c1446cb8 Fix Transfer Asset(s) to Client 2025-02-24 12:42:31 -05:00
johnnyq
8e66434ec4 Updated asset details Link in rack, fixed opening asset details modal when clicking on a connected asset in asset details page 2025-02-23 15:48:47 -05:00
johnnyq
66d43d8a95 Dashboard When clicking domains or certificates sort by expire date asc 2025-02-23 12:30:47 -05:00
johnnyq
6c7052ea0d Fix missing public key var in certificate edit 2025-02-23 12:23:13 -05:00
johnnyq
a994bb7e8c Update Links on Project and and client listing 2025-02-22 17:37:35 -05:00
johnnyq
9b109c7abd Update links in project list 2025-02-22 17:29:19 -05:00
johnnyq
95855fc22e Update links in client overview 2025-02-22 17:27:16 -05:00
johnnyq
3218ea85b2 Bug Fix Contact Detail Modal not showing Credentials or Tickets 2025-02-22 17:15:41 -05:00
Johnny
a1831c7406 Merge pull request #1174 from itflow-org/develop
25.02 Release
2025-02-22 16:40:45 -05:00
johnnyq
c022e5fe32 Last fix document edit loading tonymce 2025-02-22 15:45:21 -05:00
johnnyq
2cddda5062 Updated Changelog 2025-02-22 15:36:57 -05:00
johnnyq
daeb71abb3 Update the App Version to 25.02 for prep on release 2025-02-22 15:20:10 -05:00
johnnyq
915161d812 Fixed Revenue Edit category and account fields also removed currency selection there as its automatically determined by the company default 2025-02-22 15:04:11 -05:00
johnnyq
0e3959ce00 Updated Client Access Permissions to use the defined in check_login.php 2025-02-22 14:25:24 -05:00
johnnyq
8d05633d7d Auto set client abbreviation if not set in add or edit client 2025-02-22 14:02:31 -05:00
Johnny
2d39f21b51 Merge pull request #1173 from itflow-org/small-fix
Small perms fixes
2025-02-22 13:38:05 -05:00
johnnyq
69850f83d3 Add s 2025-02-22 13:31:27 -05:00
johnnyq
7e041d52df Move Client Overview to the bottom of the side nav 2025-02-22 13:22:53 -05:00
johnnyq
58a8f08bd2 Fix broken product edit due to wrong field being called 2025-02-22 13:15:15 -05:00
Marcus Hill
8eea19d03d Small permissions fix for client-specific access 2025-02-22 17:59:24 +00:00
johnnyq
5d18e85d62 Don't auto generate Client Abbreviation on the fly on the side bar. This is auto generated when you create or edit a client and leave abbreviation blank 2025-02-22 12:53:56 -05:00
johnnyq
8a13207327 Fixed dragula css and js to not prepend / 2025-02-22 12:47:26 -05:00
johnnyq
2a974c28b0 Remove old item ordering logic for invoice, recurring invoice and quote 2025-02-21 22:14:40 -05:00
johnnyq
9b5eb86cac Changelog Update, Allow to view unlimited notifications 2025-02-21 21:50:44 -05:00
johnnyq
86212ee088 Update Changelog 2025-02-21 21:20:14 -05:00
johnnyq
e0a1e45928 Updated Asset Details AJAX modal to include its own details as well 2025-02-21 20:48:17 -05:00
johnnyq
5c3e0f0c31 Added Contact Info to the new contact details akax modal 2025-02-21 20:37:02 -05:00
johnnyq
25db6c6e03 Replaced more contact Links with the new ajax contact details modal, updated the modal UI as well to use bigger icons and have the icon on its own line 2025-02-21 20:14:36 -05:00
johnnyq
87779e5c10 Show Quick Asset details when clicking on a connected asset also when you click on asset in document details 2025-02-21 18:22:14 -05:00
Johnny
94ff910564 Merge pull request #1171 from ssteeltm/drag-and-drop-items
Drag and drop items
2025-02-21 14:56:34 -05:00
johnnyq
1b59eef9e2 Added Quick Details Modal for Assets 2025-02-21 14:55:22 -05:00
ssteeltm
b10d757b77 drag drop for recurring invoices 2025-02-21 15:05:45 -03:00
ssteeltm
4dd55df7a8 Drag and Drop for Invoice Items 2025-02-21 14:44:24 -03:00
ssteeltm
554c4d99bb Drag and Drop Quote Items 2025-02-21 14:22:01 -03:00
ssteeltm
17920e3cda update admin_ticket_template_details.php 2025-02-21 13:51:57 -03:00
root
073713a6a2 Drag and Drop Ticket Template Tasks 2025-02-21 13:30:26 -03:00
Hugo Sampaio
43c8e0785a Merge branch 'itflow-org:master' into drag-and-drop-items 2025-02-21 12:55:35 -03:00
johnnyq
22cd28de98 Added Connected Device Icon as well 2025-02-21 01:20:27 -05:00
johnnyq
c1548ce83d Connected Asset Links are now clickable 2025-02-21 00:55:09 -05:00
johnnyq
64f3df6baf Add Some Client Permission Checks to the new Global View and some tidying 2025-02-21 00:28:36 -05:00
johnnyq
ab3ffdf7fc Update more links rearrange Client Overview Side menu to match client side nav, define 0 for the post vars now defined in form. update unbilled tickets report 2025-02-20 21:07:53 -05:00
johnnyq
162ce8261a Hide client related form elements when Creating Entities in the client over view global section 2025-02-20 18:55:27 -05:00
johnnyq
fe68a1f641 Services is now in global view 2025-02-20 17:20:15 -05:00
johnnyq
713bd0dab7 Added Network to Global View and updated links 2025-02-20 16:43:59 -05:00
johnnyq
fc00b5e78f Added Location to Global View, updated links and fixed password pop over moving you to the top of the page when clicked in asset and conact details 2025-02-20 16:25:07 -05:00
johnnyq
2795b4e15e Added Global Views for Licenses, Credentials and Certificates 2025-02-20 14:58:25 -05:00
johnnyq
7628fc2643 Fixed Shared links not showing in the client overview until a user opens it 2025-02-20 11:39:01 -05:00
johnnyq
15d7875369 Fix Client Selection 2025-02-20 00:48:44 -05:00
johnnyq
a5d69d47ee Show select Client when adding items in Client Overview / Global View 2025-02-20 00:44:22 -05:00
johnnyq
d76d405d5a Make contacts global view compatible, remove bulk mail from admin as this is in contacts bulk actions, updated links, tidy 2025-02-20 00:38:40 -05:00
johnnyq
70495ef298 Created whole new section Client Overview to get a global view of all your clients things, merged domains and assets into one 2025-02-19 22:16:24 -05:00
johnnyq
7f5893a627 Moved Edit Recurring Ticket over to the new AJAX modal function 2025-02-19 19:10:21 -05:00
johnnyq
4c02a4e8c2 Moved Edit Network over to the new AJAX modal function 2025-02-19 18:05:16 -05:00
johnnyq
afdb4c06da Converted edit Calendar to the new ajax modal function 2025-02-19 17:10:41 -05:00
johnnyq
2fe8adcfca Simplified Client URL Handling in global client header logic 2025-02-19 15:58:43 -05:00
johnnyq
a2c77cf0c2 Merged Client and Global Calendar into one code base seperated them with some header logic 2025-02-19 15:05:37 -05:00
johnnyq
eab441da06 No need to enforce client permission check as its already handled in inc_all_client.php 2025-02-19 14:23:32 -05:00
johnnyq
19daa289b2 Merged Files Vendors with Client Vendors seperated them with some header logic 2025-02-19 14:18:16 -05:00
johnnyq
d228c30b03 Merged Global Tickets with Client Tickets seperated them with some header logic 2025-02-19 13:45:44 -05:00
johnnyq
a5ff978a77 Merged Global Recurring Invoices with Client Recurring Invoices seperated them with some header logic 2025-02-19 12:10:03 -05:00
johnnyq
78cfda1dbc Merged Global Recurring Tickets with Client Recurring Tickets seperated them with some header logic 2025-02-19 11:56:49 -05:00
johnnyq
78ae44c334 Migrated domain and certificate edit to the new AJAX modal function 2025-02-19 01:22:31 -05:00
johnnyq
e6e30dcd7c Migrated domain edit to the new AJAX Modal functon 2025-02-19 00:44:51 -05:00
johnnyq
17489e60c8 Merged Client Payments and Payments into one file using logic at the header to seperate between client and global section 2025-02-18 21:45:12 -05:00
johnnyq
f723450d51 Merged Client Invoices and Invoices into one file using logic at the header to seperate between client and global section 2025-02-18 21:20:40 -05:00
johnnyq
f8e4163c2f Merged Client Trip and Global Trips along with exports into 1 managable file 2025-02-18 20:58:47 -05:00
johnnyq
1dee1b4abb Add missing LIMIT 1 to ajax edit items 2025-02-18 20:29:36 -05:00
johnnyq
6f8cc40167 Changed header names from logins to credentials in asset and contact details, migrated more items to the new AJAX modal function 2025-02-18 20:25:02 -05:00
johnnyq
88ee9b60e7 Migrated Tax, custom link edit over to the new AJAX model function 2025-02-18 18:47:28 -05:00
johnnyq
a9e3e4744d Added back option for 500 records per page as we have successfully moved most of the repeating row modals to ajax which will allow super improved performance 2025-02-18 18:10:26 -05:00
johnnyq
b9f6871bae Migrated Edit Line Item to new AJAX modal function, adjusted the logic to determine line item type (invoice, quote, recurring) in the post instead of the form 2025-02-18 18:06:31 -05:00
johnnyq
f920b8fac9 Fixed missing vendor name and category name for receipt filename in edit expense 2025-02-18 17:29:58 -05:00
johnnyq
d8955f1f2d Added Asset Purchase reference to assets to reference an invoice or PO number 2025-02-18 17:22:22 -05:00
johnnyq
43b50c44b1 Combined client_quotes.php and quotes.php into one file quotes.php checks if get client_id var is set and which chooses to display client top header and client side nav or global nav 2025-02-18 17:04:49 -05:00
johnnyq
f6e33d5892 Added Document Quick View to asset and contact details 2025-02-18 11:57:28 -05:00
johnnyq
206dfc2426 Show related documents in asset details 2025-02-18 11:47:51 -05:00
johnnyq
2467274f7b Ported users, roles, categories, tags edit to new AJAX modal function 2025-02-17 19:29:31 -05:00
johnnyq
e02d45db3e More Migration to AJAX Modal 2025-02-17 16:44:29 -05:00
johnnyq
650b8754e8 Migrated Edit Recurring Invoice, Revenue over to the new AJAX modal 2025-02-17 11:57:10 -05:00
wrongecho
64a6b7dc39 Client files - allow uploading .key files 2025-02-17 12:01:36 +00:00
wrongecho
7aa773b336 Update changelog 2025-02-17 11:56:17 +00:00
wrongecho
a8b63ed429 Quote - remove reference to old modal 2025-02-17 11:42:51 +00:00
wrongecho
08f2a307d3 Merge pull request #1166 from itflow-org/quote-upload
Ability to upload files to an approved quote
2025-02-17 11:31:46 +00:00
wrongecho
72a84af1a7 Merge branch 'develop' into quote-upload 2025-02-17 11:27:05 +00:00
wrongecho
a8f682286a Add DB logic for quote file upload 2025-02-17 11:14:55 +00:00
johnnyq
b0a79c1b6f remove legacy quote copy modal, dont show client selection in quote copy when copying quote from within client section 2025-02-16 23:55:59 -05:00
johnnyq
ccec330ceb Migrated project, transfer and quote edit to the new AJAX modal function 2025-02-16 23:14:32 -05:00
johnnyq
093fd69415 Migrated Ticket Priority, Assign Agent, Assign Contact, Ticket Billable, Task edit, task_template edit to the the new AJAX Modal 2025-02-16 18:27:43 -05:00
johnnyq
3cf33afac4 Let AJAX handle the model header 2025-02-16 13:20:15 -05:00
johnnyq
5f7b297cf1 UI tidy work on header for Viewing Message in Queue 2025-02-15 22:21:15 -05:00
johnnyq
b6ffa0595d migrated credentials and expenses edit modals to the new AJAX function 2025-02-15 21:47:43 -05:00
johnnyq
4a3154baca Remove the old asset edit modal in favor of the new AJAX function 2025-02-15 20:36:37 -05:00
johnnyq
ca0b1a1fb7 Edit and Copy Assets is now using the new AJAX function 2025-02-15 20:35:35 -05:00
johnnyq
5f02bc07aa Delete the old asset Interface edit modal as we are using the new AJAX 2025-02-15 18:12:00 -05:00
johnnyq
7c070e3929 Migrated edit asset interface to use the new AJAX function 2025-02-15 18:11:01 -05:00
johnnyq
ed0b192f5b Added data-modal-size to the new ajax generic modal functin to define modal size if left blank it will use standard md, also moved Email Message View to use the new ajax modal 2025-02-15 17:02:35 -05:00
johnnyq
36e1df93bb Moved edit client, notification, and create contact note to the new ajax system, also updated the notificaiton count to be more efficient 2025-02-15 16:19:35 -05:00
johnnyq
615604661c Seems like I have to readd some Javascript functions into the ajax footer to get certain function to work on the generic ajax modal 2025-02-15 15:01:24 -05:00
johnnyq
9458c1cc7a Added data-toggle='ajax-modal' to trigger the ajax modal instead, also added an ajax header and and footer to dedup code 2025-02-15 14:50:48 -05:00
johnnyq
298a584377 Remove Test Code that end up not using 2025-02-15 00:53:03 -05:00
johnnyq
74a1603943 Started work on AJAX with a different approach, this is WIP but edit contact currently uses it. with this approach your dont have to touch the js or modal template just the ajax 2025-02-15 00:50:52 -05:00
johnnyq
117861034a Enhanced the add/edit interface Modal UI into tabs 2025-02-14 13:42:15 -05:00
johnnyq
7452e8f08e Update some Asset Details Headings 2025-02-13 16:45:20 -05:00
johnnyq
5ed5473b36 Add Nat IP Field to Interfaces 2025-02-13 16:34:27 -05:00
johnnyq
2e9e49a203 Added the Ability Set which interface is primary under add / edit interface section 2025-02-13 16:26:21 -05:00
johnnyq
c81b430318 Feature: Ability to import and export Asset Interfaces via CSV 2025-02-13 15:58:19 -05:00
johnnyq
33beae68e5 Tickets can not be categorized in bulk 2025-02-12 19:48:16 -05:00
johnnyq
1b8cd5630a Fix recurring Tickets priority var 2025-02-12 18:54:48 -05:00
johnnyq
b8d17be015 Fix Ticket Priority Sorting, now sorts by prioty when clicked 2025-02-12 18:45:05 -05:00
johnnyq
fe762ef926 Asset Interfaces: Renamed Port to Description, added Interface Type 2025-02-12 17:13:39 -05:00
johnnyq
8d8b0f4a48 Feature: Ability to create multiple interfaces/ports in one swoop with interface name and port prefix along with network assignment and notes 2025-02-12 15:27:31 -05:00
johnnyq
a2e16f918c Removed Task Order Input from Task edit modal as this is done by dragging and dropping now 2025-02-11 17:29:53 -05:00
johnnyq
228a457518 Remove dup css styles 2025-02-11 17:25:36 -05:00
johnnyq
f0cc9412bb Added custom css class grab-cursor so it turns the cursor into a grab hand instead of a finger, applied this to ticket tasks 2025-02-11 17:24:47 -05:00
johnnyq
7509301f5c Fix Edit Login under Contact and Asset Details, had to redo the SQL query as login_id was being used in tag as well and sometimes would get a login_id 0 2025-02-11 16:41:59 -05:00
johnnyq
d97da07cb1 Restricted users by client now shows the correct client count, also moved the side nav count to a new include file called get side nav counts 2025-02-11 13:33:32 -05:00
johnnyq
2ec38606e0 Fixed URI links for credentials in asset details and contacts details 2025-02-11 13:17:56 -05:00
johnnyq
2c85922788 Clone all Interfaces of asset when transfering to a new client jut the name, port, primary, mac 2025-02-10 17:15:46 -05:00
johnnyq
fc24bcb24f Moved Transfer Asset to Client to a Bulk Action and create Primary Interface when moving with MAC address 2025-02-10 16:58:39 -05:00
Johnny
08ebedef03 Merge pull request #1165 from ssteeltm/tasks_moves
ticket tasks moving order
2025-02-10 14:07:40 -05:00
Hugo Sampaio
eac46d0da0 fix conflitct 2025-02-10 10:31:03 -03:00
johnnyq
a69b60703b Dedup Notications code and move to a modal instead of a drop menu 2025-02-08 19:54:49 -05:00
johnnyq
4ed0767f1c Show record details in listing filter footer Showing X of X of X Records 2025-02-08 18:47:23 -05:00
johnnyq
72ae7843f6 Show record details in listing filter footer Showing X of X of X Records 2025-02-08 18:45:19 -05:00
Johnny
d92b803526 Merge pull request #1158 from ssteeltm/kanban_tickets
tickets views
2025-02-08 18:22:35 -05:00
Johnny
506783f022 Merge pull request #1167 from itflow-org/portal-custom-links
Allow adding custom links to the client portal nav-bar
2025-02-06 10:33:17 -05:00
wrongecho
2fe7bf6870 Taking a different approach. Utilize the existing file upload functionality and just link the file to the quote. 2025-02-05 22:48:15 +00:00
wrongecho
c36fb6ae12 rv 2025-02-05 15:44:33 +00:00
wrongecho
55c761b11e rv 2025-02-05 15:44:09 +00:00
wrongecho
a769993fa8 swap donate link for sponsor services link 2025-02-05 15:15:28 +00:00
wrongecho
6df3a35766 Move reports perms to new role system 2025-02-05 14:51:53 +00:00
wrongecho
abd985d0f4 Create report landing page from nav menu 2025-02-05 14:50:21 +00:00
wrongecho
db5cfed96f Update to new perms system 2025-02-05 14:31:46 +00:00
wrongecho
9ce502c1b9 Comment old perms functions 2025-02-05 14:31:31 +00:00
wrongecho
0172895e3c Rename password rotation report to credential rotation report 2025-02-05 14:19:43 +00:00
wrongecho
a29bfc3cb5 Only show tasks if ticket is open OR when ticket is resolved & there were tasks 2025-02-05 10:50:59 +00:00
wrongecho
341ff69c58 Only show tasks if ticket is open OR when ticket is resolved & there were tasks 2025-02-05 10:48:16 +00:00
wrongecho
66ab0d3f11 Update changelog 2025-02-05 10:24:31 +00:00
wrongecho
b147bc46cf Client Portal Tickets - Show category field, tidy the perms check 2025-02-05 10:21:06 +00:00
Hugo Sampaio
11203f1ad2 notification when resolved 2025-02-04 17:27:41 -03:00
Hugo Sampaio
ee2e4b671d ticket kanban settings 2025-02-04 17:07:42 -03:00
Hugo Sampaio
65bb1b4007 alter ticket_kanban to ticket_order 2025-02-04 13:35:28 -03:00
wrongecho
cdc0422d31 Allow adding custom links to the client portal nav-bar 2025-02-04 16:04:44 +00:00
wrongecho
1bbf7c7662 rm old debugging message 2025-02-04 15:10:10 +00:00
wrongecho
1ca31662f8 Cron scripts should log using logApp 2025-02-04 14:24:41 +00:00
Hugo Sampaio
3de97fcd15 nullable_htmlentities 2025-02-04 10:47:23 -03:00
wrongecho
9218d828b0 Fix unbilled tickets report permissions - requires sales read rights (in addition to general reporting) 2025-02-04 13:39:42 +00:00
wrongecho
4ed9c5cfb8 Start new changelog 2025-02-04 13:30:22 +00:00
Hugo Sampaio
17cd1fd0c1 ajax cleanup 2025-02-04 10:16:52 -03:00
Hugo Sampaio
c7b9c95d0d missing tickets_kanban.css 2025-02-04 09:59:45 -03:00
Hugo Sampaio
c0360f4e68 kanban js/css files 2025-02-04 09:58:18 -03:00
wrongecho
571ed4818e rm desc field; we don't store the description, the file name is enough because we know it's already related to the quote 2025-02-03 22:32:25 +00:00
wrongecho
04226101af Add ability for client to upload attachments to approved invoices 2025-02-03 22:19:32 +00:00
wrongecho
b50c2295a6 Add logic for showing quote attachments in the admin/tech side 2025-02-03 22:19:06 +00:00
wrongecho
75e002a054 Update git-ignore for new quotes dir 2025-02-03 22:18:22 +00:00
Hugo Sampaio
e6c18970b3 fix: explicit default declaration 2025-02-03 18:04:49 -03:00
Hugo Sampaio
00a9c53fc4 dragula plugin 2025-02-03 11:59:18 -03:00
Hugo Sampaio
942f5bff52 ticket tasks moving order 2025-02-03 11:55:20 -03:00
Johnny
9ea41c6ae5 Merge pull request #1163 from itflow-org/develop
Release 25.01.3
2025-01-31 13:52:39 -05:00
Johnny
c40d15a545 Merge pull request #1162 from itflow-org/tck-assign-modal
Bugfix: Amend SQL query for ticket assignment modal so contacts aren't shown
2025-01-31 13:48:08 -05:00
wrongecho
4c966f19e5 Bugfix: Amend SQL query for ticket assignment modal so client contacts aren't shown 2025-01-31 18:42:27 +00:00
johnnyq
73d0cb7497 Removed reports_contacts.php as it was incomplete for the hotfix 3 2025-01-31 13:23:49 -05:00
Hugo Sampaio
e3ae8df4d8 new changes 2025-01-31 11:50:06 -03:00
johnnyq
ef06c4141f Started work on Global Contacts, Added PrettyContent to guest footer and updated the guest document view to use it so images are responsive and tables show up correctly 2025-01-30 18:24:05 -05:00
Johnny
0dca0ce4bf Merge pull request #1161 from itflow-org/develop
Release 25.01.2
2025-01-30 15:01:20 -05:00
johnnyq
b5be8605d6 Final Version Fix in Changelog 2025-01-30 14:58:18 -05:00
johnnyq
2268a41b00 Update App version to 25.01.2 2025-01-30 14:55:06 -05:00
johnnyq
8efd22f47b Fix App Versioning 2025-01-30 14:54:09 -05:00
Johnny
e3aafcbc68 Merge pull request #1160 from itflow-org/develop
Release 25.01.01
2025-01-30 14:45:57 -05:00
johnnyq
2e5b0d1429 Increased version to 25.01.1 for a hotfix release 2025-01-30 14:17:08 -05:00
johnnyq
dd94e594a1 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-01-30 11:38:51 -05:00
johnnyq
b3c7b00e61 Fix broken image link in user pref and company details ig not avatar or company logo is present update nav user icon 2025-01-30 11:38:34 -05:00
wrongecho
badda09245 Prevent users disabling MFA when it is enforced 2025-01-29 21:29:04 +00:00
wrongecho
bf019f374a Minor changelog wording tweaks 2025-01-29 21:19:26 +00:00
johnnyq
aa87a11f12 Removed setup from the cron script wording 2025-01-29 15:59:21 -05:00
johnnyq
6df465a4d1 Update Changelog 2025-01-29 15:25:25 -05:00
johnnyq
c4980a1241 Update Changelog 2025-01-29 15:22:52 -05:00
Hugo Sampaio
f4eaba4384 fix whitespace qualitygate 2025-01-29 16:53:52 -03:00
Hugo Sampaio
9ee159c458 fix card move, after qualitygate changes 2025-01-29 16:52:12 -03:00
Hugo Sampaio
180635f318 update 2025-01-29 16:30:04 -03:00
Hugo Sampaio
e498cc6036 update tickets_kanban.php 2025-01-29 16:27:53 -03:00
Hugo Sampaio
b6e0990a78 update tickets.php 2025-01-29 16:21:08 -03:00
Hugo Sampaio
04fac54987 update tickets_list.php 2025-01-29 16:17:29 -03:00
Hugo Sampaio
b31d1eba6a update ticket_kanban.php 2025-01-29 16:12:32 -03:00
Hugo Sampaio
dec91d116a update tickets_compact.php 2025-01-29 16:10:40 -03:00
Hugo Sampaio
1fb243df11 update compact list 2025-01-29 16:03:24 -03:00
Hugo Sampaio
c02b267d44 update tickets.php 2025-01-29 15:55:58 -03:00
johnnyq
ffca7ff445 Added back warning about the old script path 2025-01-29 12:43:29 -05:00
johnnyq
34b94af965 Copied the cron scripts from /script dir back to / and updated all require pathes 2025-01-29 12:32:45 -05:00
johnnyq
5b32127de2 Add Tooltips on hover to better explain what to do with the MFA enformcement info 2025-01-29 11:41:37 -05:00
johnnyq
22a5c90d21 Reworked MFA Enforcement page to use login page style for smoother transition 2025-01-29 11:35:14 -05:00
Hugo Sampaio
ed5aa9a0c2 sync last changes
sync last changes on days  27 and 28
2025-01-29 12:00:52 -03:00
Hugo Sampaio
3e0e72dedc database update for kanban 2025-01-29 11:39:54 -03:00
Hugo Sampaio
3aa26226e5 kanban post actions 2025-01-29 11:08:42 -03:00
Hugo Sampaio
bb787cdc70 tickets initial idea of views
Kanban view
Compact view
2025-01-29 11:01:53 -03:00
johnnyq
6cbd4ffebe Add members column in roles and other UI tidying 2025-01-28 20:03:23 -05:00
johnnyq
033a5d1f4f Remove comment 2025-01-28 19:25:29 -05:00
johnnyq
02fdc66af9 Updated UI / UX MFA enforcement 2025-01-28 19:23:25 -05:00
johnnyq
52ad2ba322 Reworked the MFA Enforcement 2025-01-28 18:57:04 -05:00
johnnyq
677bb6b400 Updated Changelog removed crons and cron key 2025-01-28 17:32:27 -05:00
johnnyq
c282e22228 Updated Changelog 2025-01-28 17:29:15 -05:00
Johnny
5b5e01df4b Merge pull request #1157 from itflow-org/bulk-mail
Bulk mail - only show active clients
2025-01-28 17:20:00 -05:00
Johnny
f4173354bb Merge pull request #1156 from itflow-org/tck-assign
Fix ticket assign modal/filter
2025-01-28 17:19:29 -05:00
Johnny
47eddfdf9c Merge pull request #1155 from itflow-org/rec-payment-stripe
Autopay
2025-01-28 17:18:23 -05:00
johnnyq
706a77c5d3 Added btn-responsive style class to define buttons to go full block level while in mobile and to stay defined size in non mobile response 2025-01-28 17:14:47 -05:00
johnnyq
a4c9b4efa4 fix right margin on forms in user details when in mobile response 2025-01-28 16:55:47 -05:00
johnnyq
9ea5fdf425 Further improve the MFA process, now when verification fails the modal will stay open and the secret remain the same 2025-01-28 16:34:07 -05:00
johnnyq
ec9572c2ec Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-01-28 15:08:41 -05:00
johnnyq
c150fb02bb Fix Profit and Loss Report getting the wrong total expense amount for Quarter 2 April - June due to wrong var being used this does not affect actual expense data and will show correctly after update and also does not affect total expense for all 4 quarters 2025-01-28 15:06:43 -05:00
wrongecho
92ef31d861 Bulk mail - only show active clients
Bulk mail shouldn't show archived clients
2025-01-28 12:31:09 +00:00
wrongecho
5fa8363ad7 Fix ticket assign modal/filter 2025-01-28 11:50:38 +00:00
wrongecho
20a862f020 Fix redirect to /client if no login key is set 2025-01-28 11:24:08 +00:00
wrongecho
071352e32f Autopay
- Stripe wasn't showing as an option in the modal
- Show the current payment method at the top of the recurring invoice
2025-01-28 11:19:56 +00:00
johnnyq
39adab734b Enhanced the MFA Setup Flow 2025-01-27 23:26:10 -05:00
johnnyq
8221ef2927 Global Ticket View make contact secondary text in table header and remove tasks from the table header 2025-01-27 11:20:24 -05:00
johnnyq
ab7273bf39 Reduce Global Ticket view padding by not displaying contact's email 2025-01-27 11:15:43 -05:00
johnnyq
96809c7f85 Update db.sql 2025-01-25 21:47:24 -05:00
johnnyq
d5a03d3afc remove cron key from the code and remove old cron script and setup and update cli scripts as they now reside in scripts directory 2025-01-25 21:44:46 -05:00
johnnyq
052d5a6dbe Remove cron key from setup 2025-01-25 21:30:23 -05:00
johnnyq
227b87b1cb Fix Show OTP on hover in asset and contact details logins section 2025-01-25 19:53:00 -05:00
Johnny
e8c3cabde7 Merge pull request #1154 from itflow-org/develop
Release 25.01
2025-01-25 12:48:43 -05:00
johnnyq
33f80cb6b5 Adjust Version to use double digit for month 2025-01-25 12:42:11 -05:00
johnnyq
bf382f3aeb Bump ITFlow Version from 24.12 to 25.01 2025-01-25 12:35:19 -05:00
johnnyq
f4c4fe655b Update Changelog 2025-01-25 12:06:45 -05:00
johnnyq
6473a84fb2 Bump plugin stripe-php from 10.5.0 to 16.4.0 and update links 2025-01-25 11:47:58 -05:00
johnnyq
17f7b8be1c Minor UI update on Client Saved Payment Methods 2025-01-25 00:51:21 -05:00
johnnyq
cd40a97ae8 Use company currency code when autopay creates an expense, sort Invoices DESC 2025-01-25 00:30:48 -05:00
johnnyq
ce7406b632 Fix stripe library link in invoice 2025-01-24 23:55:30 -05:00
johnnyq
eef67194c4 Bump plugin Inputmask from 5.0.8 to 5.0.9 2025-01-24 22:30:52 -05:00
johnnyq
79d1914fe8 Bump Plugin DataTables from 2.1.8 to 2.2.1 2025-01-24 22:23:20 -05:00
johnnyq
b47c79d90a Bump plugin pdfmake from 0.2.8 to 0.2.18 2025-01-24 22:18:13 -05:00
johnnyq
fb17dbb1fb Bump php-mime-mail-parser library to 9.0.1 2025-01-24 22:07:49 -05:00
johnnyq
927725de7d Initialize TinyMCE using gpl license 2025-01-24 21:58:12 -05:00
johnnyq
156fcb7379 Bump TinyMCE from 7.5.1 to 7.6.1 2025-01-24 21:52:52 -05:00
johnnyq
6a2489865d Garbage Collect .git 2025-01-24 21:47:03 -05:00
johnnyq
5cecbe6ed1 Revert app version link 2025-01-24 21:30:03 -05:00
johnnyq
7863935a20 Fix app_version.php link in inc_all_admin.php 2025-01-24 21:28:23 -05:00
johnnyq
87e1371318 Move app_version.php and database_version.php to includes folder update all assocoiated links, remove 2 legacy php files maintence and legacy_debug 2025-01-24 21:25:04 -05:00
johnnyq
f29d122376 Move totp.php out of functions folder into plugins then removed functions folder 2025-01-24 21:07:01 -05:00
johnnyq
772b47f2c0 Remove unused css files in css folder along with the css folder 2025-01-24 20:58:28 -05:00
Johnny
38fced55a5 Merge pull request #1153 from itflow-org/hide-files
Hide the .git and .github folders as well as config.php
2025-01-24 20:51:58 -05:00
johnnyq
e9b011ea90 Update remainder strip lib links 2025-01-24 20:48:27 -05:00
johnnyq
6733d3cd24 Removed unused libs in the vendor folder and moved stripe to the plugins folder then elininated the vendor folder all together, updated all the stripe links 2025-01-24 20:44:36 -05:00
johnnyq
bf0d3de393 totp.php link fix 2025-01-24 20:32:00 -05:00
johnnyq
8e04e10753 Combine base32static.php and rfc6238.php into 1 file called totp.php and place it into the functions folder 2025-01-24 20:26:46 -05:00
johnnyq
d80d4803db Moved TOTP dependent files rfc6238.php and base32static.php to /includes folder and updated links in pages 2025-01-24 19:20:49 -05:00
wrongecho
2b3ff954c3 Hide the .git and .github folders as well as config.php 2025-01-24 19:30:22 +00:00
johnnyq
b1f0cfa29a Add back bootstrap5 css for select2 2025-01-24 13:19:18 -05:00
johnnyq
4965bcadc5 Update some wording on select boxes and and UI tiday on Send Mass Email in contacts 2025-01-24 13:16:49 -05:00
wrongecho
fcbb083cfb Mention SSO breaking 2025-01-24 15:25:18 +00:00
wrongecho
cce2e937da Hide settings for disabled modules in the admin sidebar 2025-01-24 15:18:49 +00:00
wrongecho
a3e94d1171 - Finish updating URLs from /portal to /client
- Add a basic Stripe management page to admin settings to remove cards/reset Stripe customer IDs
2025-01-24 15:08:09 +00:00
wrongecho
57deea2785 Hyperlink primary contact name on overview 2025-01-24 09:42:59 +00:00
wrongecho
6d94c32818 Hyperlink primary contact name on overview 2025-01-24 09:41:36 +00:00
wrongecho
6f2ae10e39 Fix portal password reset link (portal -> client) 2025-01-24 09:01:49 +00:00
johnnyq
0558358627 Added breaking changes to the Changelog specifically /guest/ and /client/ 2025-01-23 17:29:13 -05:00
johnnyq
2b8778b205 Fix some lingering dead links 2025-01-23 17:21:49 -05:00
johnnyq
5f76a7989b Move portal to client and rename and reorganize some client portal files 2025-01-23 17:12:11 -05:00
johnnyq
70dd3ab5c8 Remove Cron Key Requirement from cron scripts in /scripts folder and set to only run on the cli 2025-01-23 14:01:15 -05:00
johnnyq
c8e3e37d87 Update top right corner logo on setup, add more default common income, expense, referral, payment method categories 2025-01-23 12:53:26 -05:00
johnnyq
49682e4362 Fix Adminlte Paths in setup 2025-01-23 11:47:21 -05:00
johnnyq
faa1f789b8 Update Function in bulk mail 2025-01-22 21:07:11 -05:00
johnnyq
2c51289d75 Remove mysqli connection vars when passing mail data to addToMailQueue Function 2025-01-22 20:56:24 -05:00
johnnyq
c5c809791a Fix Default order by 2025-01-22 19:32:47 -05:00
johnnyq
606f3061d0 Simplify / rework some of the filter header logic and update filter vars in the rest of the code 2025-01-22 18:55:05 -05:00
johnnyq
4fc39a7203 Update Filter Vars in expenses 2025-01-22 17:31:04 -05:00
johnnyq
e403526321 Better var naming for filter vars for clients and contacts 2025-01-22 16:36:55 -05:00
johnnyq
5765144770 Disable HTML Purifier Caching in Guest and Portal Areas ass well 2025-01-22 14:42:45 -05:00
johnnyq
bff04e947b Disable HTML Purifier Caching 2025-01-22 14:39:39 -05:00
johnnyq
502ebf5080 Update Changelog 2025-01-22 11:25:02 -05:00
johnnyq
823c9eb030 Reduce the Max amount of Records per page to 100 instead of 500 to prevent performance issues 2025-01-22 11:22:09 -05:00
johnnyq
679291217d Fix Regression with TinyMCE not loading when editing or adding a ticket template 2025-01-22 11:17:47 -05:00
johnnyq
2abc6cd8ef Fix Editing Recurring Expenses, update Changelog 2025-01-20 23:28:46 -05:00
johnnyq
9d2f509694 Add tooltips to the client badge count on the side nav menu to explain what it counts 2025-01-19 20:53:02 -05:00
johnnyq
22e9699b20 Fix Archive Taxes 2025-01-18 16:48:39 -05:00
johnnyq
5382676fc1 Reduce padding in Rack units, use thumnail class for rack image 2025-01-18 14:54:33 -05:00
johnnyq
a90e08cb2d UI Update to rack devices, added a table header to Device Units removed border between action and device 2025-01-18 14:48:59 -05:00
johnnyq
37e792402f Update Change log 2025-01-18 14:26:32 -05:00
johnnyq
034dc4a745 Row span and center each Rack Devices instead of repeating same device for each unit the device utilizes 2025-01-18 14:09:06 -05:00
johnnyq
5fb4d2a197 Tidy some code in client contacts 2025-01-18 13:38:55 -05:00
johnnyq
657d766fbd Update Table UI for domain history 2025-01-18 13:20:39 -05:00
johnnyq
eee5a9cd8d Updated CHANGELOG 2025-01-18 13:09:37 -05:00
johnnyq
360974d9f4 Refactor interface linking system:
- Remove 'interface_connected_asset_interface' column usage
- Introduce 'asset_interface_links' table for one-to-one connections
- Update add/edit/delete queries and modals to handle new schema
- Exclude already-connected interfaces in dropdowns
- Improve data integrity and simplify linking logic
2025-01-18 13:04:56 -05:00
wrongecho
d2b3970a7b Update SECURITY.md 2025-01-18 12:19:00 +00:00
wrongecho
317d45c60b Update README.md 2025-01-18 12:06:45 +00:00
wrongecho
85cee68d15 Update README.md 2025-01-18 11:20:23 +00:00
wrongecho
c425c37fbf Update CHANGELOG.md 2025-01-18 11:00:08 +00:00
johnnyq
d1ebdcf92c Add Force Recur ticket to client Recurring, client details and asset details 2025-01-17 17:34:37 -05:00
johnnyq
57cbcf4e1d Update some UI elements in User Preferences 2025-01-17 17:05:41 -05:00
Johnny
bddc406c1d Merge pull request #1151 from itflow-org/domain-history
Add domain history
2025-01-17 16:47:05 -05:00
johnnyq
43337ff138 Update User Details Page to mimic company Details layout 2025-01-17 16:44:00 -05:00
wrongecho
ecd83b6b11 Add domain history to domain refresher 2025-01-17 21:39:11 +00:00
johnnyq
e68c8b7922 Reduce Card Header Padding in Company Details 2025-01-17 16:25:54 -05:00
johnnyq
269bddee9d Feature: Ability to remove Company Logo, also small UI touch up in company details 2025-01-17 16:23:29 -05:00
johnnyq
505ad52950 Update Changelog 2025-01-17 15:58:14 -05:00
wrongecho
e0c8155943 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-01-17 20:55:18 +00:00
wrongecho
d22c2b5265 Refactor changelog 2025-01-17 20:55:10 +00:00
johnnyq
5baecf6982 Add Payment Deletion Capabilities from payments and client payments page 2025-01-17 15:54:26 -05:00
wrongecho
fd59709af5 Fix stripe auto-pay not fetching publishable key 2025-01-17 20:28:09 +00:00
wrongecho
9dcd9abdc6 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-01-17 20:27:35 +00:00
wrongecho
55b324621e Fix stripe auto-pay not fetching publishable key 2025-01-17 20:27:22 +00:00
johnnyq
e3623dce5e Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-01-17 15:27:18 -05:00
johnnyq
cb7965a84f Stripe Var Passthru attempt 2025-01-17 15:26:40 -05:00
Johnny
2ce32731aa Merge pull request #1150 from itflow-org/services-db-charset
Services table has a weird character set - removed
2025-01-15 20:22:54 -05:00
wrongecho
99c4f9b92d Add domain history 2025-01-15 18:04:56 +00:00
wrongecho
c5058b26de Services table has a weird character set - removed
https://tasks.dev.itflow.org/task_details.php?task_id=41
2025-01-15 12:05:03 +00:00
johnnyq
e4a4687e8c Added Connected Asset Interface ID to asset interface table to eventual link to anothr assets interface/port 2025-01-14 23:50:08 -05:00
johnnyq
1c971ca88c Reduce Padding for Network Interfaces table 2025-01-14 22:40:32 -05:00
johnnyq
a5d3c73249 Sort Interface Ports ASC instead of DESC in asset details 2025-01-14 22:33:31 -05:00
johnnyq
5d3b4c8ff7 Update JS for stripe autopay to fetch value of Publishable Key from hidden form element instead of using hard coded key 2025-01-14 16:39:34 -05:00
Johnny
47657e462a Merge pull request #1149 from itflow-org/modal-maxlength
Modal maxlength
2025-01-14 12:55:26 -05:00
Johnny
5567dfe968 Merge pull request #1148 from itflow-org/stripe-autopay
Initial add Stripe Auto-payment with saved card
2025-01-14 12:54:36 -05:00
wrongecho
f774218b6d Cron - log retention should include the new app and audit logs tables too 2025-01-14 17:48:42 +00:00
wrongecho
34daca31b8 Include rather than require for the admin/xcustom includes to avoid breaking notifications/logout on pages that don't have a post handler (e.g. app logs) 2025-01-14 17:47:56 +00:00
wrongecho
6d9de98a71 Add maxlength attribute to modals 2025-01-14 17:24:43 +00:00
wrongecho
6c234968cb Fix top_nav_tickets_modal path 2025-01-14 15:39:33 +00:00
wrongecho
54dde984ac nullable_htmlentities - prevent Passing null to parameter error 2025-01-14 15:37:24 +00:00
wrongecho
9a36ad2cea Initial add Stripe Auto-payment with saved card 2025-01-14 00:28:49 +00:00
wrongecho
88c1b8cb8b Initial add Stripe Auto-payment with saved card 2025-01-13 22:58:23 +00:00
johnnyq
701df8db38 Update Changelog 2025-01-13 16:15:51 -05:00
johnnyq
97723da633 Windows/Tab Titles now reflect the current page your on along with the company name or selected client. Pages contact details, asset details, tickets, projects, documents, invoices, quotes, recurring invoices overide to include more detail in tab title 2025-01-13 14:40:05 -05:00
wrongecho
2693bbf81a Initial add Stripe Auto-payment with saved card 2025-01-13 00:11:04 +00:00
wrongecho
b72c3f23af Initial add Stripe Auto-payment with saved card 2025-01-12 23:59:39 +00:00
wrongecho
f153ae8ff3 Initial add Stripe Auto-payment with saved card 2025-01-12 22:02:49 +00:00
wrongecho
cd374b7b21 Initial add Stripe Auto-payment with saved card 2025-01-12 21:42:02 +00:00
wrongecho
a15081ac67 Initial add Stripe Auto-payment with saved card 2025-01-12 20:56:38 +00:00
johnnyq
0cb3cdc26d Moved all modals into /modals and updated all require links 2025-01-12 13:55:31 -05:00
wrongecho
e7f19dc69d Fix portal invoices 2025-01-12 09:25:13 +00:00
wrongecho
2c6b1a83d6 Fix portal confirm modal include 2025-01-12 09:22:21 +00:00
johnnyq
d57caed793 tidy 2025-01-11 17:41:50 -05:00
johnnyq
5b2b3d2821 Add index.php in /guest to redirect to the portal 2025-01-11 17:28:49 -05:00
wrongecho
731927d49c Allow archiving roles 2025-01-11 22:08:28 +00:00
wrongecho
2b07b03560 Update URLs for guest being in subdir 2025-01-11 21:46:34 +00:00
johnnyq
ae7b7d1157 Update AdminLTE CSS/JS links in client Portal's login, login_reset and header and footer 2025-01-11 16:20:40 -05:00
johnnyq
cc0b456312 Update all email content links to use the /guest directory now for ticket viewing, invoice, quote and item 2025-01-11 16:07:48 -05:00
johnnyq
d29aa55411 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-01-11 15:48:31 -05:00
johnnyq
7a23cf245d Fix index.php, Move Guest files to /Guest directory, fix adminlte path 2025-01-11 15:48:10 -05:00
wrongecho
677823d19d Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-01-11 19:51:41 +00:00
wrongecho
25e7ed6a6e Guest ticket feedback now shows friendly ticket prefix & number 2025-01-11 19:51:32 +00:00
johnnyq
08b91ead25 Merge branch 'develop' of github.com:itflow-org/itflow into develop 2025-01-11 14:49:14 -05:00
johnnyq
98f9083bcb Structure rework: Moved most php files that are included to /includes renamed pagination.php to filter_footer.php, updated all file to reference new filter_footer and includes 2025-01-11 14:47:32 -05:00
wrongecho
2ca92744f3 mv 2025-01-11 19:40:36 +00:00
wrongecho
5baae71dc7 Auto-acknowledgement email for email parsed tickets now contains guest link 2025-01-11 19:33:48 +00:00
johnnyq
a9179462c4 Moved client location modals inside /modals and updated the require links in location listing 2025-01-11 13:05:26 -05:00
johnnyq
69fb9f682b Created modals and includes folder moved client contact modals to /modals and updsated contact details and contact listing code 2025-01-11 12:55:23 -05:00
wrongecho
7bd47b1cca All cron scripts should set the running directory for consistency 2025-01-09 19:01:31 +00:00
wrongecho
12d8894c8f Mail queue - duh, it actually sees to be a fix.. 2025-01-09 18:59:24 +00:00
wrongecho
73c711095a Mail queue - undo file inclusion, not a fix 2025-01-09 18:53:11 +00:00
wrongecho
8914f4afe7 Mail parser - fix billable 2025-01-09 17:02:03 +00:00
wrongecho
50e252efb7 Mail queue - fix file inclusion following move to subdir 2025-01-09 16:58:09 +00:00
wrongecho
22d1a1809c Tickets created via portal/email not being marked as billable 2025-01-09 16:29:07 +00:00
wrongecho
64fd761934 Don't require a contact for recurring tickets 2025-01-09 16:23:35 +00:00
wrongecho
90e53981f6 Credential add modal - URI placeholder text was off 2025-01-09 16:11:52 +00:00
wrongecho
a67de7a8f1 Prevent post pages being accessed directly 2025-01-09 16:09:39 +00:00
wrongecho
ec54b28b02 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-01-09 15:32:22 +00:00
wrongecho
d3d3d37595 Show git branch on debug page 2025-01-09 15:32:11 +00:00
wrongecho
cf511b2c4b Update CHANGELOG.md 2025-01-09 15:21:20 +00:00
wrongecho
0871833f48 Merge branch 'develop' of https://github.com/itflow-org/itflow into develop 2025-01-09 15:14:57 +00:00
wrongecho
e8c7b3616b Tweak docs link 2025-01-09 15:14:46 +00:00
wrongecho
9845991413 Merge pull request #1147 from itflow-org/new-admin-check
Implement new admin check
2025-01-09 15:13:04 +00:00
wrongecho
fe94036b3a Implement new admin check
Uses the new $session_is_admin rather than the old validateAdminRole.
Reverts #1065
2025-01-09 15:11:07 +00:00
wrongecho
77b3eca687 Merge pull request #1146 from itflow-org/stripe-account-ui
Stripe payments - Account selection
2025-01-09 15:01:46 +00:00
wrongecho
1e777afa50 Stripe payments - Account selection
https://tasks.dev.itflow.org/task_details.php?task_id=22
2025-01-09 15:01:04 +00:00
wrongecho
2f57bdb677 Merge pull request #1145 from itflow-org/stripe-account-ui
Stripe payments - Account selection
2025-01-09 14:58:42 +00:00
wrongecho
d32e3a698f Stripe payments - Account selection
https://tasks.dev.itflow.org/task_details.php?task_id=22
2025-01-09 14:56:36 +00:00
wrongecho
3c697617f9 Update README.md
Remove issues shield, as we'll be using our own system for roadmapping
2025-01-08 13:42:37 +00:00
johnnyq
bc417b7cf3 Fix creating a recurring expense due to bad var name 2025-01-02 21:46:40 -05:00
johnnyq
3e52155d1c Fix editing recurring expense due to bad var name 2025-01-02 21:26:29 -05:00
wrongecho
5d734e58af Merge pull request #1144 from itflow-org/bug-asset-network
Bugfix: Asset interface DHCP vanishing
2025-01-02 22:58:58 +00:00
wrongecho
b0d398618d Bugfix: Asset interface DHCP vanishing
Fixes a bug that removes the DHCP setting on asset interfaces when changing their network interface from the asset details page
2025-01-02 22:57:13 +00:00
wrongecho
87f0cb295f Merge pull request #1143 from itflow-org/bug-tickets-projects
Bugfix - tickets <=> projects
2025-01-02 22:24:46 +00:00
wrongecho
65873eb46f Bugfix: Ticket edit modal not showing multi-client/no-client projects 2025-01-02 22:22:37 +00:00
wrongecho
cb2f620343 Bugfix: Ticket edit modal not showing multi-client/no-client projects 2025-01-02 22:21:02 +00:00
wrongecho
2dad616f42 Merge pull request #1142 from itflow-org/cron-scripts-move
Domain Refresh - Tidy old debug message
2025-01-02 22:02:03 +00:00
wrongecho
afc03634d6 Tidy old debug message 2025-01-02 22:01:01 +00:00
wrongecho
e677d5f7ca Merge pull request #1141 from itflow-org/cron-scripts-move
config.php has to be written to parent dir
2025-01-02 21:57:23 +00:00
wrongecho
43ccf8a026 config.php has to be written to parent dir 2025-01-02 21:55:25 +00:00
wrongecho
4167381fb1 Merge pull request #1140 from itflow-org/cron-scripts-move
uploads have to be written to parent dir
2025-01-02 21:48:54 +00:00
wrongecho
ff4f8a9a18 uploads have to be written to parent dir 2025-01-02 21:48:02 +00:00
wrongecho
c2f82bbe0e Merge pull request #1139 from itflow-org/cron-scripts-move
config.php has to be written to parent dir
2025-01-02 21:45:36 +00:00
wrongecho
b0a960547c config.php has to be written to parent dir 2025-01-02 21:43:23 +00:00
wrongecho
04def2e434 Merge pull request #1138 from itflow-org/cron-scripts-move
db.sql also needs to be called from the parent directory
2025-01-02 21:38:41 +00:00
wrongecho
a529eca414 db.sql also needs to be called from the parent directory 2025-01-02 21:37:10 +00:00
wrongecho
942004a6a7 Merge pull request #1137 from itflow-org/cron-scripts-move
Adjust cron/cli scripts in subdir to load required scripts from parent
2025-01-02 21:31:28 +00:00
wrongecho
7ebac0a674 Sonar recommendations 2025-01-02 21:30:18 +00:00
wrongecho
50371558c6 Adjust cron/cli scripts in subdir to load required scripts from parent 2025-01-02 21:27:14 +00:00
wrongecho
ee49c2c5c6 Update CHANGELOG.md
wip
2025-01-02 21:14:15 +00:00
wrongecho
740f477d4c Merge pull request #1136 from itflow-org/cron-scripts-move
Move cli/cron scripts
2025-01-02 21:11:11 +00:00
wrongecho
2d403415d4 Tidying per sonar recommendations 2025-01-02 21:09:27 +00:00
wrongecho
f39b0eb367 Tidying per sonar recommendations 2025-01-02 21:05:03 +00:00
wrongecho
db6d2fb534 Move cron scripts
Move cron scripts to their own subfolder.
2025-01-02 20:59:05 +00:00
wrongecho
3b0d24f5a5 Delete test.md 2024-12-31 16:26:42 +00:00
wrongecho
c7b0f1222f Update test.md 2024-12-31 16:10:29 +00:00
wrongecho
bf53d5b0fe Also move setup and update cli to scripts folder for better organisation 2024-12-31 11:49:48 +00:00
wrongecho
fd2339e17c Merge pull request #1135 from itflow-org/add-changelog
Add changelog
2024-12-30 17:47:22 +00:00
wrongecho
df19709c2f Move cron scripts
Move cron scripts to their own subfolder.
2024-12-30 17:31:34 +00:00
wrongecho
5bf009f052 Add changelog 2024-12-30 16:54:16 +00:00
wrongecho
0bde1ccee4 Merge pull request #1133 from itflow-org/develop
Release system - 24.12
2024-12-30 14:26:38 +00:00
wrongecho
955f7c3f3b Merge pull request #1134 from itflow-org/add-release-system
Add release system - with admin update
2024-12-30 14:25:51 +00:00
wrongecho
8c3ea6404e Add versioning/release system - December 2024 / 24.12 2024-12-30 14:24:56 +00:00
wrongecho
e6f5c6c484 Merge pull request #1132 from itflow-org/add-release-system
Add versioning/release system - December 2024 / 24.12
2024-12-30 13:16:05 +00:00
wrongecho
469c495a73 Add versioning/release system - December 2024 / 24.12 2024-12-30 12:58:50 +00:00
wrongecho
4711955e17 Merge pull request #1131 from itflow-org/develop
Test - Merge develop into master
2024-12-30 11:59:16 +00:00
wrongecho
b014ddd6bd Merge pull request #1130 from itflow-org/test-my-feat
Test - ignore
2024-12-30 11:48:25 +00:00
wrongecho
6800a48cd4 Test - ignore 2024-12-30 11:39:34 +00:00
johnnyq
8a8af5525c Renamed header Sales to Billing on Main side nav 2024-12-28 14:24:37 -05:00
johnnyq
e56b4019e4 Rename client side menu header from Finance to Billing as its more suitable name 2024-12-28 13:10:04 -05:00
Johnny
eddf8d4016 Merge pull request #1129 from itflow-org/tidying
Tidying/General quality of life updates
2024-12-28 12:41:19 -05:00
Johnny
c78d0a175b Merge pull request #1128 from itflow-org/font-tidy
Stop using Source Sans Pro intermittently for some pages
2024-12-28 12:37:48 -05:00
Johnny
343365d31c Merge pull request #1127 from itflow-org/ticket-client-attachments
Client Portal Ticketing - Show attachments
2024-12-28 12:35:37 -05:00
Marcus Hill
c85626a937 Tidying/General quality of life updates
General quality of life updates:

- Ticket contact edit: 'No one' should be logged when ticket isn't associated with any contact, rather than a blank space; also fix email content
- Ticket portal/guest: Only show 'Assigned to' if someone is actually assigned
- Ticket tasks: Don't allow adding/modifying tasks for tickets in a resolved state
- Portal contacts: Properly align word 'Contacts' in a similar way all other page headings are aligned
- Client PDF export/handover: Now opens in a new self-closing window
2024-12-28 01:12:59 +00:00
Marcus Hill
fcfc6ff5e2 Stop using Source Sans Pro for some pages, we seem to use Sans Serif everywhere else 2024-12-27 23:02:24 +00:00
Marcus Hill
a6451c787e Client Portal Ticketing - Show attachments for each reply 2024-12-27 20:57:38 +00:00
johnnyq
a2f0f392be Moved Create and Disable Auto Pay from Hamburger menu to a button by Email Notify, also Tidied up the Header in add payment 2024-12-21 20:50:21 -05:00
johnnyq
74770a976a Added Auto Pay Options to Recurring Invoice Details 2024-12-21 20:37:46 -05:00
johnnyq
5611ac103d Recurring Payments - Added Auto Pay via cron, removed auto pay amount as it uses the recurring invoice amount, next up integrate with stripe 2024-12-21 20:25:21 -05:00
johnnyq
87a86803ee Added Recurring Payment Creation and Deletion and display in the recurring Invoice sections, still not operational need to add to cron 2024-12-21 18:49:42 -05:00
johnnyq
63015ab22d Feature: Recurring Payments created DB Structure 2024-12-21 16:46:21 -05:00
Johnny
3e0e30a480 Merge pull request #1126 from itflow-org/roles-perms
Move more things to new role perms system
2024-12-20 12:17:52 -05:00
Marcus Hill
bd7a156800 Move more things to new role perms system 2024-12-20 11:23:41 +00:00
wrongecho
dacbc51f95 Merge pull request #1125 from git-kup/master
tidy roles warning & global search
2024-12-19 12:04:33 +00:00
gt-business
8e385d8599 Update global_search.php 2024-12-18 18:57:10 -05:00
gt-business
7007c34e8d Update global_search.php 2024-12-18 18:56:26 -05:00
gt-business
c5cbfd50d2 Update global_search.php 2024-12-18 18:49:38 -05:00
gt-business
7ee04fa26a Update global_search.php 2024-12-18 18:48:42 -05:00
git-kup
4627736a8c make global search nicer 2024-12-18 18:10:22 -05:00
git-kup
56f00fe366 Update global_search.php 2024-12-18 17:50:33 -05:00
git-kup
d0998b7d0d Update admin_role.php 2024-12-18 16:35:08 -05:00
git-kup
5fccf5ffd4 Update admin_role.php 2024-12-18 16:33:20 -05:00
wrongecho
1281b7758f Merge pull request #1124 from Whit3XLightning/patch-1
client_files - check if file shared before assigning variables to prevent errors
2024-12-17 23:37:58 +00:00
Clayton Brown
608c9ef711 check if file shared before assigning variables.
Fixed an issue that produced warnings in the event a file had not been shared. The program was attempting to access a null ($row) array. Also fixed an issue where the author of an uploaded file ($file_uploaded_by) had not been declared in the scope it was being called.
2024-12-17 16:31:52 -06:00
johnnyq
829ee37a53 Add Current App Version by checking the current commit hash, also moved Database version on top with App Version in Debug 2024-12-16 14:24:38 -05:00
Johnny
803704c1ed Merge pull request #1123 from itflow-org/rec-tck-runnow
Recurring tickets
2024-12-16 14:03:47 -05:00
Marcus Hill
ac4a9b8ef2 Recurring tickets
- Allow forcing recurring tickets to run (e.g. cron broke, or you want to do a task early)
- Use new permissions system for recurring UI
- Bugfix: Ticket billable status wasn't saving/displaying on the edit modal
2024-12-16 12:11:29 +00:00
wrongecho
fae4f1e59d readme - we didn't hit stable in 2024, probs early next year now 2024-12-16 09:50:53 +00:00
Johnny
32ef744d6b Merge pull request #1122 from itflow-org/anon-tck-watcher
Anonymous/Guest tickets - Add the anon email as a watcher
2024-12-14 14:28:03 -05:00
Johnny
83cbb3daa3 Merge pull request #1121 from itflow-org/api-tck-fix-2
API - New tickets
2024-12-14 14:27:48 -05:00
wrongecho
68cfa12f1e Anonymous/Guest tickets - Add the anon email as a watcher 2024-12-14 17:31:06 +00:00
wrongecho
3eda726b2b API - New tickets
- Allow creating tickets for no client / no contact
- Set URL view key
- Fix line break after ticket details that causes odd email formatting
2024-12-14 17:06:03 +00:00
Johnny
19221b8749 Merge pull request #1119 from itflow-org/typeahead-os
Assets: Suggest operating systems when adding an asset
2024-12-14 11:53:33 -05:00
wrongecho
7577f505d5 Merge pull request #1120 from itflow-org/api-tck-fix
API - New ticket bugfix
2024-12-14 13:59:32 +00:00
wrongecho
e417badf92 API - New ticket bugfix
Ticket status should be 1, not 'New'
2024-12-14 13:55:39 +00:00
wrongecho
6d23cca51b Assets: Suggest operating systems when adding an asset 2024-12-14 13:37:40 +00:00
johnnyq
1a972d6a3e Added Fax in the UI 2024-12-13 15:59:20 -05:00
johnnyq
a21cb08914 DB Structure Update: Add Fax to location, Delete Vendor Contacts tables decided to merge vendor contacts and conacts as one table as contacts table already had a reference to vendor_id 2024-12-13 15:12:48 -05:00
Johnny
10496c2971 Merge pull request #1118 from itflow-org/bugfix-tck-feedback
Bugfix: Ticket feedback notifications
2024-12-13 11:49:10 -05:00
wrongecho
6df53db9da Bugfix: Ticket feedback notifications 2024-12-13 16:29:02 +00:00
johnnyq
0ffb39980f Started work on vendor contact post code 2024-12-12 19:27:19 -05:00
johnnyq
768511f6e5 Fix Non Existent warning file causing Javascipt to break in Users section 2024-12-12 17:55:55 -05:00
johnnyq
4681a340dc Fix Non Existent warning file causing Javascipt to break in Client Assets section 2024-12-12 11:37:34 -05:00
johnnyq
3eb1530dbc Initial Work on Vendor Details 2024-12-11 18:58:01 -05:00
johnnyq
580b7cd4c0 Added Vendor Contact Create and Edit Modals 2024-12-11 18:01:52 -05:00
johnnyq
4689b8c5c7 Remove ridicelous Export CSV Warning message 2024-12-11 16:30:42 -05:00
johnnyq
8ab82d9edf Really fix it now 2024-12-10 22:26:05 -05:00
johnnyq
41f60e6b21 Dont show update successfull if already updated 2024-12-10 22:23:53 -05:00
johnnyq
3b079de8ad Fix update_cli to get the proper latest db version 2024-12-10 22:19:41 -05:00
johnnyq
32d5e333c6 Renamed error_logs to app_logs, created app logs list view and renamed function logError to logApp, updated some of the log functions in cron and ticket mail parser to use the new appLog 2024-12-10 22:06:35 -05:00
johnnyq
d5e5a13fe7 Automatically select the current asset in asset details whjen creating a recurring or regular ticket 2024-12-10 20:51:16 -05:00
johnnyq
0bff350463 Add Recurring tickets list to contact details as well as the ability to Create and Edit Recurring contacts all witihin contact details 2024-12-10 20:40:47 -05:00
johnnyq
e24c79fbaf Add Recurring Tickets to asset details, added ability to open a ticket for asset in asset details, also recurring ticket 2024-12-10 20:23:04 -05:00
johnnyq
c0928e9b68 Dropped the Vendor Templates Table decided to use the same table, added Vendor Contacts Table to allow for more than 1 contact for a vendor 2024-12-10 17:47:41 -05:00
Johnny
d35d6a93b0 Merge pull request #1117 from ssteeltm/master
Ticket Summary with detected language
2024-12-10 15:48:34 -05:00
johnnyq
bb6a1c3cc7 Feature: Allow AI to Generate Document Templates with a prompt example Generate AD Structure Documentation, File Share etc 2024-12-10 15:47:12 -05:00
Hugo Sampaio
52da072711 Ticket Summary with detected language 2024-12-10 16:54:57 -03:00
johnnyq
1e05c7d524 Fix Ticket Summary move js inline with ticket.php as js files cant read php vars 2024-12-10 14:24:48 -05:00
johnnyq
c9a5df30d8 PHP Tag fix 2024-12-10 14:07:46 -05:00
johnnyq
2ac32ab0c5 AI Feature Ticket Summary: Summarieze an entire ticket 2024-12-10 14:03:43 -05:00
johnnyq
501c5fce15 Update update_cli script to only allow the script to run as the owner of the script preventing any permissions issues when updating via git. Also removed the --user option. to run the script you can use sudo -u USER php update_cli.php while in its path 2024-12-10 12:40:22 -05:00
johnnyq
f3faaa2a4e Revert Wireless Access Point to Access Point 2024-12-09 11:29:00 -05:00
johnnyq
1d8a78b279 Add Image Thumbnails and Previews for better image optimization update view image modal to JS and allow to move between images using previous and next arrows 2024-12-08 15:22:37 -05:00
johnnyq
c4870e49cf Ensure All commands are executed within the update and setup scripts directory 2024-12-07 15:53:17 -05:00
johnnyq
2cf2545f32 name script finalized 2024-12-07 15:49:07 -05:00
johnnyq
41743a529f Update CLI show help screen and show if an argument is invalid 2024-12-07 15:46:48 -05:00
johnnyq
6b8d02c6ef DB Update Add vendor_templates table to eventually seperate out templates from the vendors table 2024-12-07 15:38:35 -05:00
johnnyq
29f75fc69c Update CLI - Added option to specify a when update the app otherwise default to www-data 2024-12-07 15:26:29 -05:00
johnnyq
5f8b68ac3c Setup CLI Fix Country Example to include full country name and add additonal eg for timezones 2024-12-07 15:21:20 -05:00
johnnyq
a8328172e6 Allow force_update to be seperate from --update 2024-12-07 15:16:46 -05:00
johnnyq
926935ceb6 Add help to the update_cli and execute standard update by default also fix getting the current DB version 2024-12-07 15:09:29 -05:00
johnnyq
b43a7ec16d Initial work on update script via cli the update_cli.php can only be run via command line preventing web public dir execution 2024-12-07 14:46:08 -05:00
johnnyq
0a59ab33b9 Added setup_cli.php to allow to setup via the command line via interactive prompts and non intertactive by argument switches this allows for better automation of installing itflow in places like docker, ansible, HestiaCP Auto Install scripts etc 2024-12-07 14:09:15 -05:00
johnnyq
6501fc528e Add IP back to the default shown columns in assets 2024-12-07 12:45:09 -05:00
johnnyq
095c5b95ac Removed Physical Asset location in show additonal columns instead show Physical Location below location 2024-12-07 12:26:41 -05:00
johnnyq
193e9e3e01 Make Company Name clickable 2024-12-06 19:44:14 -05:00
johnnyq
e1b30f6c25 Update Side nav to use icon next to company 2024-12-06 19:40:10 -05:00
johnnyq
804164bc3f Center Align Company Name in side bar and downsize the font size 2024-12-06 19:17:15 -05:00
johnnyq
324f66b5fd Update the UI Header for Asset Selection on in the client assets and reports sections 2024-12-06 18:45:34 -05:00
johnnyq
74e7507f7d Change asset TV to Display, changed Firewall icon to Fire 2024-12-06 17:00:52 -05:00
johnnyq
acf5268139 Wording Fix for Share Link 2024-12-06 16:21:01 -05:00
johnnyq
26ca2ab907 Fix View After Delete and turn it into a switch 2024-12-06 16:10:56 -05:00
johnnyq
6ae18dbc43 Update UI in share Model Remove Views instead use Delete after view and set long expiration dates and chnage them to a radio buttons instead of select 2024-12-06 14:11:51 -05:00
Johnny
22f5bdb1c0 Merge pull request #1113 from itflow-org/invoice-guest-cancelled
Guest invoice view - cancelled
2024-12-06 11:42:39 -05:00
Johnny
9312aac7fc Merge pull request #1112 from itflow-org/portal-contacts-bugfix
Portal contacts
2024-12-06 11:42:24 -05:00
wrongecho
9bc1ebd7ea Merge pull request #1115 from itflow-org/fix-contact-related-logins
Bugfix contact related logins
2024-12-04 23:03:28 +00:00
wrongecho
8954287047 Merge pull request #1114 from itflow-org/tt-bulk-reply
Add time tracking for bulk ticket replies
2024-12-04 22:17:26 +00:00
wrongecho
4213a33652 TT for bulk resolve too 2024-12-04 21:14:35 +00:00
wrongecho
1caf33b7c2 Bugfix contact related logins. This was caused by login_id being used more than once due to joins 2024-12-04 17:20:13 +00:00
wrongecho
7afa1760f3 Add time tracking for bulk ticket replies
- TT for bulk replies
- Encourage the correct time format using a placeholder, pattern and required field (client-side validation only - still results in server error if you intentionally break it, for now)
2024-12-04 16:49:51 +00:00
wrongecho
425b06e550 Add time tracking for bulk ticket replies
- TT for bulk replies
- Encourage the correct time format using a placeholder and pattern (client-side validation only)
2024-12-04 16:43:09 +00:00
wrongecho
ab19d37f5f Guest invoice view
Make it clearer to guests when an invoice has been cancelled
2024-12-04 16:26:27 +00:00
wrongecho
da1b3b55b1 Portal contacts
- Bugfix not being able to edit contacts after the switch to storing contact creds in the users table
- Prevent a client adding contacts with duplicated emails
2024-12-02 18:01:29 +00:00
johnnyq
a31387720c Fix self avatar uploading 2024-11-27 13:34:39 -05:00
johnnyq
439d1bc3db Move Extension down one line in contact details 2024-11-27 12:55:17 -05:00
johnnyq
ad62edb7f6 Fix networks page not displaying dns if secondary dns server was not entered 2024-11-27 12:42:09 -05:00
johnnyq
f731104375 Fix Credential Deleting 2024-11-27 12:24:37 -05:00
johnnyq
53c888c4b8 Add User Type to session, along with user type check 2024-11-27 11:50:45 -05:00
johnnyq
8eb32a09b2 Feature You can now Add and Remove User type Software Licenses in Contact Details 2024-11-26 16:58:37 -05:00
johnnyq
bbed55a8ff Added Linking and unlinking services in contact details 2024-11-26 16:16:24 -05:00
johnnyq
5e8a6bfcd6 Added Unlinking of credentials and assets to contact details 2024-11-26 15:29:40 -05:00
johnnyq
cbbf8c27ba Fix Ticket Watchers not getting emails when No Contact is selected on a ticket, and add the ability to link files in contact details 2024-11-26 14:06:34 -05:00
johnnyq
8968476b7c Added Many to Many Linkage between contacts and documents, asset, credential linkage and unlinkage in contact details, more to come 2024-11-25 23:55:33 -05:00
johnnyq
8c296de205 Do not check to see if session is set before setting timezone always set timezone, Fixes MFA when switching timezones 2024-11-25 12:20:56 -05:00
johnnyq
5a8234db13 Remove branding from downloaded files via link and use original filename replaced old logging function in download with new logAction funtion 2024-11-25 11:58:08 -05:00
johnnyq
8050dffbb8 Enhancement: DB Structure Update: Seperate Logs into 3 seperate log tables error_logs, auth_logs, audit_logs. This will provide huge performance benefits and organization 2024-11-24 15:04:23 -05:00
johnnyq
94e2a4b1f0 Added Placeholder for Linking items to a contact in contact details 2024-11-24 13:06:26 -05:00
johnnyq
137438f873 Added Archive, Unarchive functions for contact notes along with the ability to add a note under client contact details page 2024-11-24 12:38:59 -05:00
johnnyq
8599729602 Defined a note_type_array in get_settings to define note type and associated icon incorporated the array into the Selectboxes to create note and the UI display in contact details 2024-11-24 12:11:31 -05:00
Johnny
276e3c79a0 Merge pull request #1107 from ColDog5044/master
Fix typos in admin_settings
2024-11-24 10:58:02 -05:00
Collin Laney
ffa677db30 Fix typo in admin_settings_quote.php
Fixed typo in placeholder for email address to notify when quotes are accepted/declined.

... leave bank for none -> ...leave blank for none.
2024-11-24 02:22:12 -05:00
Collin Laney
44a8431960 Fix typo in admin_settings_ticket.php
Fixed typo in placeholder for email address to notify when new tickets are raised.

... leave bank for none -> ...leave blank for none.
2024-11-24 02:20:45 -05:00
Collin Laney
47b720b063 Fix typo in admin_settings_invoice.php
Fixed typo in placeholder for email address to notify when invoices are paid online.

... leave bank for none -> ...leave blank for none.
2024-11-24 02:13:05 -05:00
johnnyq
a80fddfc0d Delete Contact Notes when contact is deleted also delete contact references when delting a client 2024-11-23 18:18:22 -05:00
johnnyq
724d4a347a Feature: Contact Notes / Interactions - Create an Add Model and display cpontact notes under contact details 2024-11-23 17:52:03 -05:00
johnnyq
1766b95fc4 Fixed table layout in Client Portal Documents, put pretty content in the portal footer instead as it caused issues with the XSS Protection Content-Security-Policy 2024-11-23 16:43:16 -05:00
johnnyq
1c0441060e FEATURE: Added Tables for Multiple Notes with note type to keep track of interactions and notes for clients, contacts, assets and vendors. UI to come next 2024-11-23 15:36:39 -05:00
johnnyq
504b28ee4c Fix Create / Copy Trips missing trip_id 2024-11-23 11:45:32 -05:00
wrongecho
b2651f7445 Merge pull request #1106 from itflow-org/user-create-fix
Bugfix: Creating users
2024-11-20 21:44:03 +00:00
wrongecho
a216f1bbf8 Bugfix: Creating users 2024-11-20 21:43:33 +00:00
johnnyq
c96833a977 When adding a ticket from contact details page make sure sure the contact is selected by default 2024-11-20 14:08:40 -05:00
johnnyq
fe24e3bcea Update Breadcrumbs to always have a link to the client for fast access to the client section. The breadcrumb order will change depending how you access using the global view or within the client section on Invoice, Quote, Ticket, Recurring Invoice 2024-11-20 12:41:29 -05:00
johnnyq
1e4306381f DB Optimizing in Ticket Selections and relogicify mark billable also more logging 2024-11-19 18:46:07 -05:00
johnnyq
dea702b45f Fix missing ) in Portal Post was a logging regression which also fixes poral logout 2024-11-19 18:22:53 -05:00
johnnyq
050d15579d More in depth logging ticket history and less passing vars from POT in ticket POAST 2024-11-19 18:18:32 -05:00
johnnyq
bbe2b1d2c9 Bump TinyMCE from 7.4.1 to 7.5.1 2024-11-19 16:08:20 -05:00
johnnyq
a10486a95c Breaking AI Change you must update the URL to include the full URL in settings > AI example for openai: https://api.openai.com/v1/chat/completions 2024-11-19 15:42:48 -05:00
johnnyq
dcedddcad6 Moved AI Reword Buttons to the WYSISYG toolbar, Seperated Document and ticket toolbars. Ticket Toolbar has items related to tickets while document has additional items related to documents 2024-11-19 15:33:14 -05:00
johnnyq
9d44d3e849 Uncomment contact add alert 2024-11-19 12:03:09 -05:00
johnnyq
b7163dad6d Add isset check on file upload 2024-11-19 11:59:52 -05:00
johnnyq
c181954960 Fix alert 2024-11-19 11:45:01 -05:00
johnnyq
ff3df12523 allow webp for users and profile 2024-11-18 18:19:57 -05:00
johnnyq
097e1c7b5f Add Acceptable File formats on the Client side, also allow webp for image file uploads in assets, locations, expenses and contact 2024-11-18 18:14:13 -05:00
johnnyq
34e09f32e0 Remove unessesary check if file has been uploaded as the function already does that 2024-11-18 16:29:42 -05:00
johnnyq
06314e136e Replicated previous fix by using enctype=multipart/form-data for bulk forms that have subforms that require a file upload 2024-11-18 16:16:00 -05:00
johnnyq
9d5818050e Fix Contact Photo not uploading when editing the first contact, odd fix but worked the edit contact forms are wrapped in a parent form on the entire table itself for Bulk changes. For some reason it wouldnt take the first edit modal form if we didnt enctype = multipart/form-data fo the parent form even though each edit subform has it already. it doesnt make sense but works 2024-11-18 16:07:22 -05:00
johnnyq
1a968abb35 Fix var for Reccuring Item added alert 2024-11-18 14:10:07 -05:00
johnnyq
32158872b2 get client id for logging when adding recurring items 2024-11-18 14:08:13 -05:00
johnnyq
c9b38b2b5f Show only logged in user notifications 2024-11-17 15:14:40 -05:00
johnnyq
eacb345c70 Only show notificaiton in alert window for logged in user and increase the limit from 5 to 8 2024-11-17 15:11:03 -05:00
johnnyq
cf6df1c2b1 Only show dismissed notifications pertaining to the logged in user 2024-11-17 15:09:30 -05:00
johnnyq
a81bcf350c When Dismiss all notifications are clicked only dismiss the notificaitons of the logged in user only 2024-11-17 15:03:05 -05:00
johnnyq
acec430e28 Fix var name in client edit post 2024-11-17 14:59:54 -05:00
johnnyq
9c24a780be More Checkbox enhancements, remove js from dashboard if finanacial isnt selected 2024-11-17 14:54:16 -05:00
johnnyq
b2fff24bd9 Change theme on click now instead of selecting them then hitting submit more ?? 0s for the form checkboxes 2024-11-17 14:33:31 -05:00
johnnyq
c2be946f7a Switched contact to use ?? 0 in post for checkbox items that are not checked, this save from creating an extra hidden form field in the form model hence cleaner code 2024-11-16 17:45:16 -05:00
johnnyq
978c7c5db4 Switched location to use ?? 0 in post for checkbox items that are not checked, this save from creating an extra hidden form field hence cleaner code 2024-11-16 17:38:19 -05:00
johnnyq
20a24b6ec6 Fix PHP error on login check if Array last_visited is set 2024-11-16 16:33:23 -05:00
johnnyq
20c87044b9 Only accept jpg, jpeg and png for company logo 2024-11-16 15:09:38 -05:00
johnnyq
5f4356546f Fix ticket post missing ) 2024-11-16 14:03:03 -05:00
johnnyq
7fd0a40ea1 logAction is used everywhere in ticket post, also did some logic tiday updates, but way more need to happen within ticket post so more to come 2024-11-16 14:01:08 -05:00
johnnyq
235d1641f0 Update Edit Ticket Logic, Moved fetching ticket info before check notify for logging and alerting and to reduce the amount of post data received 2024-11-16 12:34:13 -05:00
johnnyq
d5524f75b0 Format Alerting / Logging Currency for transfers 2024-11-15 16:05:57 -05:00
johnnyq
9d15721845 Fix Payment Amount logging 2024-11-15 16:00:02 -05:00
johnnyq
4ca9fbe655 wording 2024-11-15 15:31:47 -05:00
johnnyq
95ec0b2979 UI Update Setup: Move locale settings to its own screen 2024-11-15 15:28:20 -05:00
johnnyq
278ba079c3 Updated cron mail queue and cron email ticket parser to use new logAction and tidy up code 2024-11-15 13:40:04 -05:00
johnnyq
bc5e089e95 Updated login to use new logAction and tidy up code 2024-11-15 13:07:38 -05:00
johnnyq
7b9229d926 Updated Portal post to use new logAction and tidy up code 2024-11-15 12:53:41 -05:00
johnnyq
881f498237 Wording Updates Azure to Entra 2024-11-15 12:31:10 -05:00
johnnyq
a6a94e3ccd More logAction function updates to client portal entra login amd cleaned up the client entra login portal for better presentation of vars 2024-11-15 12:29:46 -05:00
johnnyq
412462a4c0 More logAction function updates to client portal login amd cleaned up the client login portal for better presentation of vars 2024-11-15 12:21:55 -05:00
johnnyq
577d97b471 Updated ajax.php to use the new logAction function 2024-11-15 11:53:43 -05:00
johnnyq
ed92592aa6 Check to see if arrays are set before executing for each loops to prevent php errors 2024-11-14 19:13:56 -05:00
johnnyq
e9f023f0c7 Updated all API functions to use the new logAction Function 2024-11-14 18:27:31 -05:00
johnnyq
bfffec7363 Temp added vars session_ip and session_user_agent to validate_api_key so IP and User agent is logged with the new logAction function 2024-11-14 17:55:35 -05:00
johnnyq
ba5e2b216b Updated asset API to use new logAction function 2024-11-14 17:42:01 -05:00
johnnyq
77aede8bab Updated the remaining posts except ticket to use new logAction function, tidy and added more details to logging 2024-11-14 17:32:26 -05:00
johnnyq
5bdd5d1f79 Finished Updating admin / settings posts to use new logAction function, tidy and added more details to logging 2024-11-14 17:20:52 -05:00
johnnyq
ef651f5248 Updated admin posts to use new logAction function, tidy and added more details to logging 2024-11-14 16:07:35 -05:00
johnnyq
8ffa90ae28 Updated vendor post to use new logAction function, tidy and added more details to logging 2024-11-14 13:39:17 -05:00
johnnyq
670390f1d3 Updated trip post to use new logAction function, tidy and added more details to logging 2024-11-14 13:16:23 -05:00
johnnyq
2047a6d18d removed old logging line in transfer 2024-11-14 12:52:56 -05:00
johnnyq
5d8b9ac600 Updated transfer post to use new logAction function, new role checking, tidy and added more details to logging 2024-11-14 12:51:26 -05:00
johnnyq
22f54886e2 Fix: Broken Create Quote - regression in logging 2024-11-14 11:56:12 -05:00
Johnny
653b174830 Merge pull request #1105 from itflow-org/import-chk
Import CSV - Check file uploaded
2024-11-14 11:17:11 -05:00
Johnny
b5256fb529 Merge pull request #1104 from itflow-org/quote-notifs
Quote notifications
2024-11-14 11:16:18 -05:00
Johnny
99b482ab30 Merge pull request #1103 from itflow-org/debug-tweak
Clarify notes on debug
2024-11-14 11:12:46 -05:00
Johnny
45b61da29a Merge pull request #1102 from itflow-org/archive-typo
Fix typo in ticket archived logging
2024-11-14 11:12:20 -05:00
wrongecho
7a561a8c2e Import CSV - Check file uploaded
Check the file was uploaded when importing a CSV. Can probably convert this into a function at a later date.
2024-11-14 11:51:39 +00:00
wrongecho
28a0343a97 Quote notifications
- Send an internal email when quotes are accepted/declined
- Clients are prompted to confirm accept/decline with confirm-link
- Tidy
2024-11-14 11:23:28 +00:00
wrongecho
9fe9d8e9ff Clarify notes on debug 2024-11-14 08:44:08 +00:00
wrongecho
fc94d71795 Fix typo in ticket archived logging 2024-11-14 08:08:52 +00:00
johnnyq
e4f618c150 More work on Updating ticket post to use new logAction function, added more ticket history updates, tidy and added more details to logging, lots of logic changes need to happen here 2024-11-13 18:46:28 -05:00
johnnyq
52284231bb Remove Dup Edit Priority Logic from ticket post and fix priority from > to 2024-11-13 17:56:28 -05:00
Johnny
05ff7e145c Merge pull request #1101 from ThaMunsta/feedback-notification
Update guest_post.php
2024-11-13 22:49:37 +00:00
johnnyq
56361c7008 Partially Updated ticket post to use new logAction function, added some ticket history updates, tidy and added more details to logging 2024-11-13 17:48:24 -05:00
ThaMunsta
93b5c6aab1 Update guest_post.php
fix hotlink on notification
2024-11-13 17:25:58 -05:00
johnnyq
47a4fa78a8 Updated task post to use new logAction function, tidy and added more details to logging 2024-11-13 17:22:07 -05:00
johnnyq
2ec4be8154 Updated software post to use new logAction function, rework array handling tidy and added more details to logging 2024-11-13 17:13:55 -05:00
johnnyq
a86eecf63b Updated service post to use new logAction function, rework adding / ediing arrays tidy and added more details to logging 2024-11-13 17:02:06 -05:00
johnnyq
ed02c2aa3e Updated revenue post to use new logAction function, new role check function tidy and added more details to logging 2024-11-13 16:23:35 -05:00
johnnyq
b408a31cde Updated rack post to use new logAction function, new role check function tidy and added more details to logging 2024-11-13 15:46:20 -05:00
johnnyq
cf22f01df4 Updated quote post to use new logAction function, tidy and added more details to logging 2024-11-13 15:28:24 -05:00
johnnyq
96649af18b Updated project post to use new logAction function, tidy and added more details to logging 2024-11-12 18:50:30 -05:00
johnnyq
c5aa22a832 Updated profile post to use new logAction function, tidy and added more details to logging 2024-11-12 18:26:04 -05:00
johnnyq
115640fc89 Updated product post to use new logAction function, tidy and added more details to logging and add permission check 2024-11-12 18:09:00 -05:00
johnnyq
08c8153d64 Updated network post to use new logAction function, tidy and added more details to logging 2024-11-12 17:41:56 -05:00
johnnyq
640a068026 Fix forloop regressions forgot to include POST duh 2024-11-12 17:30:53 -05:00
johnnyq
b88e111c64 Updated location post to use new logAction function, tidy and added more details to logging 2024-11-12 17:22:22 -05:00
johnnyq
e45b543ff8 Format Payment for currenct in alerting 2024-11-12 15:16:57 -05:00
johnnyq
b305758152 Finished Updating invoice post to use new logAction function, and appNotify function tidy and added more details to logging 2024-11-12 15:09:55 -05:00
johnnyq
651726c9ea Fix broken client link in audit logs 2024-11-12 11:26:43 -05:00
johnnyq
808b190c8d Fix broken AI Settings 2024-11-12 11:01:24 -05:00
johnnyq
e91c0b09b7 wording, fix 2024-11-11 17:46:10 -05:00
johnnyq
c61ec7def6 Partially Updated invoice post to use new logAction function, tidy and added more details to logging 2024-11-11 17:39:18 -05:00
johnnyq
1b8722eb90 Updated folder post to use new logAction function, tidy and added more details to logging 2024-11-11 16:13:44 -05:00
johnnyq
2a5945816d Updated file post to use new logAction function, tidy and added more details to logging 2024-11-10 14:37:02 -05:00
johnnyq
e58bf3d558 Updated epenses post to use new logAction function, tidy and added more details to logging 2024-11-10 13:32:42 -05:00
johnnyq
1ebd537d9d Updated Cron to use new logAction function, also updated logAction cron to make session_user_id 0 if not set 2024-11-10 12:44:10 -05:00
johnnyq
5d147c0d7a Replaced old logging with new logging function in domain event post along with tidy, wording updates and better logging and replaced one line with appNotify function 2024-11-10 12:16:30 -05:00
johnnyq
bd8ef62133 Replaced old logging with new logging function in domain post along with tidy, wording updates and better logging 2024-11-09 19:14:53 -05:00
johnnyq
51a6f7fa8f Removed left over old logging functionality in document post 2024-11-09 18:10:58 -05:00
johnnyq
93c64c7467 more wording updates 2024-11-09 18:08:19 -05:00
johnnyq
9e9c1100f8 wording update 2024-11-09 18:04:00 -05:00
johnnyq
0917633848 Replaced old logging with new logging function in document post along with tidy, wording updates and better logging 2024-11-09 18:01:59 -05:00
johnnyq
ae06ddb068 Replaced old logging with new logging function in credential post along with tidy, wording updates 2024-11-09 15:07:55 -05:00
johnnyq
60a0ebeeb6 added domain name in client creation logging 2024-11-09 13:23:40 -05:00
johnnyq
659aa7a788 Replaced old logging with new logging function in client post along with tidy, wording updates 2024-11-09 13:19:57 -05:00
johnnyq
cc97331676 Replaced old logging with new logging function in certificate post 2024-11-09 12:41:24 -05:00
johnnyq
ac2bbd55a7 Replaced old logging with new logging function in budget post 2024-11-09 12:29:15 -05:00
johnnyq
59cf67814a Functionalize Logging and tidy Asset Posts 2024-11-08 18:07:22 -05:00
johnnyq
365cd6dcae Functionlized logging for account post and wording tidy updates to account post as well 2024-11-08 16:37:05 -05:00
johnnyq
119b2d0fbc Functionalized logging for contact post and some tidying there as well 2024-11-08 16:23:24 -05:00
johnnyq
7b4dda0ad6 Functionalize logging, replaced old logging in contact add with new logging function 2024-11-08 14:40:14 -05:00
johnnyq
3d5e1a1811 Bulk Logic update for files to mimic document bulk deletion 2024-11-08 13:06:42 -05:00
johnnyq
e2f7537517 Add Bulk Document Deletion 2024-11-08 13:02:03 -05:00
johnnyq
1090794f7f Added Bulk File Delete support, Added new user role / permission enforcement on the file posts 2024-11-08 12:20:18 -05:00
johnnyq
01c9e8604f Updated the cron php script to use app notify removed the _esc from ids in cron ticket email parser as ids are always escaped as ints 2024-11-07 12:30:07 -05:00
johnnyq
a5cd1e1f1a Replaced old notification with new appNotify in all the Guest_ PHP Scripts 2024-11-07 12:13:05 -05:00
johnnyq
53724c3012 Clarify Contact Billing Role that they will receive a copy of invoices 2024-11-07 11:46:37 -05:00
johnnyq
68c47ee87d Updated appNotify function to allow null for client_id entity_id and action, also updated all the notification instances to use the new appNotify in cron.php, starting to drop the entity_id as well 2024-11-06 20:56:28 -05:00
johnnyq
db621a97fa FEATURE: appNotify Function added so each user can get their own notificaiton and can individually dismiss and see their own notifications, only works under invoice viewed right now 2024-11-06 18:58:45 -05:00
johnnyq
af9ec9ca85 Fix broken portal login and password reset due to the timezone set before the session was initiated, now we set the timezone after session has started 2024-11-06 17:55:46 -05:00
Johnny
6dbf6f0778 Merge pull request #1100 from itflow-org/admin-footer-banner
Add banner to admin footer
2024-11-06 15:13:59 -05:00
wrongecho
1dd6a02a15 Add banner to admin footer
To contain the app version, once we move to doing dev/master branches with releases.

Also adding the standard links to the forum, docs and sponsor services page.
2024-11-06 12:56:29 +00:00
wrongecho
1a66ad9070 Add banner to admin footer
To contain the app version, once we move to doing dev/master branches with releases.

Also adding the standard links to the forum, docs and sponsor services page.
2024-11-06 12:54:38 +00:00
johnnyq
351bb484a7 Reworked the entire debugger, only grather nessesary info and database comparison to existing and db.sql works now 2024-11-05 17:36:50 -05:00
johnnyq
2250269820 small Fixes UI Cleanups in checks 2024-11-05 15:35:58 -05:00
johnnyq
0d935fa221 Run various Checks (required PHP extentions, shell commands, ssl checks, fqdn check, directory permissions check, php settings check etc during setup 2024-11-05 15:19:23 -05:00
johnnyq
c41b391cb1 SET SQL TIMEZONE on Session, this fixes the issue where created,deleted,updated,archived_ats using SQLs current_timestamp() are set to UTC-0 in SQL causing issues with displaying data in ITFlow as PHP is set to the timezone selected. Note its optional to set system timezone 2024-11-05 13:47:38 -05:00
johnnyq
a3a0a3e8c6 Add xcustom and /post/xcustom to the git ignore list so git doesnt overwrite them except for the readme.php inside them 2024-11-04 22:03:57 -05:00
johnnyq
304623fc05 Guest View Invoice - Fix extra <th> tag in Outsanding Invoices Table 2024-11-04 16:41:57 -05:00
johnnyq
23cc47f8f5 DB Stucture Update: Added Ticket History Table to keep track of ticket events such as priority changes, ticket status, assignment, task completion etc 2024-11-04 12:21:47 -05:00
johnnyq
5211ba73d5 Moved Create Edit User code block towards the top of edit contact user to reduce the query by 1 2024-11-02 16:45:59 -04:00
johnnyq
593f09f6fd Fix issue with creating a contact without a user and then trying to create a user by editing the contact. 2024-11-02 16:25:50 -04:00
Johnny
ada0d52dc0 Merge pull request #1099 from itflow-org/aad-to-entra
Portal SSO - Rename AAD to Entra
2024-11-02 12:40:03 -04:00
Johnny
b71bc508f9 Merge pull request #1098 from itflow-org/cal-rep-dis
Disable calendar repeat for now until we properly add it
2024-11-02 12:39:54 -04:00
Johnny
b4f1cb7d8f Merge pull request #1097 from itflow-org/ticket-status-no-reply
Ticketing updates
2024-11-02 12:39:37 -04:00
Johnny
3dd7006ba4 Merge pull request #1096 from itflow-org/db-prune
Prune old database update logic (2+ yrs old)
2024-11-02 12:39:27 -04:00
Marcus Hill
2e2a992c32 Portal SSO - Rename AAD to Entra 2024-11-02 10:54:19 +00:00
Marcus Hill
d074ddad9f Disable calendar repeat for now until we properly add it 2024-11-02 10:50:30 +00:00
Marcus Hill
13f89d2118 Ticketing updates
- Allow changing ticket status without adding a reply (just leave the response blank)
- Bugfix: Contact change email didn't include URL key
- Make it clearer when nobody is assigned to a ticket
2024-11-02 10:22:31 +00:00
Marcus Hill
d8d455e324 Prune old database update logic (2+ yrs old) 2024-11-02 09:56:09 +00:00
johnnyq
eb70aba430 Also fix the credential tagging in client asset details page 2024-11-01 17:49:48 -04:00
johnnyq
5215ff9a7e Add Group By to logins to prevent duplicated logins from appearing, fixed client contact details from breaking because of missing login tag query 2024-11-01 17:21:55 -04:00
johnnyq
631163d691 Fix Extra spacing in Ticket to Invoice Description 2024-10-31 17:21:47 -04:00
johnnyq
2f182d8c3c tidy 2024-10-31 16:33:15 -04:00
johnnyq
08830fd21f CONTINUE BIG FIX: Adjust the breadcrumbs according to if you are in client section or main section when view ticket, invoice, quote, recurring ticket details 2024-10-31 16:30:34 -04:00
johnnyq
72240462a0 CONTINUE BIG FIX: Adjust the reaminder of links within client section 2024-10-31 15:56:20 -04:00
johnnyq
4e72925c21 BIG FIX: When accessing ticket, invoice, recurring invoice or quote details while in the client section of ITFlow keep the Client Side Nav instead of redirecting back to the Main Nav. This caused much confusion in the past. This will improve naviagtion in those areas greatly 2024-10-31 15:40:02 -04:00
johnnyq
5a6cf0ccac Revert Reoslved count as ins included when you click on Closed Add Mouse Hover Effects to Header Open and Closed Status 2024-10-31 13:39:51 -04:00
johnnyq
5af8d6934b Add Resolved Tickets Count and Select option for tickets 2024-10-31 13:26:34 -04:00
johnnyq
d35880e658 Disabled logging execution time of the mail parser 2024-10-30 21:04:16 -04:00
johnnyq
0ee5828bf3 Fix contact creation when emailing into the ticket parser with domain matching a client 2024-10-30 19:54:47 -04:00
johnnyq
910787c81c Fix Custom Links in the Top nav from breaking ITFlow if the database isnt updated to 1.4.6 2024-10-30 19:49:39 -04:00
johnnyq
1df98166bd Fix issue with Contacts API - Removed contact_auth from Contacts call to the API 2024-10-30 19:35:26 -04:00
johnnyq
c3321dcb0b Removed temp admin_fix file 2024-10-30 19:18:21 -04:00
johnnyq
70569fc226 Scans all files and matches them with the reference file in DB then sets the file size and Mime Type. Note this update doesnt do any DB Structure changes 2024-10-30 19:17:21 -04:00
johnnyq
241b0008e8 Updated DB Structure 2024-10-30 18:39:49 -04:00
johnnyq
3cc9c0720d FEATURE: Files now shows File Size, Mime Type, and who uploaded the file. These fields will only populate on newly uplaoded files, existing ones will show 0 or blank 2024-10-30 18:39:00 -04:00
johnnyq
883976529d UI Update to files, add Breadcrumbs, change file icon to dark 2024-10-30 17:05:58 -04:00
johnnyq
d60f5a9f86 FEATURE: Nested folders in Files 2024-10-30 16:55:19 -04:00
johnnyq
5d9b161b19 Wording Updates 2024-10-30 15:49:39 -04:00
johnnyq
96bdca5a4d UI Update: Reworked the Documents UI Folder Path is not located on the Right, Moved Search on the top when in root directory it searches all files when in a directory searches in current directory 2024-10-30 15:43:15 -04:00
johnnyq
a6ac215f8d FEATURE: Added Bulk Tag Assignment to Credentials 2024-10-30 15:07:51 -04:00
johnnyq
3b45f8e255 Remove login id beside the name, this was for debugging only 2024-10-30 14:53:48 -04:00
johnnyq
807bbef3e2 Use Tag array instead of querying by tag name when clicking on a tag to reveal other items with the same tag, this allow more narrowed searches 2024-10-30 14:51:39 -04:00
johnnyq
873df63c76 FEATURE: Added Credential Tagging Support 2024-10-30 14:40:02 -04:00
johnnyq
58738debc6 Fix for users on DB 1.5.9 updating to 1.6.0 check to see if login_folder_id exists before adding it and Makming sure all ticket statuses are a number 2024-10-30 12:13:26 -04:00
johnnyq
219028c6d1 Updated Anon and Archive Function to archive the user and set names to Archived - UnixTimeStamp 2024-10-30 11:41:39 -04:00
johnnyq
11f68a59f3 Fix Archive Contact, removed unused fields 2024-10-30 11:26:07 -04:00
johnnyq
990335838e Added First Asset History Item, Asset Created, also delete asset history when you delete an asset 2024-10-29 19:00:02 -04:00
johnnyq
c08ac330be FEATURE: Credential Tags Initial DB Structure Commit 2024-10-29 18:33:17 -04:00
johnnyq
926a796602 Replaced logs, with asset_history in client assets 2024-10-29 18:23:05 -04:00
johnnyq
f52beed3d0 Added asset history table 2024-10-29 18:16:28 -04:00
johnnyq
c3379a5576 Increase DB Field Sizes 2024-10-29 15:41:10 -04:00
johnnyq
ab3d915bdc Mail Ticket Parser Fix: Allow Unencrypted IMAP connections 2024-10-29 13:36:30 -04:00
johnnyq
af123d3978 Fix Only show Document Folders, Removed Create Subfolder as this is now merged into Create Folder Dependign on what folder you are in 2024-10-28 22:12:45 -04:00
johnnyq
1d4165f41a Updated Bulk Document Move to include the indented folder and sub folder structure 2024-10-28 18:47:43 -04:00
Johnny
bc211f3824 Merge pull request #1095 from itflow-org/tidy-28
Tidying
2024-10-28 18:31:13 -04:00
Johnny
5f708f6003 Merge pull request #1094 from itflow-org/force-mfa
Force setup of MFA on login
2024-10-28 18:21:32 -04:00
johnnyq
cb611a764b Rework Move Document to not utilize a function 2024-10-28 18:05:45 -04:00
johnnyq
580e6a55ce Remove garbage code 2024-10-28 17:54:33 -04:00
johnnyq
77fce6a69d FEATURE: Implemented SubFolders within Documents UI 2024-10-28 17:53:44 -04:00
wrongecho
91c01d2cdb Tidying 2024-10-28 21:16:15 +00:00
wrongecho
334829c23e Force setup of MFA on login 2024-10-28 21:01:55 +00:00
johnnyq
9491643a4b Fix issue where sometimes the due date is invisible when viewing an invoice from the guest link 2024-10-28 13:32:41 -04:00
johnnyq
56feefe612 Remove Create Ticket from Template dropdown in Contact Details 2024-10-26 19:20:06 -04:00
johnnyq
5094453550 Define processed and unprocessed email count for logging 2024-10-26 13:48:54 -04:00
johnnyq
41f2177788 Ticket Email Parser Add Debugging after each run to calculate emails processed and unprocessed including the execution time of the script 2024-10-26 13:42:48 -04:00
johnnyq
d3cca2e633 Fix Invalid var 2024-10-26 13:21:13 -04:00
johnnyq
07d89ad09d Re-add Functions after test 2024-10-26 13:14:56 -04:00
johnnyq
01db0ddc3c Do not use the autoloader to load php mime mail parser 2024-10-26 13:09:21 -04:00
johnnyq
46572afc77 Mail Parser: Use UIDs instead of Message Sequence Numbers, this could potentially fix the issue of repeating tickets 2024-10-26 13:06:53 -04:00
johnnyq
6c402942e4 Mail Parser: Better way to set important flag then remove seen flag 2024-10-26 12:48:41 -04:00
johnnyq
72eaf3d269 Email Ticket Parser: Fix Flagged Email from getting marked as read, use imap_store function to flag emails not processed as this function keeps the email as unread 2024-10-26 12:26:03 -04:00
johnnyq
71f7fa2683 Started working on Archiving Contact Options Dialog for when archiving a contact 2024-10-26 11:58:04 -04:00
johnnyq
ae561d3195 FEATURE: New Invoice Status Non-Billable 2024-10-25 14:33:12 -04:00
johnnyq
58f995ed37 Fix Invalid Field change in cron.php causing cron to break 2024-10-24 22:30:16 -04:00
johnnyq
aa2e0ed5c5 carry over the Task Completion estimate When creating a new ticket from a template 2024-10-23 14:13:05 -04:00
johnnyq
636c74dbb0 FEATURE: Added Task Completion Estimate to the UI 2024-10-23 14:06:41 -04:00
johnnyq
dffc97859d FEATURE: Estimated Time Completion on Tasks - Phase 1 DB Structure update 2024-10-23 13:28:46 -04:00
johnnyq
808fdf5f76 When Archiving, Unarchiving, Deleting and Bulk Actions also update the associated user as well 2024-10-23 12:40:32 -04:00
johnnyq
55c9c76194 Fix Self Password Reset via Portal 2024-10-23 00:46:02 -04:00
Johnny
0a63ed2cd6 Merge pull request #1091 from itflow-org/bugfix-tck-schd-notif
Bugfix: Ticket scheduling emails
2024-10-23 00:29:00 -04:00
johnnyq
f2dedbf8e8 Cmplete Migrate Contact Users to Users 2024-10-22 23:53:14 -04:00
johnnyq
ee19e1b967 Check for user type of during login and set a temp if condition on check_login.php to see if user_type field exists and query user based off that result, the condition will be removed at a later date 2024-10-22 17:06:18 -04:00
johnnyq
ba64a179c6 Add contact_user_id to contacts table to associate a contact with a user 2024-10-22 16:34:08 -04:00
wrongecho
30738ed9fd Bugfix: Ticket scheduling emails
Scheduling a ticket should only send an email if config_ticket_client_general_notifications is enabled
2024-10-22 19:42:40 +01:00
johnnyq
499f9456f8 DB Update add user_role_type to differentiate between itflow users, client users and api permissions 2024-10-22 14:08:50 -04:00
johnnyq
48b306452c Phase 1 - Combining contact logins with users table - Add User Type field to users table 2024-10-22 13:47:44 -04:00
johnnyq
ea494a8b5c Fix FullCalendar Links 2024-10-21 13:53:40 -04:00
johnnyq
b456caa129 Bump FullCalendar from 6.1.10 to 6.1.15 2024-10-21 13:48:29 -04:00
johnnyq
b1de0c86f6 Fix Broken Client Details page 2024-10-21 13:36:44 -04:00
johnnyq
47c6c70c67 Bump DataTables from 2.0.8 to 2.1.8 2024-10-21 12:29:05 -04:00
johnnyq
a93187fdf8 Add Number of Tasks in the ticket template selection when creating a ticket 2024-10-20 14:49:50 -04:00
johnnyq
c214c12d00 FEATURE: Auto Populate Create Ticket when selecting a template, remove old ticket mail parser code 2024-10-20 14:34:09 -04:00
johnnyq
061e912123 Tidy 2024-10-20 12:48:14 -04:00
johnnyq
fccc8ab8fd Fix adding a device to a rack: Unit Start number cannot be higher than Unit End number 2024-10-19 16:34:03 -04:00
johnnyq
c32c47785e Fix notification action log path for cron successully run 2024-10-19 16:13:36 -04:00
johnnyq
ab9ae71ac7 Do not resanitize subject after passed to the create/update ticket function as its sanitized before passing to the functon, this caused unessesary slashes in the subject line if sql escape chars were used 2024-10-19 15:56:26 -04:00
johnnyq
051fdda9a8 Bump TinyMCE from 7.3.0 to 7.4.1 2024-10-18 18:08:39 -04:00
johnnyq
36af07c837 Bump PHPMailer from 6.9.1 to 6.9.2 2024-10-18 18:02:09 -04:00
johnnyq
1e964fe90a Remove WEBKLEX-PHP_IMAP Libraries 2024-10-18 17:44:43 -04:00
johnnyq
6cd5290f4c Migrate cron_ticket_email_parser.php back to using php-mime-mail-parser libraries and php extensions php imap and php Mailparse while still keeping the new functionality from the webklex php-imap version of this script. There were wayyy to many dependcies with WebKlex and ran into way too many problems. This delays OAAUTH2 until we can find a better solution 2024-10-18 17:29:45 -04:00
johnnyq
02e3ca3f52 Wording 2024-10-18 16:12:11 -04:00
johnnyq
64a3f8f1cc UI Update of Client Add / Edit Modals - Moved Lead Checkbox next to Name, Moved Shortned Name and tags to main tab 2024-10-18 16:00:41 -04:00
johnnyq
b15a175044 When creating Ticket from main ticket listing and not the client listing make Client Selectable first 2024-10-18 15:42:09 -04:00
johnnyq
8dca7bc183 Simplify Ticket Creation and Edit Model by removing unessesary tabs and combining fields to fewer tabs 2024-10-18 15:40:17 -04:00
johnnyq
6c1c5d6523 Simplify Ticket Template Creation by putting all fields into 1 modal tab instead of multiple and removing the ability to ass tasks via add ticket template, this should be done in the details 2024-10-18 15:11:54 -04:00
johnnyq
d01d912154 Move logout to a file logout.php in /post fixes issue where one cant logout if in admin section, also redirect to login page with or without login key if set 2024-10-18 00:12:08 -04:00
johnnyq
fe86ca0dd7 Bump php-mime-mail-parser from 8.0 to 8.0.4 2024-10-17 23:33:53 -04:00
johnnyq
77ed7aa7ff Updated new cron mail parser 2024-10-17 23:15:39 -04:00
johnnyq
646b94d8ab Initial work on new Mail Parser that uses the old php imap libraries and not the new webklex 2024-10-17 20:55:23 -04:00
johnnyq
878e145550 When Editing Recurring Expense use the Next Month Date instead of selecting the month that the recurring expense was initially created 2024-10-15 18:28:53 -04:00
johnnyq
bfd5973be8 Fix Bulk Actions by removing input form requirements for Create asset ticket as they share one giant form 2024-10-12 15:38:43 -04:00
johnnyq
5bc260e0c0 Wording Fix 2024-10-11 12:31:55 -04:00
johnnyq
0fc6a2f02c Keep contact contact within the media body 2024-10-10 18:13:35 -04:00
johnnyq
4289ba3026 Display Link Location Name in the Custom Links Listing 2024-10-10 17:37:53 -04:00
johnnyq
22086bef24 Optimize Guest Post to only selecting the required Database Table Fields and Tidy 2024-10-10 17:01:40 -04:00
johnnyq
0954579216 rename admin to administration and use user-shield icon 2024-10-10 16:57:27 -04:00
johnnyq
e37df8bf4b Fix Custom Link Order to ASC instead of DESC as well 2024-10-10 16:53:31 -04:00
johnnyq
ab1c5ac631 FEATURE: Custom Links can be added to the Top Nav Note must have icons 2024-10-10 16:51:00 -04:00
johnnyq
eaab9b75de Send InApp Notification when Quotes have been Declined or Accepted, also show status under guest url 2024-10-10 15:28:30 -04:00
johnnyq
2b2840a43c When Adding a Ticket Template to a Project Template use the Template name and not the subject also optimized Query 2024-10-10 14:42:57 -04:00
johnnyq
4963f2f385 Add Ticket Category to New Ticket and Bulk add Tickets through assets 2024-10-10 01:38:21 -04:00
johnnyq
a9ebc1395c Fix Repeating ticket number when adding bulk tickets via assets 2024-10-10 01:08:12 -04:00
johnnyq
70ae55eacb Tidy 2024-10-09 15:49:42 -04:00
johnnyq
134f4f9ad3 FEATURE: Create Ticket for each asset in Bulk 2024-10-09 15:24:40 -04:00
johnnyq
bbdc83e57e Add Cron Execution Notify placeholder to notifications 2024-10-09 14:01:42 -04:00
johnnyq
ef3c87f5d9 Added some headings to notifications to help seperate them 2024-10-09 13:25:34 -04:00
johnnyq
6fa3aea520 Add placeholder for ITFlow Update Notification to Notifications Settings 2024-10-09 13:15:53 -04:00
johnnyq
51578cd743 Update Wording 2024-10-09 13:12:35 -04:00
johnnyq
66a28685a3 Add Place Holders for Certificate, Asset Warranty and Shared Item View to the Notifications settings, also removed 120 Days from the Notifications Settings page 2024-10-09 13:10:52 -04:00
johnnyq
246878a32f Create Notification if a shared item was viewed 2024-10-09 12:56:55 -04:00
johnnyq
ce9a0b903f Added Shared Item Recipient to Files, Documents and Credentials 2024-10-09 12:36:22 -04:00
johnnyq
d0769b9f6b Added Shared Item Recipient Email to the Shared Items list in overview 2024-10-09 12:13:26 -04:00
johnnyq
f1a90156c2 Expose more Admin Options in the Side menu without having to expand sub menus 2024-10-08 18:44:08 -04:00
Johnny
b0c592831e Merge pull request #1090 from itflow-org/tidy
Tidying
2024-10-08 18:24:06 -04:00
wrongecho
b9e37d4052 Tidying
- Move more things to new permissions system
- Deduplicate assets post logic into model
- Swap out some "SELECT *" queries when only a couple of rows are actually needed
2024-10-08 23:10:27 +01:00
wrongecho
987cd59764 Tidying
- Move more things to new permissions system
- Deduplicate assets post logic into model
- Swap out some "SELECT *" queries when only a couple of rows are actually needed
2024-10-08 23:08:05 +01:00
johnnyq
ac3ab1dedb Add Notes about setting up cron, Add ITFlow Docs Custom Link when you setup ITFlow 2024-10-08 17:49:41 -04:00
johnnyq
7eee69366a Show Example of what Phone masking Enable vs Disabled 2024-10-08 16:13:03 -04:00
Johnny
e90200aebe Merge pull request #1089 from itflow-org/bugfix-template
Ticket templates - edit bugfix
2024-10-07 11:37:14 -04:00
wrongecho
ff954b0060 Ticket templates - edit bugfix 2024-10-07 12:18:09 +01:00
wrongecho
3c73c4d34a README.md - Add Sponsor: F1 For Help 2024-10-07 07:49:24 +01:00
Johnny
4309fcc48c Merge pull request #1088 from itflow-org/doc-revisions-updatedby
Docs - Show user updated by in revisions
2024-10-06 21:36:47 -04:00
Johnny
893eb16819 Merge pull request #1087 from itflow-org/invoice-pay-addr
Invoices - Send email notif when paid
2024-10-06 21:36:13 -04:00
Johnny
e5472e2cb1 Merge pull request #1086 from itflow-org/portal-login-logs
Portal login logs
2024-10-06 21:35:53 -04:00
Johnny
315a90a913 Merge pull request #1085 from itflow-org/debug
Add notes to debug page
2024-10-06 21:35:38 -04:00
wrongecho
ab18005d72 Docs - Show user updated by in revisions 2024-10-06 21:43:07 +01:00
wrongecho
a9de75aa99 Invoices - Send email notif when paid 2024-10-06 20:59:54 +01:00
Marcus Hill
377c5952d7 Portal login logs
- Mention contact ID in audit log if password is incorrect
- Mention in audit logs if invalid email/auth method
2024-10-06 16:38:48 +01:00
Marcus Hill
afe378d2f3 Add notes to debug page 2024-10-06 16:25:58 +01:00
Johnny
c948ccff5c Merge pull request #1084 from itflow-org/budget-perms
Budget - CSRF + Perms
2024-10-03 16:52:28 -04:00
Johnny
5ea271662b Merge pull request #1083 from itflow-org/tax-report-tidy
Tidy up the tax report + perms
2024-10-03 16:52:18 -04:00
Johnny
3bc9b28712 Merge pull request #1082 from itflow-org/ticket-invoice-tidy
Tidy up the ticket_invoice_add_modal
2024-10-03 16:52:04 -04:00
Johnny
c77246c7f8 Merge pull request #1081 from itflow-org/more-permss
Move account/asset post logic to new permissions system
2024-10-03 16:51:55 -04:00
wrongecho
f8c6a5ef19 Budget - CSRF + Perms 2024-10-03 20:52:37 +01:00
wrongecho
90fb28e32b Tidy up the tax report + perms 2024-10-03 20:42:56 +01:00
wrongecho
5635cd9b8c Tidy up the tax report 2024-10-03 20:41:28 +01:00
wrongecho
e433c819a8 Tidy up the tax report 2024-10-03 20:41:12 +01:00
wrongecho
4d7d9baba8 Tidy up the ticket_invoice_add_modal 2024-10-03 20:25:41 +01:00
wrongecho
18889d228a Move account/asset post logic to new permissions system 2024-10-03 19:42:48 +01:00
Johnny
6d6689e7c5 Merge pull request #1080 from itflow-org/cert-dont-blank
Certificate cron bugfix
2024-10-02 12:34:57 -04:00
Johnny
11230d655f Merge pull request #1079 from itflow-org/custom-actions
Add custom event handler
2024-10-02 12:34:45 -04:00
Johnny
10fab109eb Merge pull request #1078 from itflow-org/cert-perms-model
Certificates - perms and model
2024-10-02 12:30:01 -04:00
wrongecho
63579d5a8f Certificate cron bugfix
Don't try to update certificates if expiry is empty (connection error)
2024-10-02 12:00:56 +01:00
wrongecho
fa6aa4318b tidy 2024-10-02 11:42:30 +01:00
wrongecho
d7b5e0e591 tidy 2024-10-02 11:35:14 +01:00
wrongecho
4a625183fb Certificates - perms and model
Move certificates to the new permissions system
Deduplicate add/edit using a model
2024-10-02 11:26:58 +01:00
wrongecho
1c404b9cf1 Add custom event handler to be triggered by some actions affecting tickets/quotes/invoices/contacts 2024-10-02 11:26:13 +01:00
wrongecho
4e9afd3e6b Certificates - perms and model
Move certificates to the new permissions system
Deduplicate add/edit using a model
2024-10-02 08:32:42 +01:00
johnnyq
c352f6e3cb Do not show Send Invoice or Add Payment if Invoice Amount is 0 2024-10-02 01:04:59 -04:00
johnnyq
6a55abaf50 Fix Error 500 when adding or editing network 2024-10-01 22:50:30 -04:00
Johnny
1f846f4164 Merge pull request #1076 from cybershieldms/ticket-features
cron_ticket_email_parser.php - send new ticket opened email to unknown clients
2024-10-01 14:49:56 -04:00
johnnyq
7ccfad80de Add Client name to the paid notification when client pays via stripe 2024-10-01 12:09:42 -04:00
Craig Hodges
d506790135 Merge branch 'itflow-org:master' into ticket-features 2024-09-30 19:08:30 -05:00
Craig Hodges
da3a6d636e Changed regex to only exclude from postmaster or daemon. 2024-09-30 19:07:01 -05:00
Johnny
b318872ba8 Merge pull request #1077 from itflow-org/projects
Projects fixups
2024-09-30 17:53:28 -04:00
wrongecho
e0b088b76b Projects
- Add archive and unarchive ability
- Improve logic around Open > Close > Archive > Delete
- Change to new perms system
- Tidy and formatting
- TODO: CSRF
2024-09-30 21:31:04 +01:00
wrongecho
10a223b5b8 Projects
- Add archive and unarchive ability
- Improve logic around Open > Close > Archive > Delete
- Change to new perms system
- TODO: CSRF
2024-09-30 21:27:42 +01:00
wrongecho
81844cea2e Update credential.Php - model fix path 2024-09-30 18:47:22 +01:00
Craig Hodges
bd5621ce1e Sends new ticket notifications to unknown (client id = 0) including logic to not process e-mail bounce messages. Fixed ticket description missing from new ticket notifications to others ().Added e-mail From: display name () to beginning of ticket description. 2024-09-29 23:46:45 -05:00
Johnny
7945d8b998 Merge pull request #1075 from itflow-org/tck-eml-urls
Add guest ticket URL to emails
2024-09-29 21:14:48 -04:00
wrongecho
478d81b0f9 Add guest ticket URL to emails 2024-09-29 22:00:15 +01:00
wrongecho
a414f279b1 Fix admin nav modules 2024-09-29 21:35:33 +01:00
Johnny
13d9d01e22 Merge pull request #1074 from itflow-org/more-perms
Refactor POST handling
2024-09-29 14:39:30 -04:00
Marcus Hill
0c0cf2f427 Refactor POST handling.
- Split into admin and user handlers, each admin page gets its own file now
- Enforce role access once for admin POST requests
- Automatically load POST logic for admin-based requests based on the referring page, otherwise automatically load all user request logic
- Add support for using custom POST handlers
2024-09-29 19:08:59 +01:00
Marcus Hill
6363d265ca Refactor POST handling.
- Split into admin and user handlers, each admin page gets its own file now
- Enforce role access once for admin POST requests
- Automatically load POST logic for admin-based requests based on the referring page, otherwise automatically load all user request logic
- Add support for using custom POST handlers
2024-09-29 19:02:28 +01:00
Johnny
e911bde66c Merge pull request #1073 from itflow-org/stripe-note
Add note re payment providers
2024-09-29 10:48:06 -04:00
Marcus Hill
99a6562d1e Add note re payment providers 2024-09-29 12:18:41 +01:00
Johnny
635b1f903a Merge pull request #1072 from itflow-org/post-perms-maint
More enforcing user permissions
2024-09-29 00:30:25 -04:00
wrongecho
928d723a77 More enforcing user permissions 2024-09-28 20:07:54 +01:00
wrongecho
654b590033 More enforcing user permissions 2024-09-28 20:04:33 +01:00
Johnny
e94aae7940 Merge pull request #1071 from ThaMunsta/download-filename-fix
Update expenses.php
2024-09-26 16:54:43 -04:00
johnnyq
cbcb793b64 Remove temp Debugging snippet for calculating recurring expenses 2024-09-26 16:52:17 -04:00
johnnyq
aca45d39aa Fix Monthly Recurring Expenses always showing 0 in Dashboard 2024-09-26 16:50:32 -04:00
ThaMunsta
e3df5c02bf Update expenses.php
Downloaded filename was hardcoded and assumed only ever PDF would be uploaded and downloads any jpg/png as a PDF filename. Fix takes into account the database filename and extension and updated iconography for more general file indication.
2024-09-25 22:57:31 -04:00
johnnyq
0cd7e7a9f5 Fix Notification Number 2024-09-25 20:25:34 -04:00
johnnyq
7d0c9b738f Fix Icons 2024-09-25 19:26:28 -04:00
johnnyq
f245d1a7b4 Revert notification Icon and badge color 2024-09-25 19:22:02 -04:00
johnnyq
2290e7ba32 UI Top Nav: Reposition Notification badge count and change color to warning 2024-09-25 17:07:17 -04:00
johnnyq
4f0e74520c Removed Destructive delete option in assets, Added Delete to assets if archived 2024-09-24 16:17:02 -04:00
johnnyq
c5e9d02edf UI Update Client Vendors: Give Description its own column, add account number if exists below Vendor Name and fix copy website button submitting instead of copying the site 2024-09-24 13:34:22 -04:00
Johnny
8e9654927a Merge pull request #1070 from itflow-org/email-parse-eml
Email parser - bugfix saving the original message
2024-09-22 01:33:00 -04:00
wrongecho
eb831b5ca1 Email parser - bugfix saving the original message 2024-09-21 16:59:38 +01:00
johnnyq
3c6b9ea206 Added Archive Button for Vendors 2024-09-21 11:47:54 -04:00
Johnny
d33e5cd08d Merge pull request #1069 from itflow-org/client-http-header-loginfail
Show a 401 header for unsuccessful portal logins
2024-09-21 11:27:16 -04:00
Johnny
c5575e749e Merge pull request #1068 from itflow-org/http-header-blocked
Show a 429 header when logins are blocked
2024-09-21 11:27:08 -04:00
Johnny
f1ce116fb5 Merge pull request #1067 from itflow-org/encoding
Detect and convert non-UTF8 encoding as part of input sanitization
2024-09-21 11:27:00 -04:00
wrongecho
0e4f57eaed Show a 401 header for unsuccessful portal logins 2024-09-21 13:45:47 +01:00
wrongecho
19dc33a836 Show a 429 header when logins are blocked 2024-09-21 13:08:30 +01:00
wrongecho
b509090530 Detect and convert non-UTF8 encoding as part of input sanitization 2024-09-21 11:07:53 +01:00
johnnyq
c5e13fdba6 Fix Dead Link 2024-09-20 21:45:23 -04:00
Johnny
eff4c9c725 Merge pull request #1066 from itflow-org/updates-db-first
Show DB updates before git updates
2024-09-20 20:02:38 -04:00
johnnyq
04f0905397 Added sort order visual cues to every listing 2024-09-20 20:00:21 -04:00
wrongecho
9d0f553422 Update CODE_OF_CONDUCT.md
rm discord
2024-09-20 23:32:05 +01:00
wrongecho
2e74e1756c Show DB updates before git updates 2024-09-20 21:51:51 +01:00
johnnyq
f9897e811c Added Sort order visual cue to invoices 2024-09-20 16:45:45 -04:00
wrongecho
3c413ae0be Merge pull request #1065 from itflow-org/revert-admin-check
Temp revert new admin check to allow DB updates
2024-09-20 21:42:03 +01:00
wrongecho
b6e4d6dd34 Temp revert new admin check to allow DB updates 2024-09-20 21:40:05 +01:00
Johnny
26e4dc5fb3 Merge pull request #1064 from itflow-org/roles-enforce-2
Permissions - clients and tickets
2024-09-20 16:16:59 -04:00
johnnyq
b658cf09dc Opps settings_localization_array.php should have not have amin_ prepended reverting 2024-09-20 16:15:05 -04:00
johnnyq
3fff623674 Add visual sort order cues to quotes 2024-09-20 16:13:38 -04:00
wrongecho
23f776efa3 Permissions - clients and tickets
Enforce new permissions model in clients and tickets
2024-09-20 21:10:24 +01:00
johnnyq
2d13dab61e Add Visual sort cues to Recurring Tickets, and projects 2024-09-20 16:02:59 -04:00
johnnyq
91e4dd5dba Add Recurring Invoices, Tickets, Expenses instead of just Recurring back to the side navs, makes for easier navigation 2024-09-20 15:45:37 -04:00
johnnyq
42ffa9b4ab Move /post/settings.php into /post/admin.php 2024-09-20 15:23:50 -04:00
johnnyq
3c4275e2c6 Preappend admin_ to the settings files for consistency 2024-09-20 15:14:28 -04:00
Johnny
9c92831f70 Merge pull request #1062 from ThaMunsta/rep-tk-client-fix-round2
Update report_ticket_by_client.php
2024-09-20 15:00:38 -04:00
Johnny
dd1994e881 Merge pull request #1061 from itflow-org/rec-delete
Recurring invoices - hide delete when active
2024-09-20 15:00:12 -04:00
Johnny
49341782a9 Merge pull request #1059 from itflow-org/func-acc-tidy
Tidy unused accounting functions
2024-09-20 14:57:19 -04:00
ThaMunsta
c02386f439 Update report_ticket_by_client.php
Sorry I thought I had this sorted out the first time but the monthly report section was still wrong.
2024-09-20 14:51:18 -04:00
johnnyq
847870a45a Fixed undefined sort var by using php isset function in the filter header, added sort order icons to tickets 2024-09-20 14:35:26 -04:00
wrongecho
ce3264db04 Recurring invoices - hide delete when active
Adjust recurring invoices so they have to be made inactive to delete them
2024-09-20 19:33:32 +01:00
wrongecho
eeac235c1d Tidy unused accounting functions 2024-09-20 19:24:28 +01:00
Johnny
e714b80af2 Merge pull request #1058 from ThaMunsta/settings-online-payment-fix
Update settings_online_payment.php
2024-09-20 14:11:43 -04:00
ThaMunsta
65b4f97e37 Update settings_online_payment.php
Removed account type as I understand that isn't used anymore.
2024-09-20 14:07:25 -04:00
johnnyq
8498f01f6c Rename pagination_head.php to filter_header.php as this is a more suitable name for its function 2024-09-20 13:58:30 -04:00
Johnny
c9f3d17f12 Merge pull request #1057 from itflow-org/roles-enforce-1
Custom Roles & Permissions
2024-09-20 13:29:31 -04:00
wrongecho
3d1e333ff0 Custom Roles & Permissions
Initial enforcement of custom roles & permissions - only on some pages via GET for now.
2024-09-20 18:17:59 +01:00
wrongecho
3c9995cb01 Custom Roles & Permissions
Initial enforcement of custom roles & permissions - only on some pages via GET for now.
2024-09-20 18:09:00 +01:00
johnnyq
55c832bde6 Feature: Inititial functionality for sort order icons on table headers 2024-09-20 13:01:41 -04:00
wrongecho
10fafacefe Custom Roles & Permissions
Initial enforcement of custom roles & permissions - only on some pages via GET for now.
2024-09-20 17:59:49 +01:00
Johnny
5a20c7fdbe Merge pull request #1056 from itflow-org/client-import
Client import - resiliency
2024-09-20 11:43:42 -04:00
Johnny
5eb9f3f5ee Merge pull request #1055 from itflow-org/tag-delete-fix
Fix deleting tags
2024-09-20 11:42:54 -04:00
wrongecho
0886a6c41d Client import - resiliency
- Add some resiliency to the client import function to better account for blank fields (may also fix some import errors)
- Fix the default settings page not loading due to the removal of account types
2024-09-20 11:38:15 +01:00
wrongecho
677d80d770 Fix deleting tags 2024-09-20 10:44:22 +01:00
Johnny
1390ca07f9 Merge pull request #1054 from ThaMunsta/report-fix
Update mysql query for report_ticket_by_client.php
2024-09-20 00:26:05 -04:00
ThaMunsta
2898084851 Update mysql query for report_ticket_by_client.php
Fix empty report
2024-09-19 23:51:17 -04:00
johnnyq
547f9282d3 Fix Dead link to domains in dashboard 2024-09-19 14:21:06 -04:00
johnnyq
8c4b021168 Added UI elements for the new custom link fields, new tab, order and location 2024-09-18 21:25:59 -04:00
johnnyq
0a1ab84140 DB Structure Update for additonal feature of custom links include nav location, order and open in new tab option 2024-09-18 18:22:37 -04:00
johnnyq
4dd24531cb Fix Main, user account, reports and admin side nav bars to prevent text overflow when collapsed now only show back button when collapsed 2024-09-18 17:52:19 -04:00
johnnyq
5f46536a85 Update Secure Message with the intended recipient, also added a confidential disclosure method to the email and Secure message link, added number of views left and expire date, and other minor ui updates 2024-09-18 17:22:39 -04:00
johnnyq
415f536cd7 DB Structure Update: Remove Account Types, Add Account Description Field, Change is admin from INT to TINYINT for performance 2024-09-18 16:30:55 -04:00
Johnny
62a2ed7430 Merge pull request #1052 from itflow-org/perms-2
Permissions overhaul - Define permissions in the database
2024-09-18 14:20:05 -04:00
johnnyq
eaee42f1f5 Add the ability to edit ticket reply types to puiblic or internal, note there is no client email option here 2024-09-17 14:55:02 -04:00
johnnyq
7b2566b654 Remove all reminense of Account Types next is deleting the DB Tables for account types 2024-09-17 13:59:58 -04:00
johnnyq
10ecb8b7c9 Phase 2 Removal of Account Types: Removed files 2024-09-17 13:32:37 -04:00
johnnyq
4286588446 Initial Removal of Account Types: Removed from Admin side nav 2024-09-17 13:29:31 -04:00
johnnyq
a2766bd67f Allow Techs to remove units from a rack 2024-09-17 13:24:08 -04:00
johnnyq
273483151f Add Expiration Date Column to Software Licenses 2024-09-17 13:18:46 -04:00
johnnyq
7e9b924927 Allow Columns to be sorted in Recurring Tickets 2024-09-17 12:45:47 -04:00
johnnyq
b251b7a15f Remove 120 Day Notifications for Domain, Cert, Warranty 2024-09-16 18:16:13 -04:00
wrongecho
0d0483b0a4 Update README.md
Move 'Built With' to docs
2024-09-15 00:18:12 +01:00
wrongecho
147df7f292 Update SECURITY.md
Add badge
2024-09-15 00:10:42 +01:00
wrongecho
970efa7731 Merge pull request #1053 from itflow-org/tidy
Tidying
2024-09-14 23:58:09 +01:00
wrongecho
4a6d312ea0 Tidying 2024-09-14 23:50:05 +01:00
wrongecho
5dc9f47799 Tidying 2024-09-14 23:47:19 +01:00
wrongecho
c65db3431d Tidying 2024-09-14 23:43:54 +01:00
wrongecho
ee9a2789e9 Permissions overhaul - Define permissions in the database
2nd attempt at this one!
Similar to #1008 but separately defining the roles, modules and associated permissions in the database.
Also has admin being a defined role automatically having full access.

Parent issue: #530
2024-09-14 19:14:35 +01:00
wrongecho
c7340ca0d4 Permissions overhaul - Define permissions in the database
2nd attempt at this one!
Similar to #1008 but separately defining the roles, modules and associated permissions in the database.
Also has admin being a defined role automatically having full access.

Parent issue: #530
2024-09-14 18:55:00 +01:00
wrongecho
271019b16b Permissions overhaul - Define permissions in the database
2nd attempt at this one!
Similar to #1008 but separately defining the roles, modules and associated permissions in the database.
Also has admin being a defined role automatically having full access.

Parent issue: #530
2024-09-14 18:29:44 +01:00
johnnyq
6975d6ef44 Fixed Broken Link to all assets on the dashboard, added link for all domains, updated all domains report to highlight domains, expired and expiring 2024-09-13 14:35:46 -04:00
johnnyq
07df444561 Added Bulk Delete Expenses Option 2024-09-13 13:52:47 -04:00
johnnyq
6bb56f7c51 UI Improvement to Domains, Certificates and Licenses listing: Updated Expire to show TimeAgo as well and to highlight table rows red if expiring within 14 Days, yellow for 90 days and gray if expired also updated side badges to refelect the badge color as well 2024-09-13 13:31:18 -04:00
johnnyq
208e56e784 Added Additonal Export Options to Expenses Including Account, Vendor and Category, removed CSV Warning on Export Model 2024-09-13 12:32:16 -04:00
johnnyq
e0ca3f15a8 Added Ubuntu, Fedora and DuckDuckGo to user agents 2024-09-12 12:42:15 -04:00
johnnyq
168a298a55 Dont Show windows version as this is inaccurate, show just Windows for OS, fix Opera String, and removed iPod 2024-09-12 12:28:24 -04:00
Johnny
86f1beb687 Merge pull request #1051 from itflow-org/allow-clear-avatar
Allow users to clear their avatar
2024-09-12 12:16:12 -04:00
Johnny
412eed7554 Merge pull request #1050 from itflow-org/ticket-reply-layout
Adjust ticket reply layout
2024-09-12 12:16:02 -04:00
johnnyq
f2a3299ef0 Update getOS Function to include Windows 11, Fix get Web Browser when using Microsoft Edge 2024-09-12 12:13:51 -04:00
wrongecho
80884bab47 Allow users to clear their avatar 2024-09-12 15:34:51 +01:00
wrongecho
77b7250703 Adjust ticket reply layout 2024-09-12 15:04:52 +01:00
Johnny
5ef8bd5720 Merge pull request #1049 from itflow-org/api
API Tidy
2024-09-11 18:05:55 -04:00
Johnny
7324c21c1f Merge pull request #1047 from itflow-org/share-modal-anyone
Guest Link Sharing
2024-09-11 18:05:45 -04:00
Johnny
f0456705ca Merge pull request #1046 from itflow-org/network-show-id
Show network ID when editing items
2024-09-11 18:05:32 -04:00
wrongecho
f3e9c9c867 API Tidy
- Remove old client ID queries, these are now built into the API keys. If a key has access to all clients, a client ID can be provided in the query.
- Small fixes to assets URI lookup
- Add read endpoint for vendors
2024-09-11 18:06:45 +01:00
wrongecho
0ad0c2c955 Guest Link Sharing
- Allow links to be emailed to non-contacts by typing their email
- Don't show archived contacts on the dropdown
- Removed unused email send check (handled via queue now)
2024-09-11 17:12:30 +01:00
wrongecho
8df3896f69 Show network ID when editing items
Shows the database object ID when editing networks on the Notes tab, to allow for use in the API.
2024-09-11 11:17:54 +01:00
Johnny
2e202df3ff Merge pull request #1045 from itflow-org/show-db-ids
Show object ID when editing items
2024-09-10 21:30:46 -04:00
Johnny
e8c27e9234 Merge pull request #1043 from itflow-org/email-send-tidy
Email Send - Tidy
2024-09-10 21:25:07 -04:00
Johnny
c863b8b033 Merge pull request #1042 from itflow-org/rm-stripe-client-pays
Stripe - Client pays removal
2024-09-10 21:22:33 -04:00
Johnny
9a53f65cdf Merge pull request #1041 from itflow-org/next-num
Ticket next number should not be lower than the last ticket number
2024-09-10 21:18:55 -04:00
Johnny
deb9ae0065 Merge pull request #1040 from itflow-org/tickets-export
Add resolved date to ticket export csv
2024-09-10 21:18:40 -04:00
wrongecho
586f0f1c57 Show object ID when editing items
Shows the database object ID when editing on the Notes tab, to allow for use in the API.
Needs further work as we move things to dynamic modals for editing.
2024-09-10 23:04:12 +01:00
wrongecho
517e8d42f0 Email Send - Tidy
- Enhance error logging in cron_mail_queue.php
- Prevent invalid sender addresses
- Prevent potential SQL injections in the sender name (admin settings and should be sanitized before being sent to queue anyway)
2024-09-10 22:34:20 +01:00
wrongecho
549868e3bf Stripe - Client pays removal
- Complete removal of client paying Stripe fees feature
- Add PHP error logging to the Stripe payment process
2024-09-10 20:26:16 +01:00
wrongecho
9e4f9cbd74 Ticket next number should not be lower than the last ticket number to prevent collisions 2024-09-10 19:20:06 +01:00
wrongecho
ce1fc04468 Add resolved date to ticket export csv 2024-09-10 19:14:47 +01:00
wrongecho
24cc593162 Add resolved date to ticket export csv 2024-09-10 19:13:13 +01:00
johnnyq
760f07e665 Removed old comment 2024-09-09 18:06:59 -04:00
johnnyq
05b50519b1 Remove the hidden form name for bulk merge and just leave the id 2024-09-09 17:55:08 -04:00
johnnyq
27dbbbb660 Fixed Bulk Merge issues by renaming ticket_id name var in bulk merge modal 2024-09-09 17:49:53 -04:00
Johnny
765850b22f Merge pull request #1038 from itflow-org/csrf
Enforce CSRF for post/asset and post/account
2024-09-09 13:14:28 -04:00
wrongecho
a10ff7963a Update README.md
Add supporters to readme
2024-09-09 10:41:18 +01:00
wrongecho
64684e1248 Enforce CSRF for post/asset and post/account
Tiny bit of tidying
2024-09-08 22:52:38 +01:00
Johnny
d1410ef967 Merge pull request #1037 from itflow-org/tech-loc-perms
Allow techs to manage locations
2024-09-07 12:05:11 -04:00
Johnny
6cbc4c584e Merge pull request #1035 from itflow-org/document-portal-visibility
Add ability to choose whether document is visible in client portal
2024-09-07 11:35:06 -04:00
wrongecho
6b850553cc Allow techs to manage locations 2024-09-07 12:25:19 +01:00
wrongecho
43d6847126 Fix images in docs not showing in client portal 2024-09-07 11:51:27 +01:00
wrongecho
40c400240f Add ability to choose whether document is visible in client portal 2024-09-07 11:21:36 +01:00
Johnny
c20f9942f1 Merge pull request #1034 from itflow-org/add-db-docs-client-visible
Docs - DB Structure to hide from client portal
2024-09-06 22:08:48 -04:00
johnnyq
903bd47f5a Allow Bulk Adding tickets to a Project from the Main Tickets Listing Page 2024-09-06 18:44:53 -04:00
johnnyq
09f2072d27 Add Client Field to Project Tickets, combine Ticket Number and Subject to 1 column 2024-09-06 18:18:41 -04:00
johnnyq
fdd8faf46a Included the Project Prefix and Number in Project Details 2024-09-06 18:08:55 -04:00
johnnyq
99c6321fbb Do not require Client for Projects, allow to add multiple tickets at once when adding tickets to a project 2024-09-06 17:53:35 -04:00
wrongecho
7edf03f79f Add DB Structure that will allow hiding specific docs from the client portal 2024-09-06 22:12:20 +01:00
johnnyq
b605f62175 In client overview Expiring / Expired / Retiring / Retired Asset links now point to the asset details page when clicked 2024-09-06 16:05:33 -04:00
johnnyq
cf535372f5 Show most recent activity first in client overview 2024-09-06 15:55:55 -04:00
johnnyq
4f0c7c5bf7 Added within context to the upcoming expire select box 2024-09-06 15:41:35 -04:00
johnnyq
9dfc7d35cc In the client overview allow the widget Expiring in Days to be Selectable with 7 30 and 90 Day Options 2024-09-06 15:39:00 -04:00
johnnyq
96c59422ea Added Cerificates Expiring/Expired and created a seperate card for expired items under client overview 2024-09-06 15:15:10 -04:00
johnnyq
25bc1d9055 Update Client Overview to Show Recents ASC not DESC so most recent shows first and do not show already Expired Items, will reseve that for a new card 2024-09-06 14:54:46 -04:00
Johnny
68458e49f2 Merge pull request #1033 from itflow-org/en-whitelabel-pt1
Add ITFlow attribution to client portal (1/2)
2024-09-06 14:19:48 -04:00
johnnyq
65f72665ad Update All Assets Report to be more like client assets 2024-09-06 14:18:00 -04:00
wrongecho
208d6cadc4 Add ITFlow attribution to client portal (1/2) 2024-09-06 18:53:48 +01:00
johnnyq
1130c17196 Added purchase date, warranty expire to show addiitonal columns in client assets 2024-09-06 13:26:17 -04:00
johnnyq
41276b55f0 Feature: Custom Links on main side nav 2024-09-05 17:08:43 -04:00
johnnyq
6879300fe8 DB Structure Update for Custom Links 2024-09-05 16:23:35 -04:00
Johnny
d890a27731 Merge pull request #1031 from itflow-org/portal-certs-domains
Portal - allow clients to see certs/domains
2024-09-05 14:24:06 -04:00
Johnny
0185452cf5 Merge pull request #1030 from itflow-org/portal-contact-add
Portal - allow adding contacts
2024-09-05 14:23:52 -04:00
Johnny
323224bc85 Merge pull request #1028 from itflow-org/whitelabel
Initial implementation of whitelabelling (disabled)
2024-09-05 14:23:43 -04:00
Johnny
fa7c99fcc5 Merge pull request #1027 from ssteeltm/fix-paging-hidden
fix pagination hidden
2024-09-05 14:19:26 -04:00
wrongecho
f2c15b4650 Portal - allow clients to see certs/domains 2024-09-05 17:56:42 +01:00
wrongecho
54c8d6d74a Portal - allow adding contacts 2024-09-05 17:26:28 +01:00
wrongecho
91fb4b663a Merge pull request #1029 from itflow-org/portal-updates
Portal - allow editing client contacts
2024-09-05 15:48:46 +01:00
wrongecho
726aaac56a Portal - allow editing client contacts, few tweaks to header incl session notifications 2024-09-05 15:44:06 +01:00
wrongecho
92681a86b3 Portal - allow editing client contacts, few tweaks to header incl session notifications 2024-09-05 15:21:05 +01:00
wrongecho
766813a326 Portal - allow editing client contacts, few tweaks to header incl session notifications 2024-09-05 15:19:52 +01:00
wrongecho
7827522b40 Portal - allow editing client contacts, few tweaks to header incl session notifications 2024-09-05 15:19:17 +01:00
wrongecho
49fddd4f1e Portal - allow editing client contacts, few tweaks to header incl session notifications 2024-09-05 15:16:11 +01:00
wrongecho
a23005babe Portal - show client contacts 2024-09-05 14:05:51 +01:00
wrongecho
3d16431d32 Initial implementation of whitelabelling 2024-09-05 10:44:50 +01:00
wrongecho
4458c87463 Initial implementation of whitelabelling 2024-09-05 10:31:18 +01:00
johnnyq
34b9e2978a Added Physical Location to the additonal asset columns option 2024-09-04 19:39:06 -04:00
johnnyq
1a359a207f Show Additional Columns in Assets 2024-09-04 19:20:32 -04:00
Hugo Sampaio
bb12b02099 Update pagination.php
makes more sense 5 because its the minimum page to set
2024-09-04 18:03:39 -03:00
Hugo Sampaio
b3e6039ec5 fix pagination hidden
fix pagination hidden, when number of rows is smaller than 10
2024-09-04 17:37:20 -03:00
Johnny
0f6ed69008 Merge pull request #1025 from itflow-org/export-validation
Hide export function when module is empty
2024-09-04 11:43:08 -04:00
Marcus Hill
f433535a8b Hide export function when module is empty 2024-09-04 08:52:08 +01:00
Johnny
5b496ff1ac Merge pull request #1024 from itflow-org/rep-tck-by-client
Enhance tickets by client report
2024-09-03 23:27:40 -04:00
Johnny
cebb6e2dd1 Merge pull request #1023 from itflow-org/ticketing-disable-modals-resolved
Do not load most edit modals if ticket is closed, as the data doesn't need to be changed
2024-09-03 23:27:26 -04:00
Johnny
16b08afa75 Merge pull request #1022 from itflow-org/client-export-log
Log when client pack is exported to PDF
2024-09-03 23:27:12 -04:00
Johnny
397765032c Merge pull request #1021 from itflow-org/hide-export-null
Hide the Export function when there are no records
2024-09-03 23:27:01 -04:00
Johnny
3ecd05b963 Merge pull request #1020 from itflow-org/logging-credentials
Log when users navigate to the credentials page for a client
2024-09-03 23:26:16 -04:00
Johnny
281bdcbaf9 Merge pull request #1019 from itflow-org/hide-debug-logins
Logins - Hide debug
2024-09-03 23:25:52 -04:00
Marcus Hill
91db3e2f37 Enhance tickets by client report
Enhancements ot the tickets by client report
- Breakdown tickets by priority (low/med/high)
- Breakdown stats per month, in addition to the existing per-year breakdown
2024-09-03 21:49:52 +01:00
Marcus Hill
d9668f3086 Do not load most edit modals if ticket is closed. 2024-08-30 23:15:48 +01:00
Marcus Hill
00e4e8a24b Log when client pack is exported to PDF 2024-08-30 23:05:04 +01:00
Marcus Hill
aeeac12f11 Log when client pack is exported to PDF 2024-08-30 23:04:20 +01:00
Marcus Hill
cf322b17bc Hide the Export function when there are no records (locations, tickets, vendors) 2024-08-30 22:57:58 +01:00
Marcus Hill
78eead24f7 Log when users navigate to the credentials page for a client 2024-08-30 22:49:18 +01:00
Marcus Hill
a59a6ce2b1 Check that a credential is shared before attempting to display the details to prevent debug error messages 2024-08-30 22:45:03 +01:00
Johnny
8ddb450f6f Merge pull request #1016 from itflow-org/resolved-ticket-report
Change ticket by client report to report on resolved, not closed tickets
2024-08-29 15:34:31 -04:00
Johnny
b42a4db6ca Merge pull request #1015 from itflow-org/rm-legacy-fetchdomainexpiration
Remove the old function for fetching domain expiration
2024-08-29 15:34:21 -04:00
wrongecho
437067fcc7 Change ticket by client report to report on resolved not closed tickets 2024-08-29 20:16:43 +01:00
wrongecho
75846adc28 Remove the old function for fetching domain expiration 2024-08-29 19:42:53 +01:00
wrongecho
ed446e18b5 Merge pull request #1013 from itflow-org/update-show-branch
Show name of branch you are on in admin update
2024-08-29 19:24:19 +01:00
wrongecho
b7d1503044 Show name of branch you are on in admin update 2024-08-29 19:21:33 +01:00
Johnny
d700289671 Merge pull request #1012 from itflow-org/assets-report-custom-columns
All asset report - custom columns
2024-08-28 18:47:46 -04:00
Johnny
99b5758839 Merge pull request #1011 from itflow-org/ticket-unbilled-perms
Bugfix: Unbilled tickets perms
2024-08-28 18:46:58 -04:00
Johnny
af62ba8b89 Merge pull request #1010 from itflow-org/asset-purchase-ordering
Re-order asset purchase and install date fields to make more sense
2024-08-28 18:46:47 -04:00
Johnny
ddf936c859 Merge pull request #1009 from itflow-org/client-perms-rectickets-projects
Bugfix: Client Access Permissions
2024-08-28 18:45:44 -04:00
wrongecho
64997acaa5 All asset report - custom columns
Created a new version of the all asset report allowing custom columns to be used
2024-08-28 23:25:03 +01:00
wrongecho
7739b31bb5 Bugfix: Remove two role checks on unbilled ticket report that prevents any non-admins viewing it 2024-08-28 22:21:02 +01:00
wrongecho
11005fef58 Re-order asset purchase and install date fields to make more sense 2024-08-28 22:11:04 +01:00
wrongecho
26d6737468 Bugfix: Client Access Permissions
Fix bug that allows users to view recurring tickets and projects they shouldn't have access to
2024-08-28 20:17:41 +01:00
johnnyq
a4a110f1e7 Show Red Badge Count next to client domains if Domain is expired or expires within 5 days 2024-08-27 20:40:12 -04:00
johnnyq
3eb6ee57fb Fix Contact Bulk Actions, removed required fields from Bulk Mail since its all under 1 big form you cant have required fields 2024-08-27 12:05:45 -04:00
johnnyq
27a9697542 Temporary diabled Bulk Ticket Merge in the Main Ticket view as it was not allowing a tech to be assigned from that view 2024-08-25 22:49:54 -04:00
Johnny
d05c5b7ca2 Merge pull request #1007 from itflow-org/api-logins-tweak
Tweak credentials read api
2024-08-25 15:31:01 -04:00
wrongecho
ec0e1c395c Tweak credentials read api 2024-08-25 20:29:14 +01:00
Johnny
c0c810764a Merge pull request #1006 from itflow-org/bulk-merge
Add bulk merge ticket feature
2024-08-25 15:20:43 -04:00
Johnny
442681a49a Merge pull request #1005 from itflow-org/debug-db-info
Debug - clarify database engine
2024-08-25 15:20:24 -04:00
Johnny
6e3dcc0237 Merge pull request #1004 from itflow-org/bugfix-ticket-client-access-perms
Tickets - Client access permissions bugfix
2024-08-25 15:20:10 -04:00
Johnny
21a31a1fe1 Merge pull request #1002 from itflow-org/api-logins
Allow decrypting logins/credentials via the API
2024-08-25 15:18:34 -04:00
wrongecho
f964d8245b Add bulk merge ticket feature 2024-08-25 19:10:06 +01:00
wrongecho
c69655a5bb Add bulk merge ticket feature 2024-08-25 19:06:57 +01:00
wrongecho
4cfa4c6e85 Debug - clarify database engine 2024-08-25 17:53:34 +01:00
wrongecho
573e2340df Fix a bug that allows technicians to view tickets they shouldn't have access to 2024-08-25 15:32:40 +01:00
wrongecho
24ff6f5c84 WIP: Allow decrypting logins/credentials via the API 2024-08-25 12:45:18 +01:00
wrongecho
9ef3099495 WIP: Allow decrypting logins/credentials via the API 2024-08-25 12:32:21 +01:00
wrongecho
d37bdcdbcb WIP: Allow decrypting logins/credentials via the API 2024-08-25 12:31:15 +01:00
johnnyq
2202f31a61 fix 2024-08-24 20:08:14 -04:00
johnnyq
26e12e1edb More UI/UX updates to the ticket reply bar 2024-08-24 20:07:06 -04:00
johnnyq
1bf80d3b15 Use TimeAgo for Ticket Created At column, use tooltip to show real date and time 2024-08-24 19:28:07 -04:00
johnnyq
f0086c8844 More Ticket Details UI/UX use btn-toolbar class instead of btn-group for the header action button this allows padding and rounding of both edges of the button, decreased the bottom padding of the ticket reply card, updated the billable status 2024-08-24 18:55:54 -04:00
johnnyq
9a3b42c623 More UI/UX Reduced the Padding in the Ticket Details Header to make more room, Use TimeAgo and tooltips for the exact times, updated the Ticket Subject display, made the Submit button green instead of primary to offset all the primary buttons, also updated other button to reduce the distraction of orimary and secondary buttons 2024-08-24 18:34:05 -04:00
johnnyq
0ea2e78c78 More UI/UX Work to ticket details 2024-08-24 18:11:57 -04:00
johnnyq
9afab6e5e5 Removed the Dark Outline border on the side cards in ticket details 2024-08-24 17:59:41 -04:00
johnnyq
ed315c3979 UI/UX Updates to the Ticket Details Header 2024-08-24 17:57:05 -04:00
johnnyq
7168cffba7 Ticket Details UI/UX Removed Prepend icon to tasks and removed the fa-fw for the checkmark next to add task 2024-08-24 16:40:01 -04:00
johnnyq
08b94dcae4 Bump TinyMCE from 7.1.1 to 7.3.0 2024-08-24 16:36:29 -04:00
johnnyq
918c202e83 Remove Dup AI Reword Button 2024-08-24 16:29:01 -04:00
johnnyq
d9299e8e28 Fix AI Reword Button, removed Status Icon 2024-08-24 16:24:14 -04:00
johnnyq
bdd7c7e993 UI/UX Updates to Ticket Details, Reduce the start, pause timer and reset button and use pause and play icons instead, use block buttons for Type of Response 2024-08-24 16:14:40 -04:00
johnnyq
a152a4a1a0 Update Ticket Details Page, remove the non working selectable comment type ad wrapped the Ticket Reply in a card body 2024-08-24 15:58:45 -04:00
johnnyq
2e0841abb3 Do not show Outstanding Balance table if no outstanding invoices exist 2024-08-24 15:06:35 -04:00
johnnyq
b14da05b17 Add more prominant Highlight of the current invoice being viewed 2024-08-24 14:57:23 -04:00
johnnyq
dd017da140 Several UX/UI Updates to Guest Invoice, Added Account Balance to the Top Right, removed Invoice History as this should be viewed via the client portal. Update the wording for Previous unpaid invoices to Outstanding Invoices, added invoice counts, reduced margin and padding in invoice tables, reworded Pay Online to Pay Now 2024-08-24 14:47:27 -04:00
johnnyq
8f5854c76e Add Full Account Balance on Guest Invoice View 2024-08-24 14:11:16 -04:00
johnnyq
04f33ac375 Add Tooltips with expire time for shared links 2024-08-24 13:36:55 -04:00
johnnyq
5588ad953e Show if a Credential, Document or File is Shared by a Link, added a new status column 2024-08-24 13:30:01 -04:00
johnnyq
374ca2a89b Fix New client Link in Dashboard 2024-08-23 18:31:54 -04:00
johnnyq
d9b8b12c17 Reworked tooltips 2024-08-23 18:27:20 -04:00
johnnyq
9225efdc9e Added Tooltips to Deactivate Action and Type under shared Links 2024-08-23 18:17:41 -04:00
johnnyq
a10b9bf93a Removed Company Name prepended to invoice email subjects as this name should be in the From Email Name Example CompanyName Billing or Just CompanyName 2024-08-23 17:49:23 -04:00
johnnyq
436b10c577 Updated the Shared items box UI/UX on Client overview 2024-08-23 17:29:03 -04:00
johnnyq
b583e7f8c9 Update Text from light to dark for warning badges on client nav 2024-08-23 16:40:47 -04:00
johnnyq
e1cac4556a Rounded out the top navbar notification count badge 2024-08-23 16:33:35 -04:00
johnnyq
6d7ffdd133 Updated Admin and Account Icons in the user drop down menu 2024-08-23 16:11:47 -04:00
johnnyq
0556f0b9a4 Moved Admin Section from side nav to User Drop Down at the top 2024-08-23 16:09:34 -04:00
johnnyq
37ddf87ef0 Removed Client ID from the Side Nav as its hidden in a popover on the client name in the client header 2024-08-23 16:01:31 -04:00
johnnyq
5ef9d76a3c Removed Shared Items from the side menu and merged them inot client overview 2024-08-23 15:59:03 -04:00
johnnyq
d35b9ee161 Removed Client Audit log, now located under Recent under client Overview can click View More to see the main audit log if your an admin also added client filter to the main audit log 2024-08-23 15:43:50 -04:00
johnnyq
58ec9121a0 Moved Bulk Email from the side Menu to a contact Bulk Action, Also removed Client Statement as it did not work and payments covers that already this frees up 2 menu spaces on the client side nav 2024-08-23 15:21:15 -04:00
wrongecho
a6113dc371 WIP: Allow decrypting logins/credentials via the API 2024-08-22 18:22:20 +01:00
wrongecho
0c60ecc329 WIP: Allow decrypting logins/credentials via the API 2024-08-22 17:46:58 +01:00
wrongecho
d0ade72e6e Merge pull request #1003 from itflow-org/bulk-resolve-bugfix
Bugfix: Bulk close should actually be bulk resolve
2024-08-19 21:58:11 +01:00
wrongecho
d43cd0398e Bugfix: Bulk close should actually be bulk resolve 2024-08-19 21:45:03 +01:00
johnnyq
d803895f08 Remove the HTML line breaks in error output as the console is text only 2024-08-19 16:33:19 -04:00
johnnyq
85f2e8c244 Fix Cron Mail Ticket Parser script: It will now check if the ITFlow folder is created and subscribed before moving the mail 2024-08-19 16:24:45 -04:00
wrongecho
63feff03d2 Initial WIP: Allow decrypting logins/credentials via the API 2024-08-19 21:23:43 +01:00
Johnny
82a123a63d Merge pull request #1001 from itflow-org/cred-fix
Bugfix: credentials
2024-08-19 15:16:39 -04:00
Johnny
0e8e8416f5 Merge pull request #1000 from itflow-org/bugfix-resolved-tickets
Bugfix: Resolved ticket counts
2024-08-19 15:15:55 -04:00
wrongecho
3f772f5a2f Bugfix: credentials
Fix an edge-case bug causing the user_encryption_session_key session cookie to not be set due to error output (when display PHP errors in browser is enabled). This means login credentials are still encrypted but cannot be decrypted properly by other users.
Prevent users creating new credentials if they do not have the correct cookie set.
2024-08-19 19:56:12 +01:00
wrongecho
d17b75b7bd Bugfix: Resolved ticket counts
Prevent resolved tickets showing up in unassigned ticket / my ticket counts
2024-08-19 18:57:20 +01:00
Johnny
86e3f377ab Merge pull request #999 from itflow-org/rec-ticket-accounting-bugfix
Recurring tickets bugfix
2024-08-18 12:56:05 -04:00
Johnny
e60ca0f978 Merge pull request #998 from itflow-org/ticketing-update
Ticketing updates - guest view & resolved vs closed
2024-08-18 12:31:13 -04:00
wrongecho
f605f581cb Recurring tickets bugfix
Fix bug preventing ticket subject/content being shown when accounting module is disabled.
Think this is due to the dynamic modals - fix for now is just to hide the billable div from the user.
2024-08-18 16:11:32 +01:00
wrongecho
0025503ff8 Ticketing updates - guest view & resolved vs closed
- Swap autclose for resolved to allow temporarily re-opening resolved tickets for 72 hrs after closure
- Add guest view URL for tickets
2024-08-17 23:42:39 +01:00
wrongecho
ad9b69ae10 Remove extra php closing tag 2024-08-17 23:34:23 +01:00
wrongecho
d80334a7cf Ticketing updates - guest view & resolved vs closed
- Swap autclose for resolved to allow temporarily re-opening resolved tickets for 72 hrs after closure
- Add guest view URL for tickets
2024-08-17 23:24:15 +01:00
wrongecho
0b801b24ac Merge pull request #997 from itflow-org/wrongecho-db-update-small-fix
Correct database update logic to ensure future updates work properly
2024-08-16 13:06:20 +01:00
wrongecho
05e2b51ada Correct database update logic to ensure future updates work properly 2024-08-16 13:05:04 +01:00
Johnny
d9316233bb Merge pull request #993 from itflow-org/portal-docs-show-current
Only show most current version of a document in the client portal
2024-08-15 20:14:57 -04:00
Johnny
08f9f137c0 Merge pull request #996 from itflow-org/tickets-tasks
Tickets & Tasks
2024-08-15 20:14:34 -04:00
wrongecho
ccdfd96f56 Tickets & Tasks
- Add ability to un-complete/undo a completed task
- Require CSRF verification when deleting tickets and tasks
2024-08-15 23:52:25 +01:00
wrongecho
786fc0a369 Only show most current version of a document in the client portal 2024-08-15 21:45:20 +01:00
Johnny
26d36e6f66 Merge pull request #992 from itflow-org/tck-eml-parse-anonymous
Add unknown/anonymous email to ticket parsing
2024-08-13 17:00:31 -04:00
Johnny
f32fd01e47 Merge pull request #991 from itflow-org/asset-client-tfr
Add move/transfer assets between clients
2024-08-13 16:58:51 -04:00
wrongecho
90e95a76b7 Add anonymous email parsing
Add option to allow unknown/anonymous email parsing for unknown contacts/domains.
This will be disabled by default due to the potential for spam, but can be turned on in the settings if required.
2024-08-10 22:39:47 +01:00
wrongecho
d6f30b83f8 Add anonymous email parsing
Add option to allow unknown/anonymous email parsing for unknown contacts/domains.
This will be disabled by default due to the potential for spam, but can be turned on in the settings if required.
2024-08-10 22:35:52 +01:00
wrongecho
8fb50275ac Add move/transfer assets
Add ability to move / transfer assets between clients. Moving an asset involves the asset being archived and then re-created under the new client with most of the same information.

Information about the old & new asset is stored in the audit logs and within the asset notes. Information from the audit logs is accessible via a new History tab on the asset, subject to audit log retention.
2024-08-10 20:51:57 +01:00
wrongecho
3d3492ef27 Add move/transfer assets
Add ability to move / transfer assets between clients. Moving an asset involves the asset being archived and then re-created under the new client with most of the same information.

Information about the old & new asset is stored in the audit logs and within the asset notes. Information from the audit logs is accessible via a new History tab on the asset, subject to audit log retention.
2024-08-10 20:46:59 +01:00
wrongecho
b732e08aff Merge pull request #990 from itflow-org/wrongecho-patch-2-assets
Update ajax.php - Assets > Asset logging
2024-08-10 12:23:46 +01:00
wrongecho
9c0dfd8b48 Update php-lint.yml - bump to 9.4.1 2024-08-10 12:21:43 +01:00
wrongecho
693156c902 Update ajax.php - Assets > Asset logging
Adjust logging for asset changes so they are logged as type 'asset' not 'assets', to match existing logging
2024-08-10 12:17:31 +01:00
wrongecho
4185c2830d Merge pull request #989 from itflow-org/wrongecho-patch-1
Update client_rack_edit_modal.php
2024-08-08 05:36:23 +01:00
wrongecho
9e19943cf7 Update client_rack_edit_modal.php
Adjust rack units max on edit modal too
2024-08-08 05:35:22 +01:00
Johnny
a3ebf0845f Merge pull request #988 from itflow-org/file-delete-bugfix
Client files bugfix
2024-07-31 17:25:31 -04:00
Johnny
2e61c7e72b Merge pull request #987 from itflow-org/rem-header-js
Remove old reference to js/header_timers.js
2024-07-31 17:25:12 -04:00
Johnny
6c50722b14 Merge pull request #986 from itflow-org/wrongecho-rack-patch
Adjust max rack size to 70U
2024-07-31 17:25:02 -04:00
Marcus Hill
cfb13a0c18 Client files bugfix
- Hide delete button for techs as they do not have this permission
- Remove unused exclude_condition var
2024-07-31 22:06:17 +01:00
Marcus Hill
de5ae4bbc3 Remove old reference to js/header_timers.js as this file no longer exists 2024-07-31 21:46:15 +01:00
wrongecho
2b83fe5796 Update client_rack_add_modal.php
Adjust max rack size to 70U
2024-07-30 16:07:37 +01:00
Johnny
cc0de316ab Merge pull request #984 from ssteeltm/credentials-filter-asset_location
filter locations on credentials
2024-07-23 22:06:18 -04:00
Johnny
708dea24ef Merge pull request #985 from ssteeltm/master
fix Order by IP on assets listing
2024-07-23 22:05:46 -04:00
Hugo Sampaio
6d45e93ad9 fix Order by IP
fixes the ordering by ip, after the new change of Interfaces
2024-07-22 13:05:23 -03:00
Hugo Sampaio
79fdc979cf Update client_logins.php
Filter for Locations, based on Asset Location, if its related.
2024-07-22 09:50:41 -03:00
Johnny
f769081bf9 Merge pull request #982 from ssteeltm/client-id-tooltip
client-id-tooltip
2024-07-16 19:54:14 -04:00
Hugo Sampaio
83da33432c Update client_side_nav.php 2024-07-12 10:53:11 -03:00
Hugo Sampaio
de49c8dba1 client-id-tooltip 2024-07-12 10:42:24 -03:00
johnnyq
dcc0d77dd4 Added Client ID in the client listing and client top header 2024-07-09 15:26:07 -04:00
johnnyq
50bdeae79d Fix Invalid Var in Add License 2024-07-09 14:30:23 -04:00
johnnyq
53550e5092 Updated Client Export Fields, and added Client Import along with download client sample file 2024-07-05 15:31:01 -04:00
Johnny
cf7a900e1a Merge pull request #981 from git-kup/master
Update invoice.php
2024-07-02 23:08:50 -04:00
git-kup
eead1328ef Update invoice.php
fixed typo payed to paid
2024-07-02 17:37:34 -04:00
Johnny
afaaa5895c Merge pull request #980 from ssteeltm/uri-dropdown
uri dropdown
2024-07-02 12:50:23 -04:00
Hugo Sampaio
4e5fd048f7 uri dropdown 2024-07-02 10:34:56 -03:00
Johnny
2fa07e4e46 Merge pull request #976 from itflow-org/log-cleanup
Add audit log cleanup/retention period to cron
2024-07-01 21:54:27 -04:00
Johnny
5818a57b9f Merge pull request #977 from itflow-org/debugging-help
Debug assistance (admin_debug.php)
2024-07-01 21:53:51 -04:00
wrongecho
b6f1e0203c Merge pull request #979 from ssteeltm/Asset-URI-link-duplicate
Update client_asset_details.php
2024-07-01 18:22:47 +01:00
Hugo Sampaio
8881cd30ff Update client_asset_details.php 2024-07-01 12:01:35 -03:00
Marcus Hill
af6740d898 Debug assistance
Clarify Apache/PHP error log location in debug/setup
Include app version, cron and timezone in debug page
2024-06-30 12:31:59 +01:00
Marcus Hill
8db9822f63 Add audit log cleanup/retention period to cron
Audit logs will be automatically cleaned up after 90 days (new installs) or 7 years (existing installs). This is configurable in Settings > Security.
2024-06-30 11:51:39 +01:00
johnnyq
cc38c642c5 Added back the old cron ticket email parser as legacy_cront_ticket_email_parser.php and added back the old libraries php-mime-mail-parser in plugins note if you recently installed itflow within the last 2 weeks you will need to install and enable the php libraries php-imap and php-mailparse if you decide to use the legacy mailer 2024-06-29 13:40:47 -04:00
johnnyq
f133981b52 Remove the UTF7 to 8 Encoding as it broke Thunderbird email parsing, somehow Roundcube webmail was fine 2024-06-28 17:21:43 -04:00
johnnyq
6bdfe1b713 Add Function to convert message text from UTF7 to UTF8 possibly fix the Google Issue not sure, we need further testing 2024-06-28 13:52:50 -04:00
johnnyq
fc82dc705e Add Payment Method and Reference to Payment Receipts 2024-06-28 12:20:20 -04:00
johnnyq
c27f9fd6a9 Set Charset to UTF-8 to avoid encoding issues on some mail servers 2024-06-28 11:39:34 -04:00
johnnyq
97c2928830 Remove Duplicate Line of Code to connect to IMAP Server and find inbox 2024-06-28 11:25:58 -04:00
johnnyq
f57cf5cb91 Fix Plain Text Emails not showing in ticket replies by converting plain text emails to HTML for displaying 2024-06-27 18:50:37 -04:00
johnnyq
95fd0344c0 Fixed ticket Email processing showing array() 2024-06-27 17:23:45 -04:00
johnnyq
1c618892cc Removed WebKlex PHP-IMAP Dependency in post as it was spewing errors for people running older version of php below 8.2 - note this is still required for Mail Parser to work 2024-06-27 01:10:00 -04:00
johnnyq
5b3c6f4272 Better Handling of HTML Reply ticket emails, reduce the spacing trim out extra spaces reduce the line height etc 2024-06-26 13:14:16 -04:00
johnnyq
30bd685dea Final path fix 2024-06-25 16:02:22 -04:00
johnnyq
f7b75bb150 fix 2024-06-25 15:54:19 -04:00
johnnyq
6456dfcc67 Fix Autoloader location for WEbklex imap 2024-06-25 15:51:51 -04:00
johnnyq
b0c5d43867 Remove the reliance on php-imap extension to test imap connection in setting. Also removed the check for php-imap in the mai, parser as we use fully rely on webklex 2024-06-25 15:48:56 -04:00
johnnyq
40866e34e2 Remove the function to check if php-mailparse is installed. Its not needed and was causing breaing issues and is an unessesary check 2024-06-25 15:28:01 -04:00
johnnyq
39ff97e9dd Restore option to share a password accidentally got wiped out when adding archive unarchive functions 2024-06-25 11:44:19 -04:00
johnnyq
fbd220c5e3 Add Global Bulk Mail back to the Admin nav side bar, seemed to have gotten lost when we updated the menu 2024-06-25 09:37:49 -04:00
Johnny
897dcb179a Merge pull request #975 from ssteeltm/tickets_tasks-progress-bar
small adjustment to show 0 completed tasks
2024-06-24 10:59:14 -04:00
Hugo Sampaio
1542a89922 small adjustment to show 0 completed tasks 2024-06-24 09:54:44 -03:00
johnnyq
0c10b863b5 Use rounded badge for priority in client tickets to match 2024-06-23 00:16:41 -04:00
johnnyq
ee5e6d157d Update Cron Ticket Email Parser script to take in account of multiple variations of the word inbox 2024-06-22 13:45:39 -04:00
Johnny
1b937a0e7d Merge pull request #974 from ssteeltm/master
Update client_file_link_asset_modal.php
2024-06-18 22:30:59 -04:00
johnnyq
ea77c7567d Updated UI badge element to use yes and no for billable tickets 2024-06-17 17:38:05 -04:00
johnnyq
46ab6a696d Assure a Primary network interface gets added with the import of assets. Also check to see if a primary interface is present when editing an interface 2024-06-17 14:43:35 -04:00
johnnyq
84366cc1b9 Small UI Comment Cleanup of dashboard 2024-06-16 12:31:45 -04:00
johnnyq
55eff7ce45 Client Racks UI Cleanup Move the Rack Data to a table instead of using dd and dl 2024-06-16 12:17:05 -04:00
johnnyq
3d6d6a0e22 UI Cleanup Move the the from and to Unit to one row when adding a device 2024-06-16 12:08:59 -04:00
johnnyq
9d40ef1776 Racks: Exclude Assets in the the add device drop downlist that are already in anopther rack 2024-06-14 18:07:43 -04:00
johnnyq
aca5a1ee54 Remove Rack Photo on deletion and do not remove rack_units as the DB is set to cacade delete these 2024-06-14 17:44:29 -04:00
johnnyq
5ba0315a42 Feature: You can add and remove linked devices and customer devices to the rack units 2024-06-14 17:22:16 -04:00
Hugo Sampaio
88896d3cdf Update client_file_link_asset_modal.php
small adjustment to allow link an asset in any files. Before this it was limiting to link only one file, dont displaying it in assets listing for other files
2024-06-14 15:13:18 -03:00
johnnyq
92e594ee32 Updated Budget UI to include card header and made a view only option for budget 2024-06-14 13:41:16 -04:00
johnnyq
70dc64f05d Updated Budget to now include easy updating and creating and viewing Yearly budgets in one POST 2024-06-14 13:13:28 -04:00
johnnyq
5352416dbe Added backend archive, unarchive, delete capaiblities for racks 2024-06-13 17:12:34 -04:00
johnnyq
17feb98ec7 Added Client Network / Server Rack Documentation to the UI More to come 2024-06-13 17:06:09 -04:00
johnnyq
1efe403422 Added Asset Photo to Asset Details Side bar 2024-06-13 14:51:09 -04:00
johnnyq
6da19c3e6f Fix Physical Locatiin not showing on edit Asset 2024-06-13 14:47:48 -04:00
johnnyq
e3c39e473f Fixes on Image Uploading for assets 2024-06-13 14:31:46 -04:00
johnnyq
16c2fbf6d1 Added Asset Photo and Asset Physical Location to the UI 2024-06-13 13:54:21 -04:00
johnnyq
3288cb6dc2 DB Structure Update to make room for Rack and Patch Panel Documentation along with adding Asset Photo and Asset Physical Location DB Fields 2024-06-13 12:40:37 -04:00
johnnyq
b37cfdf677 Fix API Asset interface relationship 2024-06-12 18:06:04 -04:00
johnnyq
2edd39c16d Remove the vendor directory in .gitignore as these dependencies are needed for php-imap 2024-06-12 16:15:10 -04:00
johnnyq
779527cf6a Migrated away from PHP Mail Parser to the new WebKlex PHP IMAP Mail Parser this will open the way to support OAUTH2 for Mail servers such as Microsoft 365 and Google Workspaces 2024-06-12 15:39:52 -04:00
johnnyq
d64a7ce31e Fix Client Services to include interfaces 2024-06-11 23:32:09 -04:00
johnnyq
836e1a3199 Updated Asset API to include its assets 2024-06-11 23:00:57 -04:00
johnnyq
b25d21b8bf Delete Asset Interfaces related to client assets when deleting a client 2024-06-11 22:39:03 -04:00
johnnyq
3eb81e5954 Fix Network Select under client assets 2024-06-11 21:51:54 -04:00
johnnyq
1e241a9232 Quick Fix 2024-06-11 21:46:45 -04:00
johnnyq
41ac390173 MAJOR Feature Update - Backup before updating Migrated Asset Network info to a seperate table to allow for multiple interfaces per asset 2024-06-11 21:36:03 -04:00
johnnyq
a1613ddceb Up Max Client Abbreviation length from 5 to 6 2024-06-11 13:45:19 -04:00
johnnyq
0a7fd1471a Move All Domains from main side nav to Reports under Overview header 2024-06-11 12:09:00 -04:00
johnnyq
32df0369e2 Added IPv6 Field to Contact Details 2024-06-10 23:57:03 -04:00
johnnyq
fc6ec8dd03 Added IPv6 field for Assets 2024-06-10 22:10:18 -04:00
johnnyq
2ce36cb14f Added Bulk Edit Category, Archive, Unarchive and Delete to Products 2024-06-10 17:26:43 -04:00
johnnyq
655f1230c2 Added Export Products CSV 2024-06-10 15:53:26 -04:00
Johnny
ff1ec30775 Merge pull request #973 from wrongecho/ticket-parse-save-original-mail
Email to ticket parsing - Save the original email
2024-06-10 11:28:33 -04:00
Johnny
7135747b7d Merge pull request #972 from wrongecho/2fa-6char
2FA tweaks
2024-06-10 11:28:11 -04:00
Marcus Hill
041cbe15fa Email to ticket parsing - Save the original email
When creating a new ticket, save the original email in a .eml format and attach it to the ticket.

This will be useful for situations when you want to reply to the original thread but don't have access to the inbox. We could add this to all received emails if there is interest?
2024-06-09 21:34:54 +01:00
Marcus Hill
3dcd04a724 2FA
- Set the 2FA number input field to only accept 6 characters max
- Revoke existing remember-me tokens when 2FA is re-enabled
2024-06-09 12:57:42 +01:00
johnnyq
51710f886c Added Category Drop Down Select and Archive Query to Products 2024-06-08 21:00:14 -04:00
johnnyq
674f4cd6db Fix Padding for Client Documents 2024-06-08 19:31:24 -04:00
johnnyq
fb16ecd0c6 Added Bulk Archive, unarchive support to domains 2024-06-08 19:17:06 -04:00
johnnyq
64c5cbda52 Added Bulk Archive, UnArchive and Delete support to client vendors 2024-06-08 18:49:18 -04:00
johnnyq
e8715979d5 Optimized Show/Unshow Archive Button Logic 2024-06-08 17:14:08 -04:00
johnnyq
2032fe43d4 Added Bulk Delete to Archived Contacts 2024-06-08 16:20:28 -04:00
johnnyq
ee30b0b197 Added Bulk Archive, Unarchive, Delete actions to to logins 2024-06-08 16:00:29 -04:00
johnnyq
0d8333c7ab Add Bulk Actions to Locations 2024-06-08 14:49:26 -04:00
johnnyq
eb7fe5708a Fix Bulk actions in client recurring tickets 2024-06-08 13:38:08 -04:00
Johnny
0af4a7ac1e Merge pull request #971 from wrongecho/ticket-report-fix
Bugfix: Ticket report - average time to close
2024-06-08 12:46:58 -04:00
Marcus Hill
c06c240e2a Bugfix: Ticket report - average time to close 2024-06-08 07:32:41 +01:00
johnnyq
551146d3e2 btn-lg 2024-06-07 20:46:36 -04:00
johnnyq
a17fbcfc1d Fix Update 2024-06-07 20:45:33 -04:00
johnnyq
02445811fa Added locaiton drop down filter to contacts 2024-06-07 20:40:35 -04:00
johnnyq
86cd618b03 Add Force Update Button 2024-06-07 20:36:18 -04:00
johnnyq
f1b28a6f14 Fix Archive var check for contacts and assets 2024-06-07 18:52:54 -04:00
johnnyq
a44a76db28 Added the option to bulk remove contact tags 2024-06-07 18:44:21 -04:00
johnnyq
e920ccc5e4 Force upper case on client abbreviations 2024-06-07 18:31:53 -04:00
johnnyq
24022eca55 Added Definable Client Abbreviation 2024-06-07 18:18:42 -04:00
johnnyq
b229349d8c Added / ID to Username field under credentials 2024-06-07 18:01:25 -04:00
johnnyq
fb4c1e828f Fix Some Undefined Vars PHP Errors 2024-06-07 17:57:02 -04:00
johnnyq
c2b7d03c22 Added Payment Method and Account Dropdown Filters to Payments 2024-06-07 16:48:57 -04:00
johnnyq
1070449450 Added User, log type, and log action Dropdown Filter to audit logs 2024-06-07 16:32:45 -04:00
johnnyq
a742c9596e Moved Exports into the the new drop downs to match consistency 2024-06-07 15:59:22 -04:00
johnnyq
01b3d53683 Feature: Ability to Bulk Assign Additional tags to Many Contacts 2024-06-06 20:19:58 -04:00
johnnyq
474e9525c4 Add Bulk Archive and Unarchive to contacts 2024-06-06 17:54:12 -04:00
johnnyq
a35a28cf7d Added Bulk Archive and Unarchive to Assets 2024-06-06 17:25:25 -04:00
johnnyq
1522f5414a Ability to Unarchive contacts and assets 2024-06-06 16:51:08 -04:00
johnnyq
94ba05271f Allow Invoices to be exportable, move export expense modal out of the record loop 2024-06-06 13:49:50 -04:00
johnnyq
10f1d39b2a Fix In Comntat Details Contact must belong to the client 2024-06-06 13:18:50 -04:00
johnnyq
71bad025cc Fix Ticket Subject under client contact details showing 0 2024-06-06 13:01:51 -04:00
johnnyq
5e6b79fce5 Added DataTables JS Plugin tested functionality for client contact details 2024-06-06 13:00:14 -04:00
johnnyq
965c16c19d Fix broken Clients when restricting user client access 2024-06-06 12:06:26 -04:00
johnnyq
40ccbb5627 Update GetDomainExpiry Function to return proper null if Expire is not found, updated the logic 2024-06-06 02:30:12 -04:00
Johnny
dfda4d1101 Merge pull request #969 from ssteeltm/asset-view-files
show related Files on Asset View
2024-06-04 21:23:00 -04:00
Johnny
61a95dbd59 Merge pull request #968 from ssteeltm/file-link-assets
link file to assets
2024-06-04 18:30:47 -04:00
johnnyq
d20e462652 Mimicked UI for Client Perms to USer and Device Licneses under Licenses 2024-06-04 16:36:39 -04:00
johnnyq
21019ba471 Add Checkbox that will select all / de-select all Client Restriction permissions in add/edit user 2024-06-04 16:05:49 -04:00
Hugo Sampaio
49436fae3b rename description
hability to also rename description
2024-06-04 16:40:33 -03:00
johnnyq
0aea143049 Update wording for Restrict Client Access 2024-06-04 15:18:44 -04:00
johnnyq
e5cab12633 Updated UI for Restrict Client Access 2024-06-04 15:11:13 -04:00
Hugo Sampaio
87069b7ebb forgoten modal identifier 2024-06-04 15:55:57 -03:00
johnnyq
254715ddc6 Rework User client Access Restriction UI for add and edit user. Moved from multi Select Box to Individual checkboxs 2024-06-04 14:52:20 -04:00
Hugo Sampaio
3b07caadb7 show related Files on Asset View
initial work on showing related files when in asset view
2024-06-04 15:45:57 -03:00
Hugo Sampaio
3023c48771 link file to assets
provides hability to add link on Files to Assets, so later we can show this related files on Asset View
2024-06-04 15:03:53 -03:00
johnnyq
8bc7c849ef Feature: Added the ability to edit the order of the tasks this is not the best solution but works we recommend setting them in orders of 5 or 10 so there is wiggle room to add tasks in between 2024-06-03 19:36:16 -04:00
johnnyq
1076ffb5f7 Feature Ability to Edit Task names under Ticket Templates 2024-06-03 19:15:59 -04:00
johnnyq
9f73b13dcf Dont show Template or Client Vendors under Vendor Select in Expenses Filter 2024-06-03 18:12:57 -04:00
johnnyq
5b594813c4 Feature: Add Advanced Filter Vendor and Category under Expenses 2024-06-03 16:28:45 -04:00
johnnyq
20795c2816 Feature: Add Advanced Filter for Account From and Account To under transfers 2024-06-03 16:13:01 -04:00
johnnyq
acfd5e8d54 Was missing a few more regexes in get domain expiry 2024-06-02 17:05:53 -04:00
johnnyq
738c83378c Forgot to add a pattern for expires on 2024-06-02 16:41:20 -04:00
johnnyq
56b0eafe2b re-push out new domain expiry lookup 2024-06-02 16:32:42 -04:00
johnnyq
e2b700cdcd Revert new Domain lookup 2024-06-02 13:15:41 -04:00
johnnyq
13764da199 Updated domain lookup function to include TLDs of and time formats to match the python script 2024-06-02 13:07:33 -04:00
johnnyq
84653cb57a Created new PHP function to use the local whois binary to get the expire date of a domain 2024-06-02 12:38:47 -04:00
johnnyq
b47f543534 Ticket Events now shows everything logged in the ticket by auditing logs 2024-06-01 20:04:37 -04:00
johnnyq
6107e0436f Added Eye ball Icon to System Calendar to toggle system calendars 2024-06-01 18:55:24 -04:00
johnnyq
c573687fa1 Feature: Calendar Names and Colors can now be edited 2024-06-01 18:48:06 -04:00
johnnyq
851542bcc1 Added Side nav for calendars, pending more updates 2024-06-01 18:09:59 -04:00
johnnyq
e04a9d1f09 Added All Domain view to main side nav 2024-06-01 17:12:15 -04:00
johnnyq
c0207aa9ec Remove the Arrow Icon Next to the client in client listing 2024-06-01 16:54:44 -04:00
johnnyq
1fa043b1d7 Bumped TinyMCE Editor from 7.0 to 7.1.1 2024-06-01 16:21:46 -04:00
johnnyq
307cc709d4 Fix Merging Ticket where the merging ticket HTML would be lost during the merge to the another ticket 2024-06-01 16:15:38 -04:00
johnnyq
18d94cb33d Add Revision history to the bottom of each document 2024-06-01 15:54:53 -04:00
johnnyq
5edec23234 Convert document details to 4 Space indent instead of 2 2024-06-01 15:32:14 -04:00
johnnyq
a064d26c10 Fix Creating Document from a template where is would not set the document_parent causing new documents to display revisions that dont exist 2024-06-01 15:24:30 -04:00
johnnyq
3621912398 Keep Admin Menu Nav Highlighted when going deeper into an item 2024-06-01 15:07:47 -04:00
johnnyq
64499fa734 Also Delete Location Tags when a Client is deleted 2024-06-01 14:39:14 -04:00
johnnyq
ba23142843 Remove repeated delete client tags query when client is deleted 2024-06-01 14:35:35 -04:00
johnnyq
dfe61fb426 Delete Contact Tags when a Client is deleted 2024-06-01 14:34:28 -04:00
johnnyq
2ab7a44f6e Feature: Add Contact Tags Support 2024-06-01 14:25:51 -04:00
johnnyq
565f8162a4 Feature: Clients and Locations can now be searchable with multiple tags selected 2024-05-31 18:18:41 -04:00
johnnyq
8d87672b49 Tidy Tickets Collapse 2024-05-31 17:39:09 -04:00
johnnyq
0770c701b5 Continue to Show Advanced Search in Tickets Filter if assigned to is selected 2024-05-31 17:36:19 -04:00
johnnyq
ecbeb12990 Fix broken page over the shortened tag query in client details and ticket details.php 2024-05-31 16:51:52 -04:00
johnnyq
a7376fe08d DB Update Shorten Client Tag Fields and add Delete Client Tags to Delete Client and cleanup clients query 2024-05-31 16:46:50 -04:00
johnnyq
5347429d58 Remove Unessesary Syntax from locaiton tag Query 2024-05-31 16:27:04 -04:00
johnnyq
89d9ec73ad Feature Added Location Tags 2024-05-31 16:13:55 -04:00
johnnyq
63f740e22f Move total time worked to 3rd column in ticket details 2024-05-30 19:42:08 -04:00
johnnyq
eab3bf226c Add Company Name to the Browser title in guest viewing sessions such as guest_invoice, guest_quote etc 2024-05-30 19:29:33 -04:00
johnnyq
7db9a7de73 Fix Telemetry check 2024-05-30 18:57:33 -04:00
johnnyq
14c814c5b8 Made Public Comment and Email Default Selected option 2024-05-30 16:45:20 -04:00
johnnyq
2149a33bd5 Added Email Client to ticket details, Public Comment does not email the client or watchers anything, but can view it in the ticker portal 2024-05-30 16:36:38 -04:00
johnnyq
237ba1dd20 Removed Custom CSS for ticket was able to make work with CSS Library bootstrap, asjusted spacing and layout of ticket response controls, 2024-05-30 15:35:02 -04:00
johnnyq
8c007ea7b1 Calculate more ticket response counts 2024-05-30 15:05:13 -04:00
johnnyq
f091d94282 Ticket Response UI Update Public Comment and Internal Note work now, added Events and Tasks to the Responses stil WIP there 2024-05-30 14:53:49 -04:00
johnnyq
db5ec8912a More UI Updates to ticket comments 2024-05-30 13:56:30 -04:00
johnnyq
7eb6c2ac7f Initial rework on UI for public comments, private notes and ticket events 2024-05-30 13:49:52 -04:00
johnnyq
dfca3a04a1 DB Structure Dumnp for billable options 2024-05-29 17:56:59 -04:00
johnnyq
1d19b72229 Added Billable Recurring Tickets, UI: changed the Billable option to switch. Added ticket settings option to automatically mark new tickets as billable 2024-05-29 17:55:39 -04:00
johnnyq
c389c68883 Default Tickets to not billable and add Billable option to Create Ticket 2024-05-27 13:46:17 -04:00
Johnny
1c5cb0123c Merge pull request #965 from wrongecho/ticket-categories
Ticket categories
2024-05-27 12:58:50 -04:00
Johnny
a3f72b7d93 Merge pull request #966 from wrongecho/calendar-start-day
Calendar start day
2024-05-27 12:58:14 -04:00
Marcus Hill
fbc87572e9 Calendar start day
Allow customising the calendar to start on a Monday instead of Sunday
2024-05-26 23:38:50 +01:00
Marcus Hill
159c1d78a0 Ticket categories
Add basic support for categorising tickets (e.g. Software/Network)
2024-05-26 22:49:57 +01:00
johnnyq
5210fae3ec Fix 2024-05-26 15:55:46 -04:00
Johnny
f177045432 Merge pull request #964 from wrongecho/user-roles-initial
User roles - Initial
2024-05-26 15:42:24 -04:00
Marcus Hill
e820ffec6b User roles
Move the default user roles into the database to make way for custom roles & permissions
2024-05-26 18:37:37 +01:00
wrongecho
c4fd3f7422 Merge pull request #962 from wrongecho/bugfix-ticker-timer-since-removal-open-tickets
Bugfix - Ticket time tracking
2024-05-26 17:09:24 +01:00
Marcus Hill
c969897389 Ticket time tracking
Bugfix for ticket time tracking as this was broken since the open ticket timer was removed
2024-05-26 17:09:04 +01:00
Marcus Hill
059a5516fc Ticket time tracking
Bugfix for ticket time tracking as this was broken since the open ticket timer was removed
2024-05-26 17:05:42 +01:00
wrongecho
f1037975a7 Merge pull request #961 from wrongecho/qr-code-fix
2FA QR Codes
2024-05-26 16:36:36 +01:00
Marcus Hill
2b006af52d 2FA QR Codes
Move away from the Google Charts API for generating QR codes as this is currently broken and not a security best practice.
2024-05-26 16:29:35 +01:00
Marcus Hill
8b1ba7028e 2FA QR Codes
Move away from the Google Charts API for generating QR codes as this is currently broken and not a security best practice.
2024-05-26 16:08:06 +01:00
johnnyq
c02d6d4cf0 Add Recurring Tickets NextDate to the Calendars 2024-05-21 13:33:53 -04:00
Johnny
85a1c5e795 Merge pull request #960 from wrongecho/2fa-token-cookie-time
Set 2FA Remember-me cookie expiry
2024-05-20 23:49:13 -04:00
Marcus Hill
cabc7e8c8b Set 2FA Remember-me cookie expiry to number of days the token should be valid for
Currently, the token is only valid for 2 days (86400 seconds = 24 hrs, multiplied by 2). This PR adjusts the cookie expiry date to the number of days configured that tokens are cleared after. This should help ensure users are not prompted for 2FA every few days, even if they've set a longer interval.
2024-05-17 23:26:22 +01:00
Johnny
579482c780 Merge pull request #958 from ssteeltm/client_logins-uri-ellipsis
client_logins uri limit with ellipsis
2024-05-17 16:26:49 -04:00
Hugo Sampaio
a96b3a30bd Update client_logins.php 2024-05-17 16:14:46 -03:00
Hugo Sampaio
4782892c8a using truncate function 2024-05-17 15:55:13 -03:00
Johnny
b78b62081c Merge pull request #959 from ssteeltm/tickets_tasks-progress-bar
Tickets tasks progress bar
2024-05-17 14:31:55 -04:00
Hugo Sampaio
aef2cde9d2 Update client_logins.php 2024-05-16 11:14:20 -03:00
Hugo Sampaio
d1aab02721 tasks table header 2024-05-16 11:04:25 -03:00
Hugo Sampaio
d4da95a6f1 show bar on html 2024-05-16 11:01:34 -03:00
Hugo Sampaio
edf9371ffa show tasks progress bar on tickets view 2024-05-16 11:00:04 -03:00
Hugo Sampaio
067d674c16 client_logins uri limit with ellipsis
limits long uri that may break lines in table
2024-05-16 10:48:41 -03:00
johnnyq
abc936d753 Update the AI prompt to style with html formatting 2024-05-15 10:47:27 -04:00
johnnyq
5b38a562bb Update the AI prompt to reword 2024-05-15 10:44:04 -04:00
johnnyq
cddd9b4977 Removed the AI Prompt as it did not always work correctly 2024-05-15 10:40:15 -04:00
Johnny
b2d529e783 Merge pull request #956 from ssteeltm/notification-updates
Display notification when update is available
2024-05-14 21:23:13 -04:00
Johnny
b8a4f0f10f Merge pull request #957 from ssteeltm/docs-files-search-recursive
search in all folders when in root (docs/files)
2024-05-14 21:20:59 -04:00
Hugo Sampaio
1242bd31c9 wrong folder id names 2024-05-13 17:28:53 -03:00
Hugo Sampaio
9e758b1edd only when search 2024-05-13 17:26:23 -03:00
Hugo Sampaio
cdf4767590 search in all folders when in root
Enable search recursive/all folders when in / (root).

In the future will be nice to have this as an advanced search.

reference:
https://forum.itflow.org/d/850-search-documents-recursive
2024-05-13 12:19:11 -03:00
Hugo Sampaio
352fbd852e typos 2024-05-13 11:22:57 -03:00
Hugo Sampaio
13a45c81a0 Display notification when update is available 2024-05-13 11:12:52 -03:00
johnnyq
bd12319422 Limit User access to restricted clients under global search 2024-05-12 13:54:34 -04:00
johnnyq
ff4628465c Quote Copy, Make Client a required field 2024-05-10 21:57:22 -04:00
johnnyq
d202c7684a Feature: Allow copying a quote from one client to another 2024-05-10 21:56:13 -04:00
johnnyq
3e7f57f64a Add contact primary to the API edit ^Cd create 2024-05-10 14:27:04 -04:00
johnnyq
9876c33d2e Client Access: Allow to select Client Access Restrictions for existing users 2024-05-10 14:01:20 -04:00
johnnyq
85bf412f53 Client Access: Allow to select Client Access Restrictions for new users 2024-05-10 13:42:42 -04:00
johnnyq
fa064962a9 Update logic denyed access to log it and redirect back with a toast indicating no access to client 2024-05-10 13:16:42 -04:00
johnnyq
e16dce190f Added logic to the inc_all_client.php file to deny access to users with client access permissions set 2024-05-10 13:05:32 -04:00
johnnyq
5f7ca75d1f Use try instead so script doesnt break if user_permissions table doesnt exist 2024-05-10 12:32:46 -04:00
johnnyq
2832f0eb33 Fix if Tables doesnt exist dont break script 2024-05-10 12:28:31 -04:00
johnnyq
ce0c394d3f Feature: User Client Access Permissions logic has been added, next up is the defining access via user managment 2024-05-10 12:25:38 -04:00
johnnyq
a41eede52f DB update for the upcoming user client restricted access permissions 2024-05-10 11:34:25 -04:00
Johnny
3b8f36e8f3 Merge pull request #954 from ssteeltm/phone-mask-option
Phone mask option
2024-05-10 11:06:24 -04:00
Johnny
2f3263cc64 Merge pull request #955 from ssteeltm/master
num active clients on menu
2024-05-10 11:03:19 -04:00
Hugo Sampaio
4779e8f923 add file ext .unf
https://forum.itflow.org/d/835-allow-file-type

added .unf for unifi backup file
2024-05-06 13:42:11 -03:00
Hugo Sampaio
ec94071167 num active clients on menu
show number of active clients um side menu
2024-05-06 13:25:30 -03:00
Hugo Sampaio
b1efb76b3b Update functions.php
handle phone_mask option
2024-05-06 11:31:38 -03:00
Hugo Sampaio
e677292875 update db
update db to store phone mask option
2024-05-06 10:44:52 -03:00
Hugo Sampaio
6c4235bdeb phone mask config
prepare phone mask config
2024-05-06 10:27:47 -03:00
Johnny
de7d68b659 Merge pull request #953 from wrongecho/hide-open-tickets-timer
Hide the running open ticket tracker as this feature is being removed
2024-05-05 14:30:21 -04:00
Johnny
c471228e6a Merge pull request #952 from wrongecho/report-tickets-time
Add total time worked to 'Tickets by client' report
2024-05-05 14:30:11 -04:00
Johnny
4069dc9cdc Merge pull request #951 from wrongecho/debug-assistance
Debugging help
2024-05-05 14:30:00 -04:00
Johnny
0f6a781638 Merge pull request #950 from wrongecho/cert-checks-custom-ports
Certificate checks - Allow custom ports
2024-05-05 14:29:51 -04:00
Johnny
aca1a13104 Merge pull request #948 from ssteeltm/master
Enable URL Recovery from logout
2024-05-05 14:29:40 -04:00
Hugo Sampaio
76a34dea8f Merge branch 'itflow-org:master' into master 2024-05-04 19:25:50 -03:00
Hugo Sampaio
5280620c6d Update login.php If standard 2024-05-04 19:25:10 -03:00
Hugo Sampaio
17eb51bd54 Update check_login.php If standard 2024-05-04 19:23:39 -03:00
Marcus Hill
df66a9625b Hide the running open ticket tracker as this feature is being removed 2024-05-04 21:36:59 +01:00
Marcus Hill
8d5c71f043 Add total time worked to 'Tickets by client' report 2024-05-04 21:32:03 +01:00
Marcus Hill
cd668241a6 Debugging help
- Mention the PHP error log on the setup & debug pages.
- Restructure the debug page to include the server info before the db structure table
2024-05-04 21:02:33 +01:00
Marcus Hill
43abd177ea Certificate checks - Allow custom ports 2024-05-04 18:04:24 +01:00
Hugo Sampaio
bab66bf769 updated
fixed domain url from config to prevent open redirect issue and encoded uri
2024-05-03 09:34:50 -03:00
wrongecho
c0fc957617 Merge pull request #949 from itflow-org/wrongecho-fileexts
Update file.php - Allow .pages and .numbers files
2024-04-28 20:06:52 +01:00
wrongecho
5f0c363503 Update file.php - Allow .pages and .numbers files 2024-04-28 20:06:08 +01:00
Hugo Sampaio
b8c529c2ec Enable URL Recovery from logout 2024-04-27 09:30:41 -03:00
johnnyq
5f0068a64f Added Advanced Filter by Referral under clients 2024-04-18 21:33:15 -04:00
johnnyq
c1f9ad6ea8 Allow to filter by industry under clients 2024-04-18 21:21:30 -04:00
johnnyq
c5876d2715 Move account selection in advanced Filter 2024-04-18 19:37:06 -04:00
johnnyq
d93caf1eac Cleanup up the side menu of admin / settings to be collapsible headers 2024-04-18 19:05:02 -04:00
johnnyq
7d6b578027 Remove indent for recurrings under client nav 2024-04-18 18:39:13 -04:00
johnnyq
0a5de911e9 Combine Settings and with Admin Side Nav 2024-04-18 18:37:43 -04:00
Johnny
d54780c913 Merge pull request #947 from git-kup/master
Update side_nav.php
2024-04-18 18:29:56 -04:00
git-kup
eb2cc7720e Update side_nav.php
Fix all 3 "Recurring" buttons where not inline with the rest of the buttons in the main side nav. it was slightly indent to the right.
2024-04-18 14:54:43 -04:00
johnnyq
894a4369b3 Fix Timezone always being UTC when sent to the mail queue when scheduling / cancelling tickets 2024-04-17 16:47:10 -04:00
johnnyq
7a2e063bde Fix Broken Reset Password due to incorrect timezone path 2024-04-17 14:05:43 -04:00
johnnyq
888552724a Set Timezone in all places and it needs to be set in and sperated it into a seperate include 2024-04-17 12:53:11 -04:00
johnnyq
7c10bbacd7 Fix not being able to filter tickets by using the search filter 2024-04-16 14:35:08 -04:00
johnnyq
2fd609bb2b Remove Piggy bank icon 2024-04-13 13:59:56 -04:00
johnnyq
7912c99b30 Add Account Selection filter in Expenses 2024-04-13 13:57:14 -04:00
Johnny
59b60e35c2 Merge pull request #945 from wrongecho/addnotice-stripefees-opentickettimer
Add removal notices for Stripe Fees & 'open ticket' time tracker
2024-04-13 13:37:53 -04:00
Johnny
4c02f3dc90 Merge pull request #944 from wrongecho/rec-inv-eml
Per-invoice notifications
2024-04-13 13:37:34 -04:00
Marcus Hill
cfa804b468 Add removal notices for Stripe Fees & 'open ticket' time tracker - these features are to be removed 2024-04-13 17:21:19 +01:00
Marcus Hill
0def06cf40 Add removal notices for Stripe Fees & 'open ticket' time tracker - these features are to be removed 2024-04-13 17:18:49 +01:00
Marcus Hill
a87a79b257 Per-invoice notifications
Hide per-invoice notif setting if invoice notifications are globally disabled
2024-04-13 17:10:10 +01:00
Johnny
a33a91cd95 Merge pull request #943 from wrongecho/ticket-notify-contact-manual-button
Ticket - Notifications
2024-04-13 11:50:04 -04:00
Marcus Hill
1c8b9a3319 Ticket - Notifications
Allow notifying contacts & watchers of a ticket when they are added/updated (#937)
2024-04-13 15:35:06 +01:00
Marcus Hill
2dc8e50ef8 Ticket - Notifications
Allow notifying contacts & watchers of a ticket when they are added/updated (#937)
2024-04-13 15:33:46 +01:00
wrongecho
034c12d6c3 Update README.md
Github readme - Updated bug report and forum roadmap links
2024-04-13 14:06:46 +01:00
johnnyq
c46d35247b Added recurring notification on off to cron 2024-04-12 20:25:05 -04:00
johnnyq
29a83b1e8e Added button to turn Email Notifications off or on on Recurring Invoices 2024-04-12 20:16:54 -04:00
johnnyq
ba66dbf887 Update DB Structure for the addition Email Notify to Recurring Invoices 2024-04-12 19:38:13 -04:00
Johnny
cc9abe5a09 Merge pull request #940 from wrongecho/tck-merge
Tickets - Merging
2024-04-12 19:30:04 -04:00
Johnny
65a3a03801 Merge pull request #939 from wrongecho/rec-invoice-var-name-fix
Client recurring invoice num fix
2024-04-12 19:29:55 -04:00
Marcus Hill
43bd028298 Tickets - Merging
- Fix merging UI not showing ticket status name correctly
- Add ability to move ticket notes and replies to the new parent ticket if desired (sometimes helpful, sometimes not)
2024-04-12 22:26:27 +01:00
Marcus Hill
bdd75f9f95 Client side nav pulls recurring invoice count from num_recurring, not num_recurring_invoices (this is instead used on the main page via inc_all) 2024-04-12 21:39:36 +01:00
wrongecho
453453cf9a Merge pull request #938 from git-kup/patch-1
Update client_overview.php
2024-04-12 21:29:33 +01:00
git-kup
60e067cc9e Update client_overview.php
Remove unpleasant looking elevation of note card in client overview
2024-04-12 15:51:01 -04:00
johnnyq
4ad897d85d Fix Closed Tickets showing up under stale tickets in client Overview 2024-04-12 14:43:53 -04:00
johnnyq
237cc38c60 Remove the recurring link on main tickets as this is on the side nav 2024-04-11 11:18:48 -04:00
johnnyq
f2125dd6d0 Changed the Tickets and Tasks Progress bar colors which have better contrast now 2024-04-10 17:24:34 -04:00
johnnyq
d0ed9fa817 Fix title to only show the session company name no need to nullify_html_entities the title this cause issues with umlaughts if you do 2024-04-10 15:11:09 -04:00
johnnyq
ccab5f9a00 Fix umlauts in settings browser title 2024-04-10 15:05:37 -04:00
johnnyq
b9342c8397 Update Browsers window title to the clients name when in the client section 2024-04-10 14:58:11 -04:00
johnnyq
51e80df71c Moved back Recurring Ticket, Invoices back in client side nav 2024-04-10 14:38:12 -04:00
johnnyq
d8bb6dd4c1 Moved back Recurring Ticket, Invoices and Expense back to the main side nav and added bagdge counters for them. They were just to buried and were used often 2024-04-10 14:06:25 -04:00
johnnyq
610ad04acf Tidy Side Nav 2024-04-10 13:40:38 -04:00
johnnyq
7dff524a19 Client domains: Do not show archived vendors and sort vendor names by name in the select boxes 2024-04-10 13:27:18 -04:00
johnnyq
88a96e3044 Reworked Client Domains, added mail host and dns host, made all the host columns sortable by reworking the logic and optimized the code further 2024-04-10 13:21:45 -04:00
johnnyq
7ca4163552 Ticket Details Update Do not show Invoice Button when Invoiced, do not show billable show Invoiced and the Invoice Number, fixed some padding 2024-04-10 11:27:58 -04:00
johnnyq
f526e908c3 Fix Bug where it doesnt add the tasks from a ticket template, this was due to the removal of task_description 2024-04-08 20:23:23 -04:00
johnnyq
199185a279 Fix Rounding Percents for tasks and tickets 2024-04-08 20:11:40 -04:00
johnnyq
3e14938a53 Add Open Quotes to the Side Nav 2024-04-08 17:35:21 -04:00
johnnyq
a9e5c1ff9c Add Open Invoices, Tickets and Projects Badges to Main Side Nav Bar 2024-04-08 17:22:08 -04:00
johnnyq
e849832f01 Make project number clickable and to view project details 2024-04-08 17:00:50 -04:00
johnnyq
0acd737135 Hide Ticket Close button until all tasks are complete 2024-04-08 16:58:43 -04:00
johnnyq
16fb1467a2 Added Project Prefix and Project Numbering System 2024-04-08 16:48:06 -04:00
johnnyq
f4051fe718 Updated Ticket details to include Tasks Completion Status and Collaborators 2024-04-08 15:58:59 -04:00
johnnyq
ae5f81d9b5 List all the ticket Callaborators in project details currenly it just gets the users that replied to tickets 2024-04-08 15:43:04 -04:00
johnnyq
6435ffde67 Added total time worked for all tickets in project details 2024-04-08 15:19:35 -04:00
johnnyq
ea85094be8 Fixed Bulk Assign Ticket, UI Update on Ticket Details, added Project details to the right pane, moved Client and ticket details along with Assign Ticket to the top Ticket Header 2024-04-08 14:44:35 -04:00
johnnyq
2aefbd9fba DB Dump from last commit 2024-04-08 12:23:05 -04:00
johnnyq
72f96e0ebf Added Project Manager field to projects 2024-04-08 12:22:16 -04:00
johnnyq
d2e11fca61 Remove the Add Contact to a ticket as this can be done at the top 2024-04-07 16:17:27 -04:00
johnnyq
dfb1304bfa When completeing task add a private note to the ticket along with a 5 Min time worked soon will be configurable based off the task 2024-04-07 14:26:37 -04:00
johnnyq
1e85b56d2a Use Plus icon for Adding tickets to Projects 2024-04-07 13:28:28 -04:00
johnnyq
e1312b29e5 Generating a Project with Tickets is now possible by selecting a project template when creating a new project 2024-04-07 13:17:52 -04:00
Johnny
d54bcf9a14 Merge pull request #936 from wrongecho/portal-pw-reset-delay
Client Portal
2024-04-07 11:40:24 -04:00
Johnny
3191ef120e Merge pull request #935 from wrongecho/client-show-archived
Client archiving
2024-04-07 11:39:31 -04:00
Johnny
acc7a7bc97 Merge pull request #934 from wrongecho/portal-sql-tidy
Client Portal - Ticket SQL Tidy
2024-04-07 11:38:19 -04:00
Marcus Hill
7171289f26 Client Portal
- Remove old fake send delay as reset links now go via mail queue
- Small tidy
2024-04-07 10:14:37 +01:00
Marcus Hill
abf01384ca Client archiving
Relates to #510

- Ability to see archived clients
- Ability to un-archive a client
- To help prevent accidents, client deletion button now only shows once the client is archived
2024-04-07 09:52:23 +01:00
Marcus Hill
da3201dbe0 Client Portal - Ticket SQL Tidy
Tidy up the client portal sql for viewing tickets to only grab required fields - #933
2024-04-07 09:15:55 +01:00
johnnyq
d762efd1a6 Try to differentiate Project Template and Project Details 2024-04-06 22:21:15 -04:00
johnnyq
004e2eb69c Make Add Ticket More Prominent in Projects and move it out of the 3 dots 2024-04-06 22:16:40 -04:00
johnnyq
e3ff8854f9 Removed Task Descriptions as the name says it all 2024-04-06 22:07:29 -04:00
johnnyq
e6e6c38db2 UI: Changed Reword to AI Reword and changed color from Primary blue to Secondary Gray so it doesnt get confuged with reply in ticket details 2024-04-06 21:54:59 -04:00
johnnyq
8473ee018f Removed Add Task Modal as this can be added inside the ticket 2024-04-06 21:44:42 -04:00
johnnyq
48ecde6e9b Allow Overriding a ticket templates subject when creating a ticket from template 2024-04-06 20:54:22 -04:00
johnnyq
8d571682cc Cleaned up Contact Add/Edit Relabeled Secure tab to Access and moved Roles to Access Tab ss this is much more suitable 2024-04-06 20:05:53 -04:00
johnnyq
6da826e418 Tidy Update Project and Ticket Templates Deleting functions 2024-04-06 19:05:36 -04:00
johnnyq
f6b87553ac Created new table to allow many to many relationship for Ticket and Project Templates 2024-04-06 18:37:37 -04:00
johnnyq
c17957fe0a Order by the order number then by ticket template name 2024-04-05 18:22:50 -04:00
johnnyq
b22781d2ea Add Ticket Template order under project templates, this will state the execution order when deployed 2024-04-05 18:20:09 -04:00
Johnny
60212b380c Merge pull request #932 from wrongecho/ticket-email-status-fix
Ticket status in emails
2024-04-05 17:01:48 -04:00
Johnny
97cc36e93a Merge pull request #931 from itflow-org/wrongecho-patch-1
Clarify remember me token is for 2fa
2024-04-05 16:52:07 -04:00
johnnyq
dbe5525046 Added the ability to Add ticket templates to project templates and also to remove ticket templates from project templates 2024-04-05 16:50:22 -04:00
Marcus Hill
be01525136 Ticket status in emails
- Fix tickets showing an "unknown" status in client update emails
- Remove old code related to closing tickets, as close is now it's own button
2024-04-05 21:48:57 +01:00
wrongecho
d7a466bde6 Clarify remember me token is for 2fa 2024-04-05 21:27:33 +01:00
johnnyq
5370a70ab8 Renamed Login In the Frontend UI to Credentials to better fit other types of creds like API Keys, WiFi etc, also renamed the password field to password / key 2024-04-05 15:06:42 -04:00
johnnyq
05d979b3d8 Do not allow editing a closed project 2024-04-05 14:19:34 -04:00
johnnyq
048b890465 Added Open and Closed Project button to projects list, renamed complete to close for projects 2024-04-05 14:06:57 -04:00
johnnyq
43c06b8151 Now you can mark a project complete when all Tickets for the project are closed and we now show an open or closed status by the project name 2024-04-05 13:48:50 -04:00
johnnyq
064b37f87e Quick Fix 2024-04-04 19:54:33 -04:00
johnnyq
4824ae8ef8 Make Remmeber Me Token Configurable and default to 3 2024-04-04 19:52:44 -04:00
johnnyq
e1f1122b3e Added more global search parameters to assets like serial, mac, ip, make, model, os, status, type 2024-04-04 14:58:14 -04:00
johnnyq
8ca8f3ef46 Added Files and Recurring Tickets to the Global Search 2024-04-04 14:48:59 -04:00
johnnyq
730c1f4df3 Feature: You can now create a ticket from a ticket template 2024-04-03 15:41:20 -04:00
johnnyq
c8bac996bf Bump TinyMCE from 6.8.2 to 7.0.0 2024-04-02 12:10:33 -04:00
wrongecho
ed87ddc2dd Merge pull request #929 from wrongecho/portal-ticket-list-fix
Client Portal Tickets - Adjust bad SQL query that shows ticket subjects for other contacts
2024-04-02 00:38:48 +01:00
Marcus Hill
bc8f79cdf9 Adjust bad SQL query that allowed contacts to see ticket subjects (but not content) for other contacts 2024-04-02 00:36:55 +01:00
Marcus Hill
2f473c6a03 Adjust bad SQL query that allowed contacts to see ticket subjects (but not content) for other contacts 2024-04-02 00:30:25 +01:00
johnnyq
da2fee7fc6 Fix add project ticket to show all tickets but closed one instead of showing just closed tickets 2024-04-01 17:37:47 -04:00
johnnyq
6d8ab569c9 Add Ticket subject to Add ticket to Project notification and logging 2024-04-01 17:33:36 -04:00
johnnyq
e5e17c669f Made Add Ticket to Project Functionable 2024-04-01 17:21:59 -04:00
johnnyq
365cd79999 No Need for if conditions on a blank due date as it is required 2024-04-01 16:49:08 -04:00
johnnyq
cf71a58526 Make Project Due Date Required Field, Do not require a project Template 2024-04-01 16:45:13 -04:00
johnnyq
f1833e1083 Updated ticket status color capabilities to use multiple color instead of a select few, added activate disable ticket statuses, fixed ticket status Left joins in a few more areas 2024-04-01 16:27:05 -04:00
johnnyq
912e2774f8 Dont display tasks if none are set 2024-03-31 14:19:06 -04:00
johnnyq
9243964242 Tidy Projects UI 2024-03-31 14:17:35 -04:00
johnnyq
b04c2e1232 Added Project due to the UI: 2024-03-31 14:02:48 -04:00
johnnyq
2fa86d9ae7 Update DB Structure to include task order and project due date 2024-03-31 13:55:38 -04:00
johnnyq
3b46f1e6bd Added the ability to Add Ticket and Edit Ticket statuses, disallowed deleting editing system tickets, this is still work in progress 2024-03-31 13:40:31 -04:00
Johnny
dac5fb1284 Merge pull request #928 from wrongecho/login-tidy
Login related tidying
2024-03-30 20:33:36 -04:00
Marcus Hill
d94b9ce7bb Login related tidying
- Feature: Show users their remember-me tokens and allow them to be revoked
- Log when a user generates a remember-me token during sign in
- General refactoring and tidying up
2024-03-30 23:19:50 +00:00
johnnyq
2c22c732e4 Comment out updating undefined statuses 2024-03-30 17:53:30 -04:00
johnnyq
d74c2c6898 New Tciket Status: Update Projects 2024-03-30 17:39:45 -04:00
johnnyq
3fb3f647cf New Tciket Status: Fix Unbilled Ticket Report to use ticket closed at IS NOT NULL 2024-03-30 17:29:38 -04:00
johnnyq
770356ba10 No Need for ticket status name or status id when bulk closing tickets 2024-03-30 17:16:01 -04:00
johnnyq
07892afe24 Fix missing ) in calendar events 2024-03-30 17:02:41 -04:00
johnnyq
5b9cc50bae Allow to search by ticket status name 2024-03-30 16:59:49 -04:00
johnnyq
0a52e3a33d Update Calendar Events use the ticket_scheule field to determine if a ticket is scheduled or not instead of status as scheduled is not a core status 2024-03-30 16:55:11 -04:00
johnnyq
afcb0cffdc Remove Ticket Status display and priority and assigned to from invoice also updated the new ticket status int format 2024-03-30 16:34:14 -04:00
johnnyq
67a045a2b5 New Ticket Status Fix Gobal search 2024-03-30 16:18:39 -04:00
johnnyq
13a1d9d394 New Ticket Status Fix Ticket Listing is asset_Details 2024-03-30 16:08:18 -04:00
johnnyq
f39c380c47 New Ticket Status Correct Ticket Side nav Badges 2024-03-30 15:58:03 -04:00
johnnyq
f99be168cf New Ticket Status Fix dashboard Tickets 2024-03-30 15:55:04 -04:00
johnnyq
b63eddb300 Fix Ticket Close to use the new ticket status INT instead of string 2024-03-30 15:46:02 -04:00
johnnyq
4aad95d380 Add Ticket Closed at time to tickets that were Bulk Closed 2024-03-30 15:28:22 -04:00
johnnyq
b4db5013a3 Fix Bulk Close Ticket not updating the ticket_closed_at field and not using the new status id 2024-03-30 15:20:01 -04:00
johnnyq
387d2733fa Fixes ticket status that did not conform to the current ticket statuses to Open 2024-03-30 15:06:52 -04:00
johnnyq
349a276de2 Merge branch 'master' of github.com:itflow-org/itflow 2024-03-30 14:59:08 -04:00
johnnyq
e177dae237 Created Project template details page and updates Tasks in project details 2024-03-30 14:58:48 -04:00
Johnny
e2f825e5c1 Merge pull request #926 from wrongecho/ticket-statuses
Ticket Statuses from DB
2024-03-30 14:57:46 -04:00
wrongecho
fa777eaf9c Merge pull request #927 from itflow-org/we-template-nav
Update admin_side_nav.php
2024-03-30 09:10:20 +00:00
wrongecho
084dcb782e Update admin_side_nav.php
https://forum.itflow.org/d/785-new-templates-ui-bug-admin
2024-03-30 09:07:32 +00:00
wrongecho
dfa952ab73 Update README.md
Bugs should also go to the forum
2024-03-30 08:27:39 +00:00
Marcus Hill
7df1d419fa Ticket Statuses from DB / use left join instead of a function, hard-code system statuses 2024-03-29 23:20:52 +00:00
Marcus Hill
a961b8aa72 Ticket Statuses from DB / touchups 2024-03-29 12:08:02 +00:00
wrongecho
2e95b7cb6e Merge branch 'master' into ticket-statuses 2024-03-29 11:58:53 +00:00
Marcus Hill
8607198c3e Ticket Statuses from DB / add project id 2024-03-29 11:32:46 +00:00
Marcus Hill
667a93210c Ticket Statuses from DB 2024-03-29 11:22:32 +00:00
johnnyq
78e92ea8d6 Add Project Templates Listing, edit and add, more to come 2024-03-28 22:03:57 -04:00
johnnyq
89a1c5d2d8 Added Ticket Templates and the ability to add Tasks to the template, reworked the ticket details tasks and adding tasks 2024-03-28 21:09:32 -04:00
johnnyq
08fc72ded7 Fix Last Reponse Column under tickets and client tickets use the ticket_reply_created_at instead of ticket_updated_at 2024-03-27 23:12:17 -04:00
johnnyq
ee308453db Dont break when division of 0 occurs 2024-03-27 22:51:20 -04:00
johnnyq
e42c5bc2f5 Major UI Updates to projects, created project details which display project stats tickets and tasks, tickets can be linked to a project, soon will add all users who contributed to a project and some more stats along with a nice timeline from created to deadline 2024-03-27 22:27:56 -04:00
johnnyq
c9724bea0d DB Update task, ticket and project templates added 2024-03-27 19:16:44 -04:00
johnnyq
76cce6ac23 Updated Edit Domain and Certificates to match the tabing in the add modal 2024-03-27 14:53:15 -04:00
johnnyq
2012a80fe5 DB Duimp for the new network fields 2024-03-27 14:21:18 -04:00
johnnyq
8addc4f55c Feature: Added Subnet Mask and primary and secondary DNS change the wording for network to IP / Network in case a single IP needs to be used for example an Internet Connection, Added more newe tabs to the Add/Edit Network so everything fits and is organized 2024-03-27 14:19:32 -04:00
johnnyq
720a4af44e Fixed Missing Invoice Button when ticket is closed 2024-03-27 11:02:45 -04:00
johnnyq
26dc3172e7 Initial Project work on the UI started 2024-03-27 00:26:53 -04:00
johnnyq
6ff740e619 Fix Missing Asset Buttons when selected 2024-03-26 16:31:24 -04:00
johnnyq
0931f60764 Ticket Details Tidy Buttons and Ticket Details 2024-03-26 16:08:32 -04:00
johnnyq
c052850465 Automatic submit when Assign Tech is selected 2024-03-26 15:41:16 -04:00
johnnyq
cdc87562c9 Ticket Details UI Enhancements, Dont display entity cards if no data, Moved Add Entities to the Top Bar along with Invoice and Close Ticket. Combine the Client Details and Assign Card into one card, and Tidy Work 2024-03-26 15:11:57 -04:00
johnnyq
038e7e4a52 Add Task Completion Date and Time Stamp 2024-03-26 14:10:14 -04:00
johnnyq
31184dab62 Moved Tasks Card under Details, Added tje ability to Edit and mark a task complete 2024-03-26 14:06:32 -04:00
johnnyq
c40c204ce1 Use full name in vars 2024-03-25 16:45:34 -04:00
johnnyq
e2733fecb7 Some initial beginnings of task management in tickets, currently you can create and delete them more to come 2024-03-25 16:43:56 -04:00
Marcus Hill
63f35d5760 Ticket Statuses from DB
First swing at this to share my progress, isn't ready to merge yet but would appreciate thoughts
2024-03-24 22:57:21 +00:00
Marcus Hill
9c68a315db Ticket Statuses from DB
First swing at this to share my progress, isn't ready to merge yet but would appreciate thoughts
2024-03-24 22:54:38 +00:00
Marcus Hill
5e63ef9a2a Ticket Statuses from DB
First swing at this to share my progress, isn't ready to merge yet but would appreciate thoughts
2024-03-24 22:36:21 +00:00
Johnny
7702d8c5bf Merge pull request #920 from wrongecho/ticket-cleanup
General ticket updates/cleanup
2024-03-24 10:56:51 -04:00
Johnny
fe644317b6 Merge branch 'master' into ticket-cleanup 2024-03-24 10:56:43 -04:00
Johnny
865c2dcb84 Merge pull request #919 from wrongecho/ticket-status-color
Ticket status colours
2024-03-24 10:54:27 -04:00
Marcus Hill
ccb1bf9b0d General ticket updates/cleanup
- Tickets & Client Tickets: General tidy up, fix broken vars, remove unneeded vars, add comments
- Client Portal: Show assigned agent for open tickets
2024-03-24 11:31:46 +00:00
Marcus Hill
796ba6633e Ticket status colours
Standardize ticket statuses via function
2024-03-24 10:12:02 +00:00
johnnyq
b47aba1d5a Feature: Submit form when drop down are selected everywhere 2024-03-23 17:31:42 -04:00
johnnyq
2afb467503 Feature: Submit form when drop down are selected 2024-03-23 17:16:06 -04:00
johnnyq
1792aaee64 Feature added location to calendar events and created new tab called details in calendar events for description and location 2024-03-23 16:43:42 -04:00
johnnyq
5ebc6ffde8 Feature Added ability to select a ticket location for location based, still need to add more to this functionality 2024-03-23 16:24:40 -04:00
johnnyq
534e02e2c7 Feature: Color ticket rows yellow if Last Response was from a client This will let you know you need to be the next responder 2024-03-23 16:03:52 -04:00
johnnyq
79ea97410e Feature Show who last replied in ticket listings 2024-03-23 15:59:02 -04:00
johnnyq
4d773e895a Tid 2024-03-23 15:24:14 -04:00
johnnyq
df313e5bd6 Tidy removed Help on the Top Nav Bar too much clutter and unnessesary 2024-03-23 15:23:12 -04:00
johnnyq
9e7f50b9eb Feature Add Bulk Cancel and Delete to Mail Queue for mail that are any status other than sent 2024-03-23 15:01:01 -04:00
johnnyq
3cf1b8427c Fix Asset Counts into a better defined count query 2024-03-22 19:01:10 -04:00
johnnyq
ca7cf62098 Do not show all asset button if no assets are found, also get correct count of assets types if location is selected 2024-03-22 18:38:29 -04:00
johnnyq
1d9d9a89ed Feature Added Location filter to assets 2024-03-22 18:09:15 -04:00
johnnyq
8270c8fcc4 Cannot edit driver Fix 2024-03-22 17:16:06 -04:00
johnnyq
cf8b2aa7ad Add eye icon for people viewing tickets 2024-03-22 15:58:25 -04:00
johnnyq
eda78f0927 Moved Ticket Viewing to the top if someone is viwing the ticket the same time you are 2024-03-22 15:44:24 -04:00
johnnyq
3974055bff Missing Div 2024-03-22 15:33:52 -04:00
johnnyq
900df014b7 Do not show Responses if the count is 0 2024-03-22 13:35:48 -04:00
johnnyq
4cfbfb1a73 Improved spae utiliztion in ticket details by Removing the Extra Card on the left and right panes 2024-03-22 13:25:13 -04:00
johnnyq
90156f4f1b Enhanced the UI for document details removed the lists in replacement of divs, remove items to the far right, removed the span buttons and used normal button as it took up too much space 2024-03-22 13:17:47 -04:00
johnnyq
a6a763c24c Move View Queue Message away from a modal as tables tend to break the modal causing distorted view, more ui work for this to come 2024-03-21 18:01:41 -04:00
johnnyq
0c62ce169f Add Pretty content JS function to global search so HTML ticket replies look nicer and fit to width 2024-03-21 17:19:06 -04:00
johnnyq
e34f66f00a Updated Services to use the media css function 2024-03-21 17:12:13 -04:00
johnnyq
1f1197be50 Missing var 2024-03-21 16:16:32 -04:00
johnnyq
7d22f208b8 Enhancement moved to media css for domain listing and added description field 2024-03-21 16:07:54 -04:00
johnnyq
ed20681790 Update Client Vendors to use the new media css function 2024-03-21 15:56:09 -04:00
johnnyq
51dba5ac1a Certificates Enhancement, Use Media CSS, add description create a new tab for notes 2024-03-21 15:46:14 -04:00
johnnyq
5266f126cb Set Timezone in the CRON files as well as the command line PHP doesn't always respect the system timezone 2024-03-21 14:55:54 -04:00
johnnyq
2f4ddd85ca Fix PHP UTC issue, new PHP updates did not not respect System TimeZone 2024-03-21 14:23:16 -04:00
johnnyq
bdf868588e Ability to search by network description 2024-03-20 18:46:34 -04:00
johnnyq
16cfc3e032 Add Description to Networks 2024-03-20 18:44:32 -04:00
johnnyq
ca0eb4f261 Adjust media css listing to use divs instead of <p> tags 2024-03-20 18:11:37 -04:00
johnnyq
5d3e6da38d Removed Extra location name under edit location 2024-03-20 17:46:32 -04:00
johnnyq
bfe7c3098d Fix broken open uri 2024-03-20 17:31:04 -04:00
johnnyq
71c4537263 Client Logins Enhancement: Moved to the new media CSS Class, fixed password reveal would take you to the top of the page, moved open URI to the action bar as a button, fixed password alignment for copy to clipboard, description is now below the login name, made set button to type=button to prevent submits if wrapped in a form 2024-03-20 17:28:09 -04:00
johnnyq
534096f182 Software Licenese / Template Enhancements: Fixed create Software from template, added description, user media css for licenses and templates, reworked the add edit modal, Removed Software Login 2024-03-20 16:54:38 -04:00
johnnyq
845e168942 Updated the rest of wording regarding email being sent to email been queued with a link to the Mail Queuer 2024-03-20 14:22:57 -04:00
johnnyq
c0115a26c5 Group Ticket Replies and only search in ticket reply not ticket subject or ticket details In global search 2024-03-20 13:36:04 -04:00
johnnyq
6790464e90 Do not show DHCP if IP is null under assets 2024-03-20 13:05:10 -04:00
johnnyq
dafdc7a63b Include Client Name in Ticket Replies Global Search 2024-03-20 13:00:50 -04:00
johnnyq
6a3d53fc4b Feature: Added Ticket Replies to Global Search 2024-03-20 12:53:25 -04:00
johnnyq
643144bc5e Name Margin enhancement 2024-03-19 18:14:36 -04:00
johnnyq
1ff614381f UI Enhancement to contact listing now use the media class 2024-03-19 18:10:40 -04:00
johnnyq
a8bacd5acb Give notes a little more space 2024-03-19 17:52:27 -04:00
johnnyq
4c01c472b8 Add UI and logic for location Description, Tweak Location Listing UI to use the media class 2024-03-19 17:48:54 -04:00
johnnyq
b800d52ea9 No Null for Invitation status 2024-03-19 17:12:22 -04:00
johnnyq
4fec8efecd DB Structure Update, added missing Short description fields to several entities, Added Event Attendees Table, Added event location, added db support support to link files with an asset, added db support to allow multiple contacts for a vendors 2024-03-19 17:08:37 -04:00
johnnyq
1a74acfbff Adjust margins in assets 2024-03-19 15:27:39 -04:00
johnnyq
904b87fff6 reduced serial number to just serial 2024-03-19 15:13:42 -04:00
johnnyq
df4f8a518c Add DHCP next to IP if none is given 2024-03-19 15:11:06 -04:00
johnnyq
e426778ac2 Remove Copy IP Button from assets as its not nessessary and was taking up precious space 2024-03-19 15:09:39 -04:00
johnnyq
2320a93f82 Renamed Column headers to increase margin space 2024-03-19 15:03:57 -04:00
johnnyq
76eae92954 UI Use media Class for assets to seperate the icon from the name / description text, moved logins and and remote links to the action column instead of by the asset name also increased right margin of the device icons for top search bar 2024-03-19 15:00:59 -04:00
johnnyq
2c8c275a7e Use bootstrap css media function to properly seperate icon on the left and text on the right for files, Fix Search for files within a folder. 2024-03-19 14:33:21 -04:00
Johnny
294760b50c Merge pull request #917 from wrongecho/guest-sharing-otp
Guest login sharing - OTP
2024-03-17 22:52:54 -04:00
Johnny
0dfca605a8 Merge pull request #916 from wrongecho/assets-and-logins
Assets and Logins
2024-03-17 22:52:29 -04:00
Johnny
aed46a3b21 Merge pull request #915 from wrongecho/contact-pw-generator-bugfix
Bugfix: Contact generated passwords are in quotes
2024-03-17 22:50:19 -04:00
Marcus Hill
f1528b9e95 Guest login sharing - OTP
Bugfix: Fix guests not being able to see the 2FA/TOTP token via the sharing link
https://forum.itflow.org/d/646-shared-login-with-otp
2024-03-17 19:32:49 +00:00
Marcus Hill
6788781ee6 Assets and Logins
- Show asset location when relating it to a login
- Bugfix: Swap login_id for asset_id on client_assets.php, as login_id won't yet be defined
- Bugfix: Don't show archived assets in the login relation modal
2024-03-17 19:19:59 +00:00
Marcus Hill
d29726f63e Bugfix: Contact generated passwords are in quotes
Fixing as per https://forum.itflow.org/d/760-password-generator-include-at-start-and-end
2024-03-17 18:51:56 +00:00
Johnny
064629d499 Merge pull request #914 from wrongecho/smtp-test-wording
Reword SMTP test message to make it clear that messages are queued
2024-03-17 13:42:31 -04:00
Johnny
ba68fe54ab Merge pull request #911 from wrongecho/rec-tck-agent-assign
Ticketing updates
2024-03-17 13:42:18 -04:00
Marcus Hill
678c53a8fb Reword SMTP test message to make it clear that messages are queued 2024-03-17 16:39:03 +00:00
wrongecho
0fd50a33ea Update db.sql
Recurring ticket agent assignment, retrigger checks
2024-03-17 16:26:59 +00:00
wrongecho
43ebb867b2 Merge pull request #912 from itflow-org/wrongecho-db-sql-lint
Create dbsql-lint.yml
2024-03-17 16:24:53 +00:00
wrongecho
73b5a6b0a5 Create dbsql-lint.yml 2024-03-17 16:23:55 +00:00
Marcus Hill
dfce95a67b Recurring tickets bugfixes 2024-03-17 11:57:58 +00:00
Marcus Hill
f9a5ca1ef8 Ticketing updates
- Bugfix: Prevent tickets from being assigned to disabled techs
- Bugfix: Un-assign all open tickets when a tech account is disabled
- Allow auto-assignment of recurring/scheduled tickets to an agent/tech (#901)
- Rework layout of recurring/scheduled ticket modal
2024-03-17 11:09:53 +00:00
johnnyq
cdd16bd460 Add file Description below filename, still need to work on the UI a bit 2024-03-15 18:44:16 -04:00
johnnyq
27a96c2293 Add Important asset, document, file, add file Description to DB Structure 2024-03-15 18:32:42 -04:00
johnnyq
d32925eefc Tidy 2024-03-13 14:03:07 -04:00
johnnyq
07c27eb2f9 Merge branch 'master' of github.com:itflow-org/itflow 2024-03-11 17:51:27 -04:00
johnnyq
79011763db Fix issue where certrain password characters would break writing config.php file which would break the setup also check for valid host 2024-03-11 17:50:48 -04:00
Johnny
a1ccecea9e Merge pull request #908 from wrongecho/guest-sharing-downloads
Guest Sharing - File downloads
2024-03-11 16:49:11 -04:00
Marcus Hill
52685e424b Guest Sharing - File downloads
- Fix a bug where the file name wouldn't be shown to guests in certain situations
- General refactor and tidy of the file download code
2024-03-10 19:06:40 +00:00
Johnny
4b839c8b23 Merge pull request #907 from wrongecho/file-upload-pfx
Allow pfx file uploads
2024-03-10 13:38:04 -04:00
Marcus Hill
c251cc1faf Allow pfx file uploads 2024-03-10 10:48:17 +00:00
johnnyq
a40ec71b0a Fix Broken Test Input Text Reword under AI Settings 2024-03-08 16:11:25 -05:00
johnnyq
5d40f7480b Add Type Button to prevent submit for copy Email in contacts 2024-03-08 12:23:44 -05:00
johnnyq
82012ced62 Use margin instead of br to seperate Last Login Info on users list 2024-03-06 12:06:32 -05:00
johnnyq
a86523bd1b Removed the requirment visual for transer method as its not required 2024-03-05 19:26:16 -05:00
johnnyq
37a4f5cee0 Added Method of Transfer to Transfers frontend, currently uses payment type category and is optional useful to see how the money got transferred 2024-03-05 19:22:05 -05:00
johnnyq
1dfc819660 Add Transfer Method to the Database this will in the method to transfer money from 1 account to another 2024-03-05 18:48:34 -05:00
johnnyq
120348df4d Add _amount 2024-03-05 17:07:51 -05:00
johnnyq
efdef7f6aa Better Descriptive Vars to seperate amounts vs counts in Invoices 2024-03-05 17:05:43 -05:00
johnnyq
5e88664558 Exclude Cancelled 2024-03-05 16:59:21 -05:00
johnnyq
e6192ab5eb Invoice Top Bar Statuses, Get the Real Overdue amout which is to subtract from the partial payments 2024-03-05 16:41:24 -05:00
johnnyq
2d447369b6 UI: Icon updates for income and profit 2024-03-05 16:37:20 -05:00
johnnyq
8719919639 UI: Update Invoices Listing Top Header to include Drafts, Unpaid and Overdue instead of Drafts, Sent, Viewed and Partial 2024-03-05 16:23:05 -05:00
johnnyq
a91352229e Drop asset_login_id as we have login_asset_id to allow 1 asset many logins, also drop the unused many to many asset login table 2024-03-03 13:40:50 -05:00
johnnyq
51248ed841 You can now view all login / passwords for an asset under asset lists and under asset details now 2024-03-03 13:23:52 -05:00
johnnyq
eeb5cece7c Remove SQL Left Join logins for assets as this is causing duplicate assets to appear if more than 1 related login exists, this break viewing login password for each asset, we will handle this a little differently 2024-03-03 13:03:49 -05:00
Johnny
8c51754c6b Merge pull request #900 from wrongecho/ticketing-hide-functions-closed
Ticketing (and Invoicing)
2024-03-02 19:48:55 -05:00
Johnny
cb57a1e86b Merge branch 'master' into ticketing-hide-functions-closed 2024-03-02 19:48:44 -05:00
Johnny
ef14e95adf Merge pull request #902 from wrongecho/ticket-statuses
Ticket States
2024-03-02 19:44:39 -05:00
Marcus Hill
81301388cd Ticket Statuses
Standardize on 5 consistent ticket states:-
- New (Red/Danger)
- Open (Blue/Primary)
- On Hold (Green/Success)
- Auto Close (Dark/black)
- Closed (Dark/black)

Update parts of the app where these have deviated from, as they have not been updated everywhere.
Other states may be configurable in future via custom fields.
2024-03-03 00:22:20 +00:00
Marcus Hill
b9431645d3 Ticket Statuses
Standardize on 5 consistent ticket states:-
- New (Red/Danger)
- Open (Blue/Primary)
- On Hold (Green/Success)
- Auto Close (Dark/black)
- Closed (Dark/black)

Update parts of the app where these have deviated from, as they have not been updated everywhere.
Other states may be configurable in future via custom fields.
2024-03-03 00:13:29 +00:00
Marcus Hill
66e07b0c47 Ticket closure email wording 2024-03-02 18:35:10 +00:00
Marcus Hill
3084e9e0d3 Ticketing (and Invoicing)
- Hide the ability to add/delete watchers when a ticket is closed
- Hide watchers card entirely when tickets are closed, if the ticket had no watchers
- Hide the ability to schedule a ticket when a ticket is closed
- Don't include tickets in an auto-close state in the sidebar ticket counts
- Small edit to the ticket closure wording to account for requests and issues
- Small edits to invoice emails text
2024-03-02 18:31:01 +00:00
wrongecho
f5a6dc2b0a Update FUNDING.yml
Adjust sponsor/donate link on Github
2024-03-02 09:38:49 +00:00
johnnyq
f860d36334 Fix Ticket Notifications via Client Portal 2024-03-01 14:43:50 -05:00
johnnyq
15e729e65a Removed old Remember me token, update revoke remember me function 2024-02-29 15:51:26 -05:00
johnnyq
6641c5c338 Added removed old remmeber me tokens after 48 hours to the cron.php cleanup section 2024-02-29 14:46:02 -05:00
johnnyq
9955ff56f5 Carry over discount amounts when copying a quote or invoice 2024-02-29 14:28:48 -05:00
johnnyq
85cc8c163b Carry over discount amounts from recurring and quotes to invoice, fix force recurring 2024-02-29 14:15:57 -05:00
johnnyq
998a701634 UI: Show assigned contact in asset dropdown select menu in tickets 2024-02-26 16:50:12 -05:00
johnnyq
be5bf1853e Sanitize From Name and From Email Output in bulk mail as its not sanitized when the vars are grabbed from get_settings.php 2024-02-26 15:58:28 -05:00
johnnyq
015ef13c55 Show the From name from System, Billing, Sales and Support Email in Bulk Email from section 2024-02-26 15:51:44 -05:00
johnnyq
18bc7c909e Sort client names ASC not desc for bulk mail 2024-02-26 15:45:11 -05:00
johnnyq
0a088a43c5 UI: Add some bottom margin so when the button is reveals rows dont shift down a few lines 2024-02-26 15:43:20 -05:00
johnnyq
4369b3bd12 Include and sort by client name first in global bulk email 2024-02-26 15:42:03 -05:00
johnnyq
c3c9da0c71 Use the bulk mail function in bulk mailers for standardization, also fix unused vars in smtp settings form 2024-02-26 15:38:00 -05:00
johnnyq
1c50a0e314 UI: Center Aligned Billable under client tickets 2024-02-26 13:08:20 -05:00
johnnyq
0997282077 Fix broken link logs.php to admin_logs.php 2024-02-26 12:28:21 -05:00
Johnny
fe5376c52e Merge pull request #893 from wrongecho/ticket-billable-column
Hide billable tickets when accounting is disabled
2024-02-24 11:19:48 -05:00
Johnny
e1b29df0ee Merge pull request #894 from wrongecho/locations-api
Add locations read api endpoint
2024-02-24 11:19:40 -05:00
Johnny
d318fffc8c Merge pull request #892 from wrongecho/mail-queue
Mail queue & tickets
2024-02-24 11:19:34 -05:00
Johnny
2016275db3 Merge pull request #890 from wrongecho/categories-shortcut-fix
Fix error 404 on categories.php as it is now admin_categories.php
2024-02-24 11:18:54 -05:00
Marcus Hill
54e015b5a5 Add locations read api endpoint 2024-02-24 11:56:18 +00:00
Marcus Hill
78db33c5d5 Hide billable tickets when accounting is disabled 2024-02-24 11:50:13 +00:00
Marcus Hill
1e8fbddcbd Mail queue & tickets
- Allow cancelling emails
- Adjust wording of ticket scheduling emails
2024-02-24 11:06:55 +00:00
johnnyq
da54b125c3 Merge branch 'master' of github.com:itflow-org/itflow 2024-02-23 23:45:06 -05:00
johnnyq
6019a4d1be DB Structure fix 2024-02-23 23:44:49 -05:00
wrongecho
c510eac613 Merge pull request #891 from wrongecho/login-encryption-fix
BUGFIX: Login with and actually decrypt the master encryption key
2024-02-23 21:29:07 +00:00
Marcus Hill
6432ee0486 BUGFIX: Login with and actually decrypt the master encryption key 2024-02-23 21:20:03 +00:00
Marcus Hill
4b730147c0 Fix error 404 on categories.php as it is now admin_categories.php 2024-02-23 20:52:34 +00:00
Johnny
603d677dfd Merge pull request #888 from wrongecho/dns-expiry-null-fix
Domain expiration dates
2024-02-23 12:23:20 -05:00
johnnyq
31184f0db1 Fix Broken DB Update was missing Primary Key declaration 2024-02-22 17:43:08 -05:00
Johnny
46344c962b Merge pull request #886 from twetech/0.1.8.4
Remember Me Tokens, and AI Enhancements
2024-02-22 17:34:10 -05:00
Johnny
f363e7e6fc Merge pull request #887 from Viborg-IT/vendor-link
Update client_vendors.php
2024-02-22 17:29:27 -05:00
Marcus Hill
dae51c9b8b Domain expiration dates - remove debug 2024-02-22 21:52:57 +00:00
Marcus Hill
66dc7e799b Domain expiration dates
- Update logic in post when adding/editing a domain to better account for null values
- Update logic in cron domain refresher to account for null values
- Prevent cron domain refresher getting stuck on a single domain
- Exclude domains with no expiration date from the cron nightly renewal alerts
2024-02-22 21:51:12 +00:00
Nicky Mogensen
30b6f9b6a7 Update client_vendors.php
Added column to quick access a vendors support url
2024-02-22 21:12:10 +01:00
o-psi
5d620d041a Fix user role and other definitions 2024-02-22 12:15:15 -06:00
o-psi
1d4271de36 Merge branch '0.1.8.4' of https://github.com/twetech/itflow into 0.1.8.4 2024-02-22 17:49:11 +00:00
o-psi
3947c3a329 Remove comment 2024-02-22 17:49:08 +00:00
o-psi
28ab569dfc Update Prompt 2024-02-22 17:48:53 +00:00
Andrew Malsbury
d2c33c28a0 Merge pull request #5 from twetech:remember-me-tokens-table
Change remember me tokens to many:many table
2024-02-22 11:46:42 -06:00
o-psi
c2cf0bb448 Change remember me tokens to a many:many table to allow for multiple devices to be remembered. 2024-02-22 17:45:09 +00:00
Andrew Malsbury
e656837d3c Merge branch 'itflow-org:master' into 0.1.8.4 2024-02-22 11:06:49 -06:00
o-psi
06ce12ba47 Update AI prompting 2024-02-21 18:13:10 +00:00
o-psi
b31f1b4c49 add ticket description to AI Query 2024-02-21 11:16:40 -06:00
johnnyq
4fddeb88b7 Fix issue with password managers asking for passwords when migrating away from the assets page 2024-02-20 14:53:32 -05:00
johnnyq
14cb4bb09a set the remember me token from 14 Days to 2 Days or 48 Hours 2024-02-19 15:00:32 -05:00
johnnyq
03bd7f837c Merge branch 'master' of github.com:itflow-org/itflow 2024-02-16 14:53:30 -05:00
johnnyq
703e0f6bb2 Remove Axios as we are not using it 2024-02-16 14:52:57 -05:00
wrongecho
ae80bba5ce Deleting recurring tickets - correctly pull subject/frequency 2024-02-16 12:20:49 +00:00
wrongecho
793a4f9c8e Recurring ticket deletion wording 2024-02-16 12:18:36 +00:00
wrongecho
e6418046aa Fix deleting recurring tickets 2024-02-16 12:15:55 +00:00
johnnyq
2a4efe629f Move Repky buttons and Control on one row removed the Timer Icon just use boxes for time as this is assumed 2024-02-15 18:24:07 -05:00
johnnyq
16a8e3d828 UI: Wrap tickert detail UI into 3 card sections for ease of seperation 2024-02-15 18:19:18 -05:00
johnnyq
66d118c1f2 UI: Wrap Dashboard and Top Controls in seperate cards 2024-02-15 18:05:37 -05:00
johnnyq
b4c50a9cd8 UI: Wrap the Calendar in a card similar to client calendar 2024-02-15 17:59:07 -05:00
Johnny
8e3c490092 Merge pull request #884 from twetech/0.1.8.4
0.1.8.4
2024-02-15 17:56:04 -05:00
o-psi
671cdd9832 Fix filtering to admin bulk mail 2024-02-15 22:16:01 +00:00
o-psi
466fbc03ca Merge branch '0.1.8.4' of https://github.com/twetech/itflow into 0.1.8.4 2024-02-15 22:12:43 +00:00
o-psi
958e808c88 fix links to contacts 2024-02-15 22:12:41 +00:00
o-psi
1ffa918d8e Merge branch '0.1.8.4' of https://github.com/twetech/itflow into 0.1.8.4 2024-02-15 16:09:25 -06:00
o-psi
79157c88ea Fix collections report 2024-02-15 16:09:10 -06:00
o-psi
570b3479a9 Only Special Contacts 2024-02-15 22:08:40 +00:00
o-psi
5d15a7ded9 Merge branch '0.1.8.4' of https://github.com/twetech/itflow into 0.1.8.4 2024-02-15 22:04:57 +00:00
o-psi
633c2f785c Add mass bulk mail 2024-02-15 22:04:54 +00:00
o-psi
9e2f92a92f Fix client statement payments 2024-02-15 15:41:34 -06:00
o-psi
277e91b07e Update Password Gen Function 2024-02-15 21:35:21 +00:00
Johnny
e358230a44 Merge pull request #883 from o-psi/patch-1
Add Zapcal to the readme
2024-02-15 12:19:47 -05:00
Johnny
b8f8cca54c Merge pull request #881 from twetech/0.1.8.3
0.1.8.3 (Calendar Update)
2024-02-15 12:16:51 -05:00
Andrew Malsbury
4db0a68488 Update README.md 2024-02-15 11:00:25 -06:00
Andrew Malsbury
00d4284e7c Merge pull request #4 from twetech/0.1.8.3
Allow canceling scheduled tickets
2024-02-15 10:36:25 -06:00
o-psi
cdf4118b09 Allow canceling scheduled tickets 2024-02-15 16:31:35 +00:00
Andrew Malsbury
f34818425b Merge pull request #3 from twetech/client-recurrings
Make same changes to client pages as main recuring invoices and tickets
2024-02-15 09:53:05 -06:00
o-psi
724540da33 Make same changes to client pages as main recuring invoices and tickets 2024-02-15 15:51:11 +00:00
o-psi
a2f8f8f731 Make script source local, and fix client_events.php 2024-02-15 15:07:12 +00:00
o-psi
767e0ecfd7 Remove old FullCalendar 2024-02-14 22:31:45 +00:00
o-psi
5a926ba205 Remove readme 2024-02-14 22:30:46 +00:00
o-psi
31171405ef Remove excess from FullCalendar 2024-02-14 22:27:25 +00:00
o-psi
09f7f8b1cd Adjust Calendar Spacing 2024-02-14 16:05:40 -06:00
o-psi
f573f0401b More calendar tweaks 2024-02-14 21:55:46 +00:00
o-psi
1f3799ebe3 Update Calendar to Full Calendar 6.1.10 2024-02-14 20:21:19 +00:00
Johnny
20845d72da Merge pull request #880 from wrongecho/logs
Update URL from logs.php to admin_logs.php
2024-02-12 17:55:31 -05:00
Johnny
e2acf07d6c Merge pull request #879 from wrongecho/recurring-tickets-wording
Recurring tickets
2024-02-12 17:55:08 -05:00
Marcus Hill
aee47adf12 Update URL from logs.php to admin_logs.php 2024-02-12 22:25:35 +00:00
Marcus Hill
2c7b65dad2 Recurring tickets
- Reword some areas to better separate recurring and scheduled tickets.
- Fix bulk actions not doing anything due to form name mismatch
2024-02-12 22:17:05 +00:00
Johnny
85f55a629b Merge pull request #878 from wrongecho/scheduling
Ticket scheduling enhancements
2024-02-12 15:00:30 -05:00
Marcus Hill
b64df190ed Ticket scheduling
- Prevent scheduling dates in the past (also for API keys expiry date)
- Correct the ticket URL in the agent email
- Update the onsite value in the database when scheduling a ticket
- Reword the internal note to include a user friendly time and whether the ticket is onsite/remote
2024-02-12 19:52:12 +00:00
Johnny
c207fdd1f5 Merge pull request #877 from wrongecho/ticket-respond-behaviour
Enhance ticket reply button
2024-02-12 13:43:35 -05:00
Marcus Hill
25d242dc86 Enhance ticket reply button
- Better logic on when the button should default to private/public
- Fix the new plane icon not showing when the button was checked/unchecked
2024-02-12 18:10:37 +00:00
johnnyq
ddb8061404 [FEATURE] Added AI Rewording Functionality to Create Ticket, Ticket Reply, Create Document and Edit Document, more to come 2024-02-11 00:13:10 -05:00
johnnyq
48ba4445bf Added LocalAI 2024-02-10 21:25:18 -05:00
johnnyq
a1d642c54b You can now Test AI Rewording Functionality right from the AI Settings Screen 2024-02-10 21:15:05 -05:00
johnnyq
726b023592 Renamed Scheduled Ticket Files to Recurring Ticket and made some more changes inside the files 2024-02-10 17:31:32 -05:00
johnnyq
310e3f0a42 Split Admin Menu and Settings Menu 2024-02-10 17:10:14 -05:00
johnnyq
30d41c523e Add Seperate Menu for Settings will be splitting Admin and Settings 2024-02-10 16:09:05 -05:00
johnnyq
e177fa193a Change more wording from the old scheduled tickets to recurring tickets 2024-02-10 15:48:00 -05:00
johnnyq
3b0b0c37e1 Do a DB Structure Dump 2024-02-10 15:26:40 -05:00
johnnyq
cb26d40090 Added AI Model to the AI settings 2024-02-10 15:24:25 -05:00
johnnyq
d9f7a2d128 Moved Recurring Invoices Inside Invoices and same with Recurring Expenses inside expense to reduce side nav menu bloat similar to recurring tickets 2024-02-10 15:13:52 -05:00
johnnyq
3374a7042a Revert Mail Queue Query Change, update the db structure to include new fields 2024-02-10 14:34:34 -05:00
Johnny
d78b667e0b Merge pull request #875 from twetech/0.1.8.2
0.1.8.2 (Scheduled tickets, and Email Improvements)
2024-02-10 14:30:30 -05:00
Johnny
4e2f107d4c Merge pull request #876 from wrongecho/cert-pull-details-fix
Bugfix: Unable to update certificate details
2024-02-10 13:57:29 -05:00
Marcus Hill
d09082bd18 Bugfix: Unable to update certificate details for existing certificate entries 2024-02-10 13:36:41 +00:00
o-psi
12f6f86581 Update for long tickets 2024-02-10 02:42:37 +00:00
o-psi
5ac03e7086 Merge branch '0.1.8.2' of https://github.com/twetech/itflow into 0.1.8.2 2024-02-09 22:49:52 +00:00
o-psi
2bf0a2aef8 cleanups 2024-02-09 22:49:12 +00:00
o-psi
f0d2f5b02a SonarCloud Cleanups 2024-02-09 16:40:51 -06:00
o-psi
971830ac21 Unassigned filter incorrect 2024-02-09 22:17:09 +00:00
o-psi
34b5e96e5a Update DB and fix Calendar 2024-02-09 22:15:31 +00:00
o-psi
6e14406364 Update Calendar to show past scheduled tickets as different colors based on status. 2024-02-09 22:06:34 +00:00
johnnyq
083d9eadc3 Added Pop Over title to Expense Date to show the TimeStamp that expense was actually created in The Database. Will implement more Title Popovers throughout ITFlow where additional info like that can be useful 2024-02-09 16:29:49 -05:00
o-psi
c72a4a2413 Update ticket scheduled post actions. 2024-02-09 17:10:59 +00:00
johnnyq
f2cba616a4 Added Axios js started testing AI Capabilities in blank.php 2024-02-08 18:47:17 -05:00
o-psi
672e51b21a Update DB to match 2024-02-08 21:41:31 +00:00
Andrew Malsbury
3d3587a525 Merge branch 'master' into 0.1.8.2 2024-02-08 14:34:39 -06:00
o-psi
b3df9fc9f6 Fix email for iCal 2024-02-08 14:16:27 -06:00
o-psi
e2392c3c6c Add iCal functionality 2024-02-08 12:59:36 -06:00
johnnyq
4dae89dabc The option to set the timezone in PHP was disabled to prevent inconsistencies with MariaDB/MySQL, which utilize the system's timezone, Although can still select timezone in the app the system time will overide it. So its best to set timezone on the system itself 2024-02-08 13:01:54 -05:00
johnnyq
919c46c03d Moved Tags on top 2024-02-05 21:55:55 -05:00
johnnyq
717f4d9e1a Fix DB Download to include ITFlow in filename 2024-02-05 21:28:53 -05:00
johnnyq
74fb7931f0 Fix DB Download to include company name and ITFlow 2024-02-05 21:26:23 -05:00
johnnyq
09838f10ed [UI] Setting Nav reorganization, eventually we will split Administration into two side naves one for Administration and one for settings 2024-02-05 21:19:12 -05:00
johnnyq
6f6b56dcfd Update Icon and wording 2024-02-05 21:12:32 -05:00
johnnyq
dc69101624 [Feature] The Start of AI Integration within ITFlow 2024-02-05 21:01:34 -05:00
johnnyq
e7586fcfb5 Update All the bulkSelect Lists to use the new format still need to fix the bulk delete submit button to allow for a confirm 2024-02-05 18:37:43 -05:00
Andrew Malsbury
50b2c3ad6c Merge branch 'itflow-org:master' into 0.1.8.2 2024-02-05 09:18:52 -06:00
Johnny
f8615bf51b Merge pull request #874 from wrongecho/api-clients-create
Api - clients create
2024-02-04 22:21:06 -05:00
Marcus Hill
102481d09f API - Add client create endpoint 2024-02-04 14:51:58 +00:00
Marcus Hill
8a9a4fd97e Bugfix: Prevent preg_replace passing null parameter error when no phone is present 2024-02-04 14:50:38 +00:00
johnnyq
8347edc04e added more days to invoice alert 2024-02-03 18:43:16 -05:00
johnnyq
f97f6ebdb6 Set Item Order to 998 for Late fee so they appear at the bottom of the invoice. Note: Item Order 999 is used for payment gateway fees 2024-02-03 18:31:26 -05:00
johnnyq
877ae71284 Additional wording 2024-02-03 18:13:56 -05:00
johnnyq
a3567af8a1 Added some legal terms to client pays fees and some links to stripe's current pricing 2024-02-03 18:11:48 -05:00
johnnyq
b386cbb170 Client Payment Gateway Fee is added as a line item if client pays fees is on and client chooses online pay this Fixes the negative invoice Balances when client pays fees is enabled 2024-02-03 17:44:48 -05:00
johnnyq
a6a93fd820 Fix client pays fees calculation. I didn't quite understand why the previous formula was used until i read this https://support.stripe.com/questions/passing-the-stripe-fee-on-to-customers 2024-02-03 17:14:48 -05:00
johnnyq
4f4bb56820 update .gitignore to include custom favicon 2024-02-03 14:33:48 -05:00
johnnyq
5d9ab76689 Remove Custom favicon 2024-02-03 14:32:08 -05:00
johnnyq
e9c85297eb Feature: Allow to upload custom fav icon under settings > Theme, icon is limited to .ico format only 2024-02-03 14:30:03 -05:00
johnnyq
01b717615e Added favicon condition everywhere 2024-02-03 13:18:20 -05:00
johnnyq
a5f08af78e Added condition to check if favicon.ico exists in /uploads else use the default 2024-02-03 13:11:04 -05:00
johnnyq
16420f417f Add Default Fav icon for now 2024-02-03 13:02:24 -05:00
johnnyq
505ecb2701 Fix Delete Confirmation for services, missing </div> Tag in add Service was causing it, also tidyed up service code 2024-02-03 12:25:38 -05:00
Andrew Malsbury
c26787b1d2 Merge pull request #2 from twetech/Unbilled-tickets-dashboard
Add unbilled tickets to dashboard if tickets and accounting is on
2024-02-02 13:28:27 -06:00
Andrew Malsbury
23770ac114 Merge pull request #1 from twetech/scheduled-tickets
Scheduled tickets
2024-02-02 12:38:33 -06:00
o-psi
3a74786cc4 Update side_nav.php to highlight "scheduled_tickets.php" as active 2024-02-02 17:42:24 +00:00
o-psi
f71d3d9b19 finish rename scheduled tickets to recurring tickets in UI 2024-02-02 15:08:44 +00:00
o-psi
0ac36f91eb Update recurring expenses icon 2024-02-02 14:40:35 +00:00
o-psi
a6f105e660 Update side_nav.php with recurring tickets link 2024-02-02 14:40:24 +00:00
o-psi
03d3b04bdb Update side_nav.php: Changed label from "Scheduled Tickets" to "Recurring Tickets" 2024-02-02 14:38:25 +00:00
Andrew Malsbury
6c247e0f58 Merge branch '0.1.7' into scheduled-tickets 2024-02-01 21:42:24 -06:00
johnnyq
1303f18218 Tidy 2024-01-31 22:16:21 -05:00
johnnyq
28e7a6b195 Removed Gateway Fee from the baance of Guest View Invoice and displayed it on the Pay Online button, as the client can pay other ways if they decide to not pay online if Client Pays Fees is enabled 2024-01-31 22:11:27 -05:00
johnnyq
1bbb4426f6 Fix Expense being off for Payment Gateway Fee 2024-01-31 21:33:37 -05:00
johnnyq
96ff92d070 Feature: Bulk Edit Category, Client and Account for expenses 2024-01-31 17:09:35 -05:00
johnnyq
19f4e215de feat. Bulk Reply To Tickets including create a private note 2024-01-31 15:24:54 -05:00
johnnyq
7975505823 feat. Updated Bulk Close Ticket to allow for a Private Note instead of public 2024-01-31 14:49:25 -05:00
johnnyq
5818c7fe18 feat. Added Contact Roles to Bulk Actions 2024-01-31 14:23:47 -05:00
johnnyq
dad2a7d376 Update Contact Department wording to also include group changed icon from building to users which is more suitable 2024-01-31 13:56:00 -05:00
johnnyq
00197cef96 feat: Bulk Set Contact Department / Group 2024-01-31 13:53:25 -05:00
johnnyq
da98f84774 Move the MailQueue Action out of the get email loop on close Bulk Tickets this prevent unessessary mysql connections 2024-01-30 16:55:04 -05:00
johnnyq
e524f1ce7c Fix issue with adding slashes to close email config_from_name vars 2024-01-30 16:40:19 -05:00
johnnyq
80fdad81e9 Fix Not being able to Enable Stripe Pay on Updated or new Installs 2024-01-30 16:25:27 -05:00
johnnyq
731b60b07a Feature: Added Bulk Ticket Closure 2024-01-30 16:04:29 -05:00
johnnyq
c6f1a25692 Feature: Added Bulk Set Priority on Tickets 2024-01-30 14:54:00 -05:00
johnnyq
db8ae13135 Feature: Add Bulk Move Folder Action to Client Documents and Files 2024-01-30 14:11:29 -05:00
johnnyq
ff1616de94 Updated Guest Invoice logic so if they payed gateway fee is not shown 2024-01-29 21:56:13 -05:00
johnnyq
e82ba786a5 Added One more code piece from Pull #866 to fix Gateway Fees shown and to fix balance on guest view invoice 2024-01-29 21:17:12 -05:00
johnnyq
007d07d417 Added unbilled ticket wording per Pull Req #866 2024-01-28 15:57:27 -05:00
johnnyq
f8dc67fbf9 Added Gateway Fee to the Guest View Invoice and minor fix for ticket counter per Pull Request #866 also added stripe flat and percent config vars to guest view invoice. Note We do not need to merge Pull #866 as all changes nessessary have been implented manually 2024-01-28 15:55:05 -05:00
johnnyq
5afacf78cf Convert strip Percentage Decimal from decimal vlaue to percentage value on view form and then reconvert from Percent back to Decimal value on POST 2024-01-28 15:23:58 -05:00
johnnyq
9bd924dc67 Only create a Stripe Expense if client pays fee is off, a stripe expense vendor and expense category is selected in settings 2024-01-28 14:54:28 -05:00
johnnyq
063d042378 Update guest_ajax.php with the new stripe vars 2024-01-28 14:45:43 -05:00
johnnyq
56c138fb12 cleanup 2024-01-28 02:08:11 -05:00
johnnyq
3d3bb6a436 Feature: Stripe Payment now logs an expense to the selected account 2024-01-28 01:49:49 -05:00
johnnyq
b986f04a0c Add More Configurable variabled for Stripe including such as Flat Rate and Percent Fees, expense vendor and expense category update guest stripe pay to take advantage of these vars and updated settings 2024-01-28 00:00:28 -05:00
johnnyq
777637277b Fix Issue where if you edited first record that shared the same form input name like location then it would blank out the first record if edited this is fixed by adding bulk_ in front of the form Input names under the bulk modals not sure why this happens but this is the fix 2024-01-27 14:15:18 -05:00
johnnyq
c711db937d Updated Edit Location logic in contacts added Pop Over Title for archived Items in assets and contacts 2024-01-27 14:01:10 -05:00
johnnyq
50b00c5712 Feature: Bulk Edit Contact Phone Number useful where the share an Office Number but have seperate extensions 2024-01-27 13:45:11 -05:00
johnnyq
8b85ae377a Updated the way Archived Items are displayed in asset list view and when editing, this will be standard going forward, added Bulk Set Asset Status, further work on improving the archived logic, assets is pretty much gold standard here now 2024-01-27 13:23:44 -05:00
johnnyq
d8de41d937 Do Not show archived items when copying asset 2024-01-27 11:59:05 -05:00
johnnyq
36e9f8cd3d Add Red X next to Assigned to for Archived Users still palying with this design maybe just make the user text red with a pop over that says archived when hovered 2024-01-27 03:44:32 -05:00
johnnyq
0b7b7e298a Remove unessesary () 2024-01-27 03:35:22 -05:00
johnnyq
d3153a29cb Asset Assignment Do not show all archived users from the date the asset is created instead if an asset has an archive user show that user and all new users 2024-01-27 03:32:30 -05:00
johnnyq
9184fa3ab3 Fix Copy IP to clipboard in Assets missing clipboardjs class 2024-01-27 03:10:54 -05:00
johnnyq
8562906fa6 Prevent Copy to Clipboard button from submitting in assets since we wrapped listings in a form to allow for bulk actions this caused buttons like this to act as submits unless we add type='button' 2024-01-27 03:04:43 -05:00
johnnyq
e139190377 UI: Set IP Column to Text no wrap to prevent the Copy IP Button from wrapping 2024-01-27 02:55:06 -05:00
johnnyq
fe33cfa4e9 UI: Fix the client top head city state postal below the address from being offset by using a font awesome dummy icon 2024-01-27 02:48:31 -05:00
johnnyq
3c28c2b89b Prevent Password Manager from asking to save password for every asset edit / add / bulk submit 2024-01-27 02:16:41 -05:00
johnnyq
7e50634c07 Added Bulk Assign contacts to Assets 2024-01-27 01:56:10 -05:00
johnnyq
1deba6eac5 Added Bulk Assign Location to Assets 2024-01-27 01:41:25 -05:00
johnnyq
ee3087725d Rename inconsistent multi Actions to Bulk Actions 2024-01-27 01:03:18 -05:00
johnnyq
f2719a612e Feature: Bulk Action - Assign Location for contacts 2024-01-26 23:59:24 -05:00
johnnyq
dec2f484ab added - between App Name and Task for ticket assignment email 2024-01-26 22:57:41 -05:00
johnnyq
a197151286 Update email wording on tech notify of assigned tickets 2024-01-26 22:35:40 -05:00
johnnyq
d7a58c01f9 Update bulk assign tech to only notify by one email with all tickets assigned instead of multiple same with notification, updated some wording as well and include a ticket count in the logging email and notification 2024-01-26 22:30:55 -05:00
johnnyq
47d2ad993e Don't show checkboxes next to closed tickets 2024-01-26 21:44:03 -05:00
johnnyq
6dbbb232ed Update Bulk Ticket assign action: Updated button, not notifies newly assigned tech via email and in app notification and now logs properly 2024-01-26 20:21:55 -05:00
johnnyq
fd48d991d9 Feature: Ticket Bulk Actions Assign Tech has been added, still work in progress, update ticket reply added tech notification add logging, do not allow to assign ticket on closed ticket and more refinements 2024-01-26 17:12:57 -05:00
johnnyq
937397e9c0 Allow .vsdx and .drawio diagram files to be uploaded via client files 2024-01-25 12:01:09 -05:00
johnnyq
9ce280d80d Fix Redirect to non-existent page after login when force MFA is enabled 2024-01-24 15:46:30 -05:00
wrongecho
861c8e4252 Merge pull request #873 from braadaaay/master
Spelling corrections in Web UI
2024-01-24 06:23:47 +00:00
Brady Williams
b854e9569b Remove extra "you" in dialog 2024-01-24 17:58:54 +13:00
Brady Williams
07c126db2b Fix Spelling from "wather" to "watcher" 2024-01-24 17:57:05 +13:00
johnnyq
4b6495b01a UI Update for Asset Listing, combined columns to allow for a better display 2024-01-23 16:44:30 -05:00
Johnny
981010b2f7 Merge pull request #871 from wrongecho/logins_js_cleanup
Logins JS Cleanup
2024-01-22 16:37:20 -05:00
Marcus Hill
ba0917e142 Logins JS Cleanup
- Remove old JS
- Standardize generate password JS style to match existing
- Move JS functions to own files
2024-01-22 21:25:21 +00:00
wrongecho
4e0c7230f3 Update README.md
Reword read me contribution section to emphasize proposing features on forum first
2024-01-22 20:47:21 +00:00
johnnyq
9e8c3ed2fd Fix Redirect Link in Stripe Pay 2024-01-22 12:27:47 -05:00
johnnyq
8d2a9bbf60 Fix Broke Guest Pay Invoice via Stripe removed additional ) 2024-01-22 12:17:06 -05:00
johnnyq
ad1ec7d338 Allow to set an optional queue time in bulk mail, update cron_mail_queue.php to only send mail after its queued_at date and time 2024-01-21 15:52:15 -05:00
johnnyq
62fb73875b Updated addToMailQueue Function to allow specifing an optional queue time to schedule outbound mail 2024-01-21 15:27:15 -05:00
johnnyq
9db7947004 Bulk Mail: Make contacts select table responsive 2024-01-21 14:34:45 -05:00
johnnyq
2ee21c3f9a Bulkmail: Use default mail from email and mail from name but still can be changed 2024-01-21 14:25:56 -05:00
johnnyq
782b0cfd96 Bulk Mail: Show dash if title is blank 2024-01-21 14:22:18 -05:00
johnnyq
a8872ae804 Bulk Mail: Don't show contacts that have no email address 2024-01-21 14:18:55 -05:00
johnnyq
413645154d Feature: Add initial basic Bulk Mail Sending capabilities via client section 2024-01-21 14:15:10 -05:00
johnnyq
0ca50bf6de Switch from ~ to -- in signature footer 2024-01-21 00:27:01 -05:00
johnnyq
cb1b6e4231 Fix client portal reset password 2024-01-20 23:37:12 -05:00
johnnyq
bd8c93cb71 Update client portal login reset for the new mail function and made some minor UI / Code changes 2024-01-20 23:28:00 -05:00
johnnyq
623ed33a27 Update Portal UI elements and Mail Functions 2024-01-20 23:11:35 -05:00
johnnyq
3b71e6132e Change Respond icon from check mark to a paper plane in ticket view 2024-01-20 22:08:41 -05:00
johnnyq
493c83e3f1 Added Days over due by to invoice reminders 2024-01-20 21:44:58 -05:00
johnnyq
d390bee0bc Update/Fix Mail Functions in cron.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars 2024-01-20 21:16:28 -05:00
johnnyq
c801e58cc9 Removed redundent get stripe client pays fee as the var is already aquired in beginning 2024-01-20 20:58:53 -05:00
johnnyq
b1fd0fb4aa fixed 2024-01-20 20:56:00 -05:00
johnnyq
00d4f7d66f moved config_stripe_client_pays_fees out of an unnessesary function and moved it to the setup stripe section 2024-01-20 20:54:56 -05:00
johnnyq
3c3e0f5f80 Cleaned up guest_pay_invoice_stripe.php incorrect DB Handling for vars was HTML encoding instead of proper SQL escaping 2024-01-20 20:49:37 -05:00
johnnyq
0cdf49f69a Update/Fix Mail Functions in POST/user.php and ajax.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars 2024-01-20 20:31:46 -05:00
johnnyq
63d4419ff5 Update/Fix Mail Functions in POST/quote.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars also 2024-01-20 20:10:33 -05:00
johnnyq
1479caa8e8 Set Textarea rows from 4 to 5 2024-01-20 19:26:00 -05:00
johnnyq
9d60ccdf3e Updated UI on add/Edit Calendar events 2024-01-20 19:25:15 -05:00
johnnyq
92ccd7de14 Update/Fix Mail Functions in POST/contact.php and event.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars also fixed scheduling calendar events was not working to send an email out 2024-01-20 19:08:51 -05:00
johnnyq
91eff8f9b6 no need to SQL escape , in the emails, so removed the \, escaping in post invoice, ticket and ticket_email_parser 2024-01-20 18:13:47 -05:00
johnnyq
a46e41ce9c Update/Fix Mail Functions in POST/invoice.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars 2024-01-20 17:58:54 -05:00
johnnyq
d3aa2e7239 Only allow A-Za-z- for Ticket Prefix 2024-01-20 16:45:39 -05:00
johnnyq
31d6605647 Updated Closed Ticket Email as well 2024-01-20 15:15:49 -05:00
johnnyq
0a32415b38 Updated ticket mail parser to not escape the entire subject and body of sending emails as this is all done by vars instead 2024-01-20 15:11:07 -05:00
johnnyq
669d2f74ed Update Ticket POST Email body to Use -- instead of ~ for closing signature 2024-01-20 13:49:27 -05:00
johnnyq
5f3b08a543 Fix Mail Array causing duplicate sending 2024-01-20 13:33:54 -05:00
johnnyq
b942bf0e18 Update/Fix Mail Functions in POST/ticket.php - sanitize POST vars instead the whole mail subject and body which prevents having a mixed of confusing redundant escaped and unescaped vars, also fixed watchers where if a watcher was added it would just emai the last watcher selected and skip the main contact and any other watchers selected 2024-01-20 13:18:17 -05:00
johnnyq
a656340c8b Fix mis-spelling sanitize not santize 2024-01-19 19:37:34 -05:00
johnnyq
79175b9e70 Sanitize Ticket Prefix and From Name in Cron Ticket Email Parser 2024-01-19 19:18:26 -05:00
Johnny
d282083f0a Merge pull request #868 from wrongecho/user_profile_fixes
User profile fixes
2024-01-19 19:08:18 -05:00
johnnyq
2f3e26b285 Fix Ticket Settings 2024-01-19 19:01:26 -05:00
Marcus Hill
1fcf559e13 Prevent users setting/hashing an empty password 2024-01-19 23:45:02 +00:00
Marcus Hill
ee68bf10b8 Don't require admin role to edit user profiles (otherwise techs/accountants can't edit their page) 2024-01-19 23:39:15 +00:00
johnnyq
56d0188ccb Fix Oppps 2024-01-19 17:56:04 -05:00
johnnyq
289031b691 Updated Cron Mail Queuer - Removed HTMLPurify and HTML Encoding using HTMLEntities as these are unnessaery and were cuasing extra cpu load and possible data corruption and are passed off to PHPMailer which handles this by default plus recipient email clients should handle XSS as well 2024-01-19 17:39:28 -05:00
johnnyq
9559c11c25 Cleaned up the initial create ticket email, removed customization for now, added some better comments to cron mailer etc 2024-01-19 17:28:17 -05:00
johnnyq
6af48594f6 Added Scheduled Ticket Count 2024-01-19 13:14:57 -05:00
johnnyq
d0dd43bef9 Fixed issue with email failing to send on password updates and email name changes was using the old formatting for the legacy way of sending emails out 2024-01-19 10:31:09 -05:00
o-psi
1ffdce6bbc Add unbilled tickets to dashboard if tickets and accounting is on
otherwise, show recurring invoices.
2024-01-18 22:49:18 +00:00
o-psi
53ad94cc06 Update Database to match 2024-01-18 22:48:20 +00:00
o-psi
13cf4df473 Scheduled Tickets 2024-01-18 19:50:01 +00:00
johnnyq
9bd28b1c56 Update Mail Send Test to use the proper from name when sending a test also show the from name from the select 2024-01-16 22:56:35 -05:00
johnnyq
e07fb9ce50 Expanded timeAgo function to incoude time ahead, added this functionality to client overview 2024-01-15 22:59:39 -05:00
johnnyq
b5e67eb3f6 Add Contact Types to Contact Details Cleanup code in asset details and contact details 2024-01-15 22:18:55 -05:00
johnnyq
cd732b4dd6 Do not allow the deletion of Parent document under revisions, create new function to delete document version and redirect back to the parent document, also delete all versions of the document if deleted from the document list 2024-01-15 21:44:13 -05:00
johnnyq
483bf4bcfd Added more informative notes placeholder for contact as well 2024-01-15 20:06:25 -05:00
johnnyq
73ebfcc233 Made Location notes placeholder offer some better examples like parking and building access then just enter some notes 2024-01-15 19:58:02 -05:00
johnnyq
a113b1390c Allow more space for quick notes 2024-01-15 15:13:03 -05:00
johnnyq
9f1f88b64e Updated breadcrumbs in Asset Details to include clients 2024-01-15 15:10:20 -05:00
johnnyq
717b63855e Updated some icons fr asset details 2024-01-15 15:06:44 -05:00
johnnyq
a11de364c8 Show correct Contact Details when on Asset Details 2024-01-15 14:56:59 -05:00
johnnyq
b1d1e39ab1 Forgot to add contact name under assigned in asset details 2024-01-15 14:44:35 -05:00
johnnyq
53b9d0a5ad Asset Details UI Use card Header for Asset name and description and use just icon for edit 2024-01-15 14:41:35 -05:00
johnnyq
9cd570b603 Updated Asset Details Page to include all the asset values 2024-01-15 14:34:41 -05:00
johnnyq
50002b0783 Added login uri 2, NAT IP and asset URI 2 to the UI, also created new tab in asset network and split form items between assignment and network 2024-01-15 13:50:46 -05:00
johnnyq
d35f1ff7fd Increased the character limit for login uris, added login uri 2 and asset nat ip currently not exposed on the ui 2024-01-15 13:08:46 -05:00
johnnyq
365c790600 Set column width of stales tickets to 4 2024-01-14 22:24:30 -05:00
johnnyq
b7fa80503f Moved Recent Client Activities to the bottom of client overview 2024-01-14 22:22:11 -05:00
johnnyq
62d5adfa9d Added asset location to the client PDF Export 2024-01-14 21:42:39 -05:00
johnnyq
d9a99b8d93 Increase the Asset URI limit from 250 to 500 and added asset URI 2 field for additional Asset URIs 2024-01-14 14:09:15 -05:00
johnnyq
9c5c501f04 Moved Browser Extension specific setting to user prefs 2024-01-13 17:16:21 -05:00
johnnyq
813e8c7e59 Renamed Profile to Account, Added a user Side nav to seperate various user preference entities 2024-01-13 17:15:20 -05:00
johnnyq
b2ad67e26d readed back ticket timer at the top as it broke the counter 2024-01-12 18:41:32 -05:00
johnnyq
625a6cac6c Included WebKlex PHP-IMAP Library in plugins folder to allow for future use when we convert IMAP to allow OAUTH2 2024-01-11 12:51:11 -05:00
johnnyq
9520148d4d Set batch payment button to color default 2024-01-11 12:10:25 -05:00
johnnyq
d25396f19a Rename rec back to recurring on the client side nav 2024-01-11 11:44:00 -05:00
johnnyq
3bb2986c4c Rename rec back to recurring on the side nav 2024-01-11 11:43:05 -05:00
johnnyq
65b73f4120 Fix Force Recurring Invoice updated more delete alerts to be red instead of green 2024-01-11 11:30:23 -05:00
johnnyq
d33d11acd2 Set lock file cront ticket email parser once again from 300 sec aka 5 mins to 180 secs aka 3 mins 2024-01-11 00:34:36 -05:00
johnnyq
a38e62c412 Set lock file cront ticket email parser from 600 sec aka 10 mins to 300 secs aa 5 mins, update telemetry to include website 2024-01-11 00:32:31 -05:00
Johnny
e69317e376 Merge pull request #865 from twetech/v0.1.5
Update to V0.1.5
2024-01-10 21:22:42 -05:00
Andrew Malsbury
b499b52f49 Merge pull request #14 from twetech:unbilled-tickets-report
Adjust filter to only show unbilled
2024-01-10 17:06:52 -06:00
o-psi
3ea326b0ac Adjust filter to only show unbilled 2024-01-10 23:05:42 +00:00
Andrew Malsbury
e30c0a14e5 Merge pull request #13 from twetech:unbilled-tickets-report
Fix increment bug in ticket_unbilled_count
2024-01-10 17:02:20 -06:00
o-psi
691a1bc019 Old Python Habits Die Hard (i++) 2024-01-10 23:01:34 +00:00
Andrew Malsbury
1afc9751e7 Merge branch 'itflow-org:master' into v0.1.5 2024-01-10 16:57:03 -06:00
Andrew Malsbury
aa2b471e0f Merge pull request #12 from twetech:unbilled-tickets-report
Add Unbilled Tickets Report
2024-01-10 16:42:41 -06:00
o-psi
234d5dde09 Remove Creepy smiley 2024-01-10 22:41:48 +00:00
johnnyq
f8757fc2e0 Added back Yearly option under edit Recurring Invoice 2024-01-10 17:41:38 -05:00
o-psi
d7e8e60693 Update message for no tickets. 2024-01-10 22:40:51 +00:00
o-psi
9a649529d2 Refactoring for better readability 2024-01-10 22:33:24 +00:00
o-psi
e1cb9655d7 Add notice if there are no unbilled tickets. 2024-01-10 22:32:21 +00:00
o-psi
d6454427bb Validate Access to unbilled report. 2024-01-10 22:26:56 +00:00
o-psi
59cf07bf49 Update filter to allow for closed and open when looking for unbilled. 2024-01-10 22:23:29 +00:00
o-psi
87f1b9c0be Add filter to Client Tickets 2024-01-10 22:16:40 +00:00
o-psi
b764506f28 Fix bug in client_tickets.php 2024-01-10 22:15:00 +00:00
o-psi
a7ee5737af Add link to tickets screen on unbilled report 2024-01-10 22:12:46 +00:00
o-psi
77d115d1f2 Update report to not have modal. Too many steps for UI. 2024-01-10 22:06:19 +00:00
o-psi
c7c6b08a11 Add Basic Unbilled tickets report 2024-01-10 21:54:43 +00:00
Andrew Malsbury
6bde67f9ad Merge branch 'itflow-org:master' into v0.1.5 2024-01-10 15:38:24 -06:00
Andrew Malsbury
ac405e1eec Merge pull request #11 from twetech:Invoice-add-ticket-modal-update
Improve invoice add ticket modal UI
2024-01-10 15:31:48 -06:00
o-psi
8dad54e450 Update badge color based on status. 2024-01-10 21:25:22 +00:00
o-psi
25c26cc2a6 Fix striped Table 2024-01-10 21:15:25 +00:00
o-psi
6ca277a636 Make table striped 2024-01-10 21:15:12 +00:00
o-psi
cf87a232c4 Invoice add ticket modal UI improvements. 2024-01-10 21:12:23 +00:00
o-psi
945eb7c87a Add Label to add column on invoice add ticket modal 2024-01-10 21:09:07 +00:00
o-psi
4ed2c7923c Change add button to a plus icon 2024-01-10 21:01:56 +00:00
o-psi
e5f8921322 Invoice add ticket modal UI Fix 2024-01-10 20:59:52 +00:00
o-psi
c24aece046 Fix Parenthesis 2024-01-10 20:56:31 +00:00
o-psi
39ba7d83fd Add ticket status to invoice filter. 2024-01-10 20:45:18 +00:00
johnnyq
29be864675 Removed Re: from ticket replies as this is reserved if following an email thread changed back to Ticket update instead 2024-01-10 13:31:56 -05:00
johnnyq
b7894ffd58 Add Missing Send Recurring Invoice Notification Email 2024-01-09 11:58:22 -05:00
johnnyq
02ed6986ec Fix Assets page not loading missing closer } 2024-01-07 12:43:28 -05:00
johnnyq
efdffa1a74 Forgot to do a DB Dump after DB Update well here it is 2024-01-06 16:07:37 -05:00
johnnyq
0948fd4dc6 Added a setting to enable destructive delete, disabled by default must enable it in the DB for now not in the settings DB 1.0.0 has been reached 2024-01-06 16:05:28 -05:00
johnnyq
e260cbf626 Scaled down the action menu under assets to fit the actions for 1 row displays 2024-01-06 15:34:59 -05:00
johnnyq
56d7772e26 Remove Delete option from asset action menu as delete is too destructive, functionality is still there in POST and Allow Tech to Archive Assets as well 2024-01-06 14:31:24 -05:00
johnnyq
6d4584be90 Remove Asset Tickets Modal, Related Documents and Files as this can be viewed in Asset Details Page 2024-01-06 14:27:21 -05:00
johnnyq
1ae6a8d757 Update Collections Report for Round Down to the nearest for Monthes behind and other formatting fixes) 2024-01-06 13:57:55 -05:00
johnnyq
5914996c41 Add Company Website to Guest Sharing footer 2024-01-04 18:39:19 -05:00
johnnyq
74abe28c33 Fix Archiving Ticket Replies 2024-01-03 18:33:09 -05:00
johnnyq
6c9fa7a607 Fix the ticket reponse count to not count archived replies 2024-01-03 18:29:32 -05:00
johnnyq
5c5871ba0d Merge branch 'master' of github.com:itflow-org/itflow 2024-01-03 18:25:42 -05:00
johnnyq
d8edf339c4 Clean up Ticket Printing: When printing a ticket do not show interactive elements 2024-01-03 18:23:39 -05:00
wrongecho
051ce46d37 Update README.md - clarify install and release date 2023-12-31 20:28:48 +00:00
wrongecho
48f0531643 Merge pull request #851 from wrongecho/bugfix-inv-quo-quantity-math
Bugfix: Quote/Invoice quantity 4 digits
2023-12-31 20:09:13 +00:00
Marcus Hill
ef2a33403b Bugfix: Quote/Invoice quantity 4 digits
Perform quote/invoice quantity number formatting after invoice sub-total is calculated to prevent math issues due to comma added for thousands
2023-12-31 20:00:01 +00:00
Johnny
622811302f Merge pull request #850 from wrongecho/notes
Add notes field & multi-select to networks/certs/domains
2023-12-31 12:43:40 -05:00
Marcus Hill
55d716642a Bugfix 2023-12-31 13:02:37 +00:00
Marcus Hill
1b567ee253 Add multi-select to networks, certificates and domains.
Fix multi-select count bug
2023-12-31 12:49:58 +00:00
Marcus Hill
9076012d2a Bugfix Undefined variable: service_created_at 2023-12-31 12:25:12 +00:00
Marcus Hill
224aa00694 Correct comments 2023-12-31 12:05:25 +00:00
Marcus Hill
78f79759dc Correct comments 2023-12-31 12:05:11 +00:00
Marcus Hill
756c3aa7ca Tidy for consistency 2023-12-31 11:20:43 +00:00
Marcus Hill
86b31ada1f Add notes to certs 2023-12-31 11:13:57 +00:00
Marcus Hill
d3b59edfe4 Add notes to domains 2023-12-31 11:13:48 +00:00
Marcus Hill
1a1b4ee810 Add notes to networks; move networks js to its own file 2023-12-31 11:13:24 +00:00
Marcus Hill
114a72424c Add domain_notes database field 2023-12-31 10:34:01 +00:00
johnnyq
938f8bb4ae Wording change on Client Address to Location 2023-12-29 17:27:29 -05:00
johnnyq
3c53caf964 UI: Fix Padding and margin Account Types Header, also send telemetry if config_telemetry detailed in selected 2023-12-29 17:21:03 -05:00
johnnyq
ed42ec9707 By default Collapse Client Top Header unless in Client Overview while in the Client section 2023-12-29 15:14:48 -05:00
Johnny
1a130ac2ab Merge pull request #849 from twetech/v0.1.4
V0.1.4
2023-12-29 14:19:13 -05:00
Johnny
815ef3da6e Merge pull request #848 from twetech/v0.1.3
v0.1.3 (no edits compared to main)
2023-12-29 14:17:19 -05:00
Andrew Malsbury
31dc8965df Merge pull request #10 from twetech:Fix-Guest-View-Partial-Invoices
Fix SQL query in invoices.php
2023-12-29 13:12:15 -06:00
o-psi
35394f3e6f Fix SQL query in invoices.php 2023-12-29 19:11:51 +00:00
o-psi
e7628ad5a6 Fix SQL query in invoices.php 2023-12-29 19:07:22 +00:00
Andrew Malsbury
ae3c52074f Merge branch 'itflow-org:master' into v0.1.4 2023-12-29 13:06:49 -06:00
johnnyq
b2dc9a123c Do not allow archived client contacts to reset their passwords 2023-12-28 22:25:57 -05:00
johnnyq
c4e4dc3a44 Do not allow archived client contacts client portal login access 2023-12-28 22:18:39 -05:00
johnnyq
7c12a716a4 When Archiving a contact remove Important, Billing and Technical Roles along with Blanking out Auth and Hashed Password 2023-12-28 22:14:45 -05:00
johnnyq
e38aad1e61 User Profile UI Spruce up / Cleanup 2023-12-28 20:45:28 -05:00
johnnyq
456545fb62 Settings Formating 2023-12-28 20:23:28 -05:00
johnnyq
bcd0eb69a1 Send Telemetry if is greater than 0 2023-12-28 20:03:08 -05:00
johnnyq
7759f54260 renamed settings alerts to notifications and reworked the notification UI to allow for future growth 2023-12-28 19:52:24 -05:00
Andrew Malsbury
d953540440 Merge pull request #9 from twetech:fix-drafts-on-ticket-invoice
adjust visuals when invoicing tickets.
2023-12-28 16:56:20 -06:00
o-psi
da42f35ff9 adjust visuals when invoicing tickets. 2023-12-28 22:55:43 +00:00
Andrew Malsbury
ae444142c6 Merge pull request #8 from twetech/ticket-add-to-invoice-drafts
Ticket add to invoice drafts
2023-12-28 16:32:28 -06:00
johnnyq
db4fd095d6 Fix Undefined Checkbox POST vars in settings ticket 2023-12-28 14:42:11 -05:00
johnnyq
6d769a5e05 When choosing to share Data via Setup make sure telemetry gets enabled after setup 2023-12-28 14:13:26 -05:00
johnnyq
deb84cc2a8 set Placeholder for Global search from just search to search everywhere 2023-12-28 13:43:24 -05:00
johnnyq
bc9ad24c76 Added badge color light blue 2023-12-27 22:44:24 -05:00
johnnyq
c30d9b4bdf Added theme light blue 2023-12-27 22:43:51 -05:00
johnnyq
4a5b0b9202 Remove Themes, lime dark-gray and light as their text was not very readable 2023-12-27 22:37:47 -05:00
johnnyq
58c7dfe2c8 Fix Client Self Service Password Reset due to new mail queue system change 2023-12-27 22:06:19 -05:00
johnnyq
a966fc9395 Fix Add and Editing Contact passwords because of a commit that change the post name from contact_password to password 2023-12-27 21:51:12 -05:00
johnnyq
c9e92cb3bb Cleaned up cron ticket parser to work better with the new mail queuer 2023-12-27 20:35:23 -05:00
johnnyq
ff5e5f950b Removed unused edit ticket watcher, we handle this differently 2023-12-27 17:47:05 -05:00
johnnyq
d6a7747935 Add Watcher via select of client contacts and can enter manual emails as well 2023-12-27 17:44:17 -05:00
johnnyq
a9dfc0d5fe Add the ability to delete a ticket watcher 2023-12-27 17:21:17 -05:00
johnnyq
a9d49c9785 Spurced up ticket Attachments view in ticket details 2023-12-27 17:02:04 -05:00
johnnyq
51a5b7d79a Moved notification badge number over 3 to allow for 3 numbers without overlapping the bell 2023-12-27 16:36:41 -05:00
johnnyq
220d565544 Commented out open ticket as its still Work IN Progress and not ready for stable 2023-12-27 16:27:42 -05:00
johnnyq
c8b51b01d3 Fix for Scheduled Ticket Umlauts 2023-12-27 16:16:52 -05:00
johnnyq
0fad6727dc Fix missing ; 2023-12-27 15:35:11 -05:00
johnnyq
51754be319 Santized Pre Vars in Cron and remove dup santized code as the new mail queue system now requires input sanitzation 2023-12-27 15:24:38 -05:00
Andrew Malsbury
8a4075a4cd Merge branch 'itflow-org:master' into v0.1.3 2023-12-27 13:27:39 -06:00
Andrew Malsbury
c4bfb314a2 Merge branch 'master' into ticket-add-to-invoice-drafts 2023-12-27 11:29:42 -06:00
Johnny
4e5bc814d5 Merge pull request #846 from wrongecho/contact-api-via-num
Contacts API
2023-12-26 17:46:48 -05:00
johnnyq
52a4963b83 Fix Edit Contact Do not make the contact Password field required as it will not allow to submit form, instead this is handled in POST if the password field is blank then dont create a password 2023-12-26 17:36:54 -05:00
Andrew Malsbury
4689faf518 Merge branch 'itflow-org:master' into v0.1.3 2023-12-26 09:17:05 -06:00
Marcus Hill
f45a5e0b51 Contacts API
Allow looking up contacts via mobile / phone number
2023-12-24 20:05:04 +00:00
Johnny
fa452dbf02 Merge pull request #845 from wrongecho/ticket-tt-gui
Time tracking input field spacing
2023-12-24 00:42:08 -05:00
Marcus Hill
bdb0cc1e38 Time tracking input field spacing
Reduce size of hrs, min, sec input fields
2023-12-23 23:41:51 +00:00
Marcus Hill
e04c681ca5 Time tracking input field spacing
Reduce size of hrs, min, sec input fields
2023-12-23 23:15:20 +00:00
Johnny
29867d6d11 Merge pull request #844 from twetech/delete-tickets-go-to-tickets.php
Redirect to tickets.php after deleting a ticket
2023-12-23 16:07:46 -05:00
Johnny
25087dd85f Merge pull request #843 from twetech/v0.1.2
Update to v0.1.2 of TWETech/ITflow
2023-12-23 16:06:29 -05:00
Andrew Malsbury
16f3cef0f4 Merge pull request #7 from twetech/delete-tickets-go-to-tickets.php
Redirect to tickets.php after deleting a ticket instead of the delete…
2023-12-22 17:22:46 -06:00
o-psi
5ef96f7860 Redirect to tickets.php after deleting a ticket instead of the deleted tickets' page. 2023-12-22 23:20:21 +00:00
Andrew Malsbury
7ecabbaf0d Merge pull request #6 from twetech/ticket-billable-module
Fix typo in accounting module condition
2023-12-22 11:57:43 -06:00
o-psi
5dda94a1ec Fix typo in accounting module condition 2023-12-22 17:45:39 +00:00
Andrew Malsbury
d448562a24 Merge branch 'itflow-org:master' into v0.1.2 2023-12-22 11:34:05 -06:00
Johnny
471e6a9f8f Merge pull request #842 from twetech/ticket-billable-module
Disable ticket billable options in accounting module
2023-12-22 12:33:18 -05:00
Johnny
27b7db63ee Merge pull request #839 from twetech/Create-Payment-Bugfix
Fix email data assignment and select option bug in invoice.php and ticket_invoice_add_modal.php
2023-12-22 12:32:27 -05:00
Andrew Malsbury
0077a03be7 Merge pull request #5 from twetech/Readable-Passwords
Readable passwords
2023-12-22 11:32:09 -06:00
Andrew Malsbury
10b04c79d0 Merge branch 'v0.1.2' into Readable-Passwords 2023-12-22 11:31:36 -06:00
Andrew Malsbury
c8d3f3df69 Merge pull request #4 from twetech/client-replied-warning-badge
Added autoclose to dark
2023-12-22 11:21:41 -06:00
o-psi
77145432ee Added autoclose to dark 2023-12-22 17:19:00 +00:00
Andrew Malsbury
6bceb4b33b Merge pull request #3 from twetech:client-replied-warning-badge
Add ticket status color for "Client-Replied"
2023-12-22 11:17:08 -06:00
o-psi
0535a903ee Add ticket status color for "Client-Replied" 2023-12-22 17:16:26 +00:00
Andrew Malsbury
fc5507272e Merge pull request #2 from twetech/Fix-for-user-IDs-in-tickets
Fix ticket assignment filter bug
2023-12-22 11:09:33 -06:00
o-psi
61a0086514 Fix ticket assignment filter bug 2023-12-22 17:06:48 +00:00
Andrew Malsbury
a6d43d97af Merge pull request #1 from twetech/Fix-for-user-IDs-in-tickets
Fix ticket_assigned_to filter in SQL query
2023-12-22 10:50:11 -06:00
o-psi
eb29f74fab fix error messages in log 2023-12-22 16:25:36 +00:00
o-psi
7709627e5b Accounting module disable ticket billable options 2023-12-22 16:19:51 +00:00
o-psi
17217019d1 Fix typo in variable name and add condition for invoice status 2023-12-22 15:19:00 +00:00
o-psi
dd7131cae1 Fix ticket_assigned_to filter in SQL query 2023-12-22 15:14:56 +00:00
o-psi
87e8f9e042 Fix email data assignment and select option bug in invoice.php and ticket_invoice_add_modal.php 2023-12-22 14:52:02 +00:00
johnnyq
f8702557c8 Remove Trailing slash for config_base_url during setup 2023-12-21 19:18:45 -05:00
johnnyq
da73b6d634 Fixed Client Pays fee not being able to be turned off 2023-12-21 19:13:14 -05:00
johnnyq
11da9ff0d4 Fix Undefined Status Array errors in tickets 2023-12-21 18:59:57 -05:00
johnnyq
435206dded Properly fetch the user dashboard settings 2023-12-21 16:56:02 -05:00
johnnyq
297148bc63 DB Update add User settings to enable / disable Dashboard Items Financial and Technical 2023-12-21 16:36:31 -05:00
johnnyq
d21e5fafca Added Your Tickets to the technical portion of the dashboard 2023-12-21 16:04:07 -05:00
johnnyq
12b8f2e005 Update Year select 2023-12-21 14:20:39 -05:00
johnnyq
5138f84575 Removed financial and technical dashboards in settings default page as these are no merged 2023-12-21 14:05:41 -05:00
johnnyq
6a63335a4a Bump PHPMailer from 6.8.1 to 6.9.1 2023-12-21 13:23:44 -05:00
johnnyq
19a18126de Bump TinyMCE from 6.7.3 to 6.8.2 2023-12-21 13:19:16 -05:00
Johnny
a1be7f2a3c Merge pull request #837 from twetech/Billable-ticket-qol
Quality of Life - Billable Tickets
2023-12-21 13:10:11 -05:00
johnnyq
afc6dd674c Add some more padding and spacing for toggles and Year Select on the dashboard 2023-12-21 13:07:20 -05:00
johnnyq
e639b69db9 Merged All Dashboards into 1 allow you to toggle between show financial and show technical 2023-12-21 13:03:37 -05:00
o-psi
3eaaf73744 Add more billable status functionality 2023-12-21 17:10:15 +00:00
o-psi
f1516b06ee Refactor calculateInvoiceBalance function to sanitizr
This commit refactors the calculateInvoiceBalance function in functions.php. The invoice_id parameter is now properly sanitized using intval() to prevent SQL injection attacks. Additionally, the SQL query for retrieving the invoice and payments data has been formatted for better readability.
2023-12-21 14:37:19 +00:00
johnnyq
70d99d28bf Removed Unused var 2023-12-21 02:40:41 -05:00
johnnyq
08a6d1d9be Update in more places 2023-12-21 02:10:09 -05:00
johnnyq
d6660bff04 Fix sending mail on item sharing 2023-12-21 02:02:40 -05:00
johnnyq
957bbc5f55 Update from name and email in other areas as well 2023-12-21 01:47:24 -05:00
johnnyq
e8a53cbd6a Update new mail queue function to use the proper mail from name and mail from email 2023-12-21 01:37:21 -05:00
johnnyq
cdaca0e06b Update a few var names for the new mail addToMailQueue function 2023-12-21 01:05:59 -05:00
Johnny
a35a6f3ea0 Merge pull request #835 from twetech/ticket_notifications
Notifications for technicians in tickets
2023-12-20 23:45:00 -05:00
Johnny
8ff6271058 Merge pull request #834 from twetech/billable_tickets
Update ticket billing functionality
2023-12-20 23:43:51 -05:00
johnnyq
82ec1408de FEATURE: Added Batch Payment to multiple invoices, currently works by paying the oldest invoices firest this can be accessed through client invoices and will show as long as the client has a balance 2023-12-20 18:47:14 -05:00
o-psi
86d836f3d3 Add vscode to .gitignore 2023-12-19 23:18:11 +00:00
o-psi
999c8ddb40 Add sanitations
Forgot to add in the sanitations.
2023-12-19 23:11:50 +00:00
o-psi
4e142b26e9 Missing "}" after confict resolution 2023-12-19 23:05:56 +00:00
Andrew Malsbury
ae1496adae Merge branch 'master' into ticket_notifications 2023-12-19 17:04:05 -06:00
o-psi
98f731b4d4 Remove any "Send Single Email" declarations except in mail queue.
All emails go through the mail queue, using the addToMailQueue() function.
2023-12-19 23:02:05 +00:00
o-psi
70a9120147 Add notification for ticket replies 2023-12-19 22:39:25 +00:00
o-psi
8b4beacf0e Update MailQueue to use function 2023-12-19 22:36:51 +00:00
johnnyq
77b431cb61 Fix Folder ID for file references 2023-12-18 14:54:49 -05:00
johnnyq
7894efedf0 Related Items under Document Details can be clicked on and opened as a new window link 2023-12-18 14:53:06 -05:00
johnnyq
2d06f923d4 Fix Adding NULL logins when editing license 2023-12-18 14:09:34 -05:00
o-psi
d6f4695a03 removed php shorthand for if statements. 2023-12-18 18:21:36 +00:00
o-psi
ebaa2a084a add readable password generation 2023-12-18 17:34:59 +00:00
o-psi
f0567c1fb7 add password generation functionality 2023-12-18 17:34:39 +00:00
o-psi
e0c8b0c30d Readable Password Function 2023-12-18 17:34:22 +00:00
o-psi
43d7f86d90 Readable Password Ajax 2023-12-18 17:34:11 +00:00
johnnyq
29c7f53b8b Fixed incorrect function in statements should be nullable_htmlentities not nullable_html_entities 2023-12-18 12:08:33 -05:00
Johnny
8e86f19bcc Merge pull request #833 from twetech/statements
Statements
2023-12-18 11:59:09 -05:00
o-psi
25fba91642 Put show modals javascript above pretty content. 2023-12-18 15:27:45 +00:00
o-psi
320d534319 Fixed invoice_url 2023-12-18 14:36:50 +00:00
o-psi
961f97f79a fix database 2023-12-17 20:38:11 +00:00
o-psi
7004d9217d Convert account_id and invoice_id to integers in calculateAccountBalance and calculateInvoiceBalance functions 2023-12-17 20:34:39 +00:00
o-psi
78260a2b4e Updates to mark tickets billable, and keep track of which have been billed. 2023-12-17 20:28:57 +00:00
johnnyq
fc7e67f5d0 Fix missing dot for allow .ps1 files 2023-12-14 12:23:55 -05:00
o-psi
1f46ea79fc Escaped Variables 2023-12-14 15:35:03 +00:00
johnnyq
3b6cfeff73 Add cfg and ps1 to the allow file upload list 2023-12-13 20:59:01 -05:00
o-psi
1a18022cc6 remove debug 2023-12-13 16:21:40 +00:00
o-psi
5d56bb2066 update collections report to include link to statement. 2023-12-13 16:12:23 +00:00
o-psi
5be0f9f934 add calculate invoice balance function 2023-12-13 16:10:08 +00:00
o-psi
8e17dbf5ba Add side nav button for statements 2023-12-13 16:09:42 +00:00
johnnyq
74aa0e829f Fix Invoice Item order in Ticketing, When creating an invoice from a ticket make sure the item added has an item_order of 1 2023-12-09 16:31:28 -05:00
johnnyq
594c8565ce Remove Weekly option when converting an invoice to a recurring invoice 2023-12-09 16:17:19 -05:00
johnnyq
72e448e4f0 Item Ordering Fix for Copy Quote or Invoice, Recurring Invoice to Invoice Cron, Force Recurring, Invoice to Recurring. It was not carrying over the item order on these tasks causing item ordering to break 2023-12-09 16:12:31 -05:00
johnnyq
3b7fe290af Removed Weekly option for Recurring Invoices soon will add Quarterly and Bi Annually 2023-12-09 15:24:41 -05:00
johnnyq
b6bc13ddd4 Removed Action Column on Client Tickets similar to the previous commit regarding Global Tickets 2023-12-09 15:08:32 -05:00
johnnyq
dccec2d5f5 Removed actions column from tickets as edit ticket and Delete should be done within the ticket itself, however you can still change priotity and assigned to within the list view. This makes a tremendous impact on performance as ticket details wont need loaded for each row Soon we will impelment bulk actions 2023-12-09 15:04:30 -05:00
Johnny
0eaf9febeb Merge pull request #830 from stehled/master
Fix domain edit for .eu and other domains.
2023-12-06 08:44:03 -05:00
Johnny
aad7b21b24 Merge pull request #831 from twetech/master
Fix for guest pay stripe with fees
2023-12-06 08:43:28 -05:00
o-psi
0aa08dac83 Fix for guest pay stripe with fees 2023-12-04 21:44:31 +00:00
Eduard Stehlík
f47c5cca84 Fix domain edit for .eu and other domains. 2023-12-04 18:40:53 +01:00
johnnyq
7d0813a163 Opps forgot to dump DB when remember_me_token was added causing remember_me on new installs to fail 2023-12-01 11:53:30 -05:00
Johnny
469c8aa501 Merge pull request #828 from wrongecho/quote-fix
Bugfix: Quotes to invoice item ordering
2023-11-30 12:50:15 -05:00
Johnny
d36dca508f Merge pull request #829 from twetech/stripe-pays-fees-undeclared-variable
Fix undeclared variable on Guest Online Pay
2023-11-30 12:50:01 -05:00
o-psi
a74bd5ade1 Fix undeclared variable on Guest Online Pay 2023-11-30 16:29:29 +00:00
Marcus Hill
a0a4e5524a Bugfix: Quotes to invoice item ordering
- Fix item ordering not working for invoices generated from quotes
- Other small quote bugfixes
2023-11-29 21:36:03 +00:00
Johnny
5772146d14 Merge pull request #827 from wrongecho/loc-primary
Bugfix: New locations are set as the primary
2023-11-25 14:14:41 -05:00
Johnny
59aeb1e976 Merge pull request #826 from wrongecho/admin-settings-csrf
Require CSRF token to edit more admin settings
2023-11-25 14:07:31 -05:00
Johnny
e50fbd76ae Merge pull request #824 from wrongecho/disable-personal-dash-link
Temporarily disable the personal dashboard link to prevent confusion
2023-11-25 13:34:25 -05:00
Johnny
e261651370 Merge pull request #823 from wrongecho/agent-email-key
Include login key in agent invitation email
2023-11-25 13:34:10 -05:00
Johnny
0196e86c16 Merge pull request #822 from wrongecho/client-tickets-default-open
Ticketing updates
2023-11-25 13:33:55 -05:00
Marcus Hill
fe369a4078 Bugfix: New locations are set as the primary
Bugfix: Every time you add a new location, it is marked as the primary location in the modal by default as the location_primary variable is overwritten with each iteration of a location.
This PR defaults to no location being the primary, to avoid unnecessarily overwriting the primary location.

Future work: Re-add fixed logic used to determine if a primary location is missing
2023-11-25 18:31:05 +00:00
Marcus Hill
8068cb6081 Require CSRF token to edit more admin settings - thanks again to @stehled 2023-11-25 18:15:25 +00:00
wrongecho
51ac53dc50 Merge pull request #825 from wrongecho/csrf-stripe
Require CSRF token to edit Stripe settings - thanks to @stehled
2023-11-25 16:39:14 +00:00
Marcus Hill
432488eca3 Require CSRF token to edit Stripe settings - thanks to @stehled 2023-11-25 16:36:05 +00:00
wrongecho
3158353921 Update first-interaction.yml
Bump to 1.2.0 to see if this fixes
2023-11-25 14:37:10 +00:00
Marcus Hill
55b35d16f1 Temporarily disable the personal dashboard link to prevent confusion as it is not yet in use 2023-11-25 14:31:09 +00:00
Marcus Hill
48c381ac2d Include login key in agent invitation email 2023-11-25 12:12:45 +00:00
Marcus Hill
c0eb94efc3 Ticketing updates
- Client ticket view now defaults to showing Open tickets
- Client ticket view now has ability to quick filter between open/closed tickets
- Don't render modals for closed tickets (~6x performance boost 0.030 seconds before vs 0.005 seconds after) (we really need dynamic modals for ticketing!)
2023-11-25 11:29:08 +00:00
wrongecho
c1d0a2368d Merge pull request #821 from twetech/Fix-collections-link
Fix link to client overview in collections
2023-11-25 10:31:35 +00:00
Andrew Malsbury
5653518f50 Merge branch 'master' into Fix-collections-link 2023-11-22 12:22:57 -06:00
Andrew Malsbury
fe86d3982c Fix the link to client overvier in collections 2023-11-22 18:18:17 +00:00
Andrew Malsbury
d90280011f Revert "Add scheduled ticket end date field"
This reverts commit d81a04a1d4.
2023-11-22 17:45:01 +00:00
Andrew Malsbury
d81a04a1d4 Add scheduled ticket end date field 2023-11-22 17:44:43 +00:00
Johnny
2adb500612 Merge pull request #819 from twetech/fix-collections-formatting
Add missing currency variable
2023-11-22 11:47:24 -05:00
Johnny
d19706e0c9 Merge pull request #818 from twetech/Fix-new-trips-modal-for-trips.php
Fix-new-trips-modal-for-trips.php
2023-11-22 11:47:05 -05:00
Andrew Malsbury
61f6735ceb added missing currency variable 2023-11-22 16:31:14 +00:00
Andrew Malsbury
7c93a073b2 fix option 2023-11-22 15:01:49 +00:00
Andrew Malsbury
dc04deaada Fix new trip on trips.php 2023-11-22 15:00:42 +00:00
johnnyq
b3c37b6c5f Added ability revoke a users Remember Me Token from the users listing 2023-11-21 18:28:42 -05:00
johnnyq
41ba04b881 Spacing Tidy 2023-11-21 17:37:30 -05:00
johnnyq
90bb9499d5 Moved Remember Me to the Enter MFA Screen Only 2023-11-21 17:36:45 -05:00
Johnny
be10ac0b46 Merge pull request #817 from twetech/remove-gateway-fees-from-client-invoice
Remove Stripe fee from main invoice display
2023-11-21 17:00:34 -05:00
Andrew Malsbury
6ce72e7cc1 Remove Stripe fee from main invoice display 2023-11-21 21:57:04 +00:00
Johnny
c95060727c Merge pull request #816 from twetech/collections-report
Add collections report
2023-11-21 16:55:35 -05:00
johnnyq
a01269ccea Updated Tax Rate to be a floatval instead of a intval 2023-11-21 16:51:05 -05:00
johnnyq
c1d6220e6a Added Tax Name and Rate to the products listing 2023-11-21 16:34:26 -05:00
johnnyq
48177e4250 Updated Quote and Recurring to Automatically select the Tax based off the product tax 2023-11-21 16:17:17 -05:00
johnnyq
3ec2e79e91 Attempt to automatically select Tax based off the products tax code in invoices, it works just doesnt update the select box to show selected 2023-11-21 16:06:12 -05:00
johnnyq
1f9c6578d5 Sanitize each Status in Array 2023-11-21 15:41:03 -05:00
johnnyq
3749cbfca1 Updated multiple ticket status selection 2023-11-21 15:22:38 -05:00
Andrew Malsbury
73e14c164b Add collections report 2023-11-21 19:03:38 +00:00
johnnyq
900ec75303 Reverted Multi Status Select using select2 in Ticket filtering as it broke existing filtering 2023-11-21 12:36:37 -05:00
Johnny
5c89e9849b Merge pull request #813 from twetech/fix-balance-sheet
Redo Balance Sheet Report
2023-11-21 11:57:03 -05:00
Johnny
af7ef5cf20 Merge pull request #814 from twetech/fix-ticket-query
Update Array for ticket Query
2023-11-21 11:55:58 -05:00
Andrew Malsbury
c28727f9a7 Update Array 2023-11-21 16:27:10 +00:00
Andrew Malsbury
230e649e2c Redo Balance Sheet Report 2023-11-21 16:04:41 +00:00
johnnyq
f18bb340bf Keep the Remember Me checkbox selected upon inital submit 2023-11-20 21:18:35 -05:00
johnnyq
0d6c58f1d0 Added Remember Me option by checking this you wont have to enter your MFA for up to 14 days on the device 2023-11-20 20:49:33 -05:00
johnnyq
dcd5103819 Hide Financial Reports, Financial Dashboard, Client Portal Invoices/Quotes of Accounting module is disabled, also included the settings into the client portal, so all settings vars are easily accessable within the portal 2023-11-20 17:20:49 -05:00
johnnyq
ed625b2d98 Fix Client Side Menu Wording 2023-11-20 17:00:04 -05:00
Johnny
26b439554b Merge pull request #810 from twetech/client-pays-fees
Enable passing stripe fee to clients
2023-11-20 16:49:16 -05:00
Johnny
a997896c46 Merge pull request #812 from wrongecho/comment-maintenance-unused
Hide currently unused "Maintenance" from Settings side navbar
2023-11-20 12:33:07 -05:00
Johnny
e9881ff32c Merge pull request #811 from wrongecho/cron-schd-tickets-agent-notif
Scheduled tickets - New ticket notifs + bugfix
2023-11-20 12:32:50 -05:00
Johnny
774531836a Merge pull request #809 from twetech/tax-report
Add functions for retrieving setting values and calculating taxes
2023-11-20 12:24:36 -05:00
Johnny
208f55fad2 Merge pull request #806 from twetech/add-client-replied-to-ticket-status-sort
Add Client-Replied and update select2 statuses in ticket sort dropdown
2023-11-20 12:23:34 -05:00
Andrew Malsbury
88392d0dea Add Stripe fee calculation to guest_ajax.php and
guest_view_invoice.php
2023-11-20 16:42:29 +00:00
Andrew Malsbury
6ab96b3b16 Update settings 2023-11-20 16:42:11 +00:00
johnnyq
02e0692b85 Fix Badge colors not working correctly after custom color tag update 2023-11-19 14:56:49 -05:00
Marcus Hill
b65b8c1c43 Hide currently unused "Maintenance" from Settings side navbar 2023-11-18 12:34:37 +00:00
Marcus Hill
41cfd8d27b Scheduled tickets
- Notify agent DL when scheduled tickets are raised (if configured)

- Bugfix: Ticket numbering if two or more scheduled tickets are raised in the same script execution
- Bugfix: Email processing if a contact replied to a scheduled ticket email (still showing original #--itflow# line rather than ##- Please type your reply above this line -##)
2023-11-18 11:53:24 +00:00
Andrew Malsbury
cc5d274596 Update database version to 0.9.5 and add
config_stripe_client_pays_fees field
2023-11-17 22:44:10 +00:00
Andrew Malsbury
5cfae2520e Add functions for retrieving setting values and
calculating taxes
2023-11-17 21:43:37 +00:00
johnnyq
fe1b8ce88f minor UI update on update 2023-11-17 15:19:48 -05:00
Johnny
75238ce0fb Merge pull request #803 from twetech/See-All-Timers
Add timers modal to see all timers
2023-11-17 14:28:06 -05:00
johnnyq
3781026c79 Commented Out Remember me as it is not feature complete yet 2023-11-17 14:21:41 -05:00
Andrew Malsbury
955b7cc53b Refactor variable declarations to use let instead
of var
2023-11-17 18:30:43 +00:00
Andrew Malsbury
feea83d380 Merge branch 'master' into See-All-Timers 2023-11-17 12:28:20 -06:00
Andrew Malsbury
011bacd1a2 Add ticket timer functionality and clear all
timers button
2023-11-17 18:27:31 +00:00
johnnyq
b1c60fa4d8 Update Categories Create and Edit Modals to take advantage of custom colors 2023-11-16 18:54:49 -05:00
johnnyq
76e348a3a1 Updated UI Create Calendar Modal 2023-11-16 18:42:21 -05:00
johnnyq
2779d6543e Updated Tag Create and Edit Modal UI, added icons, added ability to choose any color 2023-11-16 18:36:22 -05:00
johnnyq
d54a026a33 Wording: Change Passwords to Logins under global search 2023-11-16 18:14:02 -05:00
johnnyq
e8f4c5a672 Fixed Where clause in services 2023-11-16 18:08:21 -05:00
Johnny
8eccdc6b6a Merge pull request #807 from twetech/add-asset-uri-to-ticket-information
Add asset URI to client asset details page
2023-11-16 13:23:51 -05:00
johnnyq
7f7e05873a Bump InputMask from 5.07 to 5.08 2023-11-16 11:31:44 -05:00
johnnyq
b85e045202 Bump PDFMake 0.2.7 to 0.2.8 2023-11-16 11:15:14 -05:00
johnnyq
9cfb9b2f04 Bump JQuery 3.5.1 to 3.7.1 2023-11-16 11:11:47 -05:00
johnnyq
7baceb8c5a Bump TinyMCE from 6.7.0 to 6.7.3 2023-11-16 11:00:46 -05:00
johnnyq
834956624b Reduced the heading font sizes on the the right side ticket details to allow more info to be displayed 2023-11-16 10:40:54 -05:00
johnnyq
32203565a7 UI update for ticket timer, removed the appended H S M to free some clutter 2023-11-16 10:27:14 -05:00
johnnyq
48b153613f Changd Passwords to Logins, made Licenese icon consistent 2023-11-16 00:20:36 -05:00
Andrew Malsbury
41748a03b6 Merge branch 'See-All-Timers' of https://github.com/twetech/itflow into See-All-Timers 2023-11-15 16:30:13 +00:00
Andrew Malsbury
bdda03d8b2 Update ticket link in header_timers.js 2023-11-15 16:30:10 +00:00
Andrew Malsbury
e5752dc335 Add asset URI to client asset details page 2023-11-15 15:32:37 +00:00
Andrew Malsbury
94b4d4aeca Merge branch 'master' into See-All-Timers 2023-11-14 20:00:13 -06:00
Andrew Malsbury
a6a49604a8 Merge branch 'itflow-org:master' into add-client-replied-to-ticket-status-sort 2023-11-14 19:52:02 -06:00
johnnyq
201860798a Fix Ticket Timer to allow for 00 for hour 2023-11-14 18:02:12 -05:00
Andrew Malsbury
35b709fa18 Merge branches 2023-11-14 18:31:30 +00:00
Andrew Malsbury
f01d9d0530 Updated to use prepared statements as 2023-11-14 18:30:18 +00:00
johnnyq
63a4eab8bc Added Pattern Attribute to only allow correct input for the ticket timer 2023-11-14 13:20:51 -05:00
johnnyq
16aff5f634 UI Update to the ticket timer. reworked sizing to be a small input field, set the fields to text instead of numeric as the number updown element was taking up too much space 2023-11-14 13:15:49 -05:00
Andrew Malsbury
4060bea7a6 Add new ticket status and refactor ticket status
filter.
2023-11-14 17:41:30 +00:00
Andrew Malsbury
5657c153be Merge branch 'master' into See-All-Timers 2023-11-14 11:24:26 -06:00
Andrew Malsbury
973307524d Update to fix main screen 2023-11-14 17:23:13 +00:00
Andrew Malsbury
1d401874f3 Update to select2 multiple statuses. 2023-11-14 17:09:43 +00:00
Andrew Malsbury
a0cd266c8b Add Client-Replied to ticket sort dropdown 2023-11-14 15:53:04 +00:00
Johnny
5dfc0d0d2c Merge pull request #802 from twetech/update-timer-when-pending
Time tracking paused when pending
2023-11-13 23:29:15 -05:00
johnnyq
f11ad402e9 Moved the rest of the Import / Export Buttons into the Create and some exports in the Advanced filter button 2023-11-13 20:24:57 -05:00
johnnyq
4a74d7b402 Do not show other Assets if there are none 2023-11-13 19:52:03 -05:00
Johnny
c2a5f02308 Merge pull request #805 from twetech/Fix-for-quotes-and-recurrings
[HOTFIX] Fix editing of recurring and quotes
2023-11-13 14:19:30 -05:00
Andrew Malsbury
cdacb7735c Update to remove 2023-11-13 18:45:31 +00:00
Andrew Malsbury
d837a10013 Fix editing of recurring and quotes 2023-11-13 17:50:42 +00:00
Andrew Malsbury
47fe6fe233 Add timers modal to see all timers 2023-11-12 23:47:44 +00:00
Andrew Malsbury
efb4709519 Time tracking paused when pending 2023-11-12 21:23:06 +00:00
johnnyq
104bbee422 Converted Client Services Multiple Select Boxes to use Select2: 2023-11-10 16:34:21 -05:00
Johnny
9c4d9f14b1 Merge pull request #801 from wrongecho/mail-parse-blank-emails
Mail parse - Handle blank/unexpected emails better
2023-11-09 17:57:52 -05:00
Marcus Hill
0de99fda61 Mail parse - Handle blank/unexpected emails better 2023-11-09 22:18:57 +00:00
johnnyq
f6076ad97a Remove Quick Add Instead redirect them to the categories settings page when plus is clicked 2023-11-09 13:09:38 -05:00
johnnyq
8975fcf2ee Place Advanced filter back on the left final decision was made to do so and I like it 2023-11-09 11:23:45 -05:00
johnnyq
408a596efa Add logging if creating a referral via create client 2023-11-08 23:35:00 -05:00
johnnyq
0103e05093 Ability to create a referral when adding a client 2023-11-08 23:30:44 -05:00
johnnyq
89cbdd1038 Added industry select array 2023-11-08 22:54:33 -05:00
johnnyq
cbf15f4e81 Updated button colors on accept decline quote 2023-11-08 22:28:29 -05:00
johnnyq
88a6fdd36d Start page is a required select box with the option of putting in a custom value 2023-11-08 22:17:51 -05:00
johnnyq
5bd4c32f4d Reorganized Create Software License added multi select2 to assign asset and user licenses 2023-11-08 16:46:15 -05:00
johnnyq
a300248f90 Remove the old add remove ticket watcher js code 2023-11-08 14:38:48 -05:00
johnnyq
7e2d3c4159 Add Function Select2 Multiple Capabilities to add ticket watchers in create client ticket 2023-11-08 14:37:03 -05:00
johnnyq
eb01e4b4d5 Clean up Logic for Client Add and Client Edit Modals, same for trip add copy edit 2023-11-08 13:34:58 -05:00
Johnny
40b6723fac Merge pull request #800 from wrongecho/azure-sso-error-wording
AAD SSO - Wording
2023-11-07 17:28:37 -05:00
johnnyq
3a61b56c6e Fix SQL Syntax error 2023-11-07 16:52:02 -05:00
johnnyq
5d1c283533 Do not show disabled or users that were before the trip creation date 2023-11-07 16:34:32 -05:00
Marcus Hill
51ec92c72e AAD SSO - Wording
Slight change to the error wording when a user doesn't exist in ITFlow as a contact / has the wrong auth method set (blank/local rather than Azure)
2023-11-07 21:18:46 +00:00
johnnyq
afc040bfe6 Updated UI on add / edit Client moved the tagging functionality to using select2 to increase space and merge tags and notes tabs 2023-11-07 16:02:15 -05:00
johnnyq
3f2f405596 Allow Manual Input of Trip Destination or select from client locations, Added Remember me checkbox for future implementation 2023-11-06 19:37:48 -05:00
johnnyq
d2e3c1e12d Fix Domains Icon in Global Search, remove unnessesary > 2023-11-06 17:03:34 -05:00
johnnyq
a9304a3784 Move Calendar under support Move Trips under Finance 2023-11-06 15:25:54 -05:00
johnnyq
c18dbc5985 Rename Events in Client Side Nav to Calendar 2023-11-06 15:22:51 -05:00
johnnyq
91924bc239 Feature: Part 2 - Added Default Hourly rate to settings pane, default to the default hourly rate when adding a client 2023-11-06 15:05:07 -05:00
johnnyq
1f0d2ff1ab Feature: Part 1 - DB Schemea update for Default Hourly Rate 2023-11-06 14:52:01 -05:00
johnnyq
69e9691de9 Remove elevation CSS tag from tickets as this was not consistent and unnessary 2023-11-06 14:43:19 -05:00
johnnyq
76f20225f5 Fix IT Docs not showing, keep assets side nav active when viewing asset details page 2023-11-06 14:38:22 -05:00
johnnyq
c40be56869 Disable Documentation section of Client Side Nav of IT Doclumentation is disabled 2023-11-06 14:33:23 -05:00
johnnyq
a8ee791d64 Allow to set quick notes under asset details 2023-11-06 14:25:55 -05:00
johnnyq
dff4eff5cc Do not show related content in edit service if the entity archived date is greater than when the service was created 2023-11-06 13:46:52 -05:00
johnnyq
167c2a5b43 Remove Document from many to many service_documents table when archiving or deleting a document prevents from showing up under document service relation 2023-11-06 13:27:58 -05:00
johnnyq
11b814b4c8 Do not show archived content when adding a service 2023-11-06 13:19:27 -05:00
johnnyq
43b94ebddc Restored New Quote Functionality under clients this was disabled for debugging but never re-enabled back 2023-11-06 12:44:44 -05:00
Johnny
210530e673 Merge pull request #798 from wrongecho/client-is-lead-fix
Fix undefined client_is_lead errors
2023-11-05 10:49:43 -05:00
Johnny
7044c6bf54 Merge pull request #797 from wrongecho/api-additions
API - Documents
2023-11-05 10:49:30 -05:00
Marcus Hill
ba86af9efa Fix undefined client_is_lead errors
- Defines client_is_lead within the general client include file to prevent the following error filling up logs on almost every page load.
> "PHP Notice: Undefined variable: client_is_lead in itflow/client_edit_modal.php on line 111"
2023-11-05 11:03:49 +00:00
Marcus Hill
573eaf179b API - Documents
- Add create and update methods
2023-11-05 10:42:46 +00:00
wrongecho
a31c012487 Merge pull request #796 from wrongecho/fix-trip-export
Fix trip export to csv
2023-11-05 08:31:16 +00:00
Marcus Hill
7ccd69a26f Fix trip export to csv 2023-11-05 08:24:19 +00:00
Johnny
f7e0f06eb6 Merge pull request #795 from nellistc/globalsearch-domains
Update global search to include client domains
2023-11-03 16:44:50 -04:00
nellistc
7ab032fa3f Update global search, add client to domain search results
Show client name and link to client overview in domain search results
2023-11-04 07:31:21 +11:00
nellistc
008ad76c68 Update global_search.php
add domains to global search results
2023-11-03 18:22:24 +11:00
johnnyq
fbf535444b Updated Quote and Recurring to match invoice UI updates 2023-11-02 16:31:25 -04:00
johnnyq
ef213e34d4 Invoice UI Update: Bolded Due Date, Moved Subtotal to the top added - sign in front of discount, do not subtract the discount from the subtotal as this is reservered for total, do not show tax discount or paid in pdf if they are 0 2023-11-02 16:12:06 -04:00
johnnyq
015d8265e0 Fix Quotes duplicated php start close tags in edit quote discount field 2023-11-02 13:19:13 -04:00
johnnyq
cd99e91ac3 Bold the contact name in client listing 2023-11-01 18:55:41 -04:00
johnnyq
5a7c62c150 Added back number_format() function as there was a way to just remove the commas but keep the decimal place so 290.90 doesnt look like 290.9 2023-11-01 18:16:12 -04:00
johnnyq
572f12eaef Removed num_format(),2 function for pricing and cost fields as it was putting in commas as this is unacceptable for floatvals 2023-11-01 17:51:35 -04:00
johnnyq
5c0ab72d69 Moved creating lock file after all other checks have passed to prevent locking if a certian check has not passed, turned off imap extend log as it could cause mysql errors also remove lock before exiting if cannnot connect to imap 2023-11-01 13:59:35 -04:00
johnnyq
43786a72ab Moved Advanced Filter button to the right for invoices and quotes 2023-10-31 17:24:46 -04:00
johnnyq
7f19ea6c55 Moved Advanced Filter button to the far right toolbar under clients 2023-10-31 17:16:14 -04:00
johnnyq
b26c1b28c3 Show Archived Items for licenses and password and moved import exports to New DropDown 2023-10-31 16:24:59 -04:00
johnnyq
c94c88dc88 Show Archived Items for locations, vendors and assets and moved import exports to New DropDown 2023-10-31 16:16:15 -04:00
johnnyq
be279b4e8d Added more hints between leads and clients under client management 2023-10-31 15:38:40 -04:00
johnnyq
174a8d932f Reworked the sahow Client Leads button to radio style 2023-10-31 15:12:38 -04:00
johnnyq
638d59e1c1 Sort items by item order when exporting invoices or quotes to PDF in app view and guest view 2023-10-31 14:57:45 -04:00
johnnyq
036c687bf8 Fix up item moving on invoice, quotes and recurrung, removed unnessesary tags, re-arranged the arrows to the top rename remove to delete with a trash can as its more proper 2023-10-31 14:51:38 -04:00
johnnyq
8a5f51845c Reworked the Dashboard so only 1 Dashboard shows on the Side nav and now has a top nav to select dasbords, Personal Dashboard coming 2023-10-31 14:22:03 -04:00
johnnyq
4a4924f4f6 Bring back editing of username and password for an asset in the asset details page 2023-10-31 13:30:38 -04:00
johnnyq
365ed3a79a Merged Client Leads into Client Management 2023-10-31 11:03:46 -04:00
Johnny
4ab38b42f8 Merge pull request #794 from twetech/timer-tracking-remember-manual-changes
Update timer to remember manual edits
2023-10-31 10:26:57 -04:00
Andrew Malsbury
fb45bceae5 Update timer to remember manual edits. 2023-10-30 13:22:29 +00:00
Johnny
d4d4d9cd7a Merge pull request #793 from wrongecho/schd-contact
Add ability to edit contact on a scheduled ticket
2023-10-29 13:32:09 -04:00
Marcus Hill
d6cf04b8f2 Codesmell 2023-10-28 14:40:27 +01:00
Marcus Hill
e88d0b1e23 Add ability to edit contact on a scheduled ticket 2023-10-28 14:32:15 +01:00
Johnny
48753e6462 Merge pull request #792 from twetech/update-timer
Timer - Record time even if closed
2023-10-27 20:36:25 -04:00
johnnyq
3c8a026b7c Fixed Cron mail queue and email parser missing ' 2023-10-27 13:05:29 -04:00
Andrew Malsbury
adafd38684 Timer - Record time even if closed 2023-10-26 19:19:46 +00:00
johnnyq
f9d3d3b2f9 Also Added logging to cron mail queue and mail parser when attempting to execute when its already executing by checking to see if the lock file is present 2023-10-25 18:05:19 -04:00
johnnyq
c30e0f7768 Remove Lock files older than 10 Mins aka 600 Secs and log it for Cron Email Parser and Cron Mail Queue 2023-10-25 17:57:35 -04:00
Johnny
87da66b069 Merge pull request #791 from twetech/save-timer-to-local
Save ticket timer to local storage
2023-10-25 17:35:21 -04:00
Johnny
430e148815 Merge pull request #790 from twetech/Discounts-pt-2
Update Quotes and Recurrings with discounts
2023-10-25 17:34:34 -04:00
Johnny
903e9437c4 Merge pull request #789 from twetech/sort-for-quotes-and-invoices
Update for sorts
2023-10-25 17:34:19 -04:00
Johnny
a1e511d8ac Merge pull request #788 from twetech/topnav-notification-fix
Removed useless assignment
2023-10-25 17:34:06 -04:00
Andrew Malsbury
f6cdf5ac51 Added comments because I dont know JavaScript 2023-10-25 19:37:17 +00:00
Andrew Malsbury
a29a97214a Update to keep incrementing while tab is closed 2023-10-25 19:16:07 +00:00
Andrew Malsbury
ea3e1df784 clear local storage when responding 2023-10-25 19:02:23 +00:00
Andrew Malsbury
6a0b291acd Save timer to local Storage 2023-10-25 18:26:33 +00:00
Andrew Malsbury
62d3cab389 Update Quotes and Recurrings with discounts 2023-10-25 17:15:41 +00:00
Andrew Malsbury
79c112b0af Merge branch 'itflow-org:master' into topnav-notification-fix 2023-10-25 09:36:09 -05:00
Andrew Malsbury
5f2a1298a1 Fix quotes screen, and update others for looks. 2023-10-25 14:32:46 +00:00
Andrew Malsbury
85a759f7db Removed useless assignment 2023-10-25 14:07:47 +00:00
Johnny
5faac97491 Merge pull request #785 from o-psi/Update-Timer
Update Timer to stop when in focus
2023-10-24 21:10:48 -04:00
o-psi
53c953b60e Update the timer to stop when focused. 2023-10-24 20:09:07 +00:00
o-psi
6c13773706 Revert "Enhance timer: Pause during input edits"
This reverts commit 2a3156cd59.
2023-10-24 20:08:22 +00:00
o-psi
2a3156cd59 Enhance timer: Pause during input edits 2023-10-24 20:07:10 +00:00
johnnyq
b05e5bb575 Fix Broken cron.php broke as of 10-20-2023 2023-10-23 13:51:16 -04:00
johnnyq
7b94e29aa4 Fix Broken Select2 andDateRangePicker JS Plugins 2023-10-21 22:59:00 -04:00
Johnny
b34fd85ad4 Merge pull request #784 from wrongecho/portal-ticket-attachments
Portal ticket attachments
2023-10-21 16:00:14 -04:00
Johnny
e0f1adb446 Merge pull request #783 from wrongecho/email-to-ticket-extensions
Expand range of allowed file extensions for email to ticket attachments
2023-10-21 15:59:25 -04:00
Johnny
68220cc063 Merge pull request #782 from wrongecho/ticket-assigned-wording
Change modal unassigned wording from "No one" to "Not Assigned"
2023-10-21 15:59:13 -04:00
Johnny
33abf8a9eb Merge pull request #781 from wrongecho/session-timeout-garbage-workaround
Add background ajax query in an attempt to prevent session timeout
2023-10-21 15:59:00 -04:00
Johnny
abc2226b4f Merge pull request #780 from wrongecho/fix-client-page
Fix clients.php page after leads were added
2023-10-21 15:58:37 -04:00
Marcus Hill
31be8034e7 Revert different change covered in separate PR 2023-10-21 15:27:21 +01:00
Marcus Hill
218cdcdc4c Allow contacts to upload attachments when adding ticket replies in portal
- Adds the ability for contacts to add file attachments when posting a ticket reply
- Enhancements to checkFileUpload(): Adjust file reference name generation & bad extension handling
2023-10-21 15:24:15 +01:00
Marcus Hill
7aadad3597 Expand range of allowed file extensions for email to ticket attachments 2023-10-21 14:40:14 +01:00
Marcus Hill
1c6c90845c Change modal unassigned wording from "No one" to "Not Assigned" 2023-10-21 13:01:11 +01:00
Marcus Hill
65168fe702 Add background ajax query in an attempt to prevent session timeout 2023-10-21 12:34:34 +01:00
Marcus Hill
2240f641dc Fix missing variable assignment for client_is_lead 2023-10-21 11:54:41 +01:00
johnnyq
ba9442e6c3 Added Confirmation to Close Ticket in Client Portal - Seperated cofirmation modal to a seperate JS file which is now included in the Client Portal 2023-10-20 19:10:25 -04:00
johnnyq
fcfb162ec8 Enable domain expire alerts and send invoice reminders did not respect their settings it would still execute as long as cron was executing, updated the desription of the options as well 2023-10-20 18:38:48 -04:00
johnnyq
509a955277 Comment out on End Task Logs as it wasnt producing correct information 2023-10-20 17:43:31 -04:00
johnnyq
6db576c80e Update setup so Asset Type Account type can be created before it adds the cash on hand account so it may reference the assets type 2023-10-20 16:42:10 -04:00
Johnny
dd644a39b8 Merge pull request #779 from o-psi/clean-requires-and-includes
Update constructs to not have parenthesis.
2023-10-20 16:32:29 -04:00
johnnyq
7a834b0f5f Update Payments to only show account_type_parent 1 which is assets 2023-10-20 16:27:43 -04:00
o-psi
53c11edc8c Update constructs to not have parenthesis. 2023-10-20 15:25:52 -05:00
Johnny
4080774602 Merge pull request #778 from o-psi/update-di
Update discounts to allow decimals
2023-10-20 16:19:33 -04:00
johnnyq
881f43bdb7 Updated Account Selection under Pay Invoice to show only Asset Accounts which is asset_type_parent = 1 2023-10-20 16:18:06 -04:00
johnnyq
8257fc3193 Updated Accounts Listing to use take adavantage of the new account_type_parent 2023-10-20 16:10:45 -04:00
o-psi
aed411dc45 Update discounts to allow decimals 2023-10-20 15:05:42 -05:00
johnnyq
762dafab7e Updated Account Types liasting and posting to use the new account_type_parent field, also update setup to inset the correct account types into the correct account_type_parent 2023-10-20 15:40:52 -04:00
johnnyq
fcc49c2b40 DB Update: Adds an account_type_parent field to represent the parent type 1 being default and representing Assets, 2 Liabilities, 3 Equity this will be the new way to identify the parent account type instead of using account_type_id min and max values ex 10-19 was Assets, 20-29 was Liabilities, Equity being 30-39. This was improper as the primary key should never be static 2023-10-20 14:56:40 -04:00
Johnny
8b9efb2e6d Merge pull request #777 from o-psi/payments-to-assets-accounts-only
Update Payments to only show Asset Accounts
2023-10-20 12:48:23 -04:00
o-psi
987944f992 Update Payments to only show Asset Accts 2023-10-20 08:33:28 -05:00
Johnny
56b91f3278 Merge pull request #776 from o-psi/discounts
Discounts
2023-10-19 18:34:44 -04:00
Andrew Malsbury
a382092dab Merge branch 'master' into discounts 2023-10-19 17:19:32 -05:00
o-psi
6e6e0d5f71 Update variable definition 2023-10-19 17:03:50 -05:00
o-psi
824db5865b Update Guest View Payment Screen 2023-10-19 17:01:09 -05:00
o-psi
ea1dadf792 update db ver number 2023-10-19 16:34:57 -05:00
Johnny
e379587c06 Merge pull request #772 from o-psi/leads
Leads
2023-10-19 16:41:59 -04:00
o-psi
8bea3f0022 Update Guest View 2023-10-19 14:05:58 -05:00
o-psi
fdaa176486 Post handling for calculating Discounts 2023-10-19 13:56:58 -05:00
o-psi
5317f298dc Add view for discount. 2023-10-19 13:56:26 -05:00
o-psi
541bd9e0ca add discount to model 2023-10-19 13:56:01 -05:00
o-psi
25d2b48542 Add discount to modal, reformat. 2023-10-19 13:54:39 -05:00
o-psi
8182144bdc Update database to have discount field on invoice. 2023-10-19 13:53:53 -05:00
Johnny
6aeefd3d5d Merge pull request #775 from o-psi/update-readme
Default install script doesnt like the oneliner.
2023-10-18 11:43:07 -04:00
Johnny
9806fc9283 Merge pull request #774 from o-psi/Fix-Setup-Page
[Urgent] - Fix Setup Page
2023-10-18 11:42:41 -04:00
o-psi
1296e6b5f0 Default install script doesnt like the oneliner. 2023-10-18 09:38:50 -05:00
o-psi
aae3845b16 removed erroneous 's' 2023-10-18 09:34:28 -05:00
o-psi
f16a175eed fixed intentionallity issue 2023-10-16 23:40:08 -05:00
o-psi
2f9b6d97b9 update post to support leads 2023-10-16 22:52:22 -05:00
o-psi
fa1feba237 add leads to client model 2023-10-16 22:50:21 -05:00
o-psi
44e5b6c2bd add leads to sales 2023-10-16 22:50:09 -05:00
o-psi
0d02c8b855 adjust clients to filter out leads 2023-10-16 22:49:59 -05:00
o-psi
efba7ffc8b make new leads screen to view leads. 2023-10-16 22:49:45 -05:00
o-psi
b19af06dae update edit modal to support leads and modals 2023-10-16 22:49:32 -05:00
o-psi
34db62e8ee Update add modal to support leads and clients 2023-10-16 22:43:48 -05:00
o-psi
4fa186179d DB Updates to support leads functionality 2023-10-16 19:30:31 -05:00
Johnny
de91afe1a0 Merge pull request #771 from o-psi/add-links-in-reports-to-clients
Add link to client in reports
2023-10-16 17:25:22 -04:00
johnnyq
fba1115b0d Fix DB Update database version was set it 0.8.10 which caused it not to update instead chnaged it to 0.9.0. items table also does not exist updated to invoices items for the new sort function redumped DB Structure. 2023-10-16 17:21:21 -04:00
o-psi
cc9dc4e6e7 add link to client overview page 2023-10-16 16:14:15 -05:00
Johnny
d0312e75cb Merge pull request #770 from o-psi/hide-archived-clients
Dont show archived clients in new invoice screens
2023-10-16 17:07:35 -04:00
Johnny
9818c57ecb Merge pull request #769 from o-psi/other-sorts
Sorting Recurring and Quotes
2023-10-16 17:06:42 -04:00
o-psi
4763110267 Dont show archived clients in new invoice screens 2023-10-16 15:53:54 -05:00
Andrew Malsbury
2d061c0163 Merge branch 'master' into other-sorts 2023-10-16 15:40:04 -05:00
Johnny
cce1dc86c2 Merge pull request #768 from o-psi/invoice-sort-1.b
Invoice Sort Updates
2023-10-15 23:39:36 -04:00
o-psi
3c391b9d50 Database Updates to match 2023-10-15 22:26:01 -05:00
o-psi
5221a3676e quote sort logic 2023-10-15 22:14:36 -05:00
o-psi
47db00e90c recurring item sort logic 2023-10-15 22:14:24 -05:00
o-psi
b04dd98370 update sort for recurring 2023-10-15 22:14:03 -05:00
o-psi
0c98d8b45b add logic for recurring 2023-10-15 22:13:51 -05:00
o-psi
5ba0649e4a sort by order 2023-10-15 22:08:19 -05:00
o-psi
64a00551c6 Fix Quote View for Sort 2023-10-15 22:08:04 -05:00
o-psi
e51d0b74a6 Cleaned up logic 2023-10-15 20:01:15 -05:00
o-psi
5f839d8768 Added logic to hide buttons 2023-10-15 20:00:42 -05:00
johnnyq
33c1e72dcc Fix Wrong Timezone var name 2023-10-15 12:15:48 -04:00
Johnny
8d5bda529c Merge pull request #767 from o-psi/unarchive-for-account-types
Updates for account types
2023-10-15 12:09:25 -04:00
o-psi
37399a90ce Added Search 2023-10-15 00:15:00 -05:00
o-psi
845b2397fb Add 'all' button 2023-10-15 00:00:03 -05:00
o-psi
26fc756175 Fixed a bug with not showing unless query given 2023-10-14 23:54:12 -05:00
o-psi
1f3c103032 changed view from long list to broken down by type 2023-10-14 23:34:54 -05:00
o-psi
ab308af4f9 changed number to name 2023-10-14 23:34:31 -05:00
o-psi
68b232e4fd set default per type page 2023-10-14 23:34:14 -05:00
o-psi
56a5e903df added unarchiving to account types post 2023-10-14 23:33:49 -05:00
Johnny
ee7d2e9dba Merge pull request #766 from o-psi/categories_archived
Allow Unarchiving and Deleting Categories.
2023-10-14 21:46:28 -04:00
o-psi
87b4345b87 Updated to use pagination head code. 2023-10-14 19:05:39 -05:00
o-psi
b107eb232c Add archived to table. 2023-10-14 14:11:02 -05:00
o-psi
0a98c4322c Allow unarchiving in Post.php 2023-10-14 14:10:41 -05:00
johnnyq
592e2a80d2 Increment the Database version to take adavantage of the new item ordering under invoices 2023-10-14 13:58:20 -04:00
Johnny
5a21271c45 Merge pull request #765 from o-psi/Localization-Cleanup
Condensed localization to a separate file
2023-10-14 13:54:54 -04:00
Johnny
966a8b0770 Merge pull request #763 from o-psi/add-php-info-to-debug
Expand debug screen with PHPInfo
2023-10-14 13:54:16 -04:00
Johnny
766df19223 Merge pull request #762 from o-psi/Invoice-items-order
Sort invoice items
2023-10-14 13:54:01 -04:00
Johnny
21a5006a43 Merge pull request #761 from o-psi/edit-currnet-expenses-amount-regex
Allow for commas in recurring expense modals
2023-10-14 13:50:56 -04:00
o-psi
ed269e1245 changed to item_order 2023-10-13 22:49:28 -05:00
o-psi
ee8e758a49 Condensed ~1.6 LOC by 50x, and reduced duplication 2023-10-13 22:42:11 -05:00
Andrew Malsbury
29279d0a7e Merge branch 'itflow-org:master' into edit-currnet-expenses-amount-regex 2023-10-13 22:12:03 -05:00
o-psi
08a11cb53e added php info and handling to bottom of debug 2023-10-13 21:56:50 -05:00
o-psi
0270a680a6 update invoices 2023-10-13 20:54:41 -05:00
o-psi
7a6c3ec470 Removed the order_id echo statement for production 2023-10-13 20:48:44 -05:00
o-psi
b4396fe244 post actions for changing sort 2023-10-13 20:13:40 -05:00
o-psi
ffa0226067 add item sort dropdowns 2023-10-13 20:13:28 -05:00
o-psi
097690bfbd add sort to guest view 2023-10-13 20:12:58 -05:00
o-psi
141dad23fe Update database, did not do increment 2023-10-13 20:12:43 -05:00
o-psi
3124ca2777 adjust regedit to allow for commas as thousands 2023-10-13 17:40:06 -05:00
o-psi
00effcf79d remove commas before trying to make a float 2023-10-13 17:39:41 -05:00
Johnny
45acc5866d Merge pull request #760 from o-psi/dashboard-links
Dashboard links
2023-10-13 15:30:47 -04:00
Johnny
604a788112 Merge pull request #759 from o-psi/Assets-Report
Assets report
2023-10-13 15:30:36 -04:00
Johnny
ff424330b4 Merge pull request #758 from o-psi/add-archive-for-account-types
Add archive option for account types
2023-10-13 15:30:06 -04:00
o-psi
b747bd4e9d Make all boxes links 2023-10-13 10:53:20 -05:00
o-psi
157263cf8a Add link to Assets on technical dashboard 2023-10-13 09:58:56 -05:00
o-psi
78032dcf6d Added a report to view all assets by client. 2023-10-13 09:56:38 -05:00
o-psi
37a5100742 Add archive option for account types 2023-10-13 13:57:17 +00:00
Johnny
2f8ee11a77 Merge pull request #757 from o-psi/Update-Documentation-Capitalization
Update Capitalization for Documentation
2023-10-12 18:30:49 -04:00
o-psi
3d31cf0d9d Move support above documentation 2023-10-12 22:03:40 +00:00
o-psi
ab6e8dde00 Update Services location 2023-10-12 22:02:28 +00:00
o-psi
9372ca4bc3 Update Capitalization for DOCUMENTATION 2023-10-12 20:43:26 +00:00
johnnyq
8c56426186 Fixed a layout issue if no previos ticket exists for a selected contact under ticket details 2023-10-12 16:09:31 -04:00
Johnny
5a1b93ae17 Merge pull request #754 from o-psi/fixed2-typo-in-product-logging
Fixed a typo in product logging
2023-10-12 12:57:57 -04:00
Andrew Malsbury
9b7ef4761c Merge branch 'itflow-org:master' into fixed2-typo-in-product-logging 2023-10-12 11:55:07 -05:00
Johnny
df14ac8a83 Merge pull request #753 from o-psi/remove-foreign-key
Remove-foreign-key
2023-10-12 12:54:33 -04:00
o-psi
38c5547307 changed modifyed to modified 2023-10-12 16:54:18 +00:00
o-psi
8bce945a11 Moved accounts back to top, removed accounts type. 2023-10-12 16:49:56 +00:00
Andrew Malsbury
33cd0e89ca Merge branch 'itflow-org:master' into master 2023-10-12 11:40:40 -05:00
Andrew Malsbury
df9f5fb001 Update db.sql 2023-10-12 11:23:38 -05:00
Andrew Malsbury
c7ca89b2e3 Update db.sql 2023-10-12 11:09:26 -05:00
Johnny
63ecb38bb7 Merge pull request #752 from o-psi/fix-account-type-fk
[Urgent] Fix Foreign Key for account types
2023-10-12 12:01:57 -04:00
Andrew Malsbury
aa9163ae98 Merge pull request #1 from o-psi/fix-account-type-fk
fix fk for account types
2023-10-12 10:54:59 -05:00
Andrew Malsbury
befbf457e8 fix fk for account types 2023-10-12 10:22:45 -05:00
wrongecho
448aaa8c1c Merge pull request #751 from o-psi/fix-account-type-default
[Critical] Fix bug introduced in account type update
2023-10-12 15:49:03 +01:00
Andrew Malsbury
6506f64a6e Update db.sql
Fix bug introduced in account type table
2023-10-12 09:27:38 -05:00
Johnny
101488f9f1 Merge pull request #750 from o-psi/Rename-Assets-SideNav-Category
Rename Assets and move documentation and files in
2023-10-11 22:21:09 -04:00
Andrew Malsbury
aaf04f18c5 Rename Assets and move documentation and files in 2023-10-12 02:00:12 +00:00
johnnyq
e6b15a0ff3 Do not Export Archived Data when Exporting client data to a PDF 2023-10-11 17:03:20 -04:00
johnnyq
964ff6740c Fix last commit opps on balance sheet report. use not equal to 0 instead of equal 0 as it will just sum up all the transfers 2023-10-11 15:12:14 -04:00
johnnyq
25751bdd85 Fix Balance sheet report so it doesn't calculate transfers, transfers use the expense and revenue tables as well. To fix this a transfer always has a vendor_id 0 in the expense table and category_id is always 0 for the revenues table, so dont sum those 2023-10-11 15:08:20 -04:00
johnnyq
66c16d6cff Increment Database again to insert the account types for PR #734 Add Balance Sheet report 2023-10-11 14:46:44 -04:00
johnnyq
fb60412686 Increment the Database version as this was missed in PR #734 Add Balance Sheet report 2023-10-11 14:37:27 -04:00
Johnny
c248af81fb Merge pull request #749 from o-psi/remove-gui-custom-fields
Removed gui for custom fields
2023-10-11 14:34:38 -04:00
Johnny
f1e74d926d Merge pull request #748 from o-psi/quote_guest_view
Update guest quote view to make more sense
2023-10-11 14:34:18 -04:00
Johnny
7986a797a7 Merge pull request #747 from o-psi/technical-dashboard-for-admins
Update technical dashboard links.
2023-10-11 14:33:34 -04:00
Johnny
44671d4769 Merge pull request #734 from o-psi/balance-sheet
Add balance sheet report
2023-10-11 14:31:45 -04:00
Andrew Malsbury
ddff9b929d Other PR code snuck in. Still learning git sry 2023-10-11 17:31:15 +00:00
Andrew Malsbury
ce16db9413 removed gui for custom fields 2023-10-11 14:42:22 +00:00
Andrew Malsbury
7e9c22171b Update button logic to disallow on draft... 2023-10-10 22:49:34 +00:00
Andrew Malsbury
533a547622 Update technical dashboard links. 2023-10-10 18:31:01 +00:00
Andrew Malsbury
74e2866a01 Adjusted the type dropdown 2023-10-10 16:52:00 +00:00
Andrew Malsbury
22a072f2b4 Merge branch 'itflow-org:master' into balance-sheet 2023-10-10 08:27:14 -05:00
Andrew Malsbury
7b772cf529 Something is broken with the confirm-link 2023-10-09 23:21:48 +00:00
Andrew Malsbury
96e493df4a Removed a testcase 2023-10-09 23:16:22 +00:00
Andrew Malsbury
4fbf448597 Updated balance sheet to use DB types 2023-10-09 22:15:27 +00:00
Andrew Malsbury
bb559a4bdb Fixed account type not showing by default on edit 2023-10-09 21:42:03 +00:00
Andrew Malsbury
9c099f7f98 Account Types bug 2023-10-09 21:24:31 +00:00
Andrew Malsbury
d5e03f101a fixed what @wrongecho suggested. 2023-10-09 20:39:32 +00:00
Andrew Malsbury
aef4ec0d20 Post handling for add and edit 2023-10-09 20:32:19 +00:00
Andrew Malsbury
31043da039 add more default account types 2023-10-09 20:31:54 +00:00
Andrew Malsbury
e4fc7bca23 New settings menu 2023-10-09 20:31:31 +00:00
Andrew Malsbury
72da87e608 New Settings Screen 2023-10-09 20:31:21 +00:00
Andrew Malsbury
3ef045eea1 New Modal 2023-10-09 20:28:12 +00:00
Andrew Malsbury
a8e03d4660 Switched to DB controlled Account Types 2023-10-09 20:27:53 +00:00
Andrew Malsbury
69272a8800 added account type post handling 2023-10-09 20:27:28 +00:00
Andrew Malsbury
03c8f47cf0 added account types table 2023-10-09 20:27:09 +00:00
Andrew Malsbury
81f34e20d7 Updated Version 2023-10-09 20:26:48 +00:00
Andrew Malsbury
749281a3e8 Switched to DB controlled Account Types 2023-10-09 20:26:36 +00:00
Andrew Malsbury
8b6c909d95 Switched to DB controlled Account Types 2023-10-09 20:26:03 +00:00
Andrew Malsbury
f190e100e8 Switched to DB controlled Account Types 2023-10-09 20:24:54 +00:00
Andrew Malsbury
2ee87f0f66 Switched to DB controlled Account Types 2023-10-09 20:24:49 +00:00
johnnyq
537f18efd2 Fix Incorrect var when setting timezone 2023-10-08 20:03:16 -04:00
johnnyq
43dc95c55a Fix missing </div> in ticket when we tried to fix merge conflicts 2023-10-08 19:59:26 -04:00
Johnny
20602c6f89 Merge pull request #746 from wrongecho/telemetry-small-edits
Telemetry - Fix typo & add polite note
2023-10-08 19:55:56 -04:00
Johnny
ebbe1e18c7 Merge pull request #738 from wrongecho/contact-click-call
Contacts phone numbers - add tel: hyperlink for click-to-call
2023-10-08 19:55:43 -04:00
Johnny
fac9f9502a Merge pull request #736 from wrongecho/ir-agent-force-pw-reset
Add function to reset all user/agent passwords in case of IR
2023-10-08 19:55:30 -04:00
Johnny
dcd17c7556 Merge pull request #735 from wrongecho/contact-details
Contact small edits
2023-10-08 19:55:16 -04:00
Johnny
1f067c17c4 Merge pull request #733 from wrongecho/ticket-update-type-email-match
Ticket updates - Default to internal update if contact is agent
2023-10-08 19:54:19 -04:00
Johnny
edf6e18dc3 Merge branch 'master' into ticket-update-type-email-match 2023-10-08 19:54:14 -04:00
Johnny
d1a627c209 Merge pull request #732 from wrongecho/email-parse-domains
Email parsing for all domains registered under a client
2023-10-08 19:50:44 -04:00
Marcus Hill
22f14cd5e7 Telemetry - Fix typo & add polite note regarding importance of telemetry data 2023-10-08 21:30:15 +01:00
wrongecho
5b49d35f1a Update SECURITY.md
Add placeholder for 1.0
2023-10-08 20:13:42 +01:00
wrongecho
ac51e6a8ad Update SECURITY.md
Reword security policy, include an escalation process (forum private discussion)
2023-10-08 20:09:17 +01:00
wrongecho
f1b017fc46 Merge pull request #737 from o-psi/Update-readme-with-install-script
Update readme with install script
2023-10-08 19:34:39 +01:00
Andrew Malsbury
f241d247be Update oneliner to not save the install file.
Updated oneliner to pipe the script directly to bash.
2023-10-08 13:07:56 -05:00
wrongecho
cd006d0625 Update first-interaction.yml
Refer bugs/features/support to forum
2023-10-08 17:32:21 +01:00
wrongecho
57403e1707 Update bug_report.md
Refer bugs/features/support to forum
2023-10-08 17:29:01 +01:00
wrongecho
0f4f670f9c Update feature_request.md
Refer bugs/features/support to forum
2023-10-08 17:28:56 +01:00
wrongecho
4025cfdcea Update support.md
Refer bugs/features/support to forum
2023-10-08 17:28:53 +01:00
Marcus Hill
623ebc783c Contacts phone numbers - add tel: hyperlink for click-to-call 2023-10-08 13:35:13 +01:00
wrongecho
b9cadd508d Update README.md / Update readme with install script #737 2023-10-08 09:03:25 +01:00
wrongecho
92eabf1e70 Update README.md / Update readme with install script #737 2023-10-08 09:02:18 +01:00
Andrew Malsbury
605eda879d Updated wording 2023-10-08 02:09:26 +00:00
Andrew Malsbury
221a020ec7 Update Readme to suggest install script. 2023-10-08 02:06:54 +00:00
Marcus Hill
45b3311f54 Add function to reset all user/agent passwords in case of IR 2023-10-07 22:44:29 +01:00
Marcus Hill
dff0b689ce Add confirm to anonymise and archive 2023-10-07 20:48:40 +01:00
Marcus Hill
263382073d Contact small edits
- Adjust behaviour when selecting "Send user e-mail with login details?" (show reset link OR prompt user to change password if tech set one)
- Email wording change (remove ITFlow reference and replace with MSP name)
- Show contact PIN in the portal
- Bump password min length to 8 (and enforce on tech side)
- Bugfix undefined send_email value
2023-10-07 20:42:48 +01:00
Andrew Malsbury
1455e20fad Added Total Equities and Liabilities 2023-10-07 18:05:21 +00:00
Andrew Malsbury
6a485a95b4 Allows for negative numbers for credit cards 2023-10-07 17:32:34 +00:00
Andrew Malsbury
3e96751bf0 Bug - Liabilities is showing Assets total 2023-10-07 17:31:55 +00:00
Andrew Malsbury
d63da07122 Updated setup - Cash Account: current asset type 2023-10-07 17:21:31 +00:00
Andrew Malsbury
3a879088ae Add balance sheet to side nav 2023-10-07 16:16:04 +00:00
Andrew Malsbury
5d964c9282 New Balance sheet report screen 2023-10-07 16:15:50 +00:00
Andrew Malsbury
f8bc2ee4b4 Add "account_type" to accounts table 2023-10-07 16:15:02 +00:00
Andrew Malsbury
844a85cee7 Update DB 2023-10-07 16:14:39 +00:00
Andrew Malsbury
29e2e5e0d7 Update DB, and added comments for next new guy. 2023-10-07 16:14:28 +00:00
Andrew Malsbury
bc95bb4e15 Update Accounts screen to show type 2023-10-07 16:13:46 +00:00
Andrew Malsbury
db5eee0ebb Add type dropdown 2023-10-07 16:13:10 +00:00
Andrew Malsbury
ccb67d8e5d Add type dropdown, and update opening balance star 2023-10-07 16:13:00 +00:00
Andrew Malsbury
9551399b08 Update add and edit to accomodate type 2023-10-07 16:11:19 +00:00
Marcus Hill
69eef8220d Ticket update behaviour - Default to internal update when contact email matches the agent email 2023-10-07 16:10:00 +01:00
Marcus Hill
4ac7841882 Email parsing for all domains registered under a client
- Add support for email parsing/contact creation for all domains registered under a client in the domains module, rather than just the client main website.

- Additionally fix domain_created_at bug and move the new ticket auto-reply message to the email queue instead

Future work: Make ticket parsing work with HTML emails (HTML emails break agent notifs)
2023-10-07 15:51:58 +01:00
johnnyq
0c0d89c1a6 do not allow user logged in to edit their own user by clicking on their avatar under users 2023-10-04 23:00:46 -04:00
johnnyq
6760997beb Set Company Timezone properly upon login 2023-10-04 22:38:29 -04:00
johnnyq
f842d2578f Add Software Key to export client pdf 2023-10-04 22:15:35 -04:00
johnnyq
8cfa0e97d4 Allow ticket priority and status to be searchable in main tickets view 2023-10-04 22:02:08 -04:00
johnnyq
b839f188ef Allow Contact name, Vendor name and asset_name to be searchable under both client tickets and the main tickets view 2023-10-04 21:59:05 -04:00
johnnyq
7e595d9436 Fix table offset issue with Assets Listings 2023-10-04 00:38:28 -04:00
Johnny
435c789e7f Merge pull request #731 from wrongecho/password-rotation-report
Client logins/passwords - Add basic password rotation report
2023-10-02 17:55:04 -04:00
Marcus Hill
f49cdf3a35 Client logins/passwords - Add basic password rotation report
This basic report shows you which client login entries have not had their passwords changed/rotated in the last 90 days.
Password rotation is no longer encouraged for users memorising their own passwords. However, password rotation is essential for service/shared accounts commonly used by MSPs in situations where individual accounts aren't available/viable.
2023-10-02 22:24:42 +01:00
johnnyq
7abdf53e9f Add .ovpn files to allow upload file list 2023-10-02 11:44:06 -04:00
Johnny
1e47107ed0 Merge pull request #730 from wrongecho/improve-totp-security
Client logins/passwords - Ajax change + logging
2023-10-01 22:45:05 -04:00
Johnny
51316f8c1d Merge pull request #729 from wrongecho/login-password-changed-at
Client logins/password - Add tracking in DB when passwords are changed
2023-10-01 22:44:50 -04:00
Johnny
e02e5efbec Merge pull request #728 from wrongecho/ticket-notif-spacing
Agent new ticket notifs - add more spacing
2023-10-01 22:44:36 -04:00
Johnny
5cda6156d4 Merge pull request #727 from wrongecho/settings-user-prevent-self-mod
Users - Prevent modifying yourself via users.php, should use profile
2023-10-01 22:44:22 -04:00
Marcus Hill
041fcb5613 Client logins/passwords - Ajax change + logging
A few changes to the credential manager TOTP function:

- The "hover to view" function now sends the login_id to ajax.php, rather than the TOTP secret
- Viewing the TOTP code is now audited in the logs under Login/View TOTP
2023-10-01 16:32:57 +01:00
Marcus Hill
c768034a1b Client logins/password - Add tracking in DB when passwords are changed/rotated 2023-10-01 15:22:42 +01:00
Marcus Hill
526503d786 Agent new ticket notifs - add more spacing 2023-09-30 23:21:30 +01:00
Marcus Hill
d02d2d4e4a Users - Prevent modifying yourself via users.php, should use profile 2023-09-30 20:32:34 +01:00
johnnyq
203ef85997 Show MFA status in user listing 2023-09-30 15:24:46 -04:00
Johnny
f726df8f80 Merge pull request #726 from wrongecho/setup
Small adjustments to setup: add subheadings and links to docs
2023-09-30 14:10:00 -04:00
johnnyq
90ac7042ba Allow Assigning a contact to all assets in some cases where network or servers may be co-managed 2023-09-30 13:52:04 -04:00
wrongecho
67c181b14b Update first-interaction.yml
Mention GNU GPL
2023-09-30 17:41:04 +01:00
Marcus Hill
0bee5956dc Small adjustments to setup: add subheadings and links to docs 2023-09-30 17:07:21 +01:00
Marcus Hill
63ba33afde Small adjustments to setup: add subheadings and links to docs 2023-09-30 17:04:42 +01:00
Johnny
90327a959f Merge pull request #724 from wrongecho/misc-wording-edits
Small wording edits (sharing links, documents, updater)
2023-09-30 11:50:07 -04:00
Johnny
24707e89d5 Merge pull request #725 from wrongecho/fix-client-delete
Fix client delete function
2023-09-30 11:36:59 -04:00
Marcus Hill
33628d81a1 Fix client delete function 2023-09-30 15:42:00 +01:00
Marcus Hill
c3dd9a80b6 Fix client delete function 2023-09-30 15:33:48 +01:00
Marcus Hill
9bb6e0b1c7 Touch-ups 2023-09-30 13:57:48 +01:00
Marcus Hill
2924791538 Codesmell 2023-09-30 13:55:49 +01:00
Marcus Hill
ac5b6c5424 Enhance git fetch error: include error on page if possible 2023-09-30 13:52:46 +01:00
Marcus Hill
05f25b3ebf Enhance git fetch error: include error on page if possible 2023-09-30 13:51:39 +01:00
Marcus Hill
ff161ab47b Small wording edits
- Ajax: Make link sharing text clearer/friendlier, include company name in subject and shared item description in body to help legitimise the message from spam
- Client doc details: Make edit summary text smaller
- Update: Enhance git fetch error wording, mention forum for support
2023-09-30 13:41:41 +01:00
johnnyq
e5e549482c Removed horizontal line on the botton of all the side navs 2023-09-29 22:44:26 -04:00
johnnyq
375d5af974 Fix issue with roundToNearest15 Function would break php if the time worked was empty 2023-09-27 16:01:44 -04:00
johnnyq
f914fbb96f Fix current_version var in cron.php when telemetry is configured this was caused by the cron not know what its working directory was added change to current working directory 2023-09-27 12:15:12 -04:00
johnnyq
f658fe0c6c Fix Close Ticket not showing when accounting module is disabled plus remove some extra markup not needed in ticket.php 2023-09-27 11:50:27 -04:00
johnnyq
31c9a6ad6c Fix invoice ticket price issue for auto price divide client rate into 4 to acommodate 15 Min increments 2023-09-26 18:13:00 -04:00
johnnyq
8ebe7eda03 Changed roundUpTo15 function to just round to the closest 15 2023-09-26 17:59:11 -04:00
johnnyq
d82e6f99ab Reworked how watchers get added and edited 2023-09-26 16:58:46 -04:00
johnnyq
e1ef89a9a4 Added DHCP option to IP Address field 2023-09-26 16:40:24 -04:00
johnnyq
498f9c7209 Changed button text from Show Archived to just Archived 2023-09-26 15:33:22 -04:00
johnnyq
8b3adae49d Dropdown UI fix icon alignment 2023-09-26 15:31:20 -04:00
johnnyq
7848043a40 shorted show_archive to just archived 2023-09-26 15:28:26 -04:00
johnnyq
35055489e5 Added Show Archived Button to contacts, setup logic to work in other List views as well 2023-09-26 15:24:31 -04:00
johnnyq
f8cdb79114 Moved import and export contact to the New Contact button dropdown as its not used as often and clear space for multi action or further search options 2023-09-26 14:56:26 -04:00
johnnyq
477e092b27 Updated client portal ticket details and document detail to use prettyContent js function 2023-09-26 14:28:36 -04:00
johnnyq
51489c2420 Update and move pretty tables function to a seperate js file and also add img-fluid to <img> tags so images dont run off the page and also update ticket details page with prettyContent function 2023-09-26 14:22:58 -04:00
johnnyq
1a5cd14208 Added format tables in document templates 2023-09-26 13:55:59 -04:00
johnnyq
48d8fdd760 Major UI update on Document Details, do not use TinyMCE to display document, created js function to add class table to tables for nicer look. Redesigned the Header 2023-09-26 13:47:18 -04:00
johnnyq
8b403613a8 updated document templates to include created by and other UI updates 2023-09-26 13:17:10 -04:00
johnnyq
f6d032f1d2 Moved Document Templates to settings 2023-09-26 12:55:38 -04:00
johnnyq
c8d1d4d5e1 Restore Client Delete functionality for clients for compliance sake 2023-09-26 12:01:49 -04:00
johnnyq
4adc0c7cd1 Remove destructive client delete from the frontend, still present in the backend, fix the ticket assign to no show active users 2023-09-25 12:20:42 -04:00
johnnyq
6af002122a Remove Relations on document when deleted or archived, added Short description field to summerize document changes or summerize a document, add header to Document Details showing Title, Date Created, Prepared by 2023-09-24 22:29:48 -04:00
johnnyq
26196a18e7 Updated DB Structure in Documentents to allow for created, updated by and document_description 2023-09-24 20:38:42 -04:00
johnnyq
c051afd52c Count the documents in the root folder as well 2023-09-23 19:43:11 -04:00
johnnyq
1218094270 When deactivating Shared Link delete it 2023-09-23 19:16:19 -04:00
johnnyq
0312a5f957 Client Side UI: Removed the black on white on black badge counters they were just to distracting changed it to a more suble light number, also merged side alert badges 2023-09-23 19:11:08 -04:00
johnnyq
51b2f6b4e5 Document Versioning: When opening a versioned document clearly define it is an archive file and the date it was archived at the top of document details 2023-09-23 18:18:03 -04:00
johnnyq
3b59f31d86 Fix Document Versioning not carrying related items 2023-09-23 18:09:43 -04:00
johnnyq
6b22390604 Tweaked Document Versioning logic, this update will update the db to update all exisiting document to update document_parent with the same primary_key ID 2023-09-23 17:57:06 -04:00
johnnyq
8d9f031cab Feature: Document Versioning is here! 2023-09-23 15:54:31 -04:00
johnnyq
61c9c0c8b9 Feature: Automatically calculate tickert to invoice based off time worked rounded up to the near 15 min mark multiplied by Client Rate, Changed all Price, cost fields to use text field with numeric patterns instead of number fields, set pricing to always display 2 decimal spots 2023-09-22 15:19:05 -04:00
johnnyq
1ccaa936ac Removed number type on 2FA input field replaced with text and inputmode='numeric' pattern='[0-9]*' 2023-09-22 12:43:18 -04:00
johnnyq
a8b3b24fba Added Document Revsion placeholder under document details also merged card and card-body div class to reduce indentation better code readability 2023-09-22 12:16:11 -04:00
johnnyq
9aa62a8b36 Add Vendor, asset and watchers now work as a 1 click under ticket details 2023-09-21 20:01:07 -04:00
johnnyq
b9fe774fe6 Reworked Markup code under ticket details, added frontend to change Vendor and asset 2023-09-21 18:50:34 -04:00
johnnyq
ba6e79dc8c Feature: Added Document Rename Modal to Document Listing 2023-09-21 17:03:53 -04:00
johnnyq
0bc10a30e8 Fix issue with login being restricted if HTTPS_ONLY is True and SSL is terminated at a proxy and then forwarded to ITFlow App as HTTP 2023-09-21 12:00:46 -04:00
Johnny
82893c8c72 Merge pull request #720 from wrongecho/start-email-customisation-basics
Ticketing: Custom subject/body example
2023-09-21 01:13:20 -04:00
johnnyq
ee79e43fad Do not count new Clients or Vendors on the dashboard if they were archived 2023-09-20 18:55:38 -04:00
johnnyq
cea210bcea Added asset_uri field to the API 2023-09-20 16:39:55 -04:00
johnnyq
d31127c137 set current code to an intval since its a number only 2023-09-20 14:58:05 -04:00
johnnyq
40d34bb71d Set 2FA Field on login to a number field so it only shows the numbers on a mobile phone 2023-09-20 14:53:07 -04:00
johnnyq
5938925a35 Added an error if accessing ITFlow by HTTP:// and is set to true 2023-09-20 14:51:29 -04:00
johnnyq
150defe815 You can now link files to documents 2023-09-19 23:35:10 -04:00
johnnyq
ca82a567d7 When client replies to a ticket via email update the status to Client-Replied 2023-09-19 18:29:17 -04:00
johnnyq
3bd8842171 Add 2FA code for Login/Password sharing 2023-09-19 18:21:57 -04:00
johnnyq
6bccc61b4a Display Asset Icon in asset Details 2023-09-19 18:00:10 -04:00
johnnyq
f3b949499d Client Assets now link to asset details page when click upon 2023-09-19 17:47:38 -04:00
johnnyq
ff281c923e Further additions to asset_details 2023-09-19 17:43:42 -04:00
johnnyq
5f779c33a2 Started working on a asset details page similar to contact details 2023-09-19 17:18:38 -04:00
johnnyq
f897705135 Fix 3 Letter Client Abbrevation function to remove htmlentity characters to fix ' being replace with a 0 2023-09-19 16:24:41 -04:00
johnnyq
0c0cb2cec9 Added UI support for linking assets, contacts, and licenses to Documents 2023-09-19 15:55:35 -04:00
johnnyq
5d74226762 Fix unlinking lock file 2023-09-19 11:40:11 -04:00
johnnyq
946f8d0b97 Initial start of Maintenance under settings 2023-09-19 11:39:11 -04:00
johnnyq
080a79c59d Fix Replicating email opps 2023-09-19 11:10:51 -04:00
johnnyq
65cf8519d0 Added file locks on the mail queue and ticket parse cron jobs to prevent over runs, reverted last commit back to not marking all messages in ticket parse as read 2023-09-19 10:51:52 -04:00
johnnyq
d56c8a91d1 Fix a possible race condition with duplicating tickets: Revert marking Email body peeking and flag all other emails not matching the ticket parser 2023-09-19 02:13:46 -04:00
johnnyq
5990f2e53a Bump TinyMCE from 6.4.2 to 6.7.0 2023-09-18 20:56:23 -04:00
johnnyq
40ced0f748 Updated the UI for downloading and displaying ticket attachments under ticket replies 2023-09-18 19:14:41 -04:00
johnnyq
f2a3c54ed7 Do not change ticket status upon ticket reply, just update the ticket update timestamp 2023-09-18 18:51:54 -04:00
johnnyq
2e12c3e9c1 UI Fix issue with browser status covering bottom portion of the side navs 2023-09-18 17:12:06 -04:00
johnnyq
a0f46cc049 If no contact selected give option to add one under ticket details 2023-09-18 16:36:35 -04:00
johnnyq
485bb68055 A Ticket Contact is now optional 2023-09-18 16:29:19 -04:00
johnnyq
d713031545 Priority and Contact are now clickable and changeable within ticket details 2023-09-18 15:07:12 -04:00
johnnyq
301d798963 You can now change ticket priority, contact or ticket Assignment by clicking on the element in the ticket listing 2023-09-18 13:23:21 -04:00
johnnyq
6109933f42 Updated Notification titles 2023-09-17 21:26:31 -04:00
johnnyq
827b880b28 Fixed edit scheduled ticket updated shoertenClient function to be even more intelligent 2023-09-17 20:08:41 -04:00
johnnyq
1b90a005e4 Added a php function to intelligently shorten a clients name to 3 characters 2023-09-17 19:49:09 -04:00
johnnyq
0987f3121f fix Pending tickets notification 2023-09-17 19:00:31 -04:00
johnnyq
40aaddd09b Update cron to Create notification of tickets pending assignment 2023-09-17 18:55:44 -04:00
johnnyq
8fa76daf3a Update cron ticket parser to set new ticket status to Pending-Assignment instead of Open 2023-09-17 18:42:17 -04:00
johnnyq
fdc7416ae9 Wording 2023-09-17 18:38:46 -04:00
johnnyq
beaa56dc36 Removed Ticket assignment through edit ticket, has to be done within the ticket itself, properly update the status to assigned and pending-assignment based off whos assigned to the ticket 2023-09-17 18:36:48 -04:00
johnnyq
fed51928c7 Updated Status Badge Colors 2023-09-17 18:10:21 -04:00
johnnyq
b23631226b Updated and added more descriptive Ticket Statuses 2023-09-17 18:06:07 -04:00
johnnyq
dbb28a9a4c Added new ticket status array for better communication and sorting 2023-09-17 17:25:28 -04:00
johnnyq
077fc1cf35 Added additional fields to cvategories for icon support and sub category support 2023-09-17 17:16:20 -04:00
Marcus Hill
2b6be6ba45 Ticketing: Add example logic for how we might allow customised subject/ticket body 2023-09-17 12:00:27 +01:00
wrongecho
d4c71955c6 Merge pull request #718 from ColDog5044/readme-release-update
Update estimated release month in README
2023-09-16 23:21:15 +01:00
johnnyq
6bd2919c18 Do not mark unprocessed email as read 2023-09-15 17:02:07 -04:00
Collin Laney
8e714e7afa Update estimated release month in README
Browsed the ITFlow Forum to find the estimated release month. Changed July to December. https://forum.itflow.org/d/257-v10-roadmap

Keep up the good work
2023-09-14 21:09:23 -04:00
johnnyq
deb5e87630 Tidy Queries and moved client to the ends of each entity in global search 2023-09-12 13:15:07 -04:00
johnnyq
19e9c3eeb5 Added Assets to Global Search 2023-09-12 12:51:00 -04:00
johnnyq
15d433f1d9 Invoice are now searchable via global search 2023-09-12 12:06:02 -04:00
johnnyq
7d1cfc586d Revert last commit invoice quote and recurring were already searchable by its concat prefix and number 2023-09-12 11:31:23 -04:00
johnnyq
878582f7c5 Allow to search via invoice, quote, recurring numbers 2023-09-11 18:46:43 -04:00
johnnyq
43fcf86a41 Fix 2023-09-11 18:22:21 -04:00
johnnyq
3f5c1c270a Fix Certificate Renewals 2023-09-11 18:20:59 -04:00
johnnyq
ba09ea7c67 Opps fix 2023-09-11 16:13:18 -04:00
johnnyq
f44641c5e4 Sort Client tags alphabetically when being show under client details, client listing and ticket details 2023-09-11 16:01:47 -04:00
johnnyq
7561364e91 remove get Cert Expiry date from cron job as its in functions now 2023-09-11 15:32:17 -04:00
johnnyq
9028f219b9 Moved get Cert Expiry date to functions.php 2023-09-11 15:31:43 -04:00
johnnyq
b80d730910 Added Cron task to update Certificate Expiry fields 2023-09-11 15:21:16 -04:00
johnnyq
b77886cc7e Bump PHPMailer from 6.8.0 to 6.8.1 2023-09-11 13:38:57 -04:00
johnnyq
3b645fc5fb Added missing asset description under client details 2023-09-11 13:07:39 -04:00
johnnyq
277c5bad68 Also subscribe the mail folder so it shows up under mail folders 2023-09-10 22:06:22 -04:00
johnnyq
f4963cbc45 Change folder name for ITFlow Proessed mail to ITFlow and put in the root instead of INBOX Folder. Also dont flag all other mail 2023-09-10 21:41:35 -04:00
johnnyq
2c14ae1a76 Added more padding to client overview cards 2023-09-10 20:32:05 -04:00
johnnyq
9753b96fed Fix mismatch of word URI and URL to just URI, fix it to not removed Service:// 2023-09-09 23:57:55 -04:00
johnnyq
bc1e2f1ea4 Updated DB schema with the new asset_uri 2023-09-09 23:43:12 -04:00
johnnyq
747e793e54 Added Asset URI can be used for a remote link 2023-09-09 23:40:18 -04:00
Johnny
be7492ae73 Merge pull request #714 from wrongecho/qr-charts-api
Google Charts - Use HTTPS instead
2023-09-09 14:13:20 -04:00
Johnny
a5fd5a2068 Merge pull request #716 from wrongecho/ticket-api-create
API: Tickets
2023-09-09 14:12:11 -04:00
Marcus Hill
c489a85fc0 API: Tickets
Add Create API endpoint for tickets.

Supported fields:
- Client ID
- Client Contact
- Subject
- Details
- Priority
- Agent assignee
- Vendor ID
- Vendor ticket ref
2023-09-09 15:28:18 +01:00
wrongecho
89d4f85869 Merge pull request #715 from wrongecho/asset-import
Bug fix: Asset import
2023-09-09 12:08:18 +01:00
Marcus Hill
19e159e9fd Bug fix: Asset import 2023-09-09 11:53:12 +01:00
Marcus Hill
a593e4cbbb Use HTTPS instead (eventually to move this into a local library) 2023-09-09 08:33:29 +01:00
johnnyq
6cb3d8f9d0 Truncate Client Name on client side nav 2023-09-08 01:51:29 -04:00
johnnyq
21a60c0619 Added confirm delete on delete contact 2023-09-08 01:15:12 -04:00
johnnyq
3d5c09abd0 Added a mail resend option under mail queuer it reset the the failed count to 3 2023-09-07 19:31:18 -04:00
johnnyq
85c1dede07 Show password field when local is selected for both edit and add contact 2023-09-07 18:18:27 -04:00
johnnyq
420647d481 Seperated domain refresher to seperate cron job this will need to be added manually if you want domain info to be refreshed, did this because sometimes it would break 2023-09-07 17:51:35 -04:00
johnnyq
3c8c173427 Fix Bad column count error upon importing passwords via CSV 2023-09-07 17:10:50 -04:00
johnnyq
6d1420712d Minor UI/UX update on mail settings 2023-09-07 16:46:36 -04:00
johnnyq
5f53082900 Spelling fix 2023-09-07 16:40:52 -04:00
johnnyq
0ae3a7fed1 Added more common net terms 2023-09-07 16:39:17 -04:00
johnnyq
718605dd8c Removed Mail from settings under ticket, invoice and quote settings as this is all configured under mail settings now 2023-09-07 16:28:36 -04:00
johnnyq
7dee46eee9 Changed company icon from a building to a briefcase 2023-09-07 15:50:20 -04:00
johnnyq
3e039f8664 Added Timezone selection under setup 2023-09-07 15:49:04 -04:00
johnnyq
e56d78b0a8 Added timezone selection to localiztion settings 2023-09-07 15:41:01 -04:00
johnnyq
44508cfa7c Moved Company Details settings localiztion settings to its own seperate settings called localiztion 2023-09-07 15:22:16 -04:00
johnnyq
b625400638 Renamed setting side nav to administration more suitable than settings 2023-09-07 15:06:05 -04:00
johnnyq
90b483e424 Moved Calendar, Trips and Reports under More sub heading on side nav 2023-09-07 14:44:36 -04:00
johnnyq
e1e966806c Added Login Description to Contact details to mimic client passwords 2023-09-06 11:23:42 -04:00
johnnyq
725370408c Decreased Content padding for mobile view, also decreased card body content in clients for mobile 2023-09-06 02:11:32 -04:00
johnnyq
903efec1dd When local auth is selected show the password box 2023-09-06 00:49:31 -04:00
johnnyq
747b7de143 Feature: Force MFA Part 3 - Enforce MFA by redirecting users to their user_profile to setup MFA if Force MFA is checked, next up is to lock them there until 2FA is set 2023-09-06 00:08:21 -04:00
johnnyq
17c8a9ab0c FEATURE: Force MFA Part 2 - Added to add, edit user 2023-09-05 23:44:42 -04:00
johnnyq
2a142f1c42 FEATURE: Force MFA Part 1 - DB Structure 2023-09-05 23:23:16 -04:00
johnnyq
8fb211c2dc Keep current view when switching between folders 2023-09-05 23:16:14 -04:00
johnnyq
eb1048ea4a Added Confirmation to Ticket Details Page, Closing ticket archiveing reply deleting etc 2023-09-05 19:04:43 -04:00
johnnyq
54c1befed9 Added Confirmation to Delete and Archiving tasks, also fixed broken trips page 2023-09-05 19:02:52 -04:00
johnnyq
4b368ee5af FEATURE: Confirmation Modal only grab clients initials for client side nav 2023-09-05 18:26:15 -04:00
johnnyq
316afa5603 Top bar is now fixed by default also fixed markup for side top headers 2023-09-05 17:19:02 -04:00
johnnyq
97521d1df7 added more actionable notifications 2023-09-05 16:44:31 -04:00
johnnyq
52b0a17e02 added more actionable notifications 2023-09-05 16:42:33 -04:00
johnnyq
853fbf0ba7 Ticket Notifications now are clickable and will go to the ticket details 2023-09-05 16:23:10 -04:00
johnnyq
7a27e5f6d2 FEATURE: Actionable Notifications Part 1 - Added Notificaiton Action to the DB this will allow notifications to become actionable 2023-09-05 16:12:31 -04:00
johnnyq
b1a9dda896 Ticket update bar Formatting Fix 2023-09-05 15:33:03 -04:00
johnnyq
d978e475bb Removed Closed from the Ticket Dropdown as it was accidenally hit sometimes 2023-09-05 15:31:09 -04:00
johnnyq
a5b034f877 Added Ticket Watchers card to the ticket details side bar 2023-09-05 15:25:25 -04:00
johnnyq
3513173ad0 Dudup Pagination requirement 2023-09-05 14:48:58 -04:00
johnnyq
941cbd37be Add Pagination to File Grid / Thumbnail View 2023-09-05 14:46:51 -04:00
johnnyq
baea5ed997 Fixed issues with ticket notifications 2023-09-05 13:53:42 -04:00
Johnny
d76f864c56 Merge pull request #713 from wrongecho/anonymise-contact-2
Auditing bugfix
2023-09-05 11:45:42 -04:00
Marcus Hill
06c88a0c8f Bug fix: Log entries auditing tickets created by agents now correctly log under the client 2023-09-03 22:09:58 +01:00
Johnny
0c4cded64e Merge pull request #712 from wrongecho/anonymise-contact
Add Anonymize Contact feature
2023-09-03 12:42:33 -04:00
Marcus Hill
b500556403 Add Anonymize Contact feature
- Contact name is redacted
- Contact details are removed
- Contact name/email is redacted from tickets & logs
- Contact is archived
2023-09-03 17:02:42 +01:00
wrongecho
1370ac3d6c Merge pull request #711 from wrongecho/portal-sso-fix
Fix Client Portal AAD SSO Button
2023-08-31 20:24:03 +01:00
Marcus Hill
dd43d8fd26 Adjust Client Portal AAD SSO Button to be HTML rather than Javascript due to CSP blocking inline JS. 2023-08-31 20:20:49 +01:00
johnnyq
81029e4605 Agent Resassign Ticket Email notification now uses the new mail queue system 2023-08-29 14:20:05 -04:00
johnnyq
34a4f27b19 Close Ticket Email notifications now utilize the new mail queue system 2023-08-29 13:23:36 -04:00
johnnyq
353b082f0c Converted Create Ticket Email Notification to the new mail queue system 2023-08-29 12:56:00 -04:00
johnnyq
1e254c9de4 Fix Broken domain listing 2023-08-28 18:23:18 -04:00
johnnyq
0898732ee7 Added more archiving capabilities across the board also dont show delete if folder is not empty, still need to add show archived data 2023-08-28 16:21:09 -04:00
johnnyq
a959f588f3 Updated hopefully everywhere for account so account_archived works properly also do not allow archiving of account if equals online payment account 2023-08-27 17:50:10 -04:00
Johnny
1c5398d85e Merge pull request #709 from wrongecho/new-ticket-notifications
Add notify by email function when a new ticket is created
2023-08-27 15:53:41 -04:00
Johnny
c070a14b0e Merge pull request #708 from wrongecho/link-backup-docs
Link to the backup docs when informing users to perform backups
2023-08-27 11:59:32 -04:00
Marcus Hill
b7108436fd Add notify by email function when a new ticket is created 2023-08-27 12:24:15 +01:00
Marcus Hill
42b5d82e2c Link to the backup docs when informing users to perform backups 2023-08-27 10:08:52 +01:00
Johnny
ac023a1eaa Merge pull request #706 from chandachewe10/master
Copy Updated Currencies from setup.php to get_settings.php
2023-08-26 10:39:07 -04:00
chanda chewe
bfae617d6e Copy Updated Currencies from setup.php to get_settings.php 2023-08-26 14:15:54 +02:00
johnnyq
90a3644eb9 Prepend Re: to ticket reply subject lines 2023-08-25 22:46:02 -04:00
johnnyq
eb98e82505 Remove tag icon top client header 2023-08-25 21:23:10 -04:00
johnnyq
f3c571f4eb Added Border on top of Card headers in Client Top Header 2023-08-25 21:16:35 -04:00
johnnyq
7b4efb4f17 Another Update to client header it does take little more space than the last one but it is collapsable, uncollapsed by default 2023-08-25 20:54:31 -04:00
johnnyq
0cfbe5f9f9 Client Header UI/UX Improvements: Reduced margin and padding, reduced font size in billing and support items, reworked some of the HTML code 2023-08-25 17:43:00 -04:00
johnnyq
38f31f3599 Updated more icons 2023-08-25 15:39:33 -04:00
johnnyq
125bc02323 Changed Zip / Postal to just Postal, chnaged locale to Language with a better icon and do not shot language code during select 2023-08-25 15:11:37 -04:00
Johnny
f6778b5ac1 Merge pull request #705 from chandachewe10/main
Main
2023-08-24 20:56:51 -04:00
johnnyq
6858d1f293 Feature: Vendors can now be linked to documents 2023-08-24 17:03:45 -04:00
chanda chewe
4d563da860 Added single missing quotes to currecies 2023-08-24 21:32:04 +02:00
chanda chewe
3b63290911 Added single missing quotes to currecies 2023-08-24 21:26:33 +02:00
chanda chewe
d931205798 Added single missing quotes to currecies 2023-08-24 21:24:49 +02:00
chanda chewe
2c807f433c Added single missing quotes to currecies 2023-08-24 21:22:14 +02:00
chanda chewe
37ad8cfd7f Added single missing quotes to currecies 2023-08-24 21:18:21 +02:00
chanda chewe
a70f20ff20 Added single missing quotes to currecies 2023-08-24 21:14:20 +02:00
johnnyq
6325301a00 Remove Licene Actions from Contact details this should be modified in licneses also removed the Login link with the asset as this can cause dupelicate assets if more than 1 password is assigned to an asset. This is due to 1 to 1 relation and really needs to be many to many relationship 2023-08-24 14:44:50 -04:00
johnnyq
01164e5415 Fixed Duplicating Licenes issue under client contact details page. This was becuase it was linking logins with licenses so if you had 5 logins for the license it would dupe 5 times. I need to change this code to be many to many relation in future. 2023-08-24 14:33:18 -04:00
johnnyq
597b7575d6 Reworked mail settings to include all mail related thing to be in one spot and easy to understand Also updated test email to test email from each email from address configured 2023-08-24 13:23:03 -04:00
chanda chewe
19e355f1a1 Added Missing Currencies 2023-08-24 10:52:20 +02:00
chanda chewe
2c3ac9d554 Added Missing Currencies 2023-08-24 10:03:44 +02:00
chanda chewe
c79c19bf8d Added Missing Currencies 2023-08-24 09:57:31 +02:00
chanda chewe
549fe8cc05 Added Missing Currencies 2023-08-24 09:37:00 +02:00
chanda chewe
44d84d2273 Added Missing Currencies 2023-08-24 09:25:49 +02:00
chanda chewe
f2a5963d84 Added Missing Currencies 2023-08-24 09:24:46 +02:00
chanda chewe
606307d255 Added Missing Currencies 2023-08-24 09:23:39 +02:00
johnnyq
0377eeb94e Add some padding between search and folders on phones in Client files and documents 2023-08-23 18:17:53 -04:00
johnnyq
12bbfd1db1 Add select2 Class on folder 2023-08-23 18:12:59 -04:00
johnnyq
f88f04edd8 Feature: Added Folder support for files 2023-08-23 18:02:51 -04:00
johnnyq
d200575aec Updated info to include only max 20 files can be uploaded at once 2023-08-23 16:52:57 -04:00
johnnyq
03e6e31f8c Also added 500MB Limit 2023-08-23 16:51:10 -04:00
johnnyq
1083ac88d9 Create some javascript that limits the amount of files to 20 that can be uploaded at once. 2023-08-23 16:48:42 -04:00
johnnyq
811f253470 DB Dump, store file hash in the db 2023-08-23 16:27:59 -04:00
johnnyq
a95b32a57e Upon upload the file contents are not hashed in Sha256 and used for the reference file in the DB 2023-08-23 16:10:15 -04:00
johnnyq
2633477575 Added Commented code to has the file contents itself instead of the name 2023-08-23 16:04:42 -04:00
johnnyq
4ec7c686c3 Updated the checkFileUpload fucntion to use SHA256 instead of MD5 for file reference and check file ext before checking size, also adding some error returns 2023-08-23 15:59:10 -04:00
johnnyq
30a6b3dadf Added a hint about selecting multiple files for upload 2023-08-23 15:50:51 -04:00
johnnyq
0897217357 Major UI / UX enhancements to Client Files. Files are now searchable can select between thumbnail and list view, pagination enabled, file renaming capabilities 2023-08-23 15:43:47 -04:00
johnnyq
037ae820a1 Removed old files upload code 2023-08-23 13:25:22 -04:00
johnnyq
44c4beba1e Feature: You can now upload multiple files at a time in the client files section 2023-08-23 13:24:05 -04:00
johnnyq
8f9753489f Updated contact extention ui 2023-08-23 10:41:14 -04:00
johnnyq
8fdc93ebde Show contact extention in the listing 2023-08-23 10:37:04 -04:00
johnnyq
1cf015c0b7 Use correct icon for mail queue 2023-08-22 18:36:56 -04:00
johnnyq
8402ca99ae Use correct icon for audit logs 2023-08-22 18:34:13 -04:00
johnnyq
c43b22ddd5 Fix initial DB Structure was causing new installs to direct to a non existent page dashboard.php 2023-08-22 18:19:15 -04:00
johnnyq
94e56f6d68 fixed an old unused var in client_locations which was allowing someone to delete a primary location which shouldnt be allowed 2023-08-22 15:48:55 -04:00
johnnyq
715938f367 Update login cred share guest sharing look 2023-08-22 14:19:28 -04:00
johnnyq
e5fea3ab9b Further cleanup of the guest sharing page 2023-08-22 13:55:42 -04:00
johnnyq
b361b3a384 Updated Guest sharing removed irrelevant info such as warnings about this will expire and notes as this will be sent in the pre email message, Removed App name and sharing from the top. Formatted the Style into a card, Added Company Info at the footer 2023-08-22 13:41:04 -04:00
johnnyq
c49ac5eb80 oops fix, added company name to guest share 2023-08-22 13:22:56 -04:00
johnnyq
42e23b6f08 Fix issue with editing client if accounting module was disabled due to the handling of client currency 2023-08-22 12:45:52 -04:00
johnnyq
6231d7b43c Fix logic to always show tech dashboard if accountiong module is disabled 2023-08-22 10:57:21 -04:00
johnnyq
9a7bea6ef9 Fix logic for showing billing column under client Management User role is admin or accountant and Module Accounting / billing is enabled 2023-08-22 10:50:40 -04:00
johnnyq
e31a0269b3 Make Client visible note optional in sharing 2023-08-22 10:15:01 -04:00
johnnyq
7c1cb0f617 Updated Sharing to include Unlimited Time and the option to use 0 for unlimited views 2023-08-22 09:57:57 -04:00
johnnyq
3f9c7fe220 Fixed empty var Last_login 2023-08-21 18:49:42 -04:00
johnnyq
8ef806ed1c Fix php error in users listing while fetching the last log it would return error if empty 2023-08-21 18:39:41 -04:00
johnnyq
9368a3b58d Fix user agent var is guest view 2023-08-21 18:20:27 -04:00
johnnyq
583fe9807d Updated placeholders for SMTP user and pass to inform users to leave blank if no auth is required 2023-08-21 12:25:10 -04:00
johnnyq
2fa442028a Updated sendSingleEmail function to allow for authless email sending 2023-08-21 10:44:54 -04:00
johnnyq
1ed4eeaafc Remove extra bottom margin below error msg on client login 2023-08-20 15:43:39 -04:00
johnnyq
880e1be08c Did the same for client portal login as well center forgot password 2023-08-20 15:30:36 -04:00
johnnyq
1d0e2ad758 Removed some of the right and left padding to allow for larger login messages 2023-08-20 15:27:43 -04:00
johnnyq
709cec8d7e More Icon Updating and matching 2023-08-20 15:06:08 -04:00
johnnyq
2d0fe45898 Enhance the client name font and place an arrow next to client to better indicate client section will be revealed when clicked on 2023-08-19 14:48:40 -04:00
johnnyq
257d3c0c9b UI: Updated icons for the client side nav 2023-08-19 14:34:52 -04:00
johnnyq
b7fcfb90e5 UI: Updated icons in setting nav 2023-08-19 14:21:05 -04:00
johnnyq
ff840bdeb5 UI: Updated some side nav icons that were more suitable for the item 2023-08-19 14:08:26 -04:00
johnnyq
7c3d6fc07a Rename side nav items again as the new names just took too much precious UI space 2023-08-19 14:00:20 -04:00
johnnyq
c3fd6824bf More descriptive naming for the main side navigation menu 2023-08-19 13:50:34 -04:00
johnnyq
c02448dff2 Small UI/UX update used mt-1 for better spaceing than <br> made export an outline button and cleaned up the small font in clients listing page 2023-08-19 13:25:15 -04:00
johnnyq
3652e9da08 sort recent tickets by created date 2023-08-19 00:45:00 -04:00
johnnyq
c89dbb4df3 Properly format category name for HTML Displaying in budget 2023-08-18 20:37:41 -04:00
johnnyq
78de89271c Create Budget report 2023-08-18 20:36:23 -04:00
johnnyq
94a3a3fa0e Var Fix 2023-08-18 20:07:28 -04:00
johnnyq
35b3c844ad New Dashboard stat for recurring Invoice added for selected year 2023-08-18 20:06:07 -04:00
johnnyq
d4510ddafb Fix Number of clients added on dashboard not directing to the right page when clicked 2023-08-18 19:53:37 -04:00
johnnyq
c7e981646f Show recurring Monthly expenses on the dashboard 2023-08-18 19:48:54 -04:00
johnnyq
47753f4419 Fix wrong vars in budget 2023-08-18 19:36:44 -04:00
johnnyq
b1aa8d3a91 Feature Budget working need to add some more features down the line 2023-08-18 19:34:20 -04:00
johnnyq
adf313f183 Feature - Budgets - Part 1 - DB Structure Created 2023-08-18 18:21:25 -04:00
johnnyq
258287ae0c Fix Export Clients removed extra space in delimiter 2023-08-18 17:37:01 -04:00
johnnyq
4a36efce38 Fix issue with document not showing when sending a shared Link 2023-08-18 16:58:29 -04:00
johnnyq
0672063ddd Fix Incorrect var in mail_queue.php 2023-08-18 16:35:54 -04:00
johnnyq
169f542039 Show Alerts and Defaults in settings if module accounting is disabled 2023-08-18 16:26:36 -04:00
johnnyq
cd27decb37 Fix issue when sending shared links it was using the ticket_from_email_address instead of the generic Email address programmed in settings > Mail > SMTP > Mail from Email 2023-08-18 16:11:57 -04:00
johnnyq
5e88bd4b37 Fix Opps 2023-08-18 15:37:35 -04:00
johnnyq
0d497163fe Feature: Login Message now complete can be set in settings > security 2023-08-18 15:35:31 -04:00
johnnyq
b987782adb Feature - Login Message Part 1 - DB Structure 2023-08-18 15:07:39 -04:00
johnnyq
d7ab2b2fec Fix issue with umlaught characters causing the contact name not to display properly in ticket details 2023-08-17 21:04:18 -04:00
johnnyq
ed9cb5c997 Split Mail Settings into 2 form sections, one for SMTP and one IMAP 2023-08-17 20:54:54 -04:00
johnnyq
ce2ba6d3d2 Feature: Records per page is now user specific and persists with logout/login sessions 2023-08-17 19:42:42 -04:00
johnnyq
94caee4aa6 Updated all expirations within 90 days in client overview, stale tickets now use the updated date and not created date and now only show tickets that havent been updated within 3 days as stale, added descriptors to the client overview cards 2023-08-17 16:46:57 -04:00
johnnyq
7d06be0946 Feature - Recurring Expenses - Cron Completed, project finished 2023-08-17 16:03:52 -04:00
johnnyq
3ee38c3fdd Feature - Recurring Expenses - Phase 3 - Completed POST Logic and create edit modals 2023-08-17 15:08:25 -04:00
johnnyq
7527b6d6f8 Feature: Recurring Expenses - Part - Added Side Menu and Listing code 2023-08-16 18:31:52 -04:00
johnnyq
ba9c80cd7d Feature: Recurring Expenses - Part 1 - Initial DB Structure Created 2023-08-16 17:56:32 -04:00
johnnyq
a207e0bc9a Fix Pagination Record select not showing the full number on Chromium based Browsers, fixed up pagination for Mobile view as well 2023-08-16 15:18:59 -04:00
johnnyq
04e22a60ec Fixed Importing Passwords was missing the uri insert field Fixes #704 2023-08-16 14:47:25 -04:00
johnnyq
d9dbe718bd Allow the reuse of colors in tags 2023-08-16 14:37:35 -04:00
johnnyq
2915d7a1b7 Replicated reworked tags code logic under client details and ticket details 2023-08-16 14:07:25 -04:00
johnnyq
86c36e08ab client tag cleanup in add and edit modal 2023-08-16 13:56:35 -04:00
johnnyq
514b5348cb For Client Tags If no icon is present use a tag icon 2023-08-16 13:48:57 -04:00
johnnyq
67de80c97e Cleaned up client tags display logic 2023-08-16 13:47:14 -04:00
johnnyq
b2a154e97a Client Tags are now clicklable within the clients listing page to filter down based on tag 2023-08-16 13:37:50 -04:00
johnnyq
1d277da73c DB Structure Dump to include config_start_page 2023-08-16 13:24:45 -04:00
johnnyq
fda0d203ed Feature: Added Start Page functionality 2023-08-16 13:23:30 -04:00
johnnyq
f93dc32241 Removed the requirement for SMTP username and password since the IP can used as a trusted SMTP relay 2023-08-15 17:48:10 -04:00
johnnyq
7fd795e9fb Added Software Licences expiring within 30 days to client overview 2023-08-15 17:40:02 -04:00
johnnyq
43f016f70f Allow Extra file extentions to be uploaded, increased file upload hard limit in code from 20MB to 500MB 2023-08-09 16:38:53 -04:00
johnnyq
850c3f7942 Fix grammar on share link email 2023-08-07 15:28:03 -04:00
johnnyq
cc80d41964 Cleaned up the watchers Modals 2023-08-03 19:36:02 -04:00
johnnyq
427ed8e57b Replying to a ticket through the ITFLow interface it will also email the watchers 2023-08-03 18:28:17 -04:00
johnnyq
0aedf95892 Removed watcher_created_at field as its irrelevant 2023-08-03 18:08:06 -04:00
johnnyq
dd46c5bcab Ticket watchers can now be add and deleted 2023-08-03 18:03:39 -04:00
johnnyq
76b0954d25 Reissue Previous Fix 2023-08-03 00:37:42 -04:00
johnnyq
73ac6cb8aa Fix issue where recurring invoices that were not sent didnt show up in all recurring invoices 2023-08-03 00:30:00 -04:00
johnnyq
653fa01ecc Fixed issue with scheduled tickets breaking CRON removed invalid character, More work on Ticket Watchers 2023-08-02 16:36:39 -04:00
johnnyq
173230d250 FEATURE - Ticket Watcher - Added Dynamic Add/Remove Watchers Form under new ticket contacts tab 2023-08-01 13:49:15 -04:00
johnnyq
b6dc255f8d FEATURE - Ticket Watchers - Initial Commit for DB Structure for ticker wathers 2023-08-01 13:03:58 -04:00
johnnyq
8511cdd1fe Added the Ability to Toggle the Ticket Timer Pause / Play 2023-07-31 14:30:37 -04:00
johnnyq
2bd6b11f03 Fix Ticket Timer for editing a ticket response / reply 2023-07-31 14:09:12 -04:00
johnnyq
336805e16b Fix Ticket Timer for users that user 12 Hour AM/FM Format, converted from time field to text added icon for timer representation 2023-07-31 14:06:47 -04:00
johnnyq
b195da0f6e Add Move to Folder Option in documents list view 2023-07-31 13:39:58 -04:00
johnnyq
86bf7801e4 Removed Default Todays Date in Add Copy Refund Expense 2023-07-31 13:13:23 -04:00
johnnyq
e26fe1551f Add some facial expression to the update to date 2023-07-25 23:39:39 -04:00
johnnyq
7fe8aafcac Update Latest Updates Wording 2023-07-25 23:29:49 -04:00
johnnyq
2e77999b92 Vendor Templates now has checkboxes for the fields you would like to update globally meaning all clients using that vendor template make it easier for only updating a few fields globally instead of them all like unique fields such as account number or pin 2023-07-21 20:34:02 -04:00
johnnyq
cff56f6507 Update Debug to include all table stats and current DB Version 2023-07-20 17:38:35 -04:00
johnnyq
bd9b5bdc2f Hopefully fixed an issue during initial setup after entering DB credentials and writing the config.php files. This was possible due to a rac condition where intially ITflow install checks to see if it can write config.php to currect directory by actually writing a config.php file then deleting it. This could sometimes interfere with the creation of the config.php file in the next step 2023-07-17 14:33:43 -04:00
johnnyq
956a18b9bb USe Current Timezone and not UTC 0 when calculating 1 hour increments when adding calendar events fixes #567 2023-07-15 16:22:33 -04:00
johnnyq
e09c9cadb5 Added Expire Date field to Quotes also Do not show Guests Accept or Decline if Date is Expired 2023-07-15 15:33:08 -04:00
johnnyq
313191aeb2 On Recurring Invoice List Frequency column should be displayed after Amount which make more sense when reading it 2023-07-13 17:23:18 -04:00
johnnyq
67f5de1170 Fix accidentally zeroed out edit ticket modal 2023-07-13 17:09:08 -04:00
johnnyq
46f7960cd0 Fix issue where primary contact is not being automatically selected when creating a new ticket under client this was due to how we changed the way primary contacts are stored in the Database - Also added display of the contact title and if they are primary or technical. Also Sort Primary first then technical under ticket add or edit -- see here https://forum.itflow.org/d/207-tickets-broke-again 2023-07-13 15:04:14 -04:00
johnnyq
8fa7449084 Fix Creating Scheduled Tickets under Main Scheduled Tickets - Was assigning the primary contact the old way changed it to the new way 2023-07-12 16:32:34 -04:00
johnnyq
c5eb4bddd2 Fix Creating Ticket under Main Ticket - Was assigning the primary contact the old way changed it to the new way 2023-07-12 16:21:42 -04:00
johnnyq
cb20894fc0 Fixed Centering footer for Guest viewing invoices and quotes 2023-07-11 13:47:13 -04:00
johnnyq
13ebb6c627 Late fees will be applied if enabled as a seperate line item on each over due invoice. The late fees will be applied every 30 days after the initial overdue invoice this is done by running cron.php daily 2023-07-11 13:25:37 -04:00
johnnyq
bb16c4b7b8 Feature: Late Fees can now be assessed to unpaid invoices 2023-07-11 11:40:53 -04:00
johnnyq
eb1e792e77 Only Show Monthly Recurring based off the year selected and all previous years 2023-07-10 16:01:53 -04:00
johnnyq
bec2156fa2 Combine Montly Recurring and Yearly Recurring to together to create a new monthly recurring 2023-07-09 12:25:42 -04:00
johnnyq
1bacabc72b Prevent duplicate sort, order and page GET VARs in the URL when Clicking to Sort a field or Clicking a page number. We now unset the GET VAR arrays before recreating the URL GET Strings 2023-07-08 14:40:00 -04:00
johnnyq
e7572c9e8f Rename vars sb to sort, o to order, p to page. This makes the code easier to understand and brings consistency 2023-07-08 12:34:28 -04:00
johnnyq
8213ef1e24 Updated .gitignore added .gitkeep files to HTMLPurifier Cache Directories as git ignore empty folders - fixes https://forum.itflow.org/d/197-actual-answer-to-customer-in-email-is-missing/6 2023-07-07 18:57:45 -04:00
johnnyq
473cf14610 Sort logins marked important always first 2023-07-07 16:50:22 -04:00
johnnyq
c916e249bd Fix Viewing Invoices and Quotes from Client Portal in Edge Browser reversed the slashes from backslashes to forward slashes - see https://forum.itflow.org/d/198-customers-unable-to-view-invoices-client-portal-using-edge 2023-07-07 16:45:48 -04:00
johnnyq
9baf64964a Fixed Umlaughts in email subject with the new Mail Queue System 2023-07-06 15:25:10 -04:00
johnnyq
6ea31adb99 Removed Old Duplicate code for reply tickets as it was using the queue method and the old method 2023-07-06 15:09:52 -04:00
Johnny
b54a388c15 Merge pull request #702 from haymaker/imap-credentials
Feature update: add credentials for IMAP
2023-07-06 14:47:51 -04:00
Haymaker
0633107514 update db migration statements - somehow missed in prev commit 2023-07-05 22:35:34 -04:00
Haymaker
aa984b92ef add credentials for imap 2023-07-04 18:52:00 -04:00
johnnyq
448da5f393 Moved Ticket Replies to the new Mail Queue 2023-07-04 15:00:41 -04:00
johnnyq
12d1fc5cb8 Added HTML Line Breaks after Ticket Reply 2023-07-04 13:32:31 -04:00
johnnyq
379529c6af Fix Regression issue when replying to a ticket via the web app the content doesnt show in the email body see https://forum.itflow.org/d/197-actual-answer-to-customer-in-email-is-missing 2023-07-04 13:08:53 -04:00
johnnyq
7f2f9a3c9e Fix Regression Global Search 2023-07-03 21:56:19 -04:00
johnnyq
9d39ad2628 Fix broken calendar events due to the new contact_primary field being moved 2023-07-03 20:34:15 -04:00
johnnyq
9d7d78473f Removed primary_contact and primary_location from the clients table 2023-07-03 20:23:29 -04:00
johnnyq
a5100ea187 Update the remaining logic to take advantage of the moved contact_primary and contact_location fields 2023-07-03 20:16:39 -04:00
johnnyq
85c19e36c6 Updated client listing logic to work with the new contact_primary and location_primary vars 2023-07-03 18:12:26 -04:00
johnnyq
86ef22dfc9 Copy primary_contact and primary_location enties over to thier respecting tables through a DB update 2023-07-03 17:59:12 -04:00
johnnyq
957b5b583c Sort primary location at the top always 2023-07-03 17:41:43 -04:00
johnnyq
567c01ce3f Update logic for adding and editing primary location 2023-07-03 17:40:14 -04:00
johnnyq
18274d532e When Adding new client add contact as important as well, when assigning a new contact as primary contact label them as important updated the logic add and edit logic to include the new field primary contact field under contacts 2023-07-03 17:31:37 -04:00
johnnyq
70a080a24e Always Sort primary contact at the top and Important Contacts under the primary contact following normal contacts 2023-07-03 16:50:52 -04:00
johnnyq
b12e3677bd DB Structure Update This is the beginnings to move primary_contact and primary_location fields out of the clients table and into their respectable table. Created the fields in contacts and locations, next is to write SQL query to migrate and then update pieces of the codes in the App 2023-07-03 16:40:45 -04:00
johnnyq
66ec189fae removed - 2023-07-03 16:20:28 -04:00
johnnyq
457bc7d471 Feature - Accounting: Added option in account transfer to add selectable payments to transfer notes which is useful to keep track what checks were deposited in a bank transaction such as a deposit as most banks don't display each check in a deposit. 2023-07-03 16:18:01 -04:00
johnnyq
cf494a2f4e Removed Edit Modal Fucntion within document listing, it was causing documents listing to slow with large documents. Still can be edited when clicked into the document 2023-07-02 14:12:43 -04:00
Johnny
335ff27e06 Merge pull request #701 from wrongecho/post-split-1
Separate post.php into sub-module files
2023-07-02 13:49:04 -04:00
Marcus Hill
f6c4e72c86 Fix some codesmells 2023-07-02 15:07:50 +01:00
Marcus Hill
ebecdd3da2 Post.php - Separate 9k lines into separate files by sub-modules (e.g. ticket, invoice, expense) for easier development and troubleshooting 2023-07-02 14:56:12 +01:00
johnnyq
1f29d68ad5 Updated client Documents to use folder icon on the side nav and header. Update Date Format as well 2023-07-01 13:33:42 -04:00
Johnny
2b871e06f0 Merge pull request #700 from wrongecho/cron-ticket-closed-replies
Ticket parser: Better handle clients replying to closed tickets
2023-06-26 19:42:29 -04:00
Marcus Hill
0240d316e7 Ticket parser: Better handle clients replying to closed tickets 2023-06-24 22:10:06 +01:00
johnnyq
1ad1b35101 Mail Queue support added for sending welcome email to contact 2023-06-22 21:51:03 -04:00
johnnyq
7ddff0421a Mail Queue support added to Manual Quote Emailing 2023-06-22 21:28:20 -04:00
johnnyq
149db0e715 Mail Queue support added to adding payment to invoice 2023-06-22 20:54:38 -04:00
johnnyq
76c82128d9 Cleanup send invoie logic 2023-06-22 15:09:57 -04:00
johnnyq
2d0458a2f3 Fix some formatting and additonal white space before contact name in Ticket Details part 2 2023-06-22 11:05:24 -04:00
johnnyq
6ccbe67b59 Fix some formatting and additonal white space before contact name in Ticket Details 2023-06-22 10:57:14 -04:00
johnnyq
682407ad64 Trim white space before and after when adding password to a contact 2023-06-22 10:29:27 -04:00
johnnyq
db9c102f53 Trim white space before and after username and password and before encrypting when adding a client password 2023-06-22 10:23:44 -04:00
johnnyq
9d86c41bcb Added With payments of 600 or more text to vendor expense report 2023-06-21 16:28:42 -04:00
johnnyq
d15eabfee4 Rewrite Expenses by Vendor Report to combine SQL queries into one and sort highest first and add the all years option 2023-06-21 16:25:43 -04:00
johnnyq
e2923304ea Show hint on income for clients report with payments of 600 or more 2023-06-21 16:07:01 -04:00
johnnyq
ab67929a22 Add All Years Option to Income by Clients Report 2023-06-21 16:03:56 -04:00
johnnyq
a67a925868 Another SQL Attempt to fix Client Balance calc 2023-06-21 15:47:19 -04:00
johnnyq
db4c823fc8 Fix Report for Client Balance Query 2023-06-21 15:36:36 -04:00
johnnyq
d3b446706b Modified Report Client with a Balance to Sort Highest Balance First 2023-06-21 15:26:16 -04:00
johnnyq
0c7fbda127 Added Report Clients with a Balance 2023-06-21 15:22:17 -04:00
johnnyq
090ecf2e80 Fixed issue when hovering over a created calendar event the cursor does not change to a finger 2023-06-21 14:47:25 -04:00
johnnyq
b883b31194 Label Top 5 2023-06-21 14:21:56 -04:00
johnnyq
b39f115dd1 Only show Top 5 in the following Doughnut charts: Income and Exp By Cat, and Vendor Expense lump everything else into others if more than 5 cats exist this prevents the graphs from overflowing if you have 10 or 100s of vendors expense cats or income cats 2023-06-21 14:18:20 -04:00
johnnyq
4d90327c79 Created Mail Queue Logs / Viewer in settings, enabled manual send invoice to use the new queue system, now it logs the Email ID so you can reference it in the Queue to see if it sent, also do not send mail to blank billing contact emails 2023-06-21 12:09:32 -04:00
johnnyq
c6afe0b3cf Removed uneeded logging with the mail queue start and end logs 2023-06-20 20:50:55 -04:00
johnnyq
53f05a9469 Update the email status to sending before actually sending to prevent duplicate or more 2023-06-20 20:45:10 -04:00
johnnyq
63100d7cee Remove unessessary date vars and re-enable cron key check for the new cron mailer 2023-06-20 20:37:20 -04:00
johnnyq
8b372c20e0 Update new cron email queuer script to resend failed mail every 30 mins for each failed attempt up 4 attempts 2023-06-20 20:34:29 -04:00
johnnyq
72bc5b41be Added additonal DB field to mail queue for send attempts failed_at timestamp and status along with recipient to name 2023-06-20 19:54:18 -04:00
johnnyq
05f41d1798 Update email sent at field only if the email was sent 2023-06-20 19:37:42 -04:00
johnnyq
6f0505d7e9 cron process mail queue created, now need to convert some of the code over to use the new mail queuer system 2023-06-20 19:34:34 -04:00
johnnyq
75dd00c98c Shortened the document detail and contact detail breadcrumbs to show the root level being the client 2023-06-19 19:15:23 -04:00
johnnyq
bc4607fdb4 Sort Important Contacts first 2023-06-19 19:10:16 -04:00
johnnyq
d1876e829c Added asset description to the API for create and update 2023-06-19 16:34:44 -04:00
Johnny
2c7f6b1127 Merge pull request #699 from wrongecho/login-enhancements
Login page enhancements
2023-06-19 16:29:54 -04:00
Marcus Hill
7f5e63e518 Fix undefined error for company name 2023-06-17 16:16:10 +01:00
Marcus Hill
a966bf0282 Adjust content security policy 2023-06-17 16:13:02 +01:00
Marcus Hill
95cd0ebdc8 Adjust CSP 2023-06-17 16:01:15 +01:00
Marcus Hill
57dab27169 Login page enhancements
- Default to secure cookies (in case var is not defined in config.php)
- Enable content security policy
- Return HTTP 401 response code for invalid username/password combinations
2023-06-17 15:09:01 +01:00
Johnny
8a33a45d20 Merge pull request #698 from wrongecho/fix-braces
Functions.php - IP checker - braces
2023-06-14 19:17:46 -04:00
johnnyq
14b2c48b24 Fix a Syntax err 2023-06-14 19:09:05 -04:00
johnnyq
25f85486d4 Client Portal can now be enabled or disabled in settings > Modules > Enable Client Portal, it is enabled by default 2023-06-14 19:07:39 -04:00
johnnyq
8085f7cd90 User client Rate for price by default for Invoice Ticket 2023-06-14 18:44:24 -04:00
johnnyq
32c9a933ea Invoice Ticket design update, Added functionality for vendor ticket number, asset, login description and contact pin codes 2023-06-14 18:39:24 -04:00
johnnyq
cdbff0d7f6 Updated DB Structure to include asset_description, login_description, contact_pin and a table for the new email_queuing system 2023-06-14 16:59:01 -04:00
Marcus Hill
2c53faddd4 Add curly braces around if statement, adjust to exit for consistency 2023-06-13 20:36:32 +01:00
johnnyq
1b0aaf4d27 Update Document details to use TinyMCE Readonly mode on display. Add Print Button. UI Updates etc 2023-06-06 18:48:19 -04:00
johnnyq
c1ff4f6855 Add link to Telemetry Information to our docs page on the telemetry settings section of ITFlow 2023-06-06 12:21:22 -04:00
johnnyq
1db519d820 Updated Tickets to use timeAgo function along with stand DateTime 2023-06-05 12:38:25 -04:00
johnnyq
f64ab630fd Added TimeAgo Function to convert mysql DataTime to a human readable time like 2 weeks ago similar to other apps like facebook do it. Added to function to Recent Activity under client overview 2023-06-05 12:25:39 -04:00
johnnyq
ca61556c4f Updated Client Overview Removed Recently updated and replaced with recent 8 logs, updated padding and card size per element 2023-06-05 12:11:24 -04:00
johnnyq
40da8a2e69 Bold Important Passwords 2023-06-03 21:49:33 -04:00
johnnyq
6519913eed Bold Important Contacts 2023-06-03 21:47:57 -04:00
johnnyq
cb2b846418 New Tickets that have not been updated now have their whole rows bolded 2023-06-03 21:43:46 -04:00
Johnny
ad7133ddb8 Merge pull request #695 from wrongecho/recently-updated
Client Overview - Enhance Recently Updated section
2023-06-03 20:15:02 -04:00
Johnny
bc4d626a9e Merge pull request #694 from wrongecho/enable-login-key
Enable login key code
2023-06-03 20:14:50 -04:00
johnnyq
4e075b9762 Merge branch 'master' of github.com:itflow-org/itflow 2023-06-03 20:13:37 -04:00
johnnyq
48a660094c Updated setup to wotk with the automatically generated cron key used in the itflow install script 2023-06-03 20:13:17 -04:00
Marcus Hill
82056aee64 Codesmells 2023-06-03 22:00:52 +01:00
Marcus Hill
d86b5d8992 Client Overview - Enhance Recently Updated section
- Move the asset warranty expiring and stale ticket queries out of inc_all_client.php and into client_overview.php, there is no need to load this data on every page load - just for the overview
- Show recently updated documents (in addition to contacts/vendors)
- General tidy
2023-06-03 21:58:34 +01:00
wrongecho
acbc935519 client_login_add_modal.php - capitalize 'software' 2023-06-03 21:24:54 +01:00
Marcus Hill
1175cc4ade Enable login key code (see #680) 2023-06-03 21:04:43 +01:00
johnnyq
39b4bce09e Revert Tidy UI design as it was not very copy paste friendly 2023-05-31 16:59:14 -04:00
johnnyq
f2e518e745 Tidy UI for debug 2023-05-31 16:42:52 -04:00
johnnyq
76d426f793 Add WebServer version 2023-05-31 13:43:15 -04:00
johnnyq
0c9f50fbda Tidy debug 2023-05-31 13:37:43 -04:00
johnnyq
386eb0c382 Added Installed Modules, Database stats such as Number Tables, fields, rows and db size, php, mysql and OS Versions, along with upload directory stats including file count and size 2023-05-31 13:31:03 -04:00
johnnyq
eb99807214 Added Debug report under settings currently only reports Database structure differences between Git Master Repo db.sql and current database structure of the installed instance 2023-05-31 12:43:12 -04:00
johnnyq
689c52ae3e Added select2 class on share with 2023-05-25 17:39:15 -04:00
johnnyq
d3281ecd18 Updated Share Model to have an Expire selection instead of selecting a date and time, also share link will now email a chosen contact that has a valid email with the secure link, along with notifications when link is clicked. The Link now adds the https:// in the beginning for easy copy paste 2023-05-25 17:35:09 -04:00
johnnyq
29dd0f6dee Fix issue under client tickets listing where contact name would appear incorrectly 2023-05-25 15:52:27 -04:00
johnnyq
9449a87a1f Strip Out http and https in domains, vendors and passwords 2023-05-22 10:39:50 -04:00
johnnyq
96d39a328f Remove old multi-company code causing breakage. Closes #689 thanks @Heart1010 2023-05-22 10:30:36 -04:00
Johnny
80fa93626a Merge pull request #688 from wrongecho/client-website-remove-protocol-regex
Add regex to remove http:// or https:// from client_website
2023-05-21 22:43:26 -04:00
wrongecho
20a65089b6 Update invoice_payment_add_modal.php
Tidy spacing
2023-05-20 20:34:20 +01:00
wrongecho
e8b5c881fe Update invoice.php
Tidy spacing
2023-05-20 20:31:12 +01:00
wrongecho
7d3f4fefbf Update functions.php
Tidy spacing
2023-05-20 20:27:37 +01:00
wrongecho
6c84b8edca Update expense_add_modal.php
Tidy spacing
2023-05-20 20:22:20 +01:00
wrongecho
a8f3b0fed1 Update custom_field_edit_modal.php
Tidy spacing
2023-05-20 20:21:23 +01:00
wrongecho
9fd57cef43 Update cron_ticket_email_parser.php
Codesmell
2023-05-20 20:20:05 +01:00
wrongecho
e650b7938e Update client_software_add_modal.php
Tidy
2023-05-20 20:18:15 +01:00
wrongecho
6673f27cec Update client_software_add_from_template_modal.php
Tidy
2023-05-20 20:16:30 +01:00
wrongecho
54911769c6 Update ajax.php
Tidy spacing
2023-05-20 19:50:48 +01:00
wrongecho
337bd27ee8 Update contact.php
Tidy spacing
2023-05-20 19:49:25 +01:00
wrongecho
eb2c42f4a3 Update cron_ticket_email_parser.php
Remove attachments to-do item as completed.
2023-05-20 19:47:33 +01:00
Marcus Hill
d0fa30d476 Add regex to remove http:// or https:// from client_website #684 2023-05-20 18:49:21 +01:00
Johnny
0abc6b384c Merge pull request #686 from bhopkins0/patch-2
Security enchancement for getIP() function
2023-05-20 11:30:49 -04:00
wrongecho
c63b965807 Merge pull request #687 from wrongecho/fix-leftover-vulnerable-code
Remove leftover SQL-injection vulnerable code
2023-05-20 15:36:03 +01:00
Marcus Hill
cea954008f Remove SQL-injection vulnerable code in this file that was previously fixed in inc_all_client.php 2023-05-20 15:33:46 +01:00
Brent Hopkins
23f7866c8f Increased security for getIP() function 2023-05-18 05:41:06 -05:00
johnnyq
c403380562 Sort Recurring Next Date ASC instead of DESC, add missing select2 class to select inputs 2023-05-17 12:04:12 -04:00
johnnyq
11eb104383 Fix carriage return and new lines in reply emails see https://forum.itflow.org/d/169-carriage-return-and-line-feeds-showing-in-ticket-email 2023-05-16 11:07:24 -04:00
wrongecho
a60a9456f0 Merge pull request #685 from wrongecho/rev-679
Ticket.php: Revert PR 679
2023-05-15 21:44:53 +01:00
Marcus Hill
0144132649 Ticket.php: revert PR 679
- Hide previous ticket count for now as this doesn't work as intended
2023-05-15 21:40:59 +01:00
johnnyq
77fb0e008f Stack Contact infosuch as phone, mobile and email for contacts on one column as these don't need tp be sortable and will make room for more detail columns to be sortable 2023-05-15 14:24:11 -04:00
johnnyq
1f580fc638 Updated README to exclude SummerNote and include TinyMCE 2023-05-15 13:33:40 -04:00
johnnyq
0b1b551df5 Remove SummerNote Code we have replaced this with TinyMCE 2023-05-15 13:32:21 -04:00
Johnny
0649931797 Merge pull request #683 from wrongecho/ticket-button-wording
Ticket.php
2023-05-15 13:29:15 -04:00
Marcus Hill
02ced0dbbd Fix codesmell 2023-05-14 20:19:07 +01:00
Marcus Hill
1057481039 Ticket.php
- Change wording of ticket 'Respond' button to 'Add note' if reply is internal
- Fix TinyMCE not loading under certain circumstances
- Correct varname 'prefix' to 'ticket_prefix' in reply alert message
2023-05-14 20:16:04 +01:00
wrongecho
eb4c5cbf34 Merge pull request #682 from wrongecho/master
Code tidy - ticket.php
2023-05-14 19:50:14 +01:00
Marcus Hill
40a8c6d723 Tidy 2023-05-14 19:48:29 +01:00
wrongecho
994d2fa5e4 Update README.md
Bump 1.0 release to July. Clarify security note to match docs.
2023-05-14 07:57:22 +01:00
Johnny
8861243792 Merge pull request #679 from aftechro/patch-11
Update ticket.php
2023-05-14 00:25:21 -04:00
Johnny
ee913da18f Merge pull request #680 from wrongecho/login-get-param
Add database structure for 'login key' protection concept
2023-05-14 00:24:16 -04:00
Johnny
9e91066a09 Merge pull request #681 from wrongecho/cron-email-invoice
Cron - Send invoices to all billing contacts + primary
2023-05-14 00:23:52 -04:00
AFTECH.RO
4183583ef5 Update ticket.php
changed the sql for previous ticket to prevent XSS attacks.
2023-05-13 23:30:33 +01:00
Marcus Hill
c2b6591cda Cron - Send invoices to all billing contacts + primary 2023-05-13 23:10:36 +01:00
wrongecho
d2d1b25e32 Update guest_pay_invoice_stripe.php
Rem comment re multi-company
2023-05-13 22:44:39 +01:00
Marcus Hill
5d6d7e389e Add database structure for 'login key' protection concept 2023-05-13 21:49:09 +01:00
AFTECH.RO
ffe4061429 Update ticket.php
Hide Previous ticket if none exists
2023-05-13 09:42:48 +01:00
AFTECH.RO
052d418bad Update ticket.php
Re-make of Related tickets (total open and closed) and contact card, showing previous ticket and status of it. Also, made the contact mobile and contact phone clickable (tel:$contact_phone)
2023-05-13 02:30:34 +01:00
Johnny
a79baae2a8 Merge pull request #677 from wrongecho/domain-expire-quotes
Fix domain registrar/webhost update not working
2023-05-12 18:51:34 -04:00
Marcus Hill
b281a19e6b Fix domain registrar/webhost update not working
- Quote the expiry field when updating a domain
- Better handle no web host being set
2023-05-12 23:26:39 +01:00
johnnyq
e67a75805c Fix: Authenticated users can craft a POST request to delete any file on the webserver. Thank you @
bhopkins0
2023-05-12 15:24:57 -04:00
johnnyq
51ee479130 oops fix replaced the actualy function with nullable 2023-05-11 18:34:06 -04:00
johnnyq
37fb696e63 Replace the remaining php files with nullable_htmlentites() 2023-05-11 18:27:48 -04:00
johnnyq
ccf0d3ab77 Replace all instances of htmlentities() with the new function nullable_htmlentities() thanks @bhopkins0 2023-05-11 18:23:36 -04:00
Johnny
f136a915b4 Merge pull request #676 from bhopkins0/patch-1
Add function to use htmlentities without deprecated error
2023-05-11 18:05:12 -04:00
Johnny
b1dfbada0c Merge pull request #675 from bhopkins0/master
Fixed clients.php blank page
2023-05-11 18:02:24 -04:00
Brent Hopkins
019050ba82 Add function to use htmlentities without deprecated error 2023-05-11 16:37:21 -05:00
Brent Hopkins
cdd2a31217 Update MySQL query 2023-05-11 16:07:05 -05:00
Brent Hopkins
9de9dcd1b3 Add client_tags.client_tag_tag_id to GROUP BY 2023-05-11 02:43:58 -05:00
Johnny
1e9c822033 Merge pull request #674 from bhopkins0/master
Fix "My Tickets" button CSS
2023-05-11 01:27:35 -04:00
Brent Hopkins
d1fc5c3c99 Change button look 2023-05-10 21:35:48 -05:00
johnnyq
8b89ba31db Fix Raise ticket under client portal another regression when we moved to TinyMCE. Expanded Document view to container width 2023-05-10 11:50:55 -04:00
johnnyq
cf0205ba21 Tidy Portal Header 2023-05-09 16:37:32 -04:00
johnnyq
901b51a18e Merge branch 'master' of github.com:itflow-org/itflow 2023-05-09 15:51:15 -04:00
johnnyq
485510a3ce Fix Create Ticket not submitting due to TinyMCE not respecting required fields in the textarea form inputs, removed the required fields for now 2023-05-09 15:50:26 -04:00
wrongecho
0665ec5701 Update bug_report.md
Add security notice to bug report
2023-05-09 20:30:07 +01:00
wrongecho
ad5743f176 Update support.md
Adjust security link
2023-05-09 20:28:29 +01:00
johnnyq
6f6ae476a9 Added comment in pagination_head.php regarding issue #673 2023-05-09 15:22:02 -04:00
johnnyq
8d666abc40 Tidy 2023-05-09 15:13:44 -04:00
johnnyq
163f14e791 Fixed Escaping issue with sortby unfortuantly with order_by mysql_escape is not enough and must also be filtered with a preg_replace Thanks @tdragon6 2023-05-09 15:12:39 -04:00
johnnyq
cb0366b9f7 Fix XSS in expenses and trips export CSV modal Thanks @tdragon 2023-05-09 12:11:42 -04:00
johnnyq
09ff8b710b Enable browser spell checker for TinyMCE 2023-05-09 00:31:09 -04:00
johnnyq
043a9cfa0a Fixed Ticket Reply currently an issue where required fields using TinyMCE wont POST looking into it 2023-05-08 22:15:23 -04:00
johnnyq
eb3decb4da Enabled TinyMCE for mobile users as well 2023-05-08 21:25:06 -04:00
johnnyq
c3a711d75d More TinyMCE in more places 2023-05-08 19:53:42 -04:00
johnnyq
01a37cb1e1 Replace Summernote WYSIWYG with TinyMCE 2023-05-08 18:44:00 -04:00
johnnyq
018f52eb67 Revert for now added HTML Purify to client tickets as well 2023-05-08 14:38:42 -04:00
johnnyq
eb9a8000b1 Fix Rendering issues with tickets editing because ticket client_tickets and ticket all share the same edit modal which already uses htmlentites to prevent xss but so it doesnt conflict with htmlpurify in ticket details we decided to split the vars to ticket_details and ticket_details_edit which is unfilter initially but gets filtered in the modals 2023-05-08 13:52:43 -04:00
johnnyq
9887fc4a19 Removed HTML Purify on tickets.php and use htmlentities instead to mimic client_tickets.php was causing some rendering issues when you goto edit a ticket under client tickets tested for XSS all tests came back clean 2023-05-08 13:24:43 -04:00
johnnyq
5ee78ef1f3 When deleting quote from the client or global list view redirect quote delete back to the correct corresponsing list view also make Delete Quote Functional on quote details 2023-05-08 12:37:05 -04:00
Johnny
53e0ebdbf6 Merge pull request #672 from wrongecho/portal-modules
Client Portal - quotes & docs
2023-05-08 11:35:34 -04:00
Johnny
226d3ffeb2 Merge pull request #671 from wrongecho/ticket-auto-close-2
Ticket autoclose:
2023-05-08 11:35:14 -04:00
Marcus Hill
db6b88edd3 Codesmell 2023-05-08 10:54:40 +01:00
Marcus Hill
0e062081cb Client Portal
- Allow primary + accounting/billing contacts to see quotes
- Allow primary + technical contacts to see docs
2023-05-08 10:50:53 +01:00
Marcus Hill
3a83a701b5 Ticket autoclose: Clarify auto-close help wording; only show as ticket status option if enabled 2023-05-08 09:43:46 +01:00
johnnyq
03e0dd8f5e Initial DB Structure for Projects and Tasks with Ticket and Client Linkage 2023-05-07 21:43:20 -04:00
johnnyq
93d4f3ebce You can now set the number of hours before a ticket is automatically closed if autoclose is set 2023-05-07 21:09:18 -04:00
johnnyq
37b375c1d9 Remove cruft 2023-05-07 20:47:15 -04:00
johnnyq
78695208b7 Fix custom Fields DB Structure Remove Unique Indexes change defaut type TEXT to text Added Add edit Delete Read for custom fields 2023-05-07 20:46:09 -04:00
johnnyq
0f758c5901 Finished DB Structure for the coming new feature custom fields 2023-05-07 19:45:55 -04:00
johnnyq
ac51f0cb72 Add Quick link to docs.itflow.org on the top bar 2023-05-02 14:58:35 -04:00
johnnyq
072c2f9e14 Fix cron stating cron key is always invalid 2023-05-02 13:45:23 -04:00
johnnyq
a0da341114 Updated initial db structure for installation 2023-05-02 12:36:18 -04:00
johnnyq
3f2f663b7b Check to see if args is set 2023-05-01 16:56:29 -04:00
johnnyq
f7ee489293 BREAKING CRON CHANGES: must generate a cron key before using cron. Cron will need updated like so php /full/path/to/cron.php [KEY] and same with cron_ticket_parse.php 2023-05-01 16:51:20 -04:00
Johnny
8110b0ffa7 Merge pull request #668 from wrongecho/portal-rem-company
Remove reference to non-existent company_id field in contacts table
2023-05-01 11:52:33 -04:00
Johnny
07ac69a528 Merge pull request #667 from wrongecho/ticket-auto-close
Add auto close ticket feature
2023-05-01 11:52:20 -04:00
Johnny
fc1eb4cd69 Merge pull request #666 from wrongecho/email-invoice
Send invoices to all billing contacts + primary
2023-05-01 11:51:13 -04:00
Marcus Hill
bf45c58ed1 Remove reference to non-existent company_id field in contacts table 2023-05-01 14:01:23 +01:00
Marcus Hill
dc2293c8dd Add auto close ticket feature 2023-05-01 02:02:45 +01:00
Marcus Hill
588206d79d When sending invoices manually, send to all billing contacts instead of just primary contact 2023-05-01 00:06:11 +01:00
johnnyq
8cf1bd8911 Set Working directory of cron parser upon initializtion which fixes relative path issue when adding attachments to tickets 2023-04-30 13:28:00 -04:00
Johnny
c11b3d5987 Merge pull request #665 from wrongecho/email-ticket-attachments
Email ticket attachments
2023-04-30 12:43:42 -04:00
Marcus Hill
0a9af8f2e0 Ticket attachments (email)
Email to ticket parser: Add support for email attachments
2023-04-30 10:52:25 +01:00
Marcus Hill
a3d8f5ab48 Ticket attachments (email)
Email to ticket parser: Add support for email attachments
2023-04-30 10:52:15 +01:00
Johnny
ab1582fe3a Merge pull request #664 from wrongecho/csp-initial-test
CSP - Client Portal Test
2023-04-30 00:35:08 -04:00
Marcus Hill
0340b080ad CSP - Client Portal Test
Add initial content security policy trial/test to some client portal pages
2023-04-29 19:39:42 +01:00
Johnny
a3353593db Merge pull request #663 from wrongecho/ticket-edit-strip-html
Sanitize ticket details output in main edit modal
2023-04-29 11:30:33 -04:00
Marcus Hill
c5966961da Sanitize ticket details output in main edit modal 2023-04-29 12:34:14 +01:00
wrongecho
ca0024feb9 Merge pull request #661 from wrongecho/email-ticketing-updates
Update documentation links on cron tickets
2023-04-29 10:03:11 +01:00
Marcus Hill
8247362891 Update documentation links 2023-04-29 09:52:53 +01:00
johnnyq
c5c4813f47 Update Links referencing the new documentation URLs 2023-04-28 19:53:23 -04:00
johnnyq
e54de2bb73 Feature: Users can now be exported to a CSV file 2023-04-24 17:03:01 -04:00
johnnyq
53b7f7d1d5 Feature: Client CSV Exportation 2023-04-24 16:48:47 -04:00
johnnyq
7fed50eb73 Updated all Export CSV to Modals with export disclaimer 2023-04-23 16:12:18 -04:00
johnnyq
541d1dd667 Add precautionary warning when exporting CSV data, still need to add modals for client data 2023-04-23 14:27:45 -04:00
johnnyq
53092fe9ca Updated Ticket email / replies with ##- Please type your reply above this line -## 2023-04-17 16:15:22 -04:00
johnnyq
c20f19568d Update ticket to require the body field to mimic the same function as edit ticket 2023-04-16 10:49:15 -04:00
Johnny
d0dae015a6 Merge pull request #658 from itflow-org/wrongecho-email-rm-beta
Remove beta from email ticket parsing
2023-04-15 22:47:55 -04:00
wrongecho
a765459b43 Update settings_ticket.php 2023-04-15 20:15:24 +01:00
wrongecho
515ea739de Remove (beta) from email ticket parsing 2023-04-15 19:52:47 +01:00
johnnyq
b784c48120 Opps Fix 2023-04-12 16:48:35 -04:00
Johnny
880b2fccb5 Merge pull request #657 from wrongecho/client-tax-fix
Fix client_tax_id_number variable name in edit modal
2023-04-12 16:47:15 -04:00
Marcus Hill
bc4e744384 Fix client_tax_id_number variable name in edit modal 2023-04-12 21:21:56 +01:00
johnnyq
f127719cbe Added new Field Client Tax ID Number, currently only vieable on the client top head, and under edit. It is also searchable 2023-04-11 16:20:48 -04:00
johnnyq
d27c83ab66 Fix Mail Parser, inserting \r \n 2023-04-11 11:23:19 -04:00
johnnyq
ca6e3c229e Remove a lingering D under transfers 2023-04-10 17:32:21 -04:00
Johnny
eb49233d20 Merge pull request #656 from wrongecho/ticketing-0423
Ticketing Updates - Change client
2023-04-10 15:17:07 -04:00
Johnny
1c6ff4f4f6 Merge pull request #655 from wrongecho/api-multi-select
Add multi-select/bulk deletion for API keys
2023-04-10 15:16:50 -04:00
Marcus Hill
a26f3087fc Change client - fix code smell 2023-04-10 19:13:31 +01:00
Marcus Hill
c55d2a8cda Add ticket_source field for future use (agent/portal/email) 2023-04-10 18:58:06 +01:00
Marcus Hill
2f19967a0d Comment ticket_created_by 2023-04-10 18:55:42 +01:00
Marcus Hill
1aa33585a0 Ticketing - add ability to change client 2023-04-10 18:52:23 +01:00
Marcus Hill
8d97feeb54 Add ticket_source field for future use (agent/portal/email) 2023-04-10 16:37:03 +01:00
Marcus Hill
4db390d72b Add multi-select/bulk deletion for API keys 2023-04-10 12:32:05 +01:00
wrongecho
2373718be6 Bump 1.0 release from Mar/Apr to Apr/May 2023-04-10 11:52:38 +01:00
wrongecho
8e44518faa Update old broken docs link to DocuWiki homepage 2023-04-10 11:51:28 +01:00
Johnny
21fc20645b Merge pull request #654 from wrongecho/dynamic-modals
Convert quote edit modal to be dynamically populated
2023-04-09 23:35:23 -04:00
Marcus Hill
5f79931787 Dynamic modals: codesmell 2023-04-09 20:14:15 +01:00
Marcus Hill
bdf74e77ba Convert quote edit modal to be dynamically populated 2023-04-09 20:10:19 +01:00
Johnny
6287a7ce3d Merge pull request #653 from wrongecho/files-logging
Enhance logging for file uploads/deletes
2023-04-09 13:28:20 -04:00
Marcus Hill
0e0c06eebf File logging - codesmell fix 2023-04-09 13:18:14 +01:00
Marcus Hill
e66e896904 Enhance logging for file uploads/deletes 2023-04-09 13:14:46 +01:00
Johnny
f63cd120c6 Merge pull request #652 from wrongecho/confirm-file-delete
Client file deletion
2023-04-08 20:36:58 -04:00
Johnny
f07bff116b Merge pull request #651 from wrongecho/fix-file-upload-auto-name
Bufix: Fix client file uploads
2023-04-08 20:35:14 -04:00
Marcus Hill
04dad13ad3 Client file deletion
- Add file delete confirmation modal
- Change file deletes to POST not GET requests in post.php as they are state changing
- Require CSRF validation for file deletes
2023-04-08 21:59:54 +01:00
Marcus Hill
9f25b436d6 Fix client file upload not automatically naming files or showing image previews 2023-04-08 20:48:55 +01:00
johnnyq
c2b25cbf7d Fix Recurring Invoice syntax 2023-04-06 16:44:11 -04:00
johnnyq
a5d9bd7abe Convert CSS to nl2br() functions where nessesessaery to interept new lines into html code, Tidy Code remove depreciated <center> Tags 2023-04-05 15:20:07 -04:00
johnnyq
74768d6801 Transfer Notes now render new lines in the list view 2023-04-05 14:53:52 -04:00
johnnyq
d43c2f2d06 FEATURE: Added Transfer notes to the transfers list and also made notes searchable and sortable 2023-04-05 14:41:43 -04:00
johnnyq
26aa63917f Only select used fields on SQL Query for Edit Add Refund and copy queries to reduce the SQL Load on large expense tables 2023-04-03 19:18:32 -04:00
johnnyq
a3e45d632f Merge branch 'master' of github.com:itflow-org/itflow 2023-04-03 19:08:52 -04:00
johnnyq
230efc83dd Feature: Added Optional Client Field to Expenses to track your expenses to the client 2023-04-03 19:08:37 -04:00
Johnny
9f30de408c Merge pull request #650 from meltyness/totpfix
fixes #477
2023-03-28 21:47:54 -04:00
root
67c72400f8 Fixed logic incompatibility between AJAX handler and base32 object usage convention. 2023-03-28 17:30:19 -05:00
johnnyq
c544dc4a2a New Feature: Added Hourly Rate to Client 2023-03-28 15:29:54 -04:00
johnnyq
1e2535359a Update Global Search Documents to reference actual document 2023-03-23 16:57:06 -04:00
Johnny
36b6347b66 Merge pull request #649 from XVicarious/patch-1
Fix #648
2023-03-22 23:51:12 -04:00
Brian Maurer
341644ba01 Fix #648 2023-03-22 21:16:13 -04:00
johnnyq
201db36c24 Moved more edit add vars to models 2023-03-21 21:18:12 -04:00
johnnyq
3202bceddd Set File Size to 20MB 2023-03-21 13:00:50 -04:00
johnnyq
035be88e72 Moved the remaining upload logics to use the checkFileUpload() Function 2023-03-21 12:53:01 -04:00
Johnny
0f1f324162 Merge pull request #647 from wrongecho/ticket-colours
tickets.php - Rename unused ticket_status_display to ticket_status_color
2023-03-19 12:26:09 -04:00
johnnyq
899b38d84b Fix another 0000-00-00 to NULL 2023-03-19 12:21:13 -04:00
Marcus Hill
6ac7843ee9 Tidy spacing 2023-03-19 16:00:55 +00:00
Marcus Hill
3718987f50 tickets.php - Rename unused ticket_status_display to ticket_status_color 2023-03-19 15:53:10 +00:00
johnnyq
b7e59aa023 Revert the UI update on drop notifications didnt look right too much code 2023-03-18 16:29:32 -04:00
johnnyq
52faf2fac9 Spruce up the Dropdown Notifications UI 2023-03-18 16:22:43 -04:00
johnnyq
d05aa0b829 When clicking on a notificaiton on the dropdown instead of dismissing it takes you to the client page if specified otherwise its an empty click, updated some entity_id for notifications in cron.php 2023-03-18 15:36:19 -04:00
johnnyq
a9c90a0c6a Opps Add db.sql back 2023-03-18 15:21:45 -04:00
johnnyq
1dc52ecc4f Added new field to notifications called entity_id which will reference an item related to the notificaiton so it can be clicked on to go directly to the entity under notifications 2023-03-18 15:17:45 -04:00
johnnyq
427c51b728 Bump phpMailer from 6.7.1 to 6.8.0 2023-03-18 12:44:55 -04:00
johnnyq
4a2d76b056 Fix https://forum.itflow.org/d/111-umlauts-are-replaced-in-the-subjects - Removed array_map htmlentities which wasnt needed since we are passing AJAX data over which is already formated properly 2023-03-18 12:29:23 -04:00
johnnyq
99eaaa71c4 Fix #646 Thanks @Heart1010 2023-03-16 12:39:07 -04:00
johnnyq
3f028e8560 Fix Broken API due to incorrect named function https://forum.itflow.org/d/119-api-broken 2023-03-14 18:59:43 -04:00
johnnyq
37e21e963b Add summernote WYSIWYG function to Raising a ticket as we sanitize outout with HTMLPurify 2023-03-13 20:06:36 -04:00
johnnyq
748041cd5d Fix issue relating to forum post https://forum.itflow.org/d/118-users-cant-raise-tickets due to mis-spelled function 2023-03-13 19:51:52 -04:00
johnnyq
1c9461c075 Added client_id to both notifications and logging when send invoice emails 2023-03-13 16:30:02 -04:00
johnnyq
f7f9135428 Added entity_id to logging when sending invoice emails 2023-03-13 16:26:12 -04:00
johnnyq
924159dfcb Wrong var sent for logging email address during invoice sends 2023-03-13 16:23:39 -04:00
johnnyq
76f02c46a8 Use htmlpurify to show client shared document, Clean up some formatting in guest item view, fixed Invoice and Quote not logging the client who view them this was a regression from the company removal 2023-03-13 15:45:12 -04:00
johnnyq
9d053dcc91 Undo Query need to rethink this one 2023-03-12 15:49:01 -04:00
johnnyq
89c4811aa6 Combined balance, reccuring monthly and paid to date to the clients query so now they can be sortable with less queries 2023-03-12 15:39:22 -04:00
johnnyq
e1cbd12f2e Updated Git Ignore to ignore HTMLPurify cache Remove HTMLPurify generated Cruft 2023-03-12 11:31:10 -04:00
johnnyq
7543bfc8bc Remove HTMLPurify generated Cruft 2023-03-12 11:28:10 -04:00
johnnyq
6a660a5429 Removed Ticket created at as this is done automatically at the DB level 2023-03-12 11:26:47 -04:00
johnnyq
f5175ff6e7 Remove HTMLPurify generated Cruft 2023-03-12 11:02:35 -04:00
johnnyq
58d058e62c Added Summernote WYSIWYG to client portal 2023-03-12 11:02:09 -04:00
johnnyq
c9dfb1ef6a Remove HTMLPurify generated Cruft 2023-03-12 10:49:17 -04:00
johnnyq
d37c3f0251 Rework htmlpurify function in client portal to properly santizie the output instead of the input Fix broken client avatar in client portal 2023-03-12 10:48:45 -04:00
johnnyq
c9143ec3c0 Remove HTMLPurify generated Cruft 2023-03-12 10:13:56 -04:00
johnnyq
fd6a8284c4 Fixed padding under client scheduled tickets, Removed HTMLPurify under schedueld tickets post as it is not needed and seems to be taken care of by the javascript modal 2023-03-12 10:13:03 -04:00
Johnny
ef6e294acc Merge pull request #644 from wrongecho/small-fixes-post-company-edits
Small fixes post company edits
2023-03-12 09:55:52 -04:00
Marcus Hill
e9ac93085d Fix typo 2023-03-12 10:12:53 +00:00
Marcus Hill
e2d4552e6e Re-indent & remove a random 'h' 2023-03-12 09:30:07 +00:00
johnnyq
20dbe285e8 Remove HTML Entity Decode from the HTML Purifier as this is not needed now 2nd attempt in ticket replies 2023-03-11 21:48:30 -05:00
johnnyq
4eeb2fdffa Remove Cruft 2023-03-11 21:47:36 -05:00
johnnyq
16b20c0bfa Remove HTML Entity Decode from the HTML Purifier as this is not needed now 2023-03-11 21:47:11 -05:00
johnnyq
af46738427 Only use HTMLPurify Library on Output only and SQL sanitize for input 2023-03-11 21:42:47 -05:00
johnnyq
6ecca50541 Garbage Remove 2023-03-11 21:25:08 -05:00
johnnyq
b5ae7b3d86 Used HTMLPUrify to Purify the output of Tickets, Documents, Document Templates. Removed Redundant htmlentities in edit document edit ticket etc, Removed Company ID from Document Template Details 2023-03-11 21:24:35 -05:00
johnnyq
00b9391de4 Remove Company_id from Document_details.php 2023-03-11 20:57:58 -05:00
johnnyq
8fcc43d1fb Fixed broken Online Payments Settings Page due to a regression 2023-03-11 19:34:30 -05:00
johnnyq
6a92b132bf Missing } 2023-03-11 19:15:53 -05:00
johnnyq
6a435157c1 Another try to make sure config.php is written before going further 2023-03-11 19:11:34 -05:00
johnnyq
709516853a Remove company_id fields in Setup no longer used also rework writing the config file 2023-03-11 18:50:18 -05:00
johnnyq
8308b47295 Fix missing user_id var in Setup, removed sleep(2) as it did not fix the issues where config.php was not written instead used an if condition to check to see if config.php is written before going further 2023-03-11 18:35:15 -05:00
johnnyq
e2f2960830 Fix regression that caused company setup to break because of a no longer used DB table, also attempt to check if config.php exists before moving onto the user step as sometimes during setuo it does not write the config.php file 2023-03-11 18:23:20 -05:00
johnnyq
a889f7d879 Add back api/v1/assets/read.php somehow got wiped during the big update also added the ability to query asset by MAC address 2023-03-11 17:15:46 -05:00
johnnyq
0ad86ab053 Fix Company File Upload Regression 2023-03-11 17:02:53 -05:00
johnnyq
48fe49cf77 BREAKING CHANGES - MAKE FULL BACKUP BEFORE PROCEEDING - Requires Manual Intervention on files see Forum Post Make sure you run the Database update directly after update. This Removes Multi-Company Functionality. Fixes issues with Reponsive tables and bunch of other UI and small Fixes 2023-03-11 16:16:46 -05:00
wrongecho
75da31d991 Merge pull request #643 from wrongecho/master
Documents
2023-03-11 20:05:53 +00:00
Marcus Hill
90bba73aac Documents
- Properly escape HTML in the edit modal
- Tidy
2023-03-11 19:55:38 +00:00
wrongecho
4344a4fcca Update ticket_reply_edit_modal.php
Sanitize any potential HTML output in ticket reply edit modal to summernote editor
2023-03-06 21:12:58 +00:00
johnnyq
b9112ddded tidy 2023-03-05 20:33:05 -05:00
johnnyq
a711bed38c Add sme more htmlemtities for consistency 2023-03-05 20:06:42 -05:00
wrongecho
9a3266190c Merge pull request #642 from wrongecho/stricter-input-validation-theme-tags
Add stronger input validation/output escaping
2023-03-05 19:31:22 +00:00
Marcus Hill
2210ad9f3e Add stronger input validation/output escaping for theme, tags and categories vars 2023-03-05 19:25:24 +00:00
Marcus Hill
feb0267002 Add stronger input validation/output escaping for theme, tags and categories vars 2023-03-05 19:13:48 +00:00
Johnny
ff18e704c8 Merge pull request #641 from wrongecho/cert-multi-select
Add bulk actions (delete) for client certificates.
2023-03-05 11:58:09 -05:00
johnnyq
cdf97ec83b Fix clients being duplicated when multiple tags are assigned to them 2023-03-05 11:40:20 -05:00
Marcus Hill
1c18599372 Add bulk actions (delete) for client certificates. 2023-03-05 16:20:09 +00:00
johnnyq
5640a22c18 Remove some more log created at and updated at as the DB does this for us 2023-03-04 16:17:29 -05:00
johnnyq
c0af8e8eab Add '' to the date vars under API assets if not empty so they dont error out when inserted into the DB 2023-03-04 16:13:38 -05:00
johnnyq
e01dea2fd0 Fix Assets API Missing $ on var and use NULL instead of 0000-00-00 when inserting into the DB similar to POST 2023-03-04 15:58:34 -05:00
johnnyq
426b07a093 Fix issue with ulauts in the subject field of tickets opened using email parser. Removed htmlentities on subject replaced with the new inputSanitize See https://forum.itflow.org/d/111-umlauts-are-replaced-in-the-subjects 2023-03-03 12:14:29 -05:00
johnnyq
7228d8b6e6 Fix #640 2023-03-02 16:20:03 -05:00
johnnyq
7445cf1910 oops somehow dahsboard_technical got removed put it back 2023-03-01 16:28:11 -05:00
johnnyq
e42095a85e Tidy code 2023-03-01 16:26:41 -05:00
johnnyq
45b686dafc Fix issue with cron not sending recurring emails due to a misspelling 2023-03-01 14:09:58 -05:00
johnnyq
5114c1acc9 Fix possible Setup bug where it sometimes doesnt create the config.php and moves on. The hopeful fix is after creating config.php, sleep for 2 seconds which will wait for the file to be written fully to the filesystem before moving ahead. This issue could arrise with slow disks 2023-03-01 11:16:53 -05:00
johnnyq
b7c855a67d Fix #639 2023-03-01 11:07:56 -05:00
johnnyq
b2deebfa42 Reverted still causing issues with duplicate clients 2023-03-01 01:11:25 -05:00
johnnyq
58e08c1e60 Still getting dupes in clients with multiple tags redid the query 2023-03-01 01:09:14 -05:00
johnnyq
d50397f291 Add back additional Groupby in Client oops 2023-03-01 01:03:40 -05:00
johnnyq
373df5c4d1 Merge branch 'master' of github.com:itflow-org/itflow 2023-03-01 00:59:30 -05:00
johnnyq
3783fcfef6 Converting 0000-00-00 date values to NULL as this is best practice and compitible with MySQL 2023-03-01 00:59:14 -05:00
johnnyq
1a5bffd2e0 Updated the client inc to remove date 0000-00-00 format to fix issue with MySQL 2023-02-28 23:52:20 -05:00
johnnyq
99dc294145 rewrite income by client report SQL query to join as a single query instead of multiple
;
2023-02-28 23:04:25 -05:00
johnnyq
47dbd46bf3 rewrite the Recurring Incpome by Client report into 1 Query instead of multiple 2023-02-28 22:41:24 -05:00
johnnyq
94c020f689 Fix issue clients listing being broken with MySQL server due to not specifiying all non aggregate columns be in the GROUP BY Field, this was not an issue with mariaDB 2023-02-28 22:15:09 -05:00
johnnyq
e14fe2474c Updated Multi Action UI and some logic 2023-02-28 20:16:07 -05:00
johnnyq
cdfb61b294 Added a helper if no tags exist when attempting to add them to a client, Added some santizeInput tags to API 2023-02-28 11:58:08 -05:00
johnnyq
2acb5e0b7b Possible fix for MYSQL Date not handling 0000-00-00 2023-02-27 12:35:41 -05:00
johnnyq
a79e4b496c Fix regression in client listing which broke searching between dates 2023-02-27 12:26:46 -05:00
johnnyq
18a8122d4c Merge branch 'master' of github.com:itflow-org/itflow 2023-02-26 22:39:54 -05:00
johnnyq
fdb34b2613 Toyed with the idea of showing Which Column is being sorted and if its ASC or DESC in dismissed notifications 2023-02-26 22:39:34 -05:00
johnnyq
fbc30248de Toyed with the idea of showing Which Column is being sorted and if its ASC or DESC in dismissed notifications 2023-02-26 22:37:30 -05:00
johnnyq
0269f416a5 Toyed with the idea of showing Which Column is being sorted and if its ASC or DESC in dismissed notifications 2023-02-26 22:36:12 -05:00
Johnny
b9b383cbd2 Merge pull request #631 from wrongecho/532-remove-add-company
Remove ability to add new companies
2023-02-26 21:58:07 -05:00
Marcus Hill
8de76fdded Remove ability to add new companies
As part of the ongoing removal of the multi-company feature, this PR/commit removes the ability to add new companies in settings.
2023-02-25 21:53:20 +00:00
4799 changed files with 501081 additions and 96162 deletions

2
.github/FUNDING.yml vendored
View File

@@ -1 +1 @@
custom: ["https://www.paypal.com/donate/?business=QP4U384PMVBMU&no_recurring=0&item_name=Help+support+the+development+of+ITFlow&currency_code=USD"]
custom: ["https://services.itflow.org"]

View File

@@ -1,32 +1,23 @@
---
name: Bug report
about: Something not working quite right? Create a report to help us improve!
title: ''
labels: ''
about: Please report bugs on the Forum @ https://forum.itflow.org/t/bug
title: 'Please report bugs on the Forum'
labels: Support
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
We're now using GitHub Issues exclusively for development.
-
**Can you reproduce this on the demo at demo.itflow.org**
Yes/No/NA
Going forward, GitHub Issues will be used to track confirmed bugs & planned features via Github Projects. This allows us to keep GitHub clean & tidy, whilst maintaining an active and relaxed community experience on the Forum.
**Are you on the latest available version of ITFlow, with an up-to-date database structure?**
Yes/No
Please raise bugs on the forum @ https://forum.itflow.org/t/bug. Make sure to mention whether you can replicate the bug on demo.itflow.org.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
4. See error
Thanks,
**Expected behavior**
A clear and concise description of what you expected to happen, if not obvious.
The ITFlow team :)
**Screenshots**
If applicable, add screenshots to help explain your problem.
--
**Additional context**
Add any other context about the problem here.
To privately discuss a security issue, please see https://github.com/itflow-org/itflow/security

View File

@@ -1,16 +1,25 @@
---
name: Feature request
about: Please discuss new features on the Forum @ https://forum.itflow.org/t/features
title: ''
title: 'Please discuss new features on the Forum'
labels: Support
assignees: ''
---
We're now using GitHub just to track features we're definitely planning to implement (and bugs!).
We're now using GitHub Issues exclusively for development.
-
Please discuss new feature requests on the forum @ https://forum.itflow.org/t/features. This allows us to gather interest & feedback on the features people feel are most important, whilst keeping GitHub cleaner and more about the code.
Going forward, GitHub Issues will be used to track confirmed bugs & planned features via Github Projects. This allows us to keep GitHub clean & tidy, whilst maintaining an active and relaxed community experience on the Forum.
New feature requests here will be closed.
Please discuss new feature requests on the forum @ https://forum.itflow.org/t/features. When creating discussions, try to imagine how your proposed feature would also benefit other users.
Thanks :)
All new feature requests raised here will be closed, unless agreed otherwise.
Thanks,
The ITFlow team :)
--
To privately discuss a security issue, please see https://github.com/itflow-org/itflow/security

View File

@@ -1,18 +1,25 @@
---
name: Support
about: Please visit the Forum or Discord for support
title: ''
about: Please request support on the Forum @ https://forum.itflow.org/t/support
title: 'Please visit the Forum for support'
labels: Support
assignees: ''
---
Please visit the Forum or Discord for support
We're now using GitHub Issues exclusively for development.
-
Forum - https://forum.itflow.org/
Going forward, GitHub Issues will be used to track confirmed bugs & planned features via Github Projects. This allows us to keep GitHub clean & tidy, whilst maintaining an active and relaxed community experience on the Forum.
Discord - https://discord.gg/ZjCcBzTUDr
Please use the forum for support queries/issues: https://forum.itflow.org/t/support
All new support requests raised here will be closed.
Thanks,
The ITFlow team :)
--
To discuss a security issue, please see: https://i.imgur.com/P03o0Sy.png
To privately discuss a security issue, please see https://github.com/itflow-org/itflow/security

37
.github/workflows/dbsql-lint.yml vendored Normal file
View File

@@ -0,0 +1,37 @@
name: SQL Syntax Check for db.sql
on:
pull_request:
paths:
- 'db.sql'
jobs:
syntax_check:
name: Check db.sql SQL Syntax
runs-on: ubuntu-latest
services:
mariadb:
image: mariadb:latest
ports:
- "3306:3306"
env:
MYSQL_RANDOM_ROOT_PASSWORD: "yes"
MARIADB_USER: user
MARIADB_PASSWORD: password
MARIADB_DATABASE: itfsyntaxdb
options: >-
--health-cmd="healthcheck.sh --connect --innodb_initialized"
--health-interval=10s
--health-timeout=5s
--health-retries=3
steps:
- name: Checkout Repository
uses: actions/checkout@v3
- name: Import & Lint db.sql
run: mysql --host 127.0.0.1 -uuser -ppassword itfsyntaxdb < db.sql
- name: Show imported tables
run: mysql --host 127.0.0.1 -uuser -ppassword itfsyntaxdb -e "show tables;"

View File

@@ -10,18 +10,20 @@ jobs:
run:
runs-on: ubuntu-latest
steps:
- uses: actions/first-interaction@v1.1.1
- uses: actions/first-interaction@v1.2.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
issue-message: |
Hello & Welcome! :)
Thanks for taking the time to get in touch. We'll review this issue shortly.
Thanks for taking the time to get in touch.
Whilst you're waiting, please feel free to check out the [forum](https://forum.itflow.org).
We ask that all bugs/feature/support requests are raised via the [forum](https://forum.itflow.org). We'll be in touch shortly to confirm.
pr-message: |
Hello & Welcome! :)
Thanks for taking the time to help improve ITFlow. We're excited to review your contributions - we'll review this PR as soon as we can!
Whilst you're waiting, please feel free to check out the [forum](https://forum.itflow.org).
Just so you know, all contributions to ITFlow are licensed under the GNU GPL. By contributing you grant us a perpetual & irrevocable license to include your work in ITFlow.

View File

@@ -12,4 +12,4 @@ jobs:
- uses: actions/checkout@v2
- name: Check PHP syntax errors
uses: overtrue/phplint@4.1.0
uses: overtrue/phplint@9.4.1

42
.gitignore vendored
View File

@@ -1,17 +1,51 @@
node_modules
config.php
uploads/favicon.ico
uploads/clients/*
!uploads/clients/index.php
uploads/custom/*
!uploads/custom/index.php
uploads/documents/*
!uploads/documents/index.php
uploads/document_templates/*
!uploads/document_templates/index.php
uploads/expenses/*
!uploads/expenses/index.php
uploads/recurring_tickets/*
!uploads/recurring_tickets/index.php
uploads/settings/*
!uploads/settings/index.php
uploads/users/*
!uploads/users/index.php
uploads/tmp/*
!uploads/tmp/index.php
backups/*
!backups/index.php
!backups/.htaccess
.idea/*
uploads/tickets/*
!uploads/tickets/index.php
uploads/ticket_templates/*
!uploads/ticket_templates/index.php
.idea/*
plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/*
!plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/HTML/.gitkeep
plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/*
!plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/URI/.gitkeep
plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/*
!plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/.gitkeep
.vscode/settings.json
admin/custom/*
!admin/custom/readme.php
agent/custom/*
!agent/custom/readme.php
client/custom/*
!client/custom/readme.php
guest/custom/*
!guest/custom/readme.php
cron/custom/*
!cron/custom/readme.php
scripts/custom/*
!scripts/custom/readme.php
setup/custom/*
!setup/custom/readme.php
api/v1/custom/*
!api/v1/custom/readme.php
.zed

2
.htaccess Normal file
View File

@@ -0,0 +1,2 @@
# Prevent access to .git, .github, and config.php
RedirectMatch 404 ^/(\.git|\.github|config\.php)

797
CHANGELOG.md Normal file
View File

@@ -0,0 +1,797 @@
# Changelog
This file documents all notable changes made to ITFlow.
## [26.02.1] Maint Release
### Bug Fixes
- Credentials: Fix Password Generator.
- Calendar: Restrict Events for client restricted agents.
- Ticket Merge: Fix.
- Asset Transfer: Fix.
- Ticket Listing: Restrict Tickets presented in ticket list view from client restricted agents.
- 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.
### New Features & Updates
- Report: Added Client Detail Auditing.
- API: Added Endpoint to retrieve time worked by agent.
- ajax-modal: Revert to previous JS implementation before 26.02 release.
- Ticket: Move Subject from Ticket main ticket header to ticket details card header.
## [26.02] Stable Release
### Bug Fixes
- Mail Parser - Do not automatically send new ticket notifications to noreply/donotreply addresses.
- Ticket: removed newline \n on Parsed emails.
- Show Trips for everyone if accounting module is enabled.
- Fix Invoice Exporting.
- Fix Billable Column not sorting correctly in tickets.
- Fix Login flow where user agent and client user exists and agent has MFA but will not let them continue.
- Fix passing missing user_id var in client portal.
- Fix Ticket Templates not auto filling when selected.
- Fix Invoices not being sent to all billings contacts when manaully sent.
- Fix Documents and Files not able to be bulk deleted.
- Fix Role Archiving, can be archived as long as no users are assigned to the role.
- Fix showing Powered By ITFlow visibility on the login screen when Whitelabel is enabled.
- Missing username in audit log on successful login due to missing passed user_id to logging.
- API: Fix updating all documents instead of the intended document.
- Documents: Fix Document created at not showing the correct creation date of the master document.
- Ticket: Fixed Using edit ticket modal agent was not able to be set.
- Always check if a user is archived and or disabled instead of just during login.
- Report: Fix Collected tax report not totalling all tax categories.
### New Features & Updates
- Task Approval System for ticket tasks: Once an approval is requested, the task cannot be marked as complete until approved. Internal Approvals Any other technician, or Specific technician, Client Approvals Anyone (usually the requestor) Tech contacts Billing contacts.
- Printable Invoice Packing Slips now available.
- Drastic Performance Bump: Up to 50% faster queries accross the board and reduced server memory usage by 40% by switching Database Query method from mysqli_fetch_array to mysqli_fetch_assoc.
- Added Connect to Microsoft 365 Button to mail settings.
- OAUTH2 support for Microsoft 365 and Google Workspaces is now considered stable and working.
- Favorites: Assets and Credentials now can be favorited singly or by Bulk action. Favorited items appear in the client overview now.
- Files/Documents: Collapsable folders feature, collapsed by default with a button to expand all.
- URL Keys and such are now set to a more manageable 32 Characters by default.
- Various UI/UX Updates throughout the app, with focus oin ticket details, contact details modal etc.
- Added Show Archived files and documents to the files section.
- Added Bulk Archive and restore options to files and documents.
- Rewrite of the Kanban Ticket view to match our procedural style of coding.
- All options are available in TinyMCE now in Mobile mode.
- Agent names appear now in Invoice History section.
- Mail Parser: Support flowed text.
- Assets: Keep Purchase reference when copying.
- Assets: Add basic tracking history: Archiving, restoring, name changes, transferimg to new clients.
- Mail Parser: NDR Parsing.
- Allow SVG files in mail attachments.
- Tickets: Use a more friendly time worked instead of 02:41:00 translates to 2h 41m.
- Update wording on ticket to invoice item details.
- Merge Tickets: Now wth a ticket merge dropdown list of tickets instead of a text field.
- Role Permissions can now be set during role creation, update Permission UI to use radio buttons instead of select boxes.
- Bump TinyMCE 8.2.2 to 8.3.2.
- Bump PHPMailer from 7.0.1 to 7.0.2.
- Bump Datatables from 2.3.4 to 2.3.7.
## [25.12.1] Maint Release
### Major Changes
- Unified the Client/Agent Login and process (Note only Client Users can Reset passwords from the login page, does not apply to agent users).
### Bug Fixes
- Fix Payment Provider not adding an account.
- Fix New ticket button in contact details in the related tickets section.
### New Features & Updates
- You can now Set Payment Provider income/expense account, expense vendor and expense category upond creation or editing.
- Moved Saved Payment Provider Methods away from admin side nav to the count link within Payment Providers page.
- Moved AI Models from the admin side nav to the model count link within AI Providers.
- Add Favicon Reset.
## [25.12] Stable Release
### Breaking Changes ###
- For Existing installs: **php-xml** extension needs to be installed for document creation and editing, new install script does this for you as of Dec 6th 2025. To install php-xml: `sudo apt install php-xml`
### Major Changes
- Consolidated "Files" and "Documents" into a single section called **Files**.
### Bug Fixes
- Resolved issue with updating asset notes in asset details.
- Fixed problem with bulk ticket merging.
- Corrected issue where decimal inputs (e.g., price, cost) werent displaying on iPhones in certain forms.
- Added CSV escaping to the sample export data in areas where a sample CSV template is provided.
- Fix a race condition where dupe tickets, invoices, recurring invoices, recurring tickets, quotes will be created using the same number if created in parallel espcecially when using the API.
### New Features & Updates
- Introduced automatic subject-based ticket merging/reply detection. Now, if an email comes from a known contact or domain and the subject matches 95% of a ticket opened in the last 7 days, it will be merged automatically.
- Added `cleanInput` function to sanitize data before inserting it into the database when using MySQLi prepared statements.
- Migrated client post functionality to use MySQLi prepared statements.
- Updated payment method post functionality to use MySQLi prepared statements.
- Implemented `saveBase64Images()` to convert base64-encoded `<img>` tags into actual image files stored under `/uploads/<module>/<id>/` with secure filenames. Added wrapper functions, and updated document creation to use processed image paths.
- For new documents and document templates, images are now stored in `/uploads/documents/$document_id` instead of being stored as base64 in the database, using the `saveBase64Images()` function.
- UI/UX improvements made to the document details page.
- Removed sidebar quick-add options.
- Created new folders in the uploads directory: `documents`, `document_templates`, and `recurring_tickets`.
- Reworked the bulk action function to pass the name arrays, instead of a generic `selected_ids` array. This allows multiple bulk name arrays to be passed at once, currently used for the new file-document merge.
- Big task: Converted the remaining modals to use the new `ajax-modal` system, enabling more flexible flow expansion going forward.
- Mail queue: Added a `--no-mx-validation` flag to bypass recipient domain MX validation.
- Bump PHPMailer from 7.0.0 to 7.0.1.
- Bump stripe-php from 18.1.0 to 19.0.0.
- Bump TCPDF from 6.10.0 to 6.10.1.
- Bump TinyMCE from 8.2.0 to 8.2.2.
## [25.11.1] Maint Release
### Fixes
- Fix broken edit Payment Method.
- Fix unable to delete Vendor Template.
- Fix Mail Queue link in flash alert for testing email and sending a quote.
- Add Show Category Type select if not defined.
- Add Show Product Type select if not defined.
- Fix add ticket watcher.
- Fix if Client isn't assigned to a ticket dont show client view.
- Fix missing session client id check when paying an invoice from client portal.
- Update Composer Webklex-IMAP library dependency symfony/http-foundation from 7.3.3 to 7.3.7 to fix security related issues.
- Add back delete Payment provider the database will handle cascade deletes to saved cards, recurring payments and client payment provider reference.
- Don't show Client Tickets Breadcrumb if no client is assigned to a ticket.
- Don't Show Contact or Assignment Tab in edit ticket if no Client is Assigned.
- Don't Show add contact, asset, vendor, watcher if not client is assigned to a ticket.
- Don't Show Public Comment & Email if contact email doesn't exist.
- Fixed IMAP Test whicn now uses RAW TCP Connection instead of the depracated php-imap extension.
- Fix Broken Link in Ticket Updates via Client Portal to agent.
### Added / Changed
- [Feature] Added Asset Tags.
- [Feature] Added Quick Add Links to most side bar navs example quickly add a client from sidebar.
- Migrate ticket template add to ajax modal.
- Add TOTP secret to Client Export PDF in Credential section.
- Add UserID on hover in users listing.
- Merge ticket now redirects to the new ticket details page.
- [Feature] Add Pay via saved card under invoice Listings.
- Ticket Related Side Items UI Cleanup to use btn-tool class.
## [25.11] Stable
### Deprecation Notice:
- **Outdated CRON Scripts**: The following scripts are removed.
- `/scripts/cron_mail_queue.php`
- `/scripts/cron_ticket_email_parser.php`
- `/scripts/cron.php`
- `/scripts/cron_domain_refresher.php`
- `/scripts/cron_certificate_refresher.php`
**Action Required**: Transition to the new versions:
- `/cron/mail_queue.php`
- `/cron/ticket_email_parser.php`
- `/cron/cron.php`
- `/cron/domain_refresher.php`
- `/cron/certificate_refresher.php`
- PHP Extensions php-imap and php-mime-mail-parser are no longer required.
---
### Fixes
- **Ticket Listing**: Resolved issue where the “Check All” checkbox was visible even when ticket status wasnt set. Now hidden for closed tickets only.
- **Timer Auto-Start**: Show H/M/S placeholders when timer auto-start is disabled.
- **Ticket Guest URL**: Fixed email not including the ticket guest URL key.
- **EML Generation**: Resolved issue with EML not being generated in the new ticket parser.
- **New Ticket Mail Notification**: Included message when notifying the tech of a reply in the new ticket mail parser.
- **Advanced Filter Collapse**: Added clause to prevent collapse of advanced filters when the “from” date is set to the default (1970-01-01).
- **Recurring Invoice**: Fixed issue where email was marked as sent but not actually sent when forcing a recurring invoice to an invoice.
- **CSRF Token**: Fixed issue with deleting recurring ticket from asset details page due to missing CSRF check token.
- **Vendor Website Link**: Fixed missing `https://` prefix in the vendor website link on the vendor details modal.
- **Agent Select Box**: Resolved issue where agents sometimes didnt appear in the agent select boxes.
- **TinyMCE**: Fixed TinyMCE editor issue on Bulk Create Ticket in Assets.
- **Ticket Timer**: Fixed ticket timer initialization after reload and when the tab is put to sleep (background tab).
- **Client Deletion**: Fixed issue with client deletion.
- **Domain Records**: Added flag for missing SOA record when adding a domain (prevents subdomain creation).
- **Domain Fetching**: Quits domain record fetching if no SOA record exists (prevents subdomains).
- **Domain Expiry**: Only show time to expiry when theres an expiry date set; otherwise, display a dash.
- **Certificates**: Improved handling of empty date in the agent UI.
- **Certificates API**: Fixed bug with missing JS to fetch certificate details.
- **API Updates**:
- Clients API: Added support for archiving/un-archiving clients, updating client data, and abbreviation support.
- Contacts API: Added archiving/un-archiving and restriction to only allow one primary contact per client.
- Mail Queue: Added recipient domain MX validation before sending emails.
---
### Added / Changed
- **Backup / Restore**: Improved backup and restore by streaming data to disk (to prevent memory issues), setting unlimited timeouts, checking for bad backup contents, and using PHP for DB import instead of shell exec. Added `.htaccess` to prevent PHP execution in `/uploads/` directory.
- **Ajax Modals**: Migrated all Add and Bulk modals to the new Ajax Modal for improved performance.
- **Recurring Ticket Sorting**: Default sorting of recurring tickets by `RunDate` instead of subject.
- **Recurring Ticket Enhancements**:
- Added Billable column.
- Added bulk actions for setting priority, agent, billable status, and next run dates.
- Added filters for category, assigned agent, and billable status.
- Added new frequency options: 3-day and biweekly.
- **Asset Select**: Updated asset select dropdown to separate asset types using opt groups (planned for wider use).
- **Expiring Domains & Certificates**: Added "30 Day" warning for expiring domains and certificates in the dashboard.
- **Ticket Search**: Allowed search using both ticket prefix and number.
- **Recurring Invoice**: Cancel recurring invoices when the associated client is archived.
- **Credentials Import/Export**: Now includes TOTP secrets when importing/exporting credentials.
- **Asset Notes Import**: Allowed importing of asset notes.
- **Ticket View**: Added a "View HTML Code" button in all ticket views for TinyMCE.
- **Date Range Picker**: Updated all date filters to use the improved DateRangePicker JS.
- **Bulk Ticket Creation**: Added bulk ticket creation for clients.
- **Sidebar Updates**: Updated all sidebars to use absolute paths for easier integration with custom code.
- **Document Actions**: Added Archive and Delete buttons to the Document Details view with improved redirect behavior.
- **Ticket Template Sorting**: Allowed sorting by task count in ticket templates.
- **Contact Modal UI**: Updated contact details modal to display contact information at the top.
- **API & Code Updates**:
- Separated out post files for recurring tickets, invoices, expenses, and payments.
- Removed unused budget code.
- **Invoice Product Autocomplete**: Now allows searching for product codes as well as names.
- **Client Duplicate Check**: Flags duplicate clients or leads when using the client add modal.
- **Recurring Invoice Reference**: Added a column to invoices indicating if they were created from a recurring invoice.
- **Global Search Enhancements**:
- Allowed ticket details to be searchable in global search.
- Allowed searching for quotes in global search.
- **UI/UX Improvements**:
- Spruced up the ticket details page UI.
- Added contact email validation to flag duplicates or invalid addresses.
- **API Debugging**: Log API endpoint/URL path for authentication failures to aid in debugging.
- **Image Upload Optimization**: Removed image optimization from uploads (this will be handled by a cron job in the future).
- **View Behavior Change**: Updated ticket/invoice/quote views to always be in the Client section, showing client-side navigation and top info bar.
---
### Library Updates:
- **DataTable**: Bumped from 2.3.3 to 2.3.4.
- **TinyMCE**: Bumped from 8.0.2 to 8.2.0.
- **Stripe-PHP**: Bumped from 17.6.0 to 18.1.0.
- **PHPMailer**: Bumped from 6.10.0 to 7.0.0.
- **Chart.js**: Bumped from 4.5.0 to 4.5.1.
## [25.10.1]
- Deprecation Notice: `/scripts/cron_mail_queue.php` , `/scripts/cron_ticket_email_parser.php` , `/scripts/cron.php` `/scripts/cron_domain_refresher.php`, `/scripts/cron_certificate_refresher.php` are being phased out. Please transition to `/cron/mail_queue.php` , `/cron/ticket_email_parser.php`, `/cron/cron.php`, `/cron/domain_refresher.php`, `/cron/certificate_refresher.php` These older scripts will be removed in the November 25.11 release—update accordingly. 25.10.1 installs have the script already configured.
### Fixes
- Fix regression missing custom Favicon.
- Update SMTP and IMAP provider to allow for empty strings, empty means disabled.
- Fix Client portal Microsoft SSO Logins.
- Fix regression in Vendor Templates.
- Fix refression in some broken links from user to agent.
- Fix Project edit.
- Prevent open redirects upon agent login.
- Fix regression on switching to Webklex IMAP to allow for no SSL/TLS in IMAP.
- Fix Setup Redirect not behaving properly when setup hasnt been performed.
- Added Server Document Root Var to several includes, headers, footers files to allow includes from deeper directory strutures such as the new custom directories.
- Fix edit contact in contact details.
- Add .htaccess to /cron/.
### Added / Changed
- Support for HTML Signatures.
- Add Edit Project Functionality in a ticket.
- Added more custom locations: /cron/custom/, /scripts/custom/, /api/v1/custom/, /setup/custom/.
- Copied `/scripts/cron.php` `/scripts/cron_domain_refresher.php`, `/scripts/cron_certificate_refresher.php` to `/cron/cron.php`, `/cron/domain_refresher.php`, `/cron/certificate_refresher.php`. See Above!
- Signatures is now handled in post ticket reply on Public Comments only.
## [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
- Fix Payment Method Select box in Revenue.
- Remove Extra Feeback Wording When Invoice Sends.
- Updated all CSV exports to use escape parameters.
- Fix Missing First row on Asset interface export.
- Fix Edit User not working due to incorrect modal footer path.
- Fix Add Certificate breaking due spelling on function.
- Update all CSV Exports to include company name or client name depending on when its being exported from.
- Introduced new function sanitize_filename and implmented it in all exports.
- Spruced up UI/UX Saved Paymented section in Client Portal.
- Fix add Payment Link in client portal recurring invoice section.
- Better Logic handling for default page redirect.
### Features
- Introduced new Beta mail parser cron using webklex imap library instead of php-imap as this is deprecated --Not Enabled on existing installs, only new installs.
- Introduced Beta support for OAUTH2 Authentication for Microsoft 365 and Google Workspaces for both incoming ticket parsing and outgoing email but must use new mail parser and mail queue for this to work, and requires changing the cron jobs: scripts/cron_mail_queue.php to cron/mail_queue.php and scripts/cron_ticket_email_parser.php to cron/ticket_email_parser.php.
---
## [25.09.1]
### Fixes
- **Web Installer**: Resolved issue with broken installer caused by incorrect database schema file name.
- Hide the "Add Credit" button as the feature is not fully implemented yet.
- Corrected long invoice/quote notes that were overlapping with the footer in PDF exports.
- Fixed AI settings not appearing in the Admin Menu when the Billing module was disabled.
- Enabled wrapping of client tags when they are too long.
- Fixed an issue where AI was not functioning correctly.
- Removed extra spacing between the contact name and icon in the Ticket Details contact card.
### Features
- Redesigned **AI Ticket Summary**, now divided into 3 sections: Main Issue, Actions Taken, and Resolution/Next Steps.
- Updated the **AI Ticket Summary** prompt to include ticket status, reply author, source, category, and priority.
---
## [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 (with thanks to www.helx.io).
- 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 wasnt 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
- Fixed a regression in setup causing it to crash and never complete, due to missing default for currency.
## [25.06]
### Breaking CHANGES
- Old Document Verions will be deleted due to the major backend rewrite how document versions work.
### Added / Changed
- Improved function for retrieving remote IP address for logging purposes.
- Ticket categories are now sorted alphabetically.
- Visiting a deleted invoice or recurring invoice now redirects to the listing page; delete option added to invoice details page.
- Added "Mark as Sent" and "Make Payment" actions directly on the invoice listing page.
- Introduced Ticket Category UI for recurring tickets.
- In Project Details, bulk actions and sorting are now available for tickets.
- Updated ticket details UI to use full card stacks with edit icons for stackable items (e.g., asset, watchers, contact).
- Added a new setting to toggle AutoStart Timer in ticket details (disabled by default).
- Applied gray accent theme in the client section to visually distinguish from the global view.
- Introduced Ticket Due Date functionality (currently supports add/edit only; more updates coming next release).
- Added settings option to display Company Tax ID on invoices.
- Client overview now displays badge counts for all entities.
- Overhauled UI for Invoice, Quote, and Recurring Invoice details; switched PDF generation to TCPDF PHP from PDFMake JS.
- Document versioning has been moved to a separate backend table to resolve permanent link issues -- SEE Breaking CHANGES.
- Migrated Document Templates, Vendor Templates, and Software/License Templates to dedicated tables.
- Added functionality to mark all tasks in a ticket as complete or incomplete.
- Asset CSV import now supports a purchase date field.
- Recurring Payments have been restructured to auto-charge on the invoice due date instead of at generation time.
- Added "Base Template" label for vendor templates when available.
- Backup and restore processes now use a temporary directory; files are cleaned up automatically if operations fail.
- Added confirmation prompt when accepting or declining a quote.
- Other minor code UI/UX cleanups and refactoring throughout the app.
### Fixed
- Resolved issue with enabling MFA.
- Fixed UI regression where ticket listing columns would misalign.
- Non-billable invoices are no longer included in calculations.
- Addressed multiple minor reported security vulnerabilities.
- Tickets with open tasks are no longer resolved in bulk; a warning is shown along with a count of affected tickets.
## [25.05.1]
### Added / Changed
- Added Domain Expiring Card to Client Portal Dashboard for Primary and Technical Users.
- Added Balance and Monthly Recurring Amount to Client Portal Dahboard for Primary and Technical Users.
- Added Archive Searching to network and certificates also added unarchive capabilities to them as well.
### Fixed
- Add Payment not showing in Invoice.
- Updated Client Overview Entities to not show archived client's Entities even though the entity may not be archived.
## [25.05]
### Added / Changed
- Expanded file upload allow-list to include .bat and .stk file types.
- Added full backup/restore functionality. Backup downloads a zip that includes the SQL dump and uploads folder, setup now has option to restore from zip backup.
- Migrated Asset and Contact Links to modals to resolve variable overlap issue.
- Added Pagination to Notification Modal.
- Removed 500 Records Per Page option.
- Removed unused old DB checks in the top nav.
- Clients can now use the portal to setup Stripe automatic payments themselves for recurring invoices
- Automatic payments are now disabled for all recurring invoices if the saved payment method is removed
- Added Card Details and Payment added to Client Stripe.
- UI / UX updates to guest pay Make use of cards.
- Don't show Checkbox columns when ticket is closed, compact ticket list now matches round pills for status and priority.
- Ticket UI/UX update allow the ticket toolbar to be a little more mobile-friendly
- UI / UX Updates to Expenses - Combine Category and Description into 1 column.
- Country information is now displayed in Invoices, Quotes, Recurring Invoices, Clients, Locations, and the client top header.
- Added country-based search filters in Locations and Clients sections.
- Changed the settings name from Integrations to Identity Providers to make room for future iDPs (e.g. Google).
- Bump FullCalendar from 6.1.15 to 6.1.17.
- Bump DataTables from 2.2.2 to 2.3.1.
- Bump TCPDF from 6.8.2 to 6.9.4.
- Bump tinyMCE from 7.7.1 to 7.9.0.
- Bump phpMailer from 6.9.2 to 6.10.0.
- Bump stripe-php from 16.4.0 to 17.2.1.
### Fixed
- "None" option for SMTP encryption now functions correctly.
- Debug table row counts now reflect actual counts instead of relying on SHOW TABLE STATUS.
- Archived Categories now display properly.
- Stripe saved payment methods are now limited to credit/debit cards only.
## [25.03.6]
### Fixed
- Set default to date to 2035-12-31 as 9999-12-31 and 2999-12-31 broke certain browsers.
- Update Client PDF Export, add header added company logo.
- Present Larger clearer Warning about updates on update page.
- Allow to search by project reference.
## [25.03.5]
### Fixed
- Fixed the user listing issue when copying a trip.
- Corrected the display of recurring invoice amounts on the dashboard.
- Fixed the linking of entities with assets and contacts.
- Resolved the issue with displaying the correct mobile country code in the contact listing.
- Set the default date to `9999-12-31` to ensure future items (like invoices) are displayed by default.
- Fixed the display issue where file folders were not showing properly during document creation.
- Migrated from Dragula to SortableJS for a more modern, mobile-friendly solution.
- Added Handlebars icons for drag-and-drop items.
- Changed behavior to open Contact and Asset Details pages directly instead of using a modal.
## [25.03.4]
### Fixed
- Ability to remove additional assets from the ticket details screen.
- Fix the ability to remove assets from edit ticket not working when only 1 asset exists.
- Fix Database Backup corruption.
- Client Portal - show ticket number instead of ticket id in ticket listing.
- Add Purchase Reference to copy asset.
- Add Link to asset details from the global search.
- Fix Bulk assign ticket only showing contacts instead of ITFlow users.
## [25.03.3]
### Fixed
- Fix adding ITFlow user.
- Do not alert on inactive recurring invoices.
- Fix ticket user assignment including bulk assignment.
- Fix adding a location phone extension.
- Do not default to +1 Country code, instead default to null.
- Do not format numbers unless a country code is entered.
- Fix editing network location.
- Fix ticket redaction on client replies.
- Remove more from user activity as it requires admin privledges.
- Fix MFA Enforcement page.
## [25.03.2]
### Fixed
- Revert DB.sql change
## [25.03.1]
### Fixed
- Phone number missing in various sections.
- Match Database.
- Client Export Only display licenses users and assets from the selected client only.
## [25.03]
### Fixed
- Resolved missing attachments in ticket replies processed via the email parser.
- Fixed issue where the top half of portrait image uploads appeared cut off at the bottom.
- Ensured all tables and fields use `CHARACTER SET utf8mb4` and `COLLATE utf8mb4_general_ci` for updates and new installations.
- Converted `service_domains` table to use InnoDB instead of MyISAM.
- Fixed the initials function to properly handle UTF-8 characters, preventing contact-related issues.
- Interfaces can now start with `0`.
- Adjusted AI prompt handling to focus solely on content, avoiding unnecessary additions.
### Added / Changed
- Introduced bulk delete functionality for assets.
- Added the ability to redact ticket replies after a ticket is closed.
- Added support for redacting specific text while a ticket is open.
- Switched file upload hashing from SHA256 to MD5 to significantly improve performance.
- Enabled assigning multiple assets to a single ticket.
- Updated all many-to-many tables to support cascading deletes using foreign key associations, improving efficiency, performance, and data integrity.
- Enabled caching for AJAX modals to reduce repeated reloads and enhance browser performance.
- Upgraded DataTables from 2.2.1 to 2.2.2.
- Upgraded TinyMCE from 7.6.1 to 7.7.1, providing a significant performance boost.
- Added “Copy Credentials to Clipboard” button in AJAX asset and contact views.
- Renamed and reorganized several tables.
- Improved theme color organization by grouping primary colors and their related shades.
- Displayed a user icon next to contacts who have user accounts.
- New image uploads are now converted to optimized `.webp` format by default; original files are no longer saved. Existing images remain unchanged.
- Added international phone number support throughout the system.
- Introduced user signatures in preferences, which are now appended to all ticket replies.
- Optimized search filters to only display defined tags.
- Added “Projects” to the client-side navigation.
- Enabled “Create New Ticket” from within project details.
- Reintroduced batch payment functionality in client invoices.
- Included client abbreviations in both client and global search options.
- Added assigned software license details (User/Asset) to the client PDF export.
- Replaced client-side `pdfMake` with the PHP-based `TCPDF` library for generating client export runbooks.
- Introduced the ability to download documents as PDFs.
- Added a “Reference” field to tickets and invoices generated from recurring templates (not yet in active use).
### Breaking Changes
> **Important:** To update to this version, you **must** run the following commands from the command line from the scripts directory:
>
> ```bash
> php update_cli.php
> php update_cli.php --db_update
> ```
>
> Repeat `--db_update` until no further updates are found.
>
> **Back up your system before upgrading.**
> This version includes numerous backend changes critical for future development.
## [25.02.4]
### Fixed
- Resolved issue preventing the addition or editing of licenses when no vendor was selected.
- Fixed several undeclared variables in AJAX contact details.
- Corrected the contact ticket count display.
- Addressed an issue where clicking "More Details" in AJAX contact/asset details failed to include the `client_id` in the URL.
- Fixed an issue with recurring invoices in the client URL: clicking "Inactive" or "Active" would unexpectedly navigate away from the client section.
- Added new php function getFieldById() to return a record using just an id and sanitized as well.
## [25.02.3]
### Fixed
- Fixed notifications being reversed as dismissed notifications.
## [25.02.2]
### Fixed
- Corrected some edit modals not showing notes correctly.
- Bugfix: When exporting to CSV, the first asset wasn't being shown.
- Fix broken create / edit credentials.
- Fixed missing Notificatons link.
- Fixed a few dead links.
- Fixed Overdue count also counting Non-Billable Invoices.
- Fix Edit Client Notes.
### Added / Changed
- Implemented SSL certificate history tracking.
- Added Inactive / Active Filter to Recurring Invoices.
- Merged Dismissed notifications and notification in one.
- Added Link Button to addd / edit Document WYSIWYG.
- Added Physical location to the asset export / import.
## [25.02.1]
### Fixed
- Resolved broken links in the client overview, project and client listings, and rack details.
- Corrected asset transfer functionality to clients.
- Fixed the ticket scheduling redirect.
- Corrected the ticket link in the Scheduled Ticket Agent Notification email.
- Addressed issues with credentials and ticket actions in the Contact Detail Modal.
- Fixed text wrapping in notifications.
- Adjusted notifications so that they are sorted with the newest first.
- Fixed drag-and-drop functionality for tickets in the Kanban view on mobile devices.
- Resolved a weird issue with TinyMCE that prevented using links referencing your ITFlow instance url.
- Corrected image orientation issues during upload and the preview optimization process.
### Added / Changed
- Introduced entity link indicator icons and counts in the contacts and credentials section.
- Implemented a fade animation for the new AJAX modal.
- Removed the Client Overview Expire Day Select and replaced it with simplified 1, 7, or 45-day options.
- Added the ability to link and unlink entities within asset details.
- Introduced quick tag/category creation across the app.
- Added a Vendor Quick Details Modal.
- Enabled vendor linking and added a License Purchase Reference in the Software Licenses section.
- Added download original, optimized and thumbnail option for images.
- Added Paid status to the top corner of Invoice PDFs.
## [25.02]
### Fixed
- Migrated several reports to the new permissions/roles system.
- Resolved issue with empty task box showing for closed/resolved tickets.
- Corrected ticket priority sorting.
- Cloned asset interfaces when transferring assets between clients.
### Added / Changed
- Restored max number of records per page option back to 500 since we dont have repeating modals.
- Bulk Categorize Tickets feature.
- Renamed "Interface port" to "Interface Description." "Interface Name" should now refer to port name and/or number.
- Changed "Transfer Asset to Client" from a single action to a bulk action.
- Updated Filter Footer UI to show "Showing x to x of x records" instead of just the total records.
- Added Client Overview section to view client assets, contacts, licenses, credentials, etc.
- Introduced Quick Peek for asset details, contact information, and document viewing throughout the ITFlow App, all made possible by AJAX.
- Enabled Simple Drag-and-Drop Ordering for Invoices, Recurring Invoices, Quotes, Ticket Tasks, and Ticket Template Tasks.
- Added new Ticket View options: Kanban and Simple View.
- Migrated all repeating modals to the new AJAX modal function for faster loading times and quicker development.
- Allowed clients to upload PDF documents to accepted quotes.
- Client Portal now shows ticket category.
- Custom links can now be added to the Client Portal navbar.
- Lots of little tweaks to UI, performance, bugs, etc.
### Breaking Changes
- Cron scripts have officially been moved to the /scripts folder and are no longer in the root directory; they must be updated to function properly.
## [25.01.3]
### Fixed
- Fixed ticket assignment modal showing client contacts.
## [25.01.2]
### Fixed
- Fixed app version.
## [25.01.1]
### Added / Changed
- Redesigned the Multi-Factor Authentication (MFA) Setup and Enforcement Flow UI/UX for a more intuitive user experience.
- Added a "Member" column in the user roles listing for improved visibility.
- General UI/UX improvements, along with minor performance optimizations and cleanups.
### Fixed
- Fixed an issue where Stripe was not appearing as a recurring payment option.
- Corrected inaccurate Quarter 2 Expense results in the Profit & Loss Report.
- Resolved TOTP code not displaying correctly on hover in the Contact or Asset Details sections.
- Archived contacts no longer appear in the Bulk Mail section.
- Fixed an issue where the Ticket Assign Modal was showing both ITFlow and client users.
- Fixed issue with login key redirecting to legacy client portal page.
## [25.01]
### Added / Changed
- Added support for saving cards in Stripe for automatic invoice payments.
- Page titles now display detailed information (e.g., page name, client selection, company name, ticket and invoice info) for easier multi-tab navigation.
- Reintroduced the new admin role-check for admin pages.
- Admin roles can now be archived.
- Debug mode now shows the current Git branch.
- The auto-acknowledgment email for email-parsed tickets now includes a guest link.
- Recurring tickets no longer require a contact.
- Stripe online payment setup now prompts you to set the income/expense account.
- New cron/CLI scripts have been moved to the `/scripts` subfolder — remember to update your cron configurations!
- Moved modal includes to `/modals` to tidy up the root directory.
- Moved most include files to `/includes` to improve directory structure.
- Moved guest pages to `/guest` for better organization.
- Renamed the include file `pagination.php` to `filter_footer.php`, as it is used in conjunction with `filter_header.php` for page filtering.
- Guest ticket feedback now shows the ticket prefix and number, not just the ID.
- Individual POST handler logic pages are no longer directly accessible.
- Added the ability to delete payments on the Payments and Client Payments pages.
- Implemented domain history tracking.
- Added Asset Interface Linking/Connections to show what interface is connected to which interface port of another asset.
- Added Force Recurring Ticket option in more locations, not just for recurring tickets.
- Implemented row spanning and centered devices that occupy multiple units in a rack.
- Added tooltips to main navigation badge counts to clarify what is being counted.
- Reduced max records per page from 500 to 100 to prevent performance issues.
- Updated several plugins:
- `stripe-php` from 10.5.0 to 16.4.0
- `Inputmask` from 5.0.8 to 5.0.9
- `DataTables` from 2.1.8 to 2.2.1
- `pdfmake` from 0.2.8 to 0.2.18
- `php-mime-mail-parser` to 9.0.1
- `TinyMCE` from 7.5.1 to 7.6.1
- Removed unused libraries from the vendor folder and moved Stripe to the plugins folder, eliminating the vendor folder.
- Merged the MFA TOTP functionality files `base32static.php` and `rfc6238.php` into a single file (`totp`) and moved it to the plugins folder.
- No longer need to pass the DB connection (`$mysqli`) to the `addToMailQueue` function.
- Disabled HTML Purifier caching.
- Replaced the `nullable_htmlentities` function with `htmlspecialchars`.
- Updated filter variable naming.
- Implemented other minor UI updates, performance optimizations, and directory cleanups.
### Fixed
- Fixed an issue where the ticket edit modal didn't show multi-client or no-client projects.
- Fixed asset interface losing DHCP settings.
- Fixed a 500 error when creating or editing recurring expenses due to an incorrect variable name.
- Fixed tickets created via the portal/email not being marked as billable.
- Fixed issues with editing recurring expenses.
- Resolved a regression where the TinyMCE editor didnt display when adding or editing ticket templates.
- Fixed a TinyMCE license issue.
### Removed / Deprecated
- Deprecated the cron scripts in the root directory. Cron jobs should now use the ones in the `/scripts` subfolder, which no longer require a cron key and must be run via CLI.
### BREAKING CHANGES
- The client portal has been moved from `/portal` to `/client`:
- Links in previous emails will be broken.
- The Azure Entra ID SSO Redirect URI needs to be updated to `/client`.
- You may need to update other links (e.g., website, support page).
- Guest links have been moved from `/` to `/guest`. Previous links will be broken.
## [24.12]
### Added / Changed
- Introduced versioned releases for the first time!

View File

@@ -60,7 +60,7 @@ representative at an online or offline event.
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
the forums / Discord.
the forums.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the

101
README.md
View File

@@ -3,15 +3,10 @@
<!-- PROJECT SHIELDS -->
[![Contributors][contributors-shield]][contributors-url]
[![Stargazers][stars-shield]][stars-url]
[![Issues][issues-shield]][issues-url]
[![Commits][commit-shield]][commit-url]
[![GPL License][license-shield]][license-url]
<!-- PROJECT LOGO -->
<div align="center">
<!-- <a href="https://github.com/itflow-org/itflow">
<img src="images/logo.png" alt="Logo" width="80" height="80">
</a> -->
<h3 align="center">ITFlow</h3>
@@ -21,18 +16,20 @@
<br />
<a href="https://demo.itflow.org"><strong>View demo</strong></a>
<br />
Username: <b>demo@demo</b> | Password: <b>demo</b>
Username: <b>demo@demo.com</b> | Password: <b>demo</b>
<br />
<br />
<a href="https://itflow.org/index.php?page=About">About</a>
<a href="https://itflow.org/#about">About</a>
·
<a href="https://itflow.org/docs.php">Docs</a>
<a href="https://docs.itflow.org">Docs</a>
·
<a href="https://forum.itflow.org/">Forum</a>
·
<a href="https://github.com/itflow-org/itflow/issues">Report Bug</a>
<a href="https://forum.itflow.org/t/bug">Report Bug</a>
·
<a href="https://forum.itflow.org/t/features">Request Feature</a>
·
<a href="https://github.com/itflow-org/itflow/security/policy">Security</a>
</p>
</div>
@@ -45,58 +42,26 @@
### The Problem
- You're a busy MSP with 101 things to do.
- Information about your clients is unorganised and unstructured: scattered in random tickets or folders - when you do eventually find it, it's out of date.
- For some issues, you spend longer looking for the relevant documentation than actually working the ticket.
- You're a small but busy managed service provider with 101 things to do. Information about your clients is unorganised, unstructured and outdated.
- For some work, you seem to spend longer looking for the relevant documentation than actually working on the issue/project.
- On top of the technical day to day, you also have to take care of the financial side of the business - consistent pricing, quotes/invoicing, and accounting.
### The Solution: ITFlow
- ITFlow consolidates common MSP needs (documentation, ticketing, and accounting) into one system
### In Beta
* This project is in beta with many ongoing changes. Updates may unintentionally introduce bugs/security issues.
* Whilst we are confident the code is safe, nothing in life is 100% safe or risk-free. Use your best judgement before deciding to store highly confidential information in ITFlow.
* We are hoping to have a stable 1.0 release by April/May 2023.
<!-- BUILT WITH -->
### Built With
* Backend / PHP libs
* PHP
* MariaDB
* PHPMailer
* HTML Purifier
* PHP Mime Mail Parser
* CSS
* Bootstrap
* AdminLTE
* fontawesome
* JS Libraries
* chart.js
* moments.js
* jQuery
* pdfmake
* Select2
* SummerNote
* FullCalendar.io
- ITFlow consolidates common MSP needs (documentation, ticketing and billing) into one unified system.
<!-- GETTING STARTED -->
## Getting Started / Installation
## Getting Started
ITFlow is self-hosted. There is a full installation guide in the [docs](https://wiki.itflow.org/doku.php?id=wiki:installation), but the main steps are:
### Self Hosting
- The best installation method is to use the [install script](https://docs.itflow.org/installation_script) on Ubuntu/Debian. A video walk through is available [here](https://www.youtube.com/watch?v=kKz9NOU_1XE).
```
wget -O itflow_install.sh https://github.com/itflow-org/itflow-install-script/raw/main/itflow_install.sh
bash itflow_install.sh
```
- Other manual installation methods are available in the [docs](https://docs.itflow.org/installation).
1. Install a LAMP stack (Linux, Apache, MariaDB, PHP)
```sh
sudo apt install git apache2 php libapache2-mod-php php-intl php-imap php-mailparse php-mysqli php-curl mariadb-server
```
2. Clone the repo
```sh
git clone https://github.com/itflow-org/itflow.git /var/www/html
```
3. Create a MariaDB Database
4. Point your browser to your HTTPS web server to begin setup
### Managed Hosting
- If you'd prefer, we can [host ITFlow for you](https://services.itflow.org/hosting.php).
<!-- FEATURES -->
## Key Features
@@ -108,36 +73,36 @@ ITFlow is self-hosted. There is a full installation guide in the [docs](https://
<!-- ROADMAP -->
## Roadmap / Future to-do
* Comprehensive API to allow custom third party integration
* CalDAV to integrate with 3rd party calendars
* CardDAV to integrate with 3rd party Address books
* Recent caller toast alerts to click and bring up the clients account right away
* FIDO2 WebAuthn Support for passwordless auth (TPM Fingerprint), (USB Hardware keys such as Yubikey)
See the [forum](https://forum.itflow.org/d/11-road-map) and the [open issues](https://github.com/itflow-org/itflow/issues) for a full list of proposed features & known issues.
We track the implementation of confirmed features and bugs via [TaskFlow](https://tasks.dev.itflow.org/tasks.php). Use the [forum](https://forum.itflow.org) to request features or raise bug reports.
<!-- CONTRIBUTING -->
## Support & Contributions
### Forum
For help using ITFlow, feature requests, and general ideas / discussions please use the community [forum](https://forum.itflow.org).
For bugs, please raise an [issue](https://github.com/itflow-org/itflow/issues).
For help using ITFlow, bugs, feature requests, and general ideas / discussions please use the community [forum](https://forum.itflow.org).
### Contributing
If you are able to make a contribution that would make ITFlow better, please fork the repo and create a pull request. Please make sure you're following our [code standards](https://wiki.itflow.org/doku.php?id=wiki:code_standards).
For large changes / new features, please discuss the issue with other contributors first.
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).
#### Contributors
<a href="https://github.com/itflow-org/itflow/graphs/contributors">
<img src="https://contrib.rocks/image?repo=itflow-org/itflow" />
</a>
<!-- LICENSE -->
## License
### Supporters
Were incredibly grateful to the organizations and individuals who support the project - a big thank you to:
- CompuMatter
- F1 for HELP
- digiBandit
- JetBrains (PhpStorm)
## License
ITFlow is distributed "as is" under the GPL License, WITHOUT WARRANTY OF ANY KIND. See [`LICENSE`](https://github.com/itflow-org/itflow/blob/master/LICENSE) for details.
## Security
* As of 2025, we now have a stable release of the project.
* Whilst we are confident in the safety of the code, no system is risk-free. Nearly all software has bugs. Use your best judgement before storing highly confidential information in ITFlow.
* If you have a security concern, privately report it [here](https://github.com/itflow-org/itflow/security/policy).
<!-- MARKDOWN LINKS & IMAGES -->
<!-- https://www.markdownguide.org/basic-syntax/#reference-style-links -->

View File

@@ -1,23 +1,24 @@
# Security Policy
## In Beta
## **Please do NOT report security concerns/vulnerabilities publicly (Issues/forum)**
ITFlow is currently in beta and is a work in progress.
**We take security seriously**
**We take security seriously.** Whilst we are confident the code is safe, nothing in life is 100% safe or risk-free. You should use your best judgment before entering confidential information into the app.
We attempt to follow security best practices where possible, including [automated code scanning](https://sonarcloud.io/component_measures?id=itflow-org_itflow&metric=security_rating&view=list).
- Whilst we are confident in the safety of the code, no system is risk-free. Nearly all software has bugs. Use your best judgement before storing highly confidential information in ITFlow.
- We attempt to follow security best practices where possible, including [automated code scanning](https://sonarcloud.io/component_measures?id=itflow-org_itflow&metric=security_rating&view=list).
- [![Security](https://sonarcloud.io/api/project_badges/measure?project=itflow-org_itflow&metric=security_rating)](https://sonarcloud.io/summary/new_code?id=itflow-org_itflow)
## Supported Versions
We operate a rolling release model. Any bug fixes will be released into latest version of ITFlow, so you must stay up-to-date.
| Version | Supported |
| ------- | ------------------ |
| Beta | :white_check_mark: |
|---------| ------------------ |
| 25.12 | :white_check_mark: |
## Reporting a Vulnerability
**<ins>Please do not report security vulnerabilities through public GitHub issues.</ins>**
If you have discovered a security issue, please [report it](https://github.com/itflow-org/itflow/security/advisories/new) to us in as much detail as possible, so we can fix it. You should expect to receive an initial acknowledgement within 72 hours.
## Reporting a Vulnerability via GitHub Security Advisories
**Security contact: [GitHub Security Advisories](https://github.com/itflow-org/itflow/security/advisories/new)**
If you have discovered a security issue, please **[report it](https://github.com/itflow-org/itflow/security/advisories/new)** to us in as much detail as possible, so we can fix it.
You should expect to receive an initial acknowledgement within 72 hours. If you don't receive any feedback, we may have missed the initial email from GitHub (we're human!). Please raise a forum discussion quoting ONLY the assigned GHSA ref.

View File

@@ -1,61 +0,0 @@
<div class="modal" id="addAccountModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content bg-dark">
<div class="modal-header">
<h5 class="modal-title"><i class="fa fa-fw fa-piggy-bank mr-2"></i>New Account</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body bg-white">
<div class="form-group">
<label>Account Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-piggy-bank"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Account name" required autofocus>
</div>
</div>
<div class="form-group">
<label>Opening Balance</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
</div>
<input type="number" class="form-control" step="0.01" min="0" name="opening_balance" placeholder="Opening Balance" required>
</div>
</div>
<div class="form-group">
<label>Currency <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-money-bill"></i></span>
</div>
<select class="form-control select2" name="currency_code" required>
<option value="">- Currency -</option>
<?php foreach ($currencies_array as $currency_code => $currency_name) { ?>
<option <?php if ($session_company_currency == $currency_code) { echo "selected"; } ?> value="<?php echo $currency_code; ?>"><?php echo "$currency_code - $currency_name"; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Notes</label>
<textarea class="form-control" rows="5" placeholder="Enter some notes" name="notes"></textarea>
</div>
</div>
<div class="modal-footer bg-white">
<button type="submit" name="add_account" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -1,37 +0,0 @@
<div class="modal" id="editAccountModal<?php echo $account_id; ?>" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content bg-dark">
<div class="modal-header">
<h5 class="modal-title"><i class="fa fa-fw fa-piggy-bank mr-2"></i>Editing account: <strong><?php echo $account_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="account_id" value="<?php echo $account_id; ?>">
<div class="modal-body bg-white">
<div class="form-group">
<label>Account Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-piggy-bank"></i></span>
</div>
<input type="text" class="form-control" name="name" value="<?php echo $account_name; ?>" placeholder="Account name" required>
</div>
</div>
<div class="form-group">
<label>Notes</label>
<textarea class="form-control" rows="5" placeholder="Enter some notes" name="notes"><?php echo $account_notes; ?></textarea>
</div>
</div>
<div class="modal-footer bg-white">
<button type="submit" name="edit_account" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -1,114 +0,0 @@
<?php
// Default Column Sortby Filter
$sb = "account_name";
$o = "ASC";
require_once("inc_all.php");
//Rebuild URL
$url_query_strings_sb = http_build_query(array_merge($_GET, array('sb' => $sb, 'o' => $o)));
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM accounts
WHERE account_name LIKE '%$q%' AND company_id = $session_company_id
ORDER BY $sb $o LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-fw fa-piggy-bank mr-2"></i>Accounts</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addAccountModal"><i class="fas fa-plus mr-2"></i>New Account</button>
</div>
</div>
<div class="card-body">
<form autocomplete="off">
<div class="input-group">
<input type="search" class="form-control col-md-4" name="q" value="<?php if (isset($q)) { echo stripslashes(htmlentities($q)); } ?>" placeholder="Search Accounts">
<div class="input-group-append">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
<hr>
<div class="table-responsive">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sb; ?>&sb=account_name&o=<?php echo $disp; ?>">Name</a></th>
<th><a class="text-dark" href="?<?php echo $url_query_strings_sb; ?>&sb=account_currency_code&o=<?php echo $disp; ?>">Currency</a></th>
<th class="text-right">Balance</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_array($sql)) {
$account_id = intval($row['account_id']);
$account_name = htmlentities($row['account_name']);
$opening_balance = floatval($row['opening_balance']);
$account_currency_code = htmlentities($row['account_currency_code']);
$account_notes = htmlentities($row['account_notes']);
$sql_payments = mysqli_query($mysqli, "SELECT SUM(payment_amount) AS total_payments FROM payments WHERE payment_account_id = $account_id");
$row = mysqli_fetch_array($sql_payments);
$total_payments = floatval($row['total_payments']);
$sql_revenues = mysqli_query($mysqli, "SELECT SUM(revenue_amount) AS total_revenues FROM revenues WHERE revenue_account_id = $account_id");
$row = mysqli_fetch_array($sql_revenues);
$total_revenues = floatval($row['total_revenues']);
$sql_expenses = mysqli_query($mysqli, "SELECT SUM(expense_amount) AS total_expenses FROM expenses WHERE expense_account_id = $account_id");
$row = mysqli_fetch_array($sql_expenses);
$total_expenses = floatval($row['total_expenses']);
$balance = $opening_balance + $total_payments + $total_revenues - $total_expenses;
?>
<tr>
<td><a class="text-dark" href="#" data-toggle="modal" data-target="#editAccountModal<?php echo $account_id; ?>"><?php echo $account_name; ?></a></td>
<td><?php echo $account_currency_code; ?></td>
<td class="text-right"><?php echo numfmt_format_currency($currency_format, $balance, $account_currency_code); ?></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" href="#" data-toggle="modal" data-target="#editAccountModal<?php echo $account_id; ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<?php if ($balance == 0) { //Cannot Archive an Account until it reaches 0 Balance ?>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger" href="post.php?archive_account=<?php echo $account_id; ?>">
<i class="fas fa-fw fa-archive mr-2"></i>Archive
</a>
<?php } ?>
</div>
</div>
</td>
</tr>
<?php
include("account_edit_modal.php");
}
?>
</tbody>
</table>
</div>
<?php require_once("pagination.php"); ?>
</div>
</div>
<?php
require_once("account_add_modal.php");
require_once("footer.php");

117
admin/ai_model.php Normal file
View File

@@ -0,0 +1,117 @@
<?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);
?>
<ol class="breadcrumb d-print-none">
<li class="breadcrumb-item">
<a href="/admin">Admin</a>
</li>
<li class="breadcrumb-item">
<a href="ai_provider.php">AI Providers</a>
</li>
<li class="breadcrumb-item active">AI Models</li>
</ol>
<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 ajax-modal" data-modal-url="modals/ai/ai_model_add.php"><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_assoc($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 "../includes/footer.php";

109
admin/ai_provider.php Normal file
View File

@@ -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 ajax-modal" data-modal-url="modals/ai/ai_provider_add.php"><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 class="text-center">
<a class="text-dark">Models</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($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 class="text-center">
<a class="badge badge-dark badge-pill p-2" href="ai_model.php"><?= $ai_model_count ?></a>
<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 "../includes/footer.php";

173
admin/api_keys.php Normal file
View File

@@ -0,0 +1,173 @@
<?php
// Default Column Sortby Filter
$sort = "api_key_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM api_keys
LEFT JOIN clients on api_keys.api_key_client_id = clients.client_id
WHERE (api_key_name LIKE '%$q%')
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-key mr-2"></i>API Keys</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/api/api_key_add.php"><i class="fas fa-plus mr-2"></i>New API Key</button>
</div>
</div>
<div class="card-body">
<form autocomplete="off">
<div class="row">
<div class="col-md-4">
<div class="input-group mb-3 mb-md-0">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search keys">
<div class="input-group-append">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
<div class="col-md-8">
<div class="btn-group float-right">
<div class="dropdown ml-2" id="bulkActionButton" hidden>
<button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown">
<i class="fas fa-fw fa-layer-group mr-2"></i>Bulk Action (<span id="selectedCount">0</span>)
</button>
<div class="dropdown-menu">
<button class="dropdown-item text-danger text-bold"
type="submit" form="bulkActions" name="bulk_delete_api_keys">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</button>
</div>
</div>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<form id="bulkActions" action="post.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<td class="pr-0">
<div class="form-check">
<input class="form-check-input" type="checkbox" onclick="checkAll(this)">
</div>
</td>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=api_key_name&order=<?php echo $disp; ?>">
Name <?php if ($sort == 'api_key_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=api_key_client_id&order=<?php echo $disp; ?>">
Client <?php if ($sort == 'api_key_client_id') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=api_key_secret&order=<?php echo $disp; ?>">
Secret <?php if ($sort == 'api_key_secret') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=api_key_created_at&order=<?php echo $disp; ?>">
Created <?php if ($sort == 'api_key_created_at') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=api_key_expire&order=<?php echo $disp; ?>">
Expires <?php if ($sort == 'api_key_expire') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$api_key_id = intval($row['api_key_id']);
$api_key_name = nullable_htmlentities($row['api_key_name']);
$api_key_secret = nullable_htmlentities("************" . substr($row['api_key_secret'], -4));
$api_key_created_at = nullable_htmlentities($row['api_key_created_at']);
$api_key_expire = nullable_htmlentities($row['api_key_expire']);
if ($api_key_expire < date("Y-m-d H:i:s")) {
$api_key_expire = $api_key_expire . " (Expired)";
}
if ($row['api_key_client_id'] == 0) {
$api_key_client = "<i>All Clients</i>";
} else {
$api_key_client = nullable_htmlentities($row['client_name']);
}
?>
<tr>
<td class="pr-0">
<div class="form-check">
<input class="form-check-input bulk-select" type="checkbox" name="api_key_ids[]" value="<?php echo $api_key_id ?>">
</div>
</td>
<td class="text-bold"><?php echo $api_key_name; ?></td>
<td><?php echo $api_key_client; ?></td>
<td><?php echo $api_key_secret; ?></td>
<td><?php echo $api_key_created_at; ?></td>
<td><?php echo $api_key_expire; ?></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">
<?php if ($api_key_expire > date("Y-m-d H:i:s")) { ?>
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?revoke_api_key=<?php echo $api_key_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-times mr-2"></i>Revoke
</a>
<?php } ?>
<?php if ($api_key_expire < date("Y-m-d H:i:s")) { ?>
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_api_key=<?php echo $api_key_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-times mr-2"></i>Delete
</a>
<?php } ?>
</div>
</div>
</td>
</tr>
<?php } ?>
</tbody>
</table>
</form>
</div>
<?php require_once "../includes/filter_footer.php"; ?>
</div>
</div>
<script src="../js/bulk_actions.js"></script>
<?php
require_once "../includes/footer.php";

173
admin/app_log.php Normal file
View File

@@ -0,0 +1,173 @@
<?php
// Default Column Sortby Filter
$sort = "app_log_id";
$order = "DESC";
require_once "includes/inc_all_admin.php";
// Log Type Filter
if (isset($_GET['type']) & !empty($_GET['type'])) {
$log_type_query = "AND (app_log_type = '" . sanitizeInput($_GET['type']) . "')";
$type_filter = nullable_htmlentities($_GET['type']);
} else {
// Default - any
$log_type_query = '';
$type_filter = '';
}
// Log Category Filter
if (isset($_GET['category']) & !empty($_GET['catergory'])) {
$log_category_query = "AND (app_log_category = '" . sanitizeInput($_GET['category']) . "')";
$category_filter = nullable_htmlentities($_GET['category']);
} else {
// Default - any
$log_category_query = '';
$category_filter = '';
}
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM app_logs
WHERE (app_log_type LIKE '%$q%' OR app_log_category LIKE '%$q%' OR app_log_details LIKE '%$q%')
AND DATE(app_log_created_at) BETWEEN '$dtf' AND '$dtt'
$log_type_query
$log_category_query
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-history mr-2"></i>App Logs</h3>
</div>
<div class="card-body">
<form autocomplete="off">
<div class="row">
<div class="col-sm-4">
<div class="form-group">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search app logs">
<div class="input-group-append">
<button class="btn btn-secondary" type="button" data-toggle="collapse" data-target="#advancedFilter"><i class="fas fa-filter"></i></button>
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="form-group">
<select class="form-control select2" name="type" onchange="this.form.submit()">
<option value="">- All Types -</option>
<?php
$sql_types_filter = mysqli_query($mysqli, "SELECT DISTINCT app_log_type FROM app_logs ORDER BY app_log_type ASC");
while ($row = mysqli_fetch_assoc($sql_types_filter)) {
$log_type = nullable_htmlentities($row['app_log_type']);
?>
<option <?php if ($type_filter == $log_type) { echo "selected"; } ?>><?php echo $log_type; ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="col-sm-2">
<div class="form-group">
<select class="form-control select2" name="category" onchange="this.form.submit()">
<option value="">- All Categories -</option>
<?php
$sql_categories_filter = mysqli_query($mysqli, "SELECT DISTINCT app_log_category FROM app_logs ORDER BY app_log_category ASC");
while ($row = mysqli_fetch_assoc($sql_categories_filter)) {
$log_category = nullable_htmlentities($row['app_log_category']);
?>
<option <?php if ($category_filter == $log_category) { echo "selected"; } ?>><?php echo $log_category; ?></option>
<?php
}
?>
</select>
</div>
</div>
</div>
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
<div class="row">
<div class="col-md-3">
<div class="form-group">
<label>Date range</label>
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
</div>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-sm table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=app_log_created_at&order=<?php echo $disp; ?>">
Timestamp <?php if ($sort == 'app_log_created_at') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=app_log_type&order=<?php echo $disp; ?>">
Type <?php if ($sort == 'app_log_type') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=app_log_category&order=<?php echo $disp; ?>">
Category <?php if ($sort == 'app_log_category') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=app_log_details&order=<?php echo $disp; ?>">
Details <?php if ($sort == 'app_log_details') { echo $order_icon; } ?>
</a>
</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$log_id = intval($row['app_log_id']);
$log_type = nullable_htmlentities($row['app_log_type']);
$log_category = nullable_htmlentities($row['app_log_category']);
$log_details = nullable_htmlentities($row['app_log_details']);
$log_created_at = nullable_htmlentities($row['app_log_created_at']);
?>
<tr>
<td><?php echo $log_created_at; ?></td>
<td><?php echo $log_type; ?></td>
<td><?php echo $log_category; ?></td>
<td><?php echo $log_details; ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>
<?php
require_once "../includes/footer.php";

282
admin/audit_log.php Normal file
View File

@@ -0,0 +1,282 @@
<?php
// Default Column Sortby Filter
$sort = "log_id";
$order = "DESC";
require_once "includes/inc_all_admin.php";
// User Filter
if (isset($_GET['user']) & !empty($_GET['user'])) {
$user_query = 'AND (log_user_id = ' . intval($_GET['user']) . ')';
$user_filter = intval($_GET['user']);
} else {
// Default - any
$user_query = '';
$user_filter = '';
}
// Client Filter
if (isset($_GET['client']) & !empty($_GET['client'])) {
$client_query = 'AND (log_client_id = ' . intval($_GET['client']) . ')';
$client_filter = intval($_GET['client']);
} else {
// Default - any
$client_query = '';
$client_filter = '';
}
// Log Type Filter
if (isset($_GET['type']) & !empty($_GET['type'])) {
$log_type_query = "AND (log_type = '" . sanitizeInput($_GET['type']) . "')";
$type_filter = nullable_htmlentities($_GET['type']);
} else {
// Default - any
$log_type_query = '';
$type_filter = '';
}
// Log Action Filter
if (isset($_GET['action']) & !empty($_GET['action'])) {
$log_action_query = "AND (log_action = '" . sanitizeInput($_GET['action']) . "')";
$action_filter = nullable_htmlentities($_GET['action']);
} else {
// Default - any
$log_action_query = '';
$action_filter = '';
}
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM logs
LEFT JOIN users ON log_user_id = user_id
LEFT JOIN clients ON log_client_id = client_id
WHERE (log_type LIKE '%$q%' OR log_action LIKE '%$q%' OR log_description LIKE '%$q%' OR log_ip LIKE '%$q%' OR log_user_agent LIKE '%$q%' OR user_name LIKE '%$q%' OR client_name LIKE '%$q%')
AND DATE(log_created_at) BETWEEN '$dtf' AND '$dtt'
$user_query
$client_query
$log_type_query
$log_action_query
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-history mr-2"></i>Audit Logs</h3>
</div>
<div class="card-body">
<form class="mb-4" autocomplete="off">
<div class="row">
<div class="col-sm-4">
<div class="input-group mb-3 mb-md-0">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search audit logs">
<div class="input-group-append">
<button class="btn btn-secondary" type="button" data-toggle="collapse" data-target="#advancedFilter"><i class="fas fa-filter"></i></button>
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
<div class="col-sm-2">
<div class="input-group mb-3 mb-md-0">
<select class="form-control select2" name="client" onchange="this.form.submit()">
<option value="">- All Clients -</option>
<?php
$sql_clients_filter = mysqli_query($mysqli, "SELECT * FROM clients ORDER BY client_name ASC");
while ($row = mysqli_fetch_assoc($sql_clients_filter)) {
$client_id = intval($row['client_id']);
$client_name = nullable_htmlentities($row['client_name']);
?>
<option <?php if ($client_filter == $client_id) { echo "selected"; } ?> value="<?php echo $client_id; ?>"><?php echo $client_name; ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="col-sm-2">
<div class="input-group mb-3 mb-md-0">
<select class="form-control select2" name="user" onchange="this.form.submit()">
<option value="">- All Users -</option>
<?php
$sql_users_filter = mysqli_query($mysqli, "SELECT * FROM users ORDER BY user_name ASC");
while ($row = mysqli_fetch_assoc($sql_users_filter)) {
$user_id = intval($row['user_id']);
$user_name = nullable_htmlentities($row['user_name']);
?>
<option <?php if ($user_filter == $user_id) { echo "selected"; } ?> value="<?php echo $user_id; ?>"><?php echo $user_name; ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="col-sm-2">
<div class="input-group mb-3 mb-md-0">
<select class="form-control select2" name="type" onchange="this.form.submit()">
<option value="">- All Types -</option>
<?php
$sql_types_filter = mysqli_query($mysqli, "SELECT DISTINCT log_type FROM logs ORDER BY log_type ASC");
while ($row = mysqli_fetch_assoc($sql_types_filter)) {
$log_type = nullable_htmlentities($row['log_type']);
?>
<option <?php if ($type_filter == $log_type) { echo "selected"; } ?>><?php echo $log_type; ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="col-sm-2">
<div class="input-group mb-3 mb-md-0">
<select class="form-control select2" name="action" onchange="this.form.submit()">
<option value="">- All Actions -</option>
<?php
$sql_actions_filter = mysqli_query($mysqli, "SELECT DISTINCT log_action FROM logs ORDER BY log_action ASC");
while ($row = mysqli_fetch_assoc($sql_actions_filter)) {
$log_action = nullable_htmlentities($row['log_action']);
?>
<option <?php if ($action_filter == $log_action) { echo "selected"; } ?>><?php echo $log_action; ?></option>
<?php
}
?>
</select>
</div>
</div>
</div>
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
<div class="row">
<div class="col-md-3">
<div class="form-group">
<label>Date range</label>
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
</div>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-sm table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?> text-nowrap">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_created_at&order=<?php echo $disp; ?>">
Timestamp <?php if ($sort == 'log_created_at') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=user_name&order=<?php echo $disp; ?>">
User <?php if ($sort == 'user_name') { echo $order_icon; } ?>
</a>
</th>
<?php if (empty($client)) { ?>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=client_name&order=<?php echo $disp; ?>">
Client <?php if ($sort == 'client_name') { echo $order_icon; } ?>
</a>
</th>
<?php } ?>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_type&order=<?php echo $disp; ?>">
Type <?php if ($sort == 'log_type') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_action&order=<?php echo $disp; ?>">
Action <?php if ($sort == 'log_action') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_description&order=<?php echo $disp; ?>">
Description <?php if ($sort == 'log_description') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_ip&order=<?php echo $disp; ?>">
IP Address <?php if ($sort == 'log_ip') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=log_user_agent&order=<?php echo $disp; ?>">
User Agent <?php if ($sort == 'log_user_agent') { echo $order_icon; } ?>
</a>
</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$log_id = intval($row['log_id']);
$log_type = nullable_htmlentities($row['log_type']);
$log_action = nullable_htmlentities($row['log_action']);
$log_description = nullable_htmlentities($row['log_description']);
$log_ip = nullable_htmlentities($row['log_ip']);
$log_user_agent = nullable_htmlentities($row['log_user_agent']);
$log_user_os = getOS($log_user_agent);
$log_user_browser = getWebBrowser($log_user_agent);
$log_created_at = nullable_htmlentities($row['log_created_at']);
$user_id = intval($row['user_id']);
$user_name = nullable_htmlentities($row['user_name']);
if (empty($user_name)) {
$user_name_display = "-";
} else {
$user_name_display = $user_name;
}
$client_name = nullable_htmlentities($row['client_name']);
$client_id = intval($row['client_id']);
if (empty($client_name)) {
$client_name_display = "-";
} else {
$client_name_display = "<a href='../agent/client_overview.php?client_id=$client_id'>$client_name</a>";
}
$log_entity_id = intval($row['log_entity_id']);
?>
<tr>
<td><?php echo $log_created_at; ?></td>
<td><?php echo $user_name_display; ?></td>
<?php if(empty($client)) { ?>
<td><?php echo $client_name_display; ?></td>
<?php } ?>
<td><?php echo $log_type; ?></td>
<td><?php echo $log_action; ?></td>
<td><?php echo $log_description; ?></td>
<td><?php echo $log_ip; ?></td>
<td><?php echo "$log_user_os<div class='text-secondary'>$log_user_browser</div>"; ?></td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>
<?php
require_once "../includes/footer.php";

38
admin/backup.php Normal file
View File

@@ -0,0 +1,38 @@
<?php
require_once "includes/inc_all_admin.php";
?>
<div class="card card-dark mb-3">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-database mr-2"></i>Download Database</h3>
</div>
<div class="card-body" style="text-align: center;">
<div class="alert alert-secondary">If you are unable to back up the entire VM, you'll need to back up the files & database individually. There is no built-in restore. See the <a href="https://docs.itflow.org/backups" target="_blank">docs here</a>.</div>
<a class="btn btn-primary btn-lg p-3" href="post.php?download_backup&csrf_token=<?php echo $_SESSION['csrf_token'] ?>"><i class="fas fa-fw fa-4x fa-download"></i><br><br>Download Backup</a>
</div>
</div>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-key mr-2"></i>Backup Master Encryption Key</h3>
</div>
<div class="card-body">
<div class="card-body">
<form action="post.php" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="d-flex justify-content-center">
<div class="input-group col-sm-4">
<input type="password" class="form-control" placeholder="Enter your account password" name="password" autocomplete="new-password" required>
<div class="input-group-append">
<button class="btn btn-primary" type="submit" name="backup_master_key"><i class="fas fa-key"></i></button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
<?php
require_once "../includes/footer.php";

179
admin/category.php Normal file
View File

@@ -0,0 +1,179 @@
<?php
// Default Column Sortby Filter
$sort = "category_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
if (isset($_GET['category'])) {
$category = sanitizeInput($_GET['category']);
} else {
$category = "Expense";
}
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM categories
WHERE category_name LIKE '%$q%'
AND category_type = '$category'
AND category_$archive_query
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-fw fa-list-ul mr-2"></i>
<?php echo nullable_htmlentities($category); ?> Categories
</h3>
<?php
if (!isset($_GET['archived'])) {
?>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/category/category_add.php?category=<?= nullable_htmlentities($category) ?>"><i
class="fas fa-plus mr-2"></i>New <?php echo nullable_htmlentities($category); ?> Category</button>
</div>
<?php
}
?>
</div>
<div class="card-body">
<form autocomplete="off">
<input type="hidden" name="category" value="<?php echo nullable_htmlentities($category); ?>">
<div class="row">
<div class="col-sm-4 mb-2">
<div class="input-group">
<input type="search" class="form-control" name="q"
value="<?php if (isset($q)) {
echo stripslashes(nullable_htmlentities($q));
} ?>"
placeholder="Search <?php echo nullable_htmlentities($category); ?> Categories ">
<div class="input-group-append">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
<div class="col-sm-8">
<div class="btn-group float-right">
<a href="?category=Expense"
class="btn <?php if ($category == 'Expense') {
echo 'btn-primary';
} else {
echo 'btn-default';
} ?>">Expense</a>
<a href="?category=Income"
class="btn <?php if ($category == 'Income') {
echo 'btn-primary';
} else {
echo 'btn-default';
} ?>">Income</a>
<a href="?category=Referral"
class="btn <?php if ($category == 'Referral') {
echo 'btn-primary';
} else {
echo 'btn-default';
} ?>">Referral</a>
<a href="?category=Ticket"
class="btn <?php if ($category == 'Ticket') {
echo 'btn-primary';
} else {
echo 'btn-default';
} ?>">Ticket</a>
<a href="?<?php echo $url_query_strings_sort ?>&archived=1"
class="btn <?php if (isset($_GET['archived'])) {
echo 'btn-primary';
} else {
echo 'btn-default';
} ?>"><i
class="fas fa-fw fa-archive mr-2"></i>Archived</a>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=category_name&order=<?php echo $disp; ?>">
Name <?php if ($sort == 'category_name') { echo $order_icon; } ?>
</a>
</th>
<th>Color</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$category_id = intval($row['category_id']);
$category_name = nullable_htmlentities($row['category_name']);
$category_color = nullable_htmlentities($row['category_color']);
?>
<tr>
<td>
<a class="text-dark ajax-modal" href="#"
data-modal-url="modals/category/category_edit.php?id=<?= $category_id ?>">
<?php echo $category_name; ?>
</a>
</td>
<td><i class="fa fa-3x fa-circle" style="color:<?php echo $category_color; ?>;"></i></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">
<?php
if ($archived) {
?>
<a class="dropdown-item text-success confirm-link"
href="post.php?unarchive_category=<?php echo $category_id; ?>">
<i class="fas fa-fw fa-archive mr-2"></i>Unarchive
</a>
<a class="dropdown-item text-danger confirm-link"
href="post.php?delete_category=<?php echo $category_id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
<?php
} else {
?>
<a class="dropdown-item ajax-modal" href="#"
data-modal-url="modals/category/category_edit.php?id=<?= $category_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<a class="dropdown-item text-danger confirm-link"
href="post.php?archive_category=<?php echo $category_id; ?>">
<i class="fas fa-fw fa-archive mr-2"></i>Archive
</a>
<?php
}
?>
</div>
</div>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>
<?php
require_once "../includes/footer.php";

125
admin/contract_template.php Normal file
View File

@@ -0,0 +1,125 @@
<?php
// Default Column Sort by Filter
$sort = "contract_template_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
// Search query
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM contract_templates
WHERE contract_template_name LIKE '%$q%' OR contract_template_type LIKE '%$q%' OR contract_template_name LIKE '%$q%'
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-fw fa-file-contract mr-2"></i>Contract Templates</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/contract_template/contract_template_add.php" data-modal-size="lg">
<i class="fas fa-plus mr-2"></i>New Template
</button>
</div>
</div>
<div class="card-body">
<form autocomplete="off">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search templates">
<div class="input-group-append">
<button class="btn btn-secondary"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th>Template Name</th>
<th>Type</th>
<th>Update Frequency</th>
<th>SLA (L/M/H Response)</th>
<th>SLA (L/M/H Resolution)</th>
<th>Hourly Rate</th>
<th>After Hours Rate</th>
<th>Support Hours</th>
<th>Net Terms</th>
<th>Created</th>
<th>Updated</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$id = intval($row['contract_template_id']);
$name = nullable_htmlentities($row['contract_template_name']);
$type = nullable_htmlentities($row['contract_template_type']);
$freq = nullable_htmlentities($row['contract_template_update_frequency']);
$sla_low_resp = nullable_htmlentities($row['sla_low_response_time']);
$sla_med_resp = nullable_htmlentities($row['sla_medium_response_time']);
$sla_high_resp = nullable_htmlentities($row['sla_high_response_time']);
$sla_low_res = nullable_htmlentities($row['sla_low_resolution_time']);
$sla_med_res = nullable_htmlentities($row['sla_medium_resolution_time']);
$sla_high_res = nullable_htmlentities($row['sla_high_resolution_time']);
$hourly_rate = nullable_htmlentities($row['contract_template_hourly_rate']);
$after_hours = nullable_htmlentities($row['contract_template_after_hours_hourly_rate']);
$support_hours = nullable_htmlentities($row['contract_template_support_hours']);
$net_terms = nullable_htmlentities($row['contract_template_net_terms']);
$created = nullable_htmlentities($row['contract_template_created_at']);
$updated = nullable_htmlentities($row['contract_template_updated_at']);
?>
<tr>
<td>
<a class="text-bold" href="contract_template_details.php?contract_template_id=<?php echo $id; ?>">
<i class="fas fa-fw fa-file-alt text-dark"></i> <?php echo $name; ?>
</a>
<div class="mt-1 text-secondary"><?php echo nullable_htmlentities($row['contract_template_description']); ?></div>
</td>
<td><?php echo $type; ?></td>
<td><?php echo $freq; ?></td>
<td><?php echo "$sla_low_resp / $sla_med_resp / $sla_high_resp"; ?></td>
<td><?php echo "$sla_low_res / $sla_med_res / $sla_high_res"; ?></td>
<td><?php echo $hourly_rate; ?></td>
<td><?php echo $after_hours; ?></td>
<td><?php echo $support_hours; ?></td>
<td><?php echo $net_terms; ?></td>
<td><?php echo $created; ?></td>
<td><?php echo $updated; ?></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-size="xl"
data-modal-url="modals/contract_template/contract_template_edit.php?id=<?= $id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold" href="post.php?delete_contract_template=<?php echo $id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>
<?php } ?>
</tbody>
</table>
<br>
</div>
<?php require_once "../includes/filter_footer.php"; ?>
</div>
</div>
<?php require_once "../includes/footer.php"; ?>

8
admin/custom/readme.php Normal file
View File

@@ -0,0 +1,8 @@
<?php
/*
- Custom Pages -
If you wish to add custom pages to ITFlow, add them to this directory"
Link to Documentation for File Directory Structure and examples
*/

148
admin/custom_link.php Normal file
View File

@@ -0,0 +1,148 @@
<?php
// Default Column Sortby Filter
$sort = "custom_link_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM custom_links
WHERE custom_link_name LIKE '%$q%'
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-external-link-alt mr-2"></i>Custom Links</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/custom_link/custom_link_add.php"><i class="fas fa-plus mr-2"></i>New Link</button>
</div>
</div>
<div class="card-body">
<div class="row">
<div class="col-sm-4 mb-2">
<form autocomplete="off">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search Links">
<div class="input-group-append">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
</div>
<div class="col-sm-8">
</div>
</div>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=custom_link_name&order=<?php echo $disp; ?>">
Name <?php if ($sort == 'custom_link_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=custom_link_order&order=<?php echo $disp; ?>">
Order <?php if ($sort == 'custom_link_order') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=custom_link_uri&order=<?php echo $disp; ?>">
URI / <span class="text-secondary">New Tab</span> <?php if ($sort == 'custom_link_uri') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=custom_link_location&order=<?php echo $disp; ?>">
Location <?php if ($sort == 'custom_link_location') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$custom_link_id = intval($row['custom_link_id']);
$custom_link_name = nullable_htmlentities($row['custom_link_name']);
$custom_link_uri = nullable_htmlentities($row['custom_link_uri']);
$custom_link_icon = nullable_htmlentities($row['custom_link_icon']);
$custom_link_new_tab = intval($row['custom_link_new_tab']);
if ($custom_link_new_tab == 1 ) {
$custom_link_new_tab_display = "<i class='fas fa-fw fa-checkmark'></i>";
} else {
$custom_link_new_tab_display = "";
}
$custom_link_order = intval($row['custom_link_order']);
if ($custom_link_order == 0 ) {
$custom_link_order_display = "-";
} else {
$custom_link_order_display = $custom_link_order;
}
$custom_link_location = intval($row['custom_link_location']);
if ($custom_link_location == 1) {
$custom_link_location_display = "Main Side Nav";
} elseif ($custom_link_location == 2) {
$custom_link_location_display = "Top Nav";
} elseif ($custom_link_location == 3) {
$custom_link_location_display = "Client Portal Nav";
} elseif ($custom_link_location == 4) {
$custom_link_location_display = "Admin Nav";
} elseif ($custom_link_location == 5) {
$custom_link_location_display = "Reports Nav";
}
?>
<tr>
<td>
<a class="ajax-modal" href="#"
data-modal-url="modals/custom_link/custom_link_edit.php?id=<?= $custom_link_id ?>">
<i class="fa fa-fw fa-<?php echo $custom_link_icon; ?> mr-2"></i><?php echo $custom_link_name;?>
</a>
</td>
<td><?php echo $custom_link_order_display; ?></td>
<td><?php echo "$custom_link_uri $custom_link_new_tab_display"; ?></td>
<td><?php echo $custom_link_location_display; ?></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/custom_link/custom_link_edit.php?id=<?= $custom_link_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_custom_link=<?php echo $custom_link_id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>
<?php
require_once "../includes/footer.php";

4204
admin/database_updates.php Normal file

File diff suppressed because it is too large Load Diff

768
admin/debug.php Normal file
View File

@@ -0,0 +1,768 @@
<?php
require_once "includes/inc_all_admin.php";
require_once "../includes/database_version.php";
require_once "../config.php";
$checks = [];
// Execute the git command to get the latest commit hash
$commitHash = shell_exec('git log -1 --format=%H');
// Get branch info
$gitBranch = shell_exec('git rev-parse --abbrev-ref HEAD');
// Section: System Information
$systemInfo = [];
// Operating System and Version
$os = php_uname();
$systemInfo[] = [
'name' => 'Operating System',
'value' => $os,
];
// Web Server and Version
$webServer = $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown';
$systemInfo[] = [
'name' => 'Web Server',
'value' => $webServer,
];
// Kernel and Version
$kernelVersion = php_uname('r');
$systemInfo[] = [
'name' => 'Kernel Version',
'value' => $kernelVersion,
];
// Database and Version
$dbVersion = $mysqli->server_info;
$systemInfo[] = [
'name' => 'Database Version',
'value' => $dbVersion,
];
// Section: PHP Extensions
$phpExtensions = [];
$extensions = [
'php-mysqli' => 'mysqli',
'php-intl' => 'intl',
'php-curl' => 'curl',
'php-mbstring' => 'mbstring',
'php-gd' => 'gd',
'php-zip' => 'zip',
'php-xml' => 'xml',
];
foreach ($extensions as $name => $ext) {
$loaded = extension_loaded($ext);
$phpExtensions[] = [
'name' => "$name installed",
'passed' => $loaded,
'value' => $loaded ? 'Installed' : 'Not Installed',
];
}
// Section: PHP Configuration
$phpConfig = [];
// Check if shell_exec is enabled
$disabled_functions = explode(',', ini_get('disable_functions'));
$disabled_functions = array_map('trim', $disabled_functions);
$shell_exec_enabled = !in_array('shell_exec', $disabled_functions);
$phpConfig[] = [
'name' => 'shell_exec is enabled',
'passed' => $shell_exec_enabled,
'value' => $shell_exec_enabled ? 'Enabled' : 'Disabled',
];
// Check upload_max_filesize and post_max_size >= 500M
function return_bytes($val) {
$val = trim($val);
$unit = strtolower(substr($val, -1));
$num = (float)$val;
switch ($unit) {
case 'g':
$num *= 1024;
case 'm':
$num *= 1024;
case 'k':
$num *= 1024;
}
return $num;
}
$required_bytes = 500 * 1024 * 1024; // 500M in bytes
$upload_max_filesize = ini_get('upload_max_filesize');
$post_max_size = ini_get('post_max_size');
$upload_passed = return_bytes($upload_max_filesize) >= $required_bytes;
$post_passed = return_bytes($post_max_size) >= $required_bytes;
$phpConfig[] = [
'name' => 'upload_max_filesize >= 500M',
'passed' => $upload_passed,
'value' => $upload_max_filesize,
];
$phpConfig[] = [
'name' => 'post_max_size >= 500M',
'passed' => $post_passed,
'value' => $post_max_size,
];
// PHP Memory Limit >= 128M
$memoryLimit = ini_get('memory_limit');
$memoryLimitBytes = return_bytes($memoryLimit);
$memoryLimitPassed = $memoryLimitBytes >= (128 * 1024 * 1024);
$phpConfig[] = [
'name' => 'PHP Memory Limit >= 128M',
'passed' => $memoryLimitPassed,
'value' => $memoryLimit,
];
// Max Execution Time >= 300 seconds
$maxExecutionTime = ini_get('max_execution_time');
$maxExecutionTimePassed = $maxExecutionTime >= 300;
$phpConfig[] = [
'name' => 'Max Execution Time >= 300 seconds',
'passed' => $maxExecutionTimePassed,
'value' => $maxExecutionTime . ' seconds',
];
// Check PHP version >= 8.2.0
$php_version = PHP_VERSION;
$php_passed = version_compare($php_version, '8.2.0', '>=');
$phpConfig[] = [
'name' => 'PHP version >= 8.2.0',
'passed' => $php_passed,
'value' => $php_version,
];
// Section: Shell Commands
$shellCommands = [];
if ($shell_exec_enabled) {
$commands = ['whois', 'dig', 'git'];
foreach ($commands as $command) {
$which = trim(shell_exec("which $command 2>/dev/null"));
$exists = !empty($which);
$shellCommands[] = [
'name' => "Command '$command' available",
'passed' => $exists,
'value' => $exists ? $which : 'Not Found',
];
}
} else {
// If shell_exec is disabled, mark commands as unavailable
foreach (['whois', 'dig', 'git'] as $command) {
$shellCommands[] = [
'name' => "Command '$command' available",
'passed' => false,
'value' => 'shell_exec Disabled',
];
}
}
// Section: SSL Checks
$sslChecks = [];
// Check if accessing via HTTPS
$https = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') || $_SERVER['SERVER_PORT'] == 443;
$sslChecks[] = [
'name' => 'Accessing via HTTPS',
'passed' => $https,
'value' => $https ? 'Yes' : 'No',
];
// SSL Certificate Validity Check
if ($https) {
$streamContext = stream_context_create(["ssl" => ["capture_peer_cert" => true]]);
$socket = @stream_socket_client("ssl://{$_SERVER['HTTP_HOST']}:443", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $streamContext);
if ($socket) {
$params = stream_context_get_params($socket);
$cert = $params['options']['ssl']['peer_certificate'];
$certInfo = openssl_x509_parse($cert);
$validFrom = $certInfo['validFrom_time_t'];
$validTo = $certInfo['validTo_time_t'];
$currentTime = time();
$certValid = ($currentTime >= $validFrom && $currentTime <= $validTo);
$sslChecks[] = [
'name' => 'SSL Certificate is valid',
'passed' => $certValid,
'value' => $certValid ? 'Valid' : 'Invalid or Expired',
];
} else {
$sslChecks[] = [
'name' => 'SSL Certificate is valid',
'passed' => false,
'value' => 'Unable to retrieve certificate',
];
}
} else {
$sslChecks[] = [
'name' => 'SSL Certificate is valid',
'passed' => false,
'value' => 'Not using HTTPS',
];
}
// Section: Domain Checks
$domainChecks = [];
// Check if the site has a valid FQDN
$fqdn = $_SERVER['HTTP_HOST'];
$isValidFqdn = (bool) filter_var('http://' . $fqdn, FILTER_VALIDATE_URL) && preg_match('/^[a-z0-9.-]+\.[a-z]{2,}$/i', $fqdn);
$domainChecks[] = [
'name' => 'Site has a valid FQDN',
'passed' => $isValidFqdn,
'value' => $fqdn,
];
// Section: File Permissions
$filePermissions = [];
// Check if web user has write access to webroot directory
$webroot = $_SERVER['DOCUMENT_ROOT'];
$writable = is_writable($webroot);
$filePermissions[] = [
'name' => 'Web user has write access to webroot directory',
'passed' => $writable,
'value' => $webroot,
];
// Section: Uploads Directory Stats
$uploadsStats = [];
// Define the uploads directory path
$uploadsDir = __DIR__ . '/../uploads'; // Adjust the path if needed
if (is_dir($uploadsDir)) {
// Function to recursively count files and calculate total size
function getDirStats($dir) {
$files = 0;
$size = 0;
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
foreach ($iterator as $file) {
if ($file->isFile()) {
$files++;
$size += $file->getSize();
}
}
return ['files' => $files, 'size' => $size];
}
$stats = getDirStats($uploadsDir);
$sizeInMB = round($stats['size'] / (1024 * 1024), 2);
$uploadsStats[] = [
'name' => 'Number of files in uploads directory',
'value' => $stats['files'],
];
$uploadsStats[] = [
'name' => 'Total size of uploads directory (MB)',
'value' => $sizeInMB . ' MB',
];
} else {
$uploadsStats[] = [
'name' => 'Uploads directory exists',
'value' => 'Directory not found',
];
}
// Section: Database Stats
$databaseStats = [];
// Get list of tables
$tablesResult = $mysqli->query("SHOW TABLE STATUS");
if ($tablesResult) {
$totalTables = 0;
$totalFields = 0;
$totalRows = 0;
$totalSize = 0;
$tableDetails = [];
while ($table = $tablesResult->fetch_assoc()) {
$tableName = $table['Name'];
// Accurate row count
$countResult = $mysqli->query("SELECT COUNT(*) AS cnt FROM `$tableName`");
$countRow = $countResult->fetch_assoc();
$tableRows = $countRow['cnt'];
$countResult->free();
$dataLength = $table['Data_length'];
$indexLength = $table['Index_length'];
$tableSize = ($dataLength + $indexLength) / (1024 * 1024); // Size in MB
// Get number of fields
$fieldsResult = $mysqli->query("SHOW COLUMNS FROM `$tableName`");
$numFields = $fieldsResult->num_rows;
$fieldsResult->free();
$totalTables++;
$totalFields += $numFields;
$totalRows += $tableRows;
$totalSize += $tableSize;
$tableDetails[] = [
'name' => $tableName,
'fields' => $numFields,
'rows' => $tableRows,
'size' => round($tableSize, 2),
];
}
$tablesResult->free();
$databaseStats[] = [
'name' => 'Total number of tables',
'value' => $totalTables,
];
$databaseStats[] = [
'name' => 'Total number of fields',
'value' => $totalFields,
];
$databaseStats[] = [
'name' => 'Total number of rows',
'value' => $totalRows,
];
$databaseStats[] = [
'name' => 'Total database size (MB)',
'value' => round($totalSize, 2) . ' MB',
];
}
// Section: Database Structure Comparison
$dbComparison = [];
// Path to the db.sql file
$dbSqlFile = __DIR__ . '/../db.sql';
if (file_exists($dbSqlFile)) {
// Read the db.sql file
$sqlContent = file_get_contents($dbSqlFile);
// Remove comments and empty lines
$lines = explode("\n", $sqlContent);
$sqlStatements = [];
$statement = '';
foreach ($lines as $line) {
// Remove single-line comments
$line = preg_replace('/--.*$/', '', $line);
$line = preg_replace('/\/\*.*?\*\//', '', $line);
// Skip empty lines
if (trim($line) == '') {
continue;
}
// Append line to the current statement
$statement .= $line . "\n";
// Check if the statement ends with a semicolon
if (preg_match('/;\s*$/', $line)) {
$sqlStatements[] = $statement;
$statement = '';
}
}
// Parse the CREATE TABLE statements
$sqlTables = [];
foreach ($sqlStatements as $sql) {
if (preg_match('/CREATE TABLE\s+`?([^` ]+)`?\s*\((.*)\)(.*?);/msi', $sql, $match)) {
$tableName = $match[1];
$columnsDefinition = $match[2];
// Extract column names and data types
$columns = [];
$columnLines = explode("\n", $columnsDefinition);
foreach ($columnLines as $line) {
$line = trim($line);
// Skip empty lines and lines that do not define columns
if ($line == '' || strpos($line, 'PRIMARY KEY') !== false || strpos($line, 'UNIQUE KEY') !== false || strpos($line, 'KEY') === 0 || strpos($line, 'CONSTRAINT') === 0 || strpos($line, ')') === 0) {
continue;
}
// Remove trailing comma if present
$line = rtrim($line, ',');
// Match column definition
if (preg_match('/^`([^`]+)`\s+(.+)/', $line, $colMatch)) {
$colName = $colMatch[1];
$colDefinition = $colMatch[2];
// Extract the data type from the column definition
$tokens = preg_split('/\s+/', $colDefinition);
$colType = $tokens[0];
// Handle data types with parentheses (e.g., varchar(255), decimal(15,2))
if (preg_match('/^([a-zA-Z]+)\(([^)]+)\)/', $colType, $typeMatch)) {
$colType = $typeMatch[1] . '(' . $typeMatch[2] . ')';
}
$columns[$colName] = $colType;
}
}
$sqlTables[$tableName] = $columns;
}
}
// Get current database table structures
$dbTables = [];
$tablesResult = $mysqli->query("SHOW TABLES");
while ($row = $tablesResult->fetch_row()) {
$tableName = $row[0];
$columnsResult = $mysqli->query("SHOW COLUMNS FROM `$tableName`");
$columns = [];
while ($col = $columnsResult->fetch_assoc()) {
$columns[$col['Field']] = $col['Type'];
}
$columnsResult->free();
$dbTables[$tableName] = $columns;
}
$tablesResult->free();
// Compare the structures
foreach ($sqlTables as $tableName => $sqlColumns) {
if (!isset($dbTables[$tableName])) {
$dbComparison[] = [
'name' => "Table `$tableName` missing in database",
'status' => 'Missing Table',
];
continue;
}
// Compare columns
$dbColumns = $dbTables[$tableName];
foreach ($sqlColumns as $colName => $colType) {
if (!isset($dbColumns[$colName])) {
$dbComparison[] = [
'name' => "Column `$colName` missing in table `$tableName`",
'status' => 'Missing Column',
];
} else {
// Normalize data types for comparison
$sqlColType = strtolower($colType);
$dbColType = strtolower($dbColumns[$colName]);
// Remove attributes and constraints
$sqlColType = preg_replace('/\s+.*$/', '', $sqlColType);
$dbColType = preg_replace('/\s+.*$/', '', $dbColType);
// Remove additional attributes like unsigned, zerofill, etc.
$sqlColType = preg_replace('/\s+unsigned|\s+zerofill|\s+binary/', '', $sqlColType);
$dbColType = preg_replace('/\s+unsigned|\s+zerofill|\s+binary/', '', $dbColType);
if ($sqlColType != $dbColType) {
$dbComparison[] = [
'name' => "Data type mismatch for `$colName` in table `$tableName`",
'status' => "Expected: $colType, Found: {$dbColumns[$colName]}",
];
}
}
}
// Check for extra columns in the database that are not in the SQL file
foreach ($dbColumns as $colName => $colType) {
if (!isset($sqlColumns[$colName])) {
$dbComparison[] = [
'name' => "Extra column `$colName` in table `$tableName` not present in db.sql",
'status' => 'Extra Column',
];
}
}
}
// Check for tables in the database not present in the db.sql file
foreach ($dbTables as $tableName => $dbColumns) {
if (!isset($sqlTables[$tableName])) {
$dbComparison[] = [
'name' => "Extra table `$tableName` in database not present in db.sql",
'status' => 'Extra Table',
];
}
}
} else {
$dbComparison[] = [
'name' => 'db.sql file not found',
'status' => 'File Missing',
];
}
$mysqli->close();
?>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-bug mr-2"></i>Debug</h3>
</div>
<div class="card-body">
<h2>Debugging</h2>
<ul>
<li>If you are experiencing a problem with ITFlow, this page should help you identify any configuration issues.</li>
<li>Note: You might also need to gather <a href="https://docs.itflow.org/gathering_logs#error_logs">error logs</a></li>
</ul>
<hr>
<div class="table-responsive">
<table class="table table-bordered mb-3">
<tr>
<th>ITFlow release version</th>
<th><?php echo APP_VERSION; ?></th>
</tr>
<tr>
<td>Current DB Version</td>
<td><?php echo CURRENT_DATABASE_VERSION; ?></td>
</tr>
<tr>
<td>Current Code Commit</td>
<td><?php echo $commitHash; ?></td>
</tr>
<tr>
<td>Current Branch</td>
<td><?php echo $gitBranch; ?></td>
</tr>
</table>
</div>
<!-- System Information Table -->
<h3>System Information</h3>
<table class="table table-sm table-bordered">
<tbody>
<?php foreach ($systemInfo as $info): ?>
<tr>
<td><?= htmlspecialchars($info['name']); ?></td>
<td><?= htmlspecialchars($info['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<!-- PHP Extensions and Configuration Table -->
<h3 class="mt-3">PHP Extensions and Configuration</h3>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<!-- PHP Extensions Section -->
<thead>
<tr class="table-secondary">
<th colspan="3">PHP Extensions</th>
</tr>
</thead>
<tbody>
<?php foreach ($phpExtensions as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<!-- PHP Configuration Section -->
<thead>
<tr class="table-secondary">
<th colspan="3">PHP Configuration</th>
</tr>
</thead>
<tbody>
<?php foreach ($phpConfig as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<thead>
<tr class="table-secondary">
<th colspan="3">Shell Commands</th>
</tr>
</thead>
<tbody>
<?php foreach ($shellCommands as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<thead>
<tr class="table-secondary">
<th colspan="3">SSL Checks</th>
</tr>
</thead>
<tbody>
<?php foreach ($sslChecks as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<thead>
<tr class="table-secondary">
<th colspan="3">Domain Checks</th>
</tr>
</thead>
<tbody>
<?php foreach ($domainChecks as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
<!-- File Permissions Table -->
<thead>
<tr class="table-secondary">
<th colspan="3">File Permissions</th>
</tr>
</thead>
<tbody>
<?php foreach ($filePermissions as $check): ?>
<tr>
<td><?= htmlspecialchars($check['name']); ?></td>
<td class="text-center">
<?php if ($check['passed']): ?>
<i class="fas fa-check" style="color:green"></i>
<?php else: ?>
<i class="fas fa-times" style="color:red"></i>
<?php endif; ?>
</td>
<td><?= htmlspecialchars($check['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- Database Structure Comparison Table -->
<h3 class="mt-3">Database Structure Comparison</h3>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<tbody>
<?php if (!empty($dbComparison)): ?>
<?php foreach ($dbComparison as $issue): ?>
<tr>
<td><?= htmlspecialchars($issue['name']); ?></td>
<td colspan="2"><?= htmlspecialchars($issue['status']); ?></td>
</tr>
<?php endforeach; ?>
<?php else: ?>
<tr>
<td colspan="3">No discrepancies found between the database and db.sql file.</td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
<!-- Uploads Directory Stats Table -->
<h3 class="mt-3">Uploads Directory Stats</h3>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<tbody>
<?php foreach ($uploadsStats as $stat): ?>
<tr>
<td><?= htmlspecialchars($stat['name']); ?></td>
<td colspan="2"><?= htmlspecialchars($stat['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- Database Stats Table -->
<h3 class="mt-3">Database Stats</h3>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<tbody>
<?php foreach ($databaseStats as $stat): ?>
<tr>
<td><?= htmlspecialchars($stat['name']); ?></td>
<td colspan="2"><?= htmlspecialchars($stat['value']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<!-- Table Stats Table -->
<h3 class="mt-3">Table Stats</h3>
<div class="table-responsive">
<table class="table table-sm table-bordered">
<thead>
<tr>
<th>Table Name</th>
<th>Fields / Rows</th>
<th>Size (MB)</th>
</tr>
</thead>
<tbody>
<?php foreach ($tableDetails as $table): ?>
<tr>
<td><?= htmlspecialchars($table['name']); ?></td>
<td><?= htmlspecialchars("Fields: {$table['fields']}, Rows: {$table['rows']}"); ?></td>
<td><?= htmlspecialchars($table['size'] . ' MB'); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
<?php
require_once "../includes/footer.php";

124
admin/document_template.php Normal file
View File

@@ -0,0 +1,124 @@
<?php
// Default Column Sort by Filter
$sort = "document_template_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM document_templates
LEFT JOIN users ON document_template_created_by = user_id
WHERE user_name LIKE '%$q%' OR document_template_name LIKE '%$q%'
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-fw fa-file mr-2"></i>Document Templates</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/document_template/document_template_add.php" data-modal-size="xl">
<i class="fas fa-plus mr-2"></i>New Template
</button>
</div>
</div>
<div class="card-body">
<form autocomplete="off">
<div class="input-group">
<input type="search" class="form-control " name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search templates">
<div class="input-group-append">
<button class="btn btn-secondary"><i class="fa fa-search"></i></button>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<th>
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_name&order=<?php echo $disp; ?>">
Template Name <?php if ($sort == 'document_template_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_created_at&order=<?php echo $disp; ?>">
Created <?php if ($sort == 'document_template_created_at') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=document_template_updated_at&order=<?php echo $disp; ?>">
Updated <?php if ($sort == 'document_template_updated_at') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">
Action
</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$document_template_id = intval($row['document_template_id']);
$document_template_name = nullable_htmlentities($row['document_template_name']);
$document_template_description = nullable_htmlentities($row['document_template_description']);
$document_template_content = nullable_htmlentities($row['document_template_content']);
$document_template_created_by_name = nullable_htmlentities($row['user_name']);
$document_template_created_at = nullable_htmlentities($row['document_template_created_at']);
$document_template_updated_at = nullable_htmlentities($row['document_template_updated_at']);
?>
<tr>
<td>
<a class="text-bold" href="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>
<div class="mt-1 text-secondary"><?php echo $document_template_description; ?></div>
</td>
<td>
<?php echo $document_template_created_at; ?>
<div class="text-secondary"><?php echo $document_template_created_by_name; ?></div>
</td>
<td><?php echo $document_template_updated_at; ?></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-size="xl"
data-modal-url="modals/document_template/document_template_edit.php?id=<?= $document_template_id ?>">
<i class="fas fa-fw fa-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger text-bold" href="post.php?delete_document_template=<?php echo $document_template_id; ?>">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</a>
</div>
</div>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
<br>
</div>
<?php require_once "../includes/filter_footer.php"; ?>
</div>
</div>
<?php require_once "../includes/footer.php";

View File

@@ -0,0 +1,70 @@
<?php
require_once "includes/inc_all_admin.php";
//Initialize the HTML Purifier to prevent XSS
require "../plugins/htmlpurifier/HTMLPurifier.standalone.php";
$purifier_config = HTMLPurifier_Config::createDefault();
$purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one
$purifier_config->set('URI.AllowedSchemes', ['data' => true, 'src' => true, 'http' => true, 'https' => true]);
$purifier = new HTMLPurifier($purifier_config);
if (isset($_GET['document_template_id'])) {
$document_template_id = intval($_GET['document_template_id']);
}
$sql_document = mysqli_query($mysqli, "SELECT * FROM document_templates WHERE document_template_id = $document_template_id LIMIT 1");
if (mysqli_num_rows($sql_document) == 0) {
echo "<center><h1 class='text-secondary mt-5'>Nothing to see here</h1><a class='btn btn-lg btn-secondary mt-3' href='javascript:history.back()'><i class='fa fa-fw fa-arrow-left'></i> Go Back</a></center>";
require_once "../includes/footer.php";
exit();
}
$row = mysqli_fetch_assoc($sql_document);
$document_template_name = nullable_htmlentities($row['document_template_name']);
$document_template_description = nullable_htmlentities($row['document_template_description']);
$document_template_content = $purifier->purify($row['document_template_content']);
$document_template_created_at = nullable_htmlentities($row['document_template_created_at']);
$document_template_updated_at = nullable_htmlentities($row['document_template_updated_at']);
?>
<ol class="breadcrumb d-print-none">
<li class="breadcrumb-item">
<a href="../">Home</a>
</li>
<li class="breadcrumb-item">
<a href="users.php">Admin</a>
</li>
<li class="breadcrumb-item">
<a href="document_template.php">Document Templates</a>
</li>
<li class="breadcrumb-item active"><i class="fas fa-file mr-2"></i><?php echo $document_template_name; ?></li>
</ol>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fa fa-fw fa-file mr-2"></i><?php echo $document_template_name; ?></h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal"
data-modal-size="xl"
data-modal-url="modals/document_template/document_template_edit.php?id=<?= $document_template_id ?>">
<i class="fas fa-edit mr-2"></i>Edit
</button>
</div>
</div>
<div class="card-body prettyContent">
<?php echo $document_template_content; ?>
</div>
</div>
<script src="../js/pretty_content.js"></script>
<?php
require_once "../includes/footer.php";

View File

@@ -0,0 +1,58 @@
<?php
require_once "includes/inc_all_admin.php";
?>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-fingerprint mr-2"></i>Identity Providers</h3>
</div>
<div class="card-body">
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<h4>Client Portal SSO via Microsoft Entra</h4>
<div class="form-group">
<label>Identity Provider <small class='text-secondary'>(Currently only works with Microsoft Entra ID/AAD)</small></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-fingerprint"></i></span>
</div>
<select class="form-control select2" readonly>
<option <?php if (empty($config_azure_client_id)) { echo "selected"; } ?>>Disabled</option>
<option <?php if ($config_azure_client_id) { echo "selected"; } ?>>Microsoft Entra</option>
<option>Google (WIP)</option>
<option>Custom SSO (WIP)</option>
</select>
</div>
</div>
<div class="form-group">
<label>MS Entra OAuth App (Client) ID</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<input type="text" class="form-control" name="azure_client_id" placeholder="e721e3b6-01d6-50e8-7f22-c84d951a52e7" value="<?php echo nullable_htmlentities($config_azure_client_id); ?>">
</div>
</div>
<div class="form-group">
<label>MS Entra OAuth Secret</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="password" class="form-control" name="azure_client_secret" placeholder="Auto-generated from App Registration" value="<?php echo nullable_htmlentities($config_azure_client_secret); ?>" autocomplete="new-password">
</div>
</div>
<hr>
<button type="submit" name="edit_identity_provider" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
</form>
</div>
</div>
<?php require_once "../includes/footer.php";

View File

@@ -0,0 +1,16 @@
<?php
require_once $_SERVER['DOCUMENT_ROOT'] . '/config.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/functions.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/check_login.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/page_title.php';
if (!isset($session_is_admin) || !$session_is_admin) {
exit(WORDING_ROLECHECK_FAILED . "<br>Tell your admin: Your role does not have admin access.");
}
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php';
require_once 'includes/side_nav.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_wrapper.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_alert_feedback.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/filter_header.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/app_version.php';

325
admin/includes/side_nav.php Normal file
View File

@@ -0,0 +1,325 @@
<!-- Main Sidebar Container -->
<aside class="main-sidebar sidebar-dark-<?php echo nullable_htmlentities($config_theme); ?> d-print-none">
<a class="brand-link pb-1 mt-1" href="/agent/<?php echo $config_start_page ?>">
<p class="h6">
<i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
<span class="brand-text">
Back | <strong>Administration</strong>
</span>
</p>
</a>
<!-- Sidebar -->
<div class="sidebar">
<!-- Sidebar Menu -->
<nav>
<ul class="nav nav-pills nav-sidebar flex-column mt-2" data-widget="treeview" data-accordion="false">
<li class="nav-header">ACCESS</li>
<li class="nav-item">
<a href="/admin/users.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "users.php") {echo "active";} ?>">
<i class="nav-icon fas fa-users"></i>
<p>Users</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/roles.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "roles.php") {echo "active";} ?>">
<i class="nav-icon fas fa-user-shield"></i>
<p>Roles</p>
</a>
</li>
<!-- 2025-12-05 JQ - Hide Permission Modules currently just shows modules
<li class="nav-item">
<a href="/admin/modules.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "modules.php") {echo "active";} ?>">
<i class="nav-icon fas fa-puzzle-piece"></i>
<p>Modules</p>
</a>
</li>
-->
<li class="nav-item">
<a href="/admin/api_keys.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "api_keys.php") {echo "active";} ?>">
<i class="nav-icon fas fa-key"></i>
<p>API Keys</p>
</a>
</li>
<li class="nav-header">TAGS & CATEGORIES</li>
<li class="nav-item">
<a href="/admin/tag.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'tag.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-tags"></i>
<p>Tags</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/category.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'category.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-list-ul"></i>
<p>Categories</p>
</a>
</li>
<?php if ($config_module_enable_accounting) { ?>
<li class="nav-item">
<a href="/admin/tax.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'tax.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-balance-scale"></i>
<p>Taxes</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/payment_method.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'payment_method.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-hand-holding-usd"></i>
<p>Payment Methods</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/payment_provider.php"
class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['payment_provider.php', 'saved_payment_method.php']) ? 'active' : ''); ?>">
<i class="nav-icon far fa-credit-card"></i>
<p>Payment Providers</p>
</a>
</li>
<?php } ?>
<li class="nav-item">
<a href="/admin/ai_provider.php"
class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['ai_provider.php', 'ai_model.php']) ? 'active' : ''); ?>">
<i class="nav-icon fas fa-robot"></i>
<p>AI Providers</p>
</a>
</li>
<?php if ($config_module_enable_ticketing) { ?>
<li class="nav-item">
<a href="/admin/ticket_status.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ticket_status.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-info-circle"></i>
<p>Ticket Statuses</p>
</a>
</li>
<?php } ?>
<li class="nav-item">
<a href="/admin/custom_link.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'custom_link.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-external-link-alt"></i>
<p>Custom Links</p>
</a>
</li>
<?php if ($config_module_enable_itdoc) { ?>
<li class="nav-header">TEMPLATES</li>
<!-- 2025-11-16 JQ - Hide Contracts not yet ready
<li class="nav-item">
<a href="/admin/contract_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'contract_template.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-file-contract"></i>
<p>
<span href="#" class="fas fa-plus-circle right ajax-modal" data-modal-url="/admin/modals/contract_template/contract_template_add.php" data-modal-size="lg"></span>
Contract Templates
</p>
</a>
</li>
-->
<li class="nav-item">
<a href="/admin/project_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['project_template.php', 'project_template_details.php']) ? 'active' : ''); ?>">
<i class="nav-icon fas fa-project-diagram"></i>
<p>Project Templates</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/ticket_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['ticket_template.php', 'ticket_template_details.php']) ? 'active' : ''); ?>">
<i class="nav-icon fas fa-life-ring"></i>
<p>Ticket Templates</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/vendor_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'vendor_template.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-building"></i>
<p>Vendor Templates</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/software_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'software_template.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-rocket"></i>
<p>License Templates</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/document_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['document_template.php', 'document_template_details.php']) ? 'active' : ''); ?>">
<i class="nav-icon fas fa-file"></i>
<p>Document Templates</p>
</a>
</li>
<?php } ?>
<li class="nav-header">MAINTENANCE</li>
<li class="nav-item">
<a href="/admin/mail_queue.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'mail_queue.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-mail-bulk"></i>
<p>Mail Queue</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/audit_log.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'audit_log.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-history"></i>
<p>Audit Logs</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/app_log.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'app_log.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-history"></i>
<p>App Logs</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/backup.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'backup.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-cloud-upload-alt"></i>
<p>Backup</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/debug.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'debug.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-bug"></i>
<p>Debug</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/update.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'update.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-download"></i>
<p>Update</p>
</a>
</li>
<!-- SETTINGS Section -->
<li class="nav-item has-treeview mt-2 <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['settings_company.php', 'settings_localization.php', 'settings_theme.php', 'settings_security.php', 'settings_mail.php', 'settings_notification.php', 'settings_default.php', 'settings_invoice.php', 'settings_quote.php', 'settings_online_payment.php', 'settings_online_payment_clients.php', 'settings_project.php', 'settings_ticket.php', 'settings_ai.php', 'identity_provider.php', 'settings_telemetry.php', 'settings_module.php']) ? 'menu-open' : ''); ?>">
<a href="#" class="nav-link">
<p>
SETTINGS
<i class="right fas fa-angle-left"></i>
</p>
</a>
<ul class="nav nav-treeview">
<li class="nav-item">
<a href="/admin/settings_company.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_company.php' ? 'active' : ''); ?>">
<i class="nav-icon fa fa-briefcase"></i>
<p>Company Details</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_localization.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_localization.php' ? 'active' : ''); ?>">
<i class="nav-icon fa fa-globe"></i>
<p>Localization</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_theme.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_theme.php' ? 'active' : ''); ?>">
<i class="nav-icon fa fa-paint-brush"></i>
<p>Theme</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_security.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_security.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-shield-alt"></i>
<p>Security</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_mail.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_mail.php' ? 'active' : ''); ?>">
<i class="nav-icon far fa-envelope"></i>
<p>Mail</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_notification.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_notification.php' ? 'active' : ''); ?>">
<i class="nav-icon far fa-bell"></i>
<p>Notifications</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_default.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_default.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-cogs"></i>
<p>Defaults</p>
</a>
</li>
<?php if ($config_module_enable_accounting) { ?>
<li class="nav-item">
<a href="/admin/settings_invoice.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_invoice.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-file-invoice"></i>
<p>Invoice</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_quote.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_quote.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-comment-dollar"></i>
<p>Quote</p>
</a>
</li>
<?php } ?>
<?php if ($config_module_enable_ticketing) { ?>
<li class="nav-item">
<a href="/admin/settings_project.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_project.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-project-diagram"></i>
<p>Project</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_ticket.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_ticket.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-life-ring"></i>
<p>Ticket</p>
</a>
</li>
<?php } ?>
<!-- Currently the only integration is the client portal SSO -->
<?php if ($config_client_portal_enable) { ?>
<li class="nav-item">
<a href="/admin/identity_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'identity_provider.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-fingerprint"></i>
<p>Identity Provider</p>
</a>
</li>
<?php } ?>
<li class="nav-item">
<a href="/admin/settings_telemetry.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_telemetry.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-satellite-dish"></i>
<p>Telemetry</p>
</a>
</li>
<li class="nav-item">
<a href="/admin/settings_module.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_module.php' ? 'active' : ''); ?>">
<i class="nav-icon fas fa-cube"></i>
<p>Modules</p>
</a>
</li>
</ul>
</li>
<?php
$sql_custom_links = mysqli_query($mysqli, "SELECT * FROM custom_links
WHERE custom_link_location = 4 AND custom_link_archived_at IS NULL
ORDER BY custom_link_order ASC, custom_link_name ASC"
);
while ($row = mysqli_fetch_assoc($sql_custom_links)) {
$custom_link_name = nullable_htmlentities($row['custom_link_name']);
$custom_link_uri = sanitize_url($row['custom_link_uri']);
$custom_link_icon = nullable_htmlentities($row['custom_link_icon']);
$custom_link_new_tab = intval($row['custom_link_new_tab']);
if ($custom_link_new_tab == 1) {
$target = "target='_blank' rel='noopener noreferrer'";
} else {
$target = "";
}
?>
<li class="nav-item">
<a href="<?php echo $custom_link_uri; ?>" <?php echo $target; ?> class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == basename($custom_link_uri)) { echo "active"; } ?>">
<i class="fas fa-<?php echo $custom_link_icon; ?> nav-icon"></i>
<p><?php echo $custom_link_name; ?></p>
<i class="fas fa-angle-right nav-icon float-right"></i>
</a>
</li>
<?php } ?>
</ul>
</nav>
<!-- /.sidebar-menu -->
<div class="mb-3"></div>
</div>
<!-- /.sidebar -->
</aside>

4
admin/index.php Normal file
View File

@@ -0,0 +1,4 @@
<?php
header('Location: users.php');

193
admin/mail_queue.php Normal file
View File

@@ -0,0 +1,193 @@
<?php
// Default Column Sortby Filter
$sort = "email_id";
$order = "DESC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM email_queue
WHERE (email_id LIKE '%$q%' OR email_from LIKE '%$q%' OR email_from_name LIKE '%$q%' OR email_recipient LIKE '%$q%' OR email_recipient_name LIKE '%$q%' OR email_subject LIKE '%$q%')
AND DATE(email_queued_at) BETWEEN '$dtf' AND '$dtt'
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-3">
<h3 class="card-title"><i class="fas fa-fw fa-mail-bulk mr-2"></i>Email Queue</h3>
</div>
<div class="card-body">
<form class="mb-4" autocomplete="off">
<div class="row">
<div class="col-sm-4">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) { echo stripslashes(nullable_htmlentities($q)); } ?>" placeholder="Search mail queue">
<div class="input-group-append">
<button class="btn btn-secondary" type="button" data-toggle="collapse" data-target="#advancedFilter"><i class="fas fa-filter"></i></button>
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
<div class="col-sm-8">
<div class="dropdown float-right" id="bulkActionButton" hidden>
<button class="btn btn-secondary dropdown-toggle" type="button" data-toggle="dropdown">
<i class="fas fa-fw fa-layer-group mr-2"></i>Bulk Action (<span id="selectedCount">0</span>)
</button>
<div class="dropdown-menu">
<button class="dropdown-item"
type="submit" form="bulkActions" name="bulk_cancel_emails">
<i class="fas fa-fw fa-ban mr-2"></i>Cancel
</button>
<div class="dropdown-divider"></div>
<button class="dropdown-item text-danger text-bold"
type="submit" form="bulkActions" name="bulk_delete_emails">
<i class="fas fa-fw fa-trash mr-2"></i>Delete
</button>
</div>
</div>
</div>
</div>
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
<div class="row">
<div class="col-md-3">
<div class="form-group">
<label>Date range</label>
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
</div>
</div>
</div>
</div>
</form>
<hr>
<form id="bulkActions" action="post.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="table-responsive-sm">
<table class="table table-sm table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?>">
<tr>
<td class="bg-light pr-0">
<div class="form-check">
<input class="form-check-input" id="selectAllCheckbox" type="checkbox" onclick="checkAll(this)">
</div>
</td>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_queued_at&order=<?php echo $disp; ?>">
Queued <?php if ($sort == 'email_queued_at') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_from&order=<?php echo $disp; ?>">
From <?php if ($sort == 'email_from') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_recipient&order=<?php echo $disp; ?>">
To <?php if ($sort == 'email_recipient') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_subject&order=<?php echo $disp; ?>">
Subject <?php if ($sort == 'email_subject') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_status&order=<?php echo $disp; ?>">
Status <?php if ($sort == 'email_status') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=email_attempts&order=<?php echo $disp; ?>">
Attempts <?php if ($sort == 'email_attempts') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$email_id = intval($row['email_id']);
$email_from = nullable_htmlentities($row['email_from']);
$email_from_name = nullable_htmlentities($row['email_from_name']);
$email_recipient = nullable_htmlentities($row['email_recipient']);
$email_recipient_name = nullable_htmlentities($row['email_recipient_name']);
$email_subject = nullable_htmlentities($row['email_subject']);
$email_attempts = intval($row['email_attempts']);
$email_queued_at = nullable_htmlentities($row['email_queued_at']);
$email_failed_at = nullable_htmlentities($row['email_failed_at']);
$email_sent_at = nullable_htmlentities($row['email_sent_at']);
$email_status = intval($row['email_status']);
if ($email_status == 0) {
$email_status_display = "<div class='text-primary'>Queued</div>";
} elseif($email_status == 1) {
$email_status_display = "<div class='text-warning'>Sending</div>";
} elseif($email_status == 2) {
$email_status_display = "<div class='text-danger'>Failed</div><small class='text-secondary'>$email_failed_at</small>";
} else {
$email_status_display = "<div class='text-success'>Sent</div><small class='text-secondary'>$email_sent_at</small>";
}
?>
<tr>
<td class="pr-0 bg-light">
<?php if ($email_status !== 3) { ?>
<div class="form-check">
<input class="form-check-input bulk-select" type="checkbox" name="email_ids[]" value="<?php echo $email_id ?>">
</div>
<?php } ?>
</td>
<td><?php echo $email_queued_at; ?></td>
<td><?php echo "$email_from<br><small class='text-secondary'>$email_from_name</small>"?></td>
<td><?php echo "$email_recipient<br><small class='text-secondary'>$email_recipient_name</small>"?></td>
<td><?php echo $email_subject; ?></td>
<td><?php echo $email_status_display; ?></td>
<td><?php echo $email_attempts; ?></td>
<td class="text-center">
<a class="btn btn-sm btn-secondary ajax-modal" href="#"
data-modal-size="lg"
data-modal-url="modals/mail_queue/mail_queue_message_view.php?id=<?= $email_id ?>">
<i class="fas fa-fw fa-eye"></i>
</a>
<!-- Show force resend if all retries have failed -->
<?php if ($email_status == 2 && $email_attempts > 3) { ?>
<a class="btn btn-sm btn-success" href="post.php?send_failed_mail=<?php echo $email_id; ?>"><i class="fas fa-fw fa-paper-plane"></i></a>
<?php } ?>
<!-- Allow cancelling a message if it hasn't yet been picked up (e.g. stuck/bugged) -->
<?php if ($email_status !== 3) { ?>
<a class="btn btn-sm btn-danger confirm-link" href="post.php?cancel_mail=<?php echo $email_id; ?>"><i class="fas fa-fw fa-trash"></i></a>
<?php } ?>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
</form>
<?php require_once "../includes/filter_footer.php"; ?>
</div>
</div>
<script src="../js/bulk_actions.js"></script>
<?php
require_once "../includes/footer.php";

View File

@@ -0,0 +1,77 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-robot mr-2"></i>Add AI Model</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="form-group">
<label>Provider <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<select class="form-control select2" name="provider" required>
<option value="">- Select an AI Provider -</option>
<?php
$sql_ai_providers = mysqli_query($mysqli, "SELECT * FROM ai_providers");
while ($row = mysqli_fetch_assoc($sql_ai_providers)) {
$ai_provider_id = intval($row['ai_provider_id']);
$ai_provider_name = nullable_htmlentities($row['ai_provider_name']);
?>
<option value="<?php echo $ai_provider_id; ?>"><?php echo $ai_provider_name; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Model Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<input type="text" class="form-control" name="model" placeholder="ex gpt-4">
</div>
</div>
<div class="form-group">
<label>Use Case <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-th-list"></i></span>
</div>
<select class="form-control select2" name="use_case">
<option>General</option>
<option>Tickets</option>
<option>Documentation</option>
</select>
</div>
</div>
<div class="form-group">
<textarea class="form-control" rows="8" name="prompt" placeholder="Enter a model prompt:"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_ai_model" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,90 @@
<?php
require_once '../../../includes/modal_header.php';
$model_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM ai_models WHERE ai_model_id = $model_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$ai_model_ai_provider_id = intval($row['ai_model_ai_provider_id']);
$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 = nullable_htmlentities($row['ai_model_prompt']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-robot mr-2"></i>Editing: <strong><?php echo $model_name; ?></strong></h5>
<button type="button" class="close text-light" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="model_id" value="<?php echo $model_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Provider <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<select class="form-control select2" name="provider" required>
<option value="">- Select an AI Provider -</option>
<?php
$sql_ai_providers = mysqli_query($mysqli, "SELECT * FROM ai_providers");
while ($row = mysqli_fetch_assoc($sql_ai_providers)) {
$ai_provider_id = intval($row['ai_provider_id']);
$ai_provider_name = nullable_htmlentities($row['ai_provider_name']);
?>
<option <?php if ($ai_provider_id = $ai_model_ai_provider_id) { echo "selected"; } ?> value="<?php echo $ai_provider_id; ?>"><?php echo $ai_provider_name; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Model Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<input type="text" class="form-control" name="model" value="<?php echo $model_name; ?>" placeholder="ex gpt-4">
</div>
</div>
<div class="form-group">
<label>Use Case <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-th-list"></i></span>
</div>
<select class="form-control select2" name="use_case">
<option <?php if ($use_case == 'General') { echo "selected"; } ?>>General</option>
<option <?php if ($use_case == 'Tickets') { echo "selected"; } ?>>Tickets</option>
<option <?php if ($use_case == 'Documentation') { echo "selected"; } ?>>Documentation</option>
</select>
</div>
</div>
<div class="form-group">
<textarea class="form-control" rows="8" name="prompt" placeholder="Enter a model prompt:"><?php echo $prompt; ?></textarea>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_ai_model" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,58 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-robot mr-2"></i>New AI Provider</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="form-group">
<label>Provider Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<input type="text" class="form-control" name="provider" placeholder="ex OpenAI">
</div>
</div>
<div class="form-group">
<label>URL <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
</div>
<input type="url" class="form-control" name="url" placeholder="ex https://ai.company.ext/api">
</div>
</div>
<div class="form-group">
<label>API Key</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="api_key" placeholder="Enter API key here">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_ai_provider" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,69 @@
<?php
require_once '../../../includes/modal_header.php';
$provider_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM ai_providers WHERE ai_provider_id = $provider_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$provider_name = nullable_htmlentities($row['ai_provider_name']);
$url = nullable_htmlentities($row['ai_provider_api_url']);
$key = nullable_htmlentities($row['ai_provider_api_key']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-robot mr-2"></i>Editing: <strong><?php echo $provider_name; ?></strong></h5>
<button type="button" class="close text-light" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="provider_id" value="<?php echo $provider_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Provider Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-robot"></i></span>
</div>
<input type="text" class="form-control" name="provider" value="<?php echo $provider_name; ?>" placeholder="ex OpenAI">
</div>
</div>
<div class="form-group">
<label>URL <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
</div>
<input type="url" class="form-control" name="url" value="<?php echo $url; ?>" placeholder="ex https://ai.company.ext/api">
</div>
</div>
<div class="form-group">
<label>API Key</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="api_key" value="<?php echo $key; ?>" placeholder="Enter API key here">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_ai_provider" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,124 @@
<?php
require_once '../../../includes/modal_header.php';
$key = randomString(32);
$decryptPW = randomString(32);
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-key mr-2"></i>New Key</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-api-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-api-keys">Keys</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-api-details">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="key" value="<?php echo $key ?>">
<input type="hidden" name="password" value="<?php echo $decryptPW ?>">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sticky-note"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Key Name" maxlength="255" required autofocus>
</div>
</div>
<div class="form-group">
<label>Expiration Date <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="date" class="form-control" name="expire" min="<?php echo date('Y-m-d')?>" max="2999-12-31" required>
</div>
</div>
<div class="form-group">
<label>Client Access <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<select class="form-control select2" name="client" required>
<option value="0"> ALL CLIENTS </option>
<?php
$sql = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients WHERE client_archived_at IS NULL ORDER BY client_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$client_id = intval($row['client_id']);
$client_name = nullable_htmlentities($row['client_name']); ?>
<option value="<?php echo $client_id; ?>"><?php echo "$client_name (Client ID: $client_id)"; ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-api-keys">
<div class="form-group">
<label>API Key <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" value="<?php echo $key ?>" required disabled>
<div class="input-group-append">
<button class="btn btn-default clipboardjs" type="button" data-clipboard-text="<?php echo $key; ?>"><i class="fa fa-fw fa-copy"></i></button>
</div>
</div>
</div>
<div class="form-group">
<label>Login credential decryption password <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-unlock-alt"></i></span>
</div>
<input type="text" class="form-control" value="<?php echo $decryptPW ?>" required disabled>
<div class="input-group-append">
<button class="btn btn-default clipboardjs" type="button" data-clipboard-text="<?php echo $decryptPW; ?>"><i class="fa fa-fw fa-copy"></i></button>
</div>
</div>
</div>
<br>
<div class="form-group">
<label>I have made a copy of the key(s)<strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<input type="checkbox" name="ack" value="1" required>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_api_key" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,70 @@
<?php
require_once '../../../includes/modal_header.php';
$category = nullable_htmlentities($_GET['category'] ?? '');
$category_types_array = ['Expense', 'Income', 'Referral', 'Ticket'];
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-list-ul mr-2"></i>New <strong><?= nullable_htmlentities($category) ?></strong> Category</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<?php if ($category) { ?>
<input type="hidden" name="type" value="<?= $category ?>">
<?php } else { ?>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Select Type -</option>
<?php foreach ($category_types_array as $type_select) { ?>
<option><?= $type_select ?></option>
<?php } ?>
</select>
</div>
</div>
<?php } ?>
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list-ul"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Category name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_category" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create Category</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,56 @@
<?php
require_once '../../../includes/modal_header.php';
$category_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM categories WHERE category_id = $category_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$category_name = nullable_htmlentities($row['category_name']);
$category_color = nullable_htmlentities($row['category_color']);
$category_type = nullable_htmlentities($row['category_type']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-list-ul mr-2"></i>Editing category: <strong><?php echo $category_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="category_id" value="<?php echo $category_id; ?>">
<input type="hidden" name="type" value="<?php echo $category_type; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list-ul"></i></span>
</div>
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $category_name; ?>" required>
</div>
</div>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" value="<?php echo $category_color; ?>" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_category" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,221 @@
<?php
require_once '../../../includes/modal_header.php';
$contract_types_array = ['Fully Managed', 'Partialy Managed', 'Break/Fix'];
$renewal_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '7 Year'];
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-file-contract mr-2"></i>New Contract Template</h5>
<button type="button" class="close text-white" data-dismiss="modal"><span>&times;</span></button>
</div>
<!-- Tabs Navigation -->
<ul class="modal-header nav nav-pills nav-justified">
<li class="nav-item">
<a class="nav-link active" id="general-tab" data-toggle="tab" href="#general" role="tab">General Info</a>
</li>
<li class="nav-item">
<a class="nav-link" id="sla-tab" data-toggle="tab" href="#sla" role="tab">SLA</a>
</li>
<li class="nav-item">
<a class="nav-link" id="rates-tab" data-toggle="tab" href="#rates" role="tab">Rates & Support</a>
</li>
<li class="nav-item">
<a class="nav-link" id="details-tab" data-toggle="tab" href="#details" role="tab">Details</a>
</li>
</ul>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="tab-content" id="contractTemplateTabContent">
<!-- General Info Tab -->
<div class="tab-pane fade show active" id="general" role="tabpanel">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-file-contract"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Contract Template Name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Template Description <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
</div>
<input type="text" class="form-control" name="description"
placeholder="Contract Template Description" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Contract Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Select Type -</option>
<?php foreach ($contract_types_array as $type) { ?>
<option><?= $type ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Renewal Frequency</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sync-alt"></i></span>
</div>
<select class="form-control select2" name="renewal_frequency">
<option value="">- Select Frequency -</option>
<?php foreach ($renewal_frequency_array as $renewal_frequency) { ?>
<option><?= $renewal_frequency ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<!-- SLA Tab -->
<div class="tab-pane fade" id="sla" role="tabpanel">
<div class="form-row">
<div class="form-group col-md-6">
<label>Low Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div>
<input type="number" class="form-control" name="sla_low_response_time" placeholder="e.g., 24">
</div>
</div>
<div class="form-group col-md-6">
<label>Low Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
</div>
<input type="number" class="form-control" name="sla_low_resolution_time" placeholder="e.g., 48">
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Medium Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div>
<input type="number" class="form-control" name="sla_medium_response_time" placeholder="e.g., 12">
</div>
</div>
<div class="form-group col-md-6">
<label>Medium Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
</div>
<input type="number" class="form-control" name="sla_medium_resolution_time" placeholder="e.g., 24">
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>High Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-bolt"></i></span>
</div>
<input type="number" class="form-control" name="sla_high_response_time" placeholder="e.g., 1">
</div>
</div>
<div class="form-group col-md-6">
<label>High Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-stopwatch"></i></span>
</div>
<input type="number" class="form-control" name="sla_high_resolution_time" placeholder="e.g., 4">
</div>
</div>
</div>
</div>
<!-- Rates & Support Tab -->
<div class="tab-pane fade" id="rates" role="tabpanel">
<div class="form-group">
<label>Standard Hourly Rate</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
</div>
<input type="text" class="form-control" name="rate_standard" placeholder="e.g., 100">
</div>
</div>
<div class="form-group">
<label>After Hours Hourly Rate</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-moon"></i></span>
</div>
<input type="text" class="form-control" name="rate_after_hours" placeholder="e.g., 150">
</div>
</div>
<div class="form-group">
<label>Support Hours</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="text" class="form-control" name="support_hours" placeholder="e.g., Mon-Fri 9am-5pm">
</div>
</div>
<div class="form-group">
<label>Net Terms</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-file-invoice-dollar"></i></span>
</div>
<input type="text" class="form-control" name="net_terms" placeholder="e.g., Net 30">
</div>
</div>
</div>
<!-- Details Tab -->
<div class="tab-pane fade" id="details" role="tabpanel">
<div class="form-group">
<textarea class="form-control tinymce" rows="6" name="details" placeholder="Enter Contract Details"></textarea>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_contract_template" class="btn btn-primary text-bold">
<i class="fa fa-check mr-2"></i>Create Template
</button>
<button type="button" class="btn btn-light" data-dismiss="modal">
<i class="fa fa-times mr-2"></i>Cancel
</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';
?>

View File

@@ -0,0 +1,265 @@
<?php
require_once '../../../includes/modal_header.php';
$contract_template_id = intval($_GET['id']);
$contract_types_array = ['Fully Managed', 'Partialy Managed', 'Break/Fix'];
$update_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '7 Year'];
// Fetch existing template
$sql = mysqli_query($mysqli, "SELECT * FROM contract_templates WHERE contract_template_id = $contract_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
// Assign locals
$name = nullable_htmlentities($row['contract_template_name']);
$description = nullable_htmlentities($row['contract_template_description']);
$type = nullable_htmlentities($row['contract_template_type']);
$renewal_frequency = nullable_htmlentities($row['contract_template_renewal_frequency']);
$sla_low_resp = intval($row['contract_template_sla_low_response_time']);
$sla_med_resp = intval($row['contract_template_sla_medium_response_time']);
$sla_high_resp = intval($row['contract_template_sla_high_response_time']);
$sla_low_res = intval($row['contract_template_sla_low_resolution_time']);
$sla_med_res = intval($row['contract_template_sla_medium_resolution_time']);
$sla_high_res = intval($row['contract_template_sla_high_resolution_time']);
$hourly_rate = intval($row['contract_template_rate_standard']);
$after_hours = intval($row['contract_template_rate_after_hours']);
$support_hours = nullable_htmlentities($row['contract_template_support_hours']);
$net_terms = intval($row['contract_template_net_terms']);
$details = nullable_htmlentities($row['contract_template_details']);
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-file-contract mr-2"></i>Edit Contract Template</h5>
<button type="button" class="close text-white" data-dismiss="modal"><span>&times;</span></button>
</div>
<!-- Tabs Navigation -->
<ul class="modal-header nav nav-pills nav-justified">
<li class="nav-item">
<a class="nav-link active" id="general-tab" data-toggle="tab" href="#general" role="tab">General Info</a>
</li>
<li class="nav-item">
<a class="nav-link" id="sla-tab" data-toggle="tab" href="#sla" role="tab">SLA</a>
</li>
<li class="nav-item">
<a class="nav-link" id="rates-tab" data-toggle="tab" href="#rates" role="tab">Rates & Support</a>
</li>
<li class="nav-item">
<a class="nav-link" id="details-tab" data-toggle="tab" href="#details" role="tab">Details</a>
</li>
</ul>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="contract_template_id" value="<?php echo $contract_template_id; ?>">
<div class="modal-body">
<div class="tab-content" id="contractTemplateTabContent">
<!-- General Info Tab -->
<div class="tab-pane fade show active" id="general" role="tabpanel">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-file-contract"></i></span>
</div>
<input type="text" class="form-control" name="name"
placeholder="Contract Template Name" maxlength="200" required autofocus
value="<?= $name ?>">
</div>
</div>
<div class="form-group">
<label>Template Description <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
</div>
<input type="text" class="form-control" name="description"
placeholder="Contract Template Description" maxlength="200" required
value="<?= $description ?>">
</div>
</div>
<div class="form-group">
<label>Contract Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Select Type -</option>
<?php foreach ($contract_types_array as $type_select) { ?>
<option <?php if ($type == $type_select) { echo "selected"; } ?>><?= $type_select ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Renewal Frequency</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sync-alt"></i></span>
</div>
<select class="form-control select2" name="renewal_frequency">
<option value="">- Select Frequency -</option>
<?php foreach ($renewal_frequency_array as $renewal_frequency_select) { ?>
<option <?php if ($renewal_frequency == $renewal_frequency_select) { echo "selected"; } ?>><?= $renewal_frequency_select ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<!-- SLA Tab -->
<div class="tab-pane fade" id="sla" role="tabpanel">
<div class="form-row">
<div class="form-group col-md-6">
<label>Low Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div>
<input type="number" class="form-control" name="sla_low_response_time" placeholder="e.g., 24"
value="<?= $sla_low_resp ?>">
</div>
</div>
<div class="form-group col-md-6">
<label>Low Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
</div>
<input type="number" class="form-control" name="sla_low_resolution_time" placeholder="e.g., 48"
value="<?= $sla_low_res ?>">
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>Medium Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div>
<input type="number" class="form-control" name="sla_medium_response_time" placeholder="e.g., 12"
value="<?= $sla_med_resp ?>">
</div>
</div>
<div class="form-group col-md-6">
<label>Medium Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
</div>
<input type="number" class="form-control" name="sla_medium_resolution_time" placeholder="e.g., 24"
value="<?= $sla_med_res ?>">
</div>
</div>
</div>
<div class="form-row">
<div class="form-group col-md-6">
<label>High Priority Response (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-bolt"></i></span>
</div>
<input type="number" class="form-control" name="sla_high_response_time" placeholder="e.g., 1"
value="<?= $sla_high_resp ?>">
</div>
</div>
<div class="form-group col-md-6">
<label>High Priority Resolution (hrs)</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-stopwatch"></i></span>
</div>
<input type="number" class="form-control" name="sla_high_resolution_time" placeholder="e.g., 4"
value="<?= $sla_high_res ?>">
</div>
</div>
</div>
</div>
<!-- Rates & Support Tab -->
<div class="tab-pane fade" id="rates" role="tabpanel">
<div class="form-group">
<label>Standard Hourly Rate</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
</div>
<input type="text" class="form-control" name="rate_standard" placeholder="e.g., 100"
value="<?= $rate_standard ?>">
</div>
</div>
<div class="form-group">
<label>After Hours Hourly Rate</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-moon"></i></span>
</div>
<input type="text" class="form-control" name="rate_after_hours" placeholder="e.g., 150"
value="<?= $rate_after_hours ?>">
</div>
</div>
<div class="form-group">
<label>Support Hours</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="text" class="form-control" name="support_hours" placeholder="e.g., Mon-Fri 9am-5pm"
value="<?= $support_hours ?>">
</div>
</div>
<div class="form-group">
<label>Net Terms</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-file-invoice-dollar"></i></span>
</div>
<input type="text" class="form-control" name="net_terms" placeholder="e.g., Net 30"
value="<?= $net_terms ?>">
</div>
</div>
</div>
<!-- Details Tab -->
<div class="tab-pane fade" id="details" role="tabpanel">
<div class="form-group">
<label>Contract Details</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
</div>
<textarea class="form-control tinymce" rows="6" name="details"
placeholder="Enter Contract Details"><?= $details ?></textarea>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_contract_template" class="btn btn-primary text-bold">
<i class="fa fa-check mr-2"></i>Save Changes
</button>
<button type="button" class="btn btn-light" data-dismiss="modal">
<i class="fa fa-times mr-2"></i>Cancel
</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';
?>

View File

@@ -0,0 +1,41 @@
<div class="modal" id="createCustomFieldModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-th-list mr-2"></i>Create <?php echo nullable_htmlentities($table); ?> field</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="table" value="<?php echo nullable_htmlentities($table); ?>">
<div class="modal-body">
<div class="form-group">
<label>Label <strong class="text-danger">*</strong></label>
<input type="text" class="form-control" name="label" placeholder="Enter a custom field label" maxlength="255" required autofocus>
</div>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-th"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Select a field type -</option>
<option>Text</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="create_custom_field" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,40 @@
<div class="modal" id="editCustomFieldModal<?php echo $custom_field_id; ?>" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-th-list mr-2"></i>Editing custom field: <strong><?php echo $custom_field_label; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="custom_field_id" value="<?php echo $custom_field_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Label <strong class="text-danger">*</strong></label>
<input type="text" class="form-control" name="label" maxlength="255" value="<?php echo $custom_field_label; ?>" required>
</div>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-th"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Select a field type -</option>
<option <?php if ($custom_field_type == 'text') { echo "selected"; } ?> value="text">Text</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_custom_field" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,88 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-external-link-alt mr-2"></i>New Custom Link</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list-ul"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Link name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Order</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sort-numeric-down"></i></span>
</div>
<input type="number" class="form-control" name="order" placeholder="Leave blank for no order">
</div>
</div>
<div class="form-group">
<label>URI <strong class="text-danger">*</strong></label> / <span class="text-secondary">Open New Tab</span>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-external-link-alt"></i></span>
</div>
<input type="text" class="form-control" name="uri" placeholder="Enter Link" maxlength="500" required>
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="new_tab" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Icon</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-image"></i></span>
</div>
<input type="text" class="form-control" name="icon" placeholder="Icon ex handshake" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Location <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-home"></i></span>
</div>
<select class="form-control select2" name="location" required>
<option value="1">Main Side Nav</option>
<option value="2">Top Nav (Icon Required)</option>
<option value="3">Client Portal Nav</option>
<option value="4">Admin Nav</option>
<option value="5">Reports Nav</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_custom_link" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,101 @@
<?php
require_once '../../../includes/modal_header.php';
$custom_link_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM custom_links WHERE custom_link_id = $custom_link_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$custom_link_name = nullable_htmlentities($row['custom_link_name']);
$custom_link_uri = nullable_htmlentities($row['custom_link_uri']);
$custom_link_icon = nullable_htmlentities($row['custom_link_icon']);
$custom_link_new_tab = intval($row['custom_link_new_tab']);
$custom_link_order = intval($row['custom_link_order']);
$custom_link_location = intval($row['custom_link_location']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-external-link-alt mr-2"></i>Editing link: <strong><?php echo $custom_link_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="custom_link_id" value="<?php echo $custom_link_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list-ul"></i></span>
</div>
<input type="text" class="form-control" name="name" value="<?php echo $custom_link_name; ?>" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Order</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sort-numeric-down"></i></span>
</div>
<input type="number" class="form-control" name="order" placeholder="Leave blank for no order" value="<?php echo $custom_link_order; ?>">
</div>
</div>
<div class="form-group">
<label>URI <strong class="text-danger">*</strong></label> / <span class="text-secondary">Open New Tab</span>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-external-link-alt"></i></span>
</div>
<input type="text" class="form-control" name="uri" placeholder="Enter Link" maxlength="500" value="<?php echo $custom_link_uri; ?>" required>
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="new_tab" value="1" <?php if ($custom_link_new_tab == 1) { echo "checked"; } ?>>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Icon</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-image"></i></span>
</div>
<input type="text" class="form-control" name="icon" placeholder="Icon ex handshake" maxlength="200" value="<?php echo $custom_link_icon; ?>">
</div>
</div>
<div class="form-group">
<label>Location <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-home"></i></span>
</div>
<select class="form-control select2" name="location" required>
<option value="1" <?php if ($custom_link_location === 1) { echo "selected"; } ?> >Main Side Nav</option>
<option value="2" <?php if ($custom_link_location === 2) { echo "selected"; } ?> >Top Nav (Icon Required)</option>
<option value="3" <?php if ($custom_link_location === 3) { echo "selected"; } ?> >Client Portal Nav</option>
<option value="4" <?php if ($custom_link_location === 4) { echo "selected"; } ?> >Admin Nav</option>
<option value="5" <?php if ($custom_link_location === 5) { echo "selected"; } ?> >Reports Nav</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_custom_link" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,87 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-file-alt mr-2"></i>Creating Document Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<input type="text" class="form-control" name="name" placeholder="Template name" maxlength="200">
</div>
<div class="form-group">
<label>Enter a prompt for the type of IT documentation you want to generate:</label>
<div class="input-group mb-3">
<input type="text" class="form-control" id="aiPrompt" placeholder="e.g. 'A network troubleshooting guide for junior technicians'">
<div class="input-group-append">
<button class="btn btn-info" type="button" id="generateAIContent">
<i class="fa fa-fw fa-magic mr-1"></i>Generate with AI
</button>
</div>
</div>
</div>
<!-- TinyMCE Content -->
<div class="form-group">
<textarea class="form-control tinymce" name="content"></textarea>
</div>
<div class="form-group">
<input type="text" class="form-control" name="description" placeholder="Enter a short summary">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_document_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<script>
$(document).ready(function(){
$('#generateAIContent').on('click', function(){
var prompt = $('#aiPrompt').val().trim();
if(prompt === '') {
alert('Please enter a prompt.');
return;
}
$('#generateAIContent').prop('disabled', true).html('<i class="fa fa-spinner fa-spin"></i> Generating...');
$.ajax({
url: '/agent/ajax.php?ai_create_document_template', // The PHP script that calls the OpenAI API
method: 'POST',
data: { prompt: prompt },
dataType: 'html',
success: function(response) {
// Assuming you have exactly one TinyMCE instance on the page
// and it's targeting the .tinymce textarea:
tinymce.activeEditor.setContent(response);
},
error: function() {
alert('Error generating content. Please try again.');
},
complete: function() {
$('#generateAIContent').prop('disabled', false).html('<i class="fa fa-fw fa-magic mr-1"></i>Generate with AI');
}
});
});
});
</script>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,47 @@
<?php
require_once '../../../includes/modal_header.php';
$document_template_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM document_templates WHERE document_template_id = $document_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$document_template_name = nullable_htmlentities($row['document_template_name']);
$document_template_description = nullable_htmlentities($row['document_template_description']);
$document_template_content = nullable_htmlentities($row['document_template_content']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-file-alt mr-2"></i>Editing template: <strong><?php echo $document_template_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="document_template_id" value="<?php echo $document_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $document_template_name; ?>" placeholder="Name" required>
</div>
<div class="form-group">
<textarea class="form-control tinymce" name="content"><?php echo $document_template_content; ?></textarea>
</div>
<div class="form-group">
<input type="text" class="form-control" name="description" value="<?php echo $document_template_description; ?>" placeholder="Short summary">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_document_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,79 @@
<?php
require_once '../../../includes/modal_header.php';
if (!isset($session_is_admin) || !$session_is_admin) {
exit(WORDING_ROLECHECK_FAILED . "<br>Tell your admin: Your role does not have admin access.");
}
$email_id = intval($_GET['id']);
//Initialize the HTML Purifier to prevent XSS
require "../../../plugins/htmlpurifier/HTMLPurifier.standalone.php";
$purifier_config = HTMLPurifier_Config::createDefault();
$purifier_config->set('Cache.DefinitionImpl', null); // Disable cache by setting a non-existent directory or an invalid one
$purifier_config->set('URI.AllowedSchemes', ['data' => true, 'src' => true, 'http' => true, 'https' => true]);
$purifier = new HTMLPurifier($purifier_config);
$sql = mysqli_query($mysqli, "SELECT * FROM email_queue WHERE email_id = $email_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$email_from = nullable_htmlentities($row['email_from']);
$email_from_name = nullable_htmlentities($row['email_from_name']);
$email_recipient = nullable_htmlentities($row['email_recipient']);
$email_recipient_name = nullable_htmlentities($row['email_recipient_name']);
$email_subject = nullable_htmlentities($row['email_subject']);
$email_content = $purifier->purify($row['email_content']);
$email_attempts = intval($row['email_attempts']);
$email_queued_at = nullable_htmlentities($row['email_queued_at']);
$email_failed_at = nullable_htmlentities($row['email_failed_at']);
$email_sent_at = nullable_htmlentities($row['email_sent_at']);
$email_status = intval($row['email_status']);
if ($email_status == 0) {
$email_status_display = "<div class='text-primary'>Queued</div>";
} elseif($email_status == 1) {
$email_status_display = "<div class='text-warning'>Sending</div>";
} elseif($email_status == 2) {
$email_status_display = "<div class='text-danger'>Failed</div><small class='text-secondary'>$email_failed_at</small>";
} else {
$email_status_display = "<div class='text-success'>Sent</div><small class='text-secondary'>$email_sent_at</small>";
}
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class='fas fa-fw fa-envelope-open mr-2'></i><strong><?php echo $email_subject; ?></strong></h5>
<button type="button" class="close text-light" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<div class="modal-body">
<div class="row">
<div class="col-md-1">
<span class="text-secondary">From:</span>
</div>
<div class="col-md-10">
<?php echo "<strong>$email_from_name</strong> ($email_from)"; ?>
</div>
</div>
<hr class="my-2">
<div class="row">
<div class="col-md-1">
<span class="text-secondary">To:</span>
</div>
<div class="col-md-10">
<?php echo "<strong>$email_recipient_name</strong> ($email_recipient)"; ?>
</div>
</div>
<hr class="my-2">
<div class="prettyContent">
<?php echo $email_content; ?>
</div>
</div>
<script src="../../js/pretty_content.js"></script>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,42 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-credit-card mr-2"></i>Creating: <strong>Payment Method</strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-credit-card"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Payment method name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<textarea class="form-control" rows="3" name="description" placeholder="Enter a description..."></textarea>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_payment_method" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,51 @@
<?php
require_once '../../../includes/modal_header.php';
$payment_method_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM payment_methods WHERE payment_method_id = $payment_method_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$payment_method_id = intval($row['payment_method_id']);
$payment_method_name = nullable_htmlentities($row['payment_method_name']);
$payment_method_description = nullable_htmlentities($row['payment_method_description']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-credit-card mr-2"></i>Editing: <strong><?php echo $payment_method_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="payment_method_id" value="<?= $payment_method_id ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-credit-card"></i></span>
</div>
<input type="text" class="form-control" name="name" value="<?php echo $payment_method_name; ?>" placeholder="Payment method name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<textarea class="form-control" rows="3" name="description" placeholder="Enter a description..."><?php echo $payment_method_description; ?></textarea>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_payment_method" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,203 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-credit-card mr-2"></i>Add Payment Provider</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="alert alert-info text-center">
<h6>Before Adding a Payment Provider!</h6>
We recommend you add an <strong>Account</strong> and <strong>Vendor</strong> based off the Provider name before continuing eg <strong>Stripe</strong>
</div>
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-expense">Expense</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-details">
<div class="form-group">
<label>Provider <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-credit-card"></i></span>
</div>
<select class="form-control select2" name="provider">
<option>Stripe</option>
</select>
</div>
</div>
<div class="form-group">
<label>Publishable key <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-eye"></i></span>
</div>
<input type="text" class="form-control" name="public_key" placeholder="Publishable API Key (pk_...)">
</div>
</div>
<div class="form-group">
<label>Secret key <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="private_key" placeholder="Secret API Key (sk_...)">
</div>
</div>
<div class="form-group">
<label>Income / Expense Account <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-piggy-bank"></i></span>
</div>
<select class="form-control select2" name="account" required>
<option value="">- Select an Account -</option>
<?php
$sql = mysqli_query($mysqli, "SELECT account_id, account_name FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$account_id = intval($row['account_id']);
$account_name = nullable_htmlentities($row['account_name']);
?>
<option <?php if ($account_name === 'Stripe') { echo "selected"; } ?> value="<?= $account_id ?>"><?= $account_name ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="form-group">
<label>Threshold</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,2}" name="threshold" placeholder="1000.00">
</div>
<small class="form-text text-muted">Will not show as an option at Checkout if invoice amount is above this number, 0 disables the threshold check.</small>
</div>
</div>
<div class="tab-pane fade" id="pills-expense">
<div class="form-group">
<div class="custom-control custom-switch">
<input type="checkbox" class="custom-control-input" name="enable_expense" checked value="1" id="enableExpenseSwitch">
<label class="custom-control-label" for="enableExpenseSwitch">Enable Expense</label>
</div>
</div>
<div class="form-group">
<label>Payment Provider Vendor <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-building"></i></span>
</div>
<select class="form-control select2" name="expense_vendor" required>
<option value="0">Expense Disabled</option>
<?php
$sql = mysqli_query($mysqli, "SELECT vendor_id, vendor_name FROM vendors WHERE vendor_client_id = 0 AND vendor_archived_at IS NULL ORDER BY vendor_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$vendor_id = intval($row['vendor_id']);
$vendor_name = nullable_htmlentities($row['vendor_name']);
?>
<option <?php if ($vendor_name === 'Stripe') { echo "selected"; } ?> value="<?= $vendor_id ?>"><?= $vendor_name ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="form-group">
<label>Expense Category <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="expense_category" required>
<option value="">- Select a Category -</option>
<?php
$sql = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Expense' AND category_archived_at IS NULL ORDER BY category_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$category_id = intval($row['category_id']);
$category_name = nullable_htmlentities($row['category_name']);
?>
<option <?php if ($category_name === 'Processing Fee') { echo "selected"; } ?> value="<?= $category_id ?>"><?= $category_name ?></option>
<?php
}
?>
</select>
<div class="input-group-append">
<button class="btn btn-secondary ajax-modal" type="button"
data-modal-url="../admin/modals/category/category_add.php?category=Expense">
<i class="fas fa-plus"></i>
</button>
</div>
</div>
</div>
<div class="form-group">
<label>Percentage Fee to expense</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-percent"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,2}" name="percentage_fee" placeholder="Enter Percentage">
</div>
<small class="form-text text-muted">See <a href="https://stripe.com/pricing" target="_blank">here <i class="fas fa-fw fa-external-link-alt"></i></a> for the latest Stripe Fees.</small>
</div>
<div class="form-group">
<label>Flat Fee to expense</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,3}" name="flat_fee" placeholder="0.030">
</div>
<small class="form-text text-muted">See <a href="https://stripe.com/pricing" target="_blank">here <i class="fas fa-fw fa-external-link-alt"></i></a> for the latest Stripe Fees.</small>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_payment_provider" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Add</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,197 @@
<?php
require_once '../../../includes/modal_header.php';
$provider_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM payment_providers WHERE payment_provider_id = $provider_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$provider_name = nullable_htmlentities($row['payment_provider_name']);
$public_key = nullable_htmlentities($row['payment_provider_public_key']);
$private_key = nullable_htmlentities($row['payment_provider_private_key']);
$account_id = intval($row['payment_provider_account']);
$threshold = floatval($row['payment_provider_threshold']);
$vendor_id = intval($row['payment_provider_expense_vendor']);
$category_id = intval($row['payment_provider_expense_category']);
$percent_fee = floatval($row['payment_provider_expense_percentage_fee']) * 100;
$flat_fee = floatval($row['payment_provider_expense_flat_fee']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-credit-card mr-2"></i>Editing: <strong><?= $provider_name ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
<input type="hidden" name="provider_id" value="<?= $provider_id ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-expense">Expense</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-details">
<div class="form-group">
<label>Publishable key <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-eye"></i></span>
</div>
<input type="text" class="form-control" name="public_key" placeholder="Publishable API Key (pk_...)" value="<?= $public_key ?>">
</div>
</div>
<div class="form-group">
<label>Secret key <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="private_key" placeholder="Secret API Key (sk_...)" value="<?= $private_key ?>">
</div>
</div>
<div class="form-group">
<label>Income / Expense Account <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-piggy-bank"></i></span>
</div>
<select class="form-control select2" name="account" required>
<option value="">- Select an Account -</option>
<?php
$sql = mysqli_query($mysqli, "SELECT account_id, account_name FROM accounts WHERE account_archived_at IS NULL ORDER BY account_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$account_id_select = intval($row['account_id']);
$account_name = nullable_htmlentities($row['account_name']);
?>
<option <?php if ($account_id === $account_id_select) { echo "selected"; } ?> value="<?= $account_id_select ?>"><?= $account_name ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="form-group">
<label>Threshold</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,2}" name="threshold" placeholder="1000.00" value="<?php echo $threshold; ?>">
</div>
<small class="form-text text-muted">Will not show as an option at Checkout if above this number</small>
</div>
</div>
<div class="tab-pane fade" id="pills-expense">
<div class="form-group">
<label>Payment Provider Vendor <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-building"></i></span>
</div>
<select class="form-control select2" name="expense_vendor" required>
<option value="0">Expense Disabled</option>
<?php
$sql = mysqli_query($mysqli, "SELECT vendor_id, vendor_name FROM vendors WHERE vendor_client_id = 0 AND vendor_archived_at IS NULL ORDER BY vendor_name ASC");
while ($row = mysqli_fetch_assoc($sql)) {
$vendor_id_select = intval($row['vendor_id']);
$vendor_name = nullable_htmlentities($row['vendor_name']);
?>
<option <?php if ($vendor_id === $vendor_id_select) { echo "selected"; } ?>
value="<?= $vendor_id_select ?>"><?= $vendor_name ?>
</option>
<?php
}
?>
</select>
</div>
</div>
<div class="form-group">
<label>Expense Category <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
</div>
<select class="form-control select2" name="expense_category" required>
<option value="">- Select a Category -</option>
<?php
$sql_category = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Expense' AND category_archived_at IS NULL ORDER BY category_name ASC");
while ($row = mysqli_fetch_assoc($sql_category)) {
$category_id_select = intval($row['category_id']);
$category_name = nullable_htmlentities($row['category_name']);
?>
<option <?php if ($category_id === $category_id_select) { echo "selected"; } ?> value="<?= $category_id_select ?>"><?= $category_name ?></option>
<?php
}
?>
</select>
<div class="input-group-append">
<button class="btn btn-secondary ajax-modal" type="button"
data-modal-url="../admin/modals/category/category_add.php?category=Expense">
<i class="fas fa-plus"></i>
</button>
</div>
</div>
</div>
<div class="form-group">
<label>Percentage Fee to expense</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-percent"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,2}" name="percentage_fee" value="<?php echo $percent_fee; ?>" placeholder="Enter Percentage">
</div>
<small class="form-text text-muted">See <a href="https://stripe.com/pricing" target="_blank">here <i class="fas fa-fw fa-external-link-alt"></i></a> for the latest Stripe Fees.</small>
</div>
<div class="form-group">
<label>Flat Fee to expense</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
</div>
<input type="text" class="form-control" inputmode="decimal" pattern="[0-9]*\.?[0-9]{0,3}" name="flat_fee" value="<?php echo $flat_fee; ?>" placeholder="0.030">
</div>
<small class="form-text text-muted">See <a href="https://stripe.com/pricing" target="_blank">here <i class="fas fa-fw fa-external-link-alt"></i></a> for the latest Stripe Fees.</small>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_payment_provider" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,45 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-project-diagram mr-2"></i>Creating Project Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<label>Project Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-project-diagram"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Project Template Name" maxlength="255" required autofocus>
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Description">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_project_template" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,56 @@
<?php
require_once '../../../includes/modal_header.php';
$project_template_id = intval($_GET['project_template_id']);
$sql = mysqli_query($mysqli, "SELECT * FROM project_templates WHERE project_template_id = $project_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$project_template_name = nullable_htmlentities($row['project_template_name']);
$project_template_description = nullable_htmlentities($row['project_template_description']);
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-project-diagram mr-2"></i>Editing Project Template: <strong><?php echo $project_template_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="project_template_id" value="<?php echo $project_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Project Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-project-diagram"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Project Template Name" maxlength="255" value="<?php echo $project_template_name; ?>" required autofocus>
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Description" value="<?php echo $project_template_description; ?>">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_project_template" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,71 @@
<?php
require_once '../../../includes/modal_header.php';
$project_template_id = intval($_GET['project_template_id']);
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-life-ring mr-2"></i>Adding Ticket Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="project_template_id" value="<?php echo $project_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Ticket Template <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-life-ring"></i></span>
</div>
<select class="form-control select2" name="ticket_template_id" required>
<option value="">- Select a Ticket Template -</option>
<?php
$sql_ticket_templates_select = mysqli_query($mysqli, "SELECT ticket_template_id, ticket_template_name FROM ticket_templates
WHERE ticket_template_id NOT IN (
SELECT ticket_template_id FROM project_template_ticket_templates
WHERE project_template_id = $project_template_id
)
AND ticket_template_archived_at IS NULL
ORDER BY ticket_template_name ASC"
);
while ($row = mysqli_fetch_assoc($sql_ticket_templates_select)) {
$ticket_template_id_select = intval($row['ticket_template_id']);
$ticket_template_name_select = nullable_htmlentities($row['ticket_template_name']);
?>
<option value="<?php echo $ticket_template_id_select; ?>"><?php echo $ticket_template_name_select; ?></option>
<?php
}
?>
</select>
</div>
</div>
<div class="form-group">
<label>Order</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sort-numeric-down"></i></span>
</div>
<input type="text" class="form-control" name="order" value="1">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_ticket_template_to_project_template" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Add</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,213 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-shield mr-2"></i>New Role</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-role-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-role-permissions">Permissions</a>
</li>
</ul>
<hr>
<div class="tab-content">
<!-- DETAILS TAB -->
<div class="tab-pane fade show active" id="pills-role-details">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<input type="text" class="form-control" name="role_name" placeholder="Role Name" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Description <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-chevron-right"></i></span>
</div>
<input type="text" class="form-control" name="role_description" placeholder="Role Description" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Admin Access <strong class="text-danger">*</strong></label>
<div class="custom-control custom-radio mb-2">
<input type="radio" class="custom-control-input" id="admin_no" name="role_is_admin" value="0" checked required>
<label class="custom-control-label" for="admin_no">
No - use permissions on the next tab
</label>
</div>
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="admin_yes" name="role_is_admin" value="1" required>
<label class="custom-control-label" for="admin_yes">
Yes - this role should have full admin access
</label>
</div>
</div>
</div>
<!-- PERMISSIONS TAB -->
<div class="tab-pane fade" id="pills-role-permissions">
<?php
// Enumerate modules
$sql_modules = mysqli_query($mysqli, "SELECT * FROM modules");
while ($row_modules = mysqli_fetch_assoc($sql_modules)) {
$module_id = intval($row_modules['module_id']);
// raw for name, escaped for display
$module_name_raw = $row_modules['module_name'];
$module_name_display = ucfirst(str_replace("module_", "", $module_name_raw));
$module_name_display_safe = nullable_htmlentities($module_name_display);
$module_description = nullable_htmlentities($row_modules['module_description']);
// default for new role
$module_permission = 0;
$field_name = $module_id . "##" . $module_name_raw;
$group_id = "perm_group_$module_id";
?>
<div class="form-group">
<label><?= $module_name_display_safe ?> <strong class="text-danger">*</strong></label>
<div class="btn-group btn-group-toggle btn-block" data-toggle="buttons" role="group"
aria-label="Permissions for <?= $module_name_display_safe ?>">
<label class="btn btn-outline-secondary btn-sm active" title="No Access">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_0"
value="0"
autocomplete="off"
checked
required
>
None
</label>
<label class="btn btn-outline-primary btn-sm" title="Viewing Only">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_1"
value="1"
autocomplete="off"
>
<i class="fas fa-fw fa-eye mr-1"></i>Read
</label>
<label class="btn btn-outline-warning btn-sm" title="Read, Edit, Archive">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_2"
value="2"
autocomplete="off"
>
<i class="fas fa-fw fa-edit mr-1"></i>Modify
</label>
<label class="btn btn-outline-danger btn-sm" title="Read, Edit, Archive, Delete">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_3"
value="3"
autocomplete="off"
>
<i class="fas fa-fw fa-trash mr-1"></i>Full
</label>
</div>
<small class="form-text text-muted mt-2"><?= $module_description ?></small>
</div>
<?php } // end while ?>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_role" class="btn btn-primary text-bold">
<i class="fas fa-check mr-2"></i>Create
</button>
<button type="button" class="btn btn-light" data-dismiss="modal">
<i class="fas fa-times mr-2"></i>Cancel
</button>
</div>
</form>
<script>
// Optional: when Admin Yes is selected, disable permission radios + switch to Details tab
(function () {
function setPermissionsEnabled(enabled) {
const permsTab = document.getElementById('pills-role-permissions');
if (!permsTab) return;
permsTab.querySelectorAll('input[type="radio"]').forEach(function (el) {
el.disabled = !enabled;
});
// also visually dim the tab content
permsTab.style.opacity = enabled ? '1' : '0.5';
}
const adminYes = document.getElementById('admin_yes');
const adminNo = document.getElementById('admin_no');
function refresh() {
const isAdmin = adminYes && adminYes.checked;
setPermissionsEnabled(!isAdmin);
if (isAdmin) {
// move user back to Details tab (avoids confusion)
const detailsTab = document.querySelector('a[href="#pills-role-details"]');
if (detailsTab) detailsTab.click();
}
}
if (adminYes && adminNo) {
adminYes.addEventListener('change', refresh);
adminNo.addEventListener('change', refresh);
refresh();
}
})();
</script>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,210 @@
<?php
require_once '../../../includes/modal_header.php';
$role_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE role_id = $role_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$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(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 WHERE user_role_id = $role_id AND user_archived_at IS NULL");
// Initialize an empty array to hold user names
$user_names = [];
// Fetch each row and store the user_name in the array
while($row = mysqli_fetch_assoc($sql_users)) {
$user_names[] = nullable_htmlentities($row['user_name']);
}
// Convert the array of user names to a comma-separated string
$user_names_string = implode(",", $user_names) ;
if (empty($user_names_string)) {
$user_names_string = "-";
}
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-shield mr-2"></i>Editing role:
<strong><?= $role_name ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
<input type="hidden" name="role_id" value="<?= $role_id ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-role-details">Details</a>
</li>
<?php if (!$role_admin) { ?>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-role-permissions">Permissions</a>
</li>
<?php } ?>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-role-details">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<input type="text" class="form-control" name="role_name" placeholder="Role Name" maxlength="200" value="<?= $role_name ?>" required>
</div>
</div>
<div class="form-group">
<label>Description <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-chevron-right"></i></span>
</div>
<input type="text" class="form-control" name="role_description" placeholder="Role Description" maxlength="200" value="<?= $role_description ?>" required>
</div>
</div>
<div class="form-group">
<label>Admin Access <strong class="text-danger">*</strong></label>
<div class="custom-control custom-radio mb-2">
<input type="radio" class="custom-control-input" id="admin_yes" name="role_is_admin" value="1"
<?php if ($role_admin) { echo 'checked'; } ?> required>
<label class="custom-control-label" for="admin_yes">
Yes - this role should have full admin access
</label>
</div>
<div class="custom-control custom-radio">
<input type="radio" class="custom-control-input" id="admin_no" name="role_is_admin" value="0"
<?php if (!$role_admin) { echo 'checked'; } ?> required>
<label class="custom-control-label" for="admin_no">
No - use permissions on the next tab
</label>
</div>
</div>
</div>
<?php if (!$role_admin) { ?>
<div class="tab-pane fade" id="pills-role-permissions">
<?php if ($role_admin) { ?>
<div class="alert alert-warning"><strong>Module permissions do not apply to Admins.</strong></div>
<?php } ?>
<?php
// Enumerate modules
$sql_modules = mysqli_query($mysqli, "SELECT * FROM modules");
while ($row_modules = mysqli_fetch_assoc($sql_modules)) {
$module_id = intval($row_modules['module_id']);
$module_name = nullable_htmlentities($row_modules['module_name']);
$module_name_display = ucfirst(str_replace("module_","",$module_name));
$module_description = nullable_htmlentities($row_modules['module_description']);
// Get permission level for module
$module_permission_row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT user_role_permission_level FROM user_role_permissions WHERE module_id = $module_id AND user_role_id = $role_id LIMIT 1"));
$module_permission = 0;
if ($module_permission_row) {
$module_permission = $module_permission_row['user_role_permission_level'];
}
?>
<div class="form-group">
<label> <?= $module_name_display ?> <strong class="text-danger">*</strong></label>
<?php
$field_name = "$module_id##$module_name";
$group_id = "perm_group_$module_id";
?>
<div class="btn-group btn-group-toggle btn-block" data-toggle="buttons" role="group" aria-label="Permissions for <?= $module_name_display ?>">
<label class="btn btn-outline-secondary btn-sm <?php if ($module_permission == 0) { echo 'active'; } ?>" title="No Access">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_0"
value="0"
autocomplete="off"
<?php if ($module_permission == 0) { echo 'checked'; } ?>
required
>
None
</label>
<label class="btn btn-outline-primary btn-sm <?php if ($module_permission == 1) { echo 'active'; } ?>" title="Viewing Only">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_1"
value="1"
autocomplete="off"
<?php if ($module_permission == 1) { echo 'checked'; } ?>
>
<i class="fas fa-fw fa-eye mr-1"></i>Read
</label>
<label class="btn btn-outline-warning btn-sm <?php if ($module_permission == 2) { echo 'active'; } ?>" title="Read, Edit, Archive">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_2"
value="2"
autocomplete="off"
<?php if ($module_permission == 2) { echo 'checked'; } ?>
>
<i class="fas fa-fw fa-edit mr-1"></i>Modify
</label>
<label class="btn btn-outline-danger btn-sm <?php if ($module_permission == 3) { echo 'active'; } ?>" title="Read, Edit, Archive, Delete">
<input
type="radio"
name="<?= $field_name ?>"
id="<?= $group_id ?>_3"
value="3"
autocomplete="off"
<?php if ($module_permission == 3) { echo 'checked'; } ?>
>
<i class="fas fa-fw fa-trash mr-1"></i>Full
</label>
</div>
<small class="form-text text-muted mt-2"><?= $module_description ?></small>
</div>
<?php } // End while ?>
</div>
<?php } ?>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_role" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,88 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-cube mr-2"></i>New License Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Software name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Version</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<input type="text" class="form-control" name="version" placeholder="Software version" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Short description">
</div>
</div>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Type -</option>
<?php foreach($software_types_array as $software_type) { ?>
<option><?php echo $software_type; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>License Type</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<select class="form-control select2" name="license_type">
<option value="">- Select a License Type -</option>
<?php foreach($license_types_array as $license_type) { ?>
<option><?php echo $license_type; ?></option>
<?php } ?>
</select>
</div>
</div>
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"></textarea>
</div>
<div class="modal-footer">
<button type="submit" name="add_software_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,99 @@
<?php
require_once '../../../includes/modal_header.php';
$software_template_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM software_templates WHERE software_template_id = $software_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$software_name = nullable_htmlentities($row['software_template_name']);
$software_version = nullable_htmlentities($row['software_template_version']);
$software_description = nullable_htmlentities($row['software_template_description']);
$software_type = nullable_htmlentities($row['software_template_type']);
$software_license_type = nullable_htmlentities($row['software_template_license_type']);
$software_notes = nullable_htmlentities($row['software_template_notes']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-cube mr-2"></i>Editing template: <strong><?php echo $software_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="software_template_id" value="<?php echo $software_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Software name" maxlength="200" value="<?php echo $software_name; ?>" required>
</div>
</div>
<div class="form-group">
<label>Version</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<input type="text" class="form-control" name="version" placeholder="Software version" maxlength="200" value="<?php echo $software_version; ?>">
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Short description" value="<?php echo $software_description; ?>">
</div>
</div>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<select class="form-control select2" name="type" required>
<?php foreach($software_types_array as $software_type_select) { ?>
<option <?php if($software_type == $software_type_select) { echo "selected"; } ?>><?php echo $software_type_select; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>License Type</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-cube"></i></span>
</div>
<select class="form-control select2" name="license_type">
<option value="">- Select a License Type -</option>
<?php foreach($license_types_array as $license_type_select) { ?>
<option <?php if($license_type_select == $software_license_type){ echo "selected"; } ?>><?php echo $license_type_select; ?></option>
<?php } ?>
</select>
</div>
</div>
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?php echo $software_notes; ?></textarea>
</div>
<div class="modal-footer">
<button type="submit" name="edit_software_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,98 @@
<?php
require_once '../../../includes/modal_header.php';
$type_display = '';
if (isset($_GET['type'])) {
$type = intval($_GET['type']);
if ($type === 1) {
$type_display = "Client";
} elseif($type === 2) {
$type_display = "Location";
} elseif ($type === 3) {
$type_display = "Contact";
} elseif ($type === 4) {
$type_display = "Credential";
} elseif ($type === 5) {
$type_display = "Asset";
}
}
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-tag mr-2"></i>New <strong><?= $type_display ?></strong> Tag</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="type" value="<?php echo $type; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Tag name" maxlength="200" required autofocus>
</div>
</div>
<?php if (isset($_GET['type'])) { ?>
<input type="hidden" name="type" value="<?= $type ?>">
<?php } else { ?>
<div class="form-group">
<label>Type <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-th"></i></span>
</div>
<select class="form-control select2" name="type" required>
<option value="">- Type -</option>
<option value="1">Client Tag</option>
<option value="2">Location Tag</option>
<option value="3">Contact Tag</option>
<option value="4">Credential Tag</option>
<option value="5">Asset Tag</option>
</select>
</div>
</div>
<?php } ?>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" required>
</div>
</div>
<div class="form-group">
<label>Icon</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-image"></i></span>
</div>
<input type="text" class="form-control" name="icon" placeholder="Icon ex handshake">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create Tag</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,79 @@
<?php
require_once '../../../includes/modal_header.php';
$tag_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM tags WHERE tag_id = $tag_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$tag_name = nullable_htmlentities($row['tag_name']);
$tag_type = intval($row['tag_type']);
$tag_color = nullable_htmlentities($row['tag_color']);
$tag_icon = nullable_htmlentities($row['tag_icon']);
if ($tag_type == 1) {
$tag_type_display = "Client";
} elseif ( $tag_type == 2) {
$tag_type_display = "Location";
} elseif ( $tag_type == 3) {
$tag_type_display = "Contact";
} elseif ( $tag_type == 4) {
$tag_type_display = "Credential";
} elseif ( $tag_type == 5) {
$tag_type_display = "Asset";
} else {
$tag_type_display = "Unknown";
}
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-tag mr-2"></i><?= $tag_type_display ?> Tag: <strong><?php echo $tag_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="tag_id" value="<?php echo $tag_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $tag_name; ?>" required>
</div>
</div>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" value="<?php echo $tag_color; ?>" required>
</div>
</div>
<div class="form-group">
<label>Icon</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-image"></i></span>
</div>
<input type="text" class="form-control" name="icon" placeholder="Icon ex handshake" value="<?php echo $tag_icon; ?>">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save changes</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,35 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-balance-scale mr-2"></i>New Tax</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span aria-hidden="true">&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<input type="text" class="form-control" name="name" placeholder="Tax name" maxlength="200" required autofocus>
</div>
<div class="form-group">
<label>Percent <strong class="text-danger">*</strong></label>
<input type="number" min="0" step="any" class="form-control col-md-4" name="percent">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_tax" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,46 @@
<?php
require_once '../../../includes/modal_header.php';
$tax_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM taxes WHERE tax_id = $tax_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$tax_name = nullable_htmlentities($row['tax_name']);
$tax_percent = floatval($row['tax_percent']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-balance-scale mr-2"></i>Editing tax: <strong><?php echo $tax_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="tax_id" value="<?php echo $tax_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $tax_name; ?>" required>
</div>
<div class="form-group">
<label>Percent <strong class="text-danger">*</strong></label>
<input type="number" min="0" step="any" class="form-control col-md-4" name="percent" value="<?php echo $tax_percent; ?>">
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_tax" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,43 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-info-circle mr-2"></i>New Ticket Status</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-info-circle"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Ticket Status name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" required>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_ticket_status" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,79 @@
<?php
require_once '../../../includes/modal_header.php';
$ticket_status_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM ticket_statuses WHERE ticket_status_id = $ticket_status_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$ticket_status_name = nullable_htmlentities($row['ticket_status_name']);
$ticket_status_color = nullable_htmlentities($row['ticket_status_color']);
$ticket_status_order = intval($row['ticket_status_order']);
$ticket_status_active = intval($row['ticket_status_active']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-info-circle mr-2"></i>Editing Ticket Status: <strong><?php echo $ticket_status_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="ticket_status_id" value="<?php echo $ticket_status_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $ticket_status_name; ?>" required <?php if ($ticket_status_id <= 5) { echo "readonly"; } ?>>
</div>
</div>
<div class="form-group">
<label>Color <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-paint-brush"></i></span>
</div>
<input type="color" class="form-control col-3" name="color" value="<?php echo $ticket_status_color; ?>" required>
</div>
</div>
<div class="form-group">
<label>Order</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-sort-numeric-down"></i></span>
</div>
<input type="number" class="form-control" name="order" placeholder="Leave blank for no order" value="<?php echo $ticket_status_order; ?>">
</div>
</div>
<div class="form-group">
<label>Status <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-info-circle"></i></span>
</div>
<select class="form-control select2" name="status" required>
<option <?php if ($ticket_status_active == 1) { echo "selected"; } ?> value="1">Active</option>
<option <?php if ($ticket_status_active == 0) { echo "selected"; } ?> value="0" <?php if ($ticket_status_id <= 5) { echo "disabled"; } ?>>Inactive</option>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_ticket_status" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,79 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-life-ring mr-2"></i>New Ticket Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-life-ring"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Template name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Subject</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="subject" placeholder="Subject" maxlength="500">
</div>
</div>
<div class="form-group">
<textarea class="form-control tinymceTicket" name="details"></textarea>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Short description">
</div>
</div>
<div class="form-group">
<label>Add it to a Project Template?</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-project-diagram"></i></span>
</div>
<select class="form-control select2" name="project_template">
<option value="0">- No -</option>
<?php
$sql_project_templates = mysqli_query($mysqli, "SELECT * FROM project_templates WHERE project_template_archived_at IS NULL ORDER BY project_template_name ASC");
while ($row = mysqli_fetch_assoc($sql_project_templates)) {
$project_template_id_select = intval($row['project_template_id']);
$project_template_name_select = nullable_htmlentities($row['project_template_name']); ?>
<option value="<?php echo $project_template_id_select; ?>"><?php echo $project_template_name_select; ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_ticket_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create Template</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,57 @@
<div class="modal" id="editTicketTemplateModal" tabindex="-1">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-life-ring mr-2"></i>Editing Ticket Template: <?php echo $ticket_template_name; ?></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="ticket_template_id" value="<?php echo $ticket_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Template Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-life-ring"></i></span>
</div>
<input type="text" class="form-control" name="name" maxlength="200" value="<?php echo $ticket_template_name; ?>" placeholder="Template name" required autofocus>
</div>
</div>
<div class="form-group">
<label>Subject</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="subject" maxlength="500" value="<?php echo $ticket_template_subject; ?>" placeholder="Subject">
</div>
</div>
<div class="form-group">
<textarea class="form-control tinymceTicket" name="details"><?php echo $ticket_template_details; ?></textarea>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" value="<?php echo $ticket_template_description; ?>" placeholder="Short description">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_ticket_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
</div>
</div>
</div>

View File

@@ -0,0 +1,62 @@
<?php
require_once '../../../includes/modal_header.php';
$task_template_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_id = $task_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$task_template_name = nullable_htmlentities($row['task_template_name']);
$task_template_order = intval($row['task_template_order']);
$task_template_completion_estimate = intval($row['task_template_completion_estimate']);
//$task_template_description = nullable_htmlentities($row['task_template_description']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fa fa-fw fa-tasks mr-2"></i>Editing task</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="task_template_id" value="<?php echo $task_template_id; ?>">
<div class="modal-body">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Name the task" maxlength="255" value="<?php echo $task_template_name; ?>" required autofocus>
</div>
</div>
<div class="form-group">
<label>Estimated Completion Time <span class="text-secondary">(Minutes)</span></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
</div>
<input type="number" class="form-control" name="completion_estimate" placeholder="Estimated time to complete task in mins" value="<?php echo $task_template_completion_estimate; ?>">
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_ticket_template_task" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,176 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-plus mr-2"></i>New User</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-user-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-user-access">Restrict Access</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-user-details">
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Full Name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Email <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-envelope"></i></span>
</div>
<input type="email" class="form-control" name="email" placeholder="Email Address" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Password <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-lock"></i></span>
</div>
<input type="password" class="form-control" data-toggle="password" name="password" id="password" placeholder="Enter a Password" autocomplete="new-password" minlength="8" required>
<div class="input-group-append">
<span class="input-group-text"><i class="fa fa-fw fa-eye"></i></span>
</div>
<div class="input-group-append">
<span class="btn btn-default"><i class="fa fa-fw fa-question" onclick="generatePassword()"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label>Role <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<select class="form-control select2" name="role" required>
<option value="">- Role -</option>
<?php
$sql_user_roles = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE role_archived_at IS NULL");
while ($row = mysqli_fetch_assoc($sql_user_roles)) {
$role_id = intval($row['role_id']);
$role_name = nullable_htmlentities($row['role_name']);
?>
<option value="<?php echo $role_id; ?>"><?php echo $role_name; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Avatar</label>
<input type="file" class="form-control-file" accept="image/*" name="file">
</div>
<div class="form-group" <?php if(empty($config_smtp_host)) { echo "hidden"; } ?>>
<div class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" id="sendEmailCheckBox" name="send_email" value="" checked>
<label for="sendEmailCheckBox" class="custom-control-label">
Send user e-mail with login details?
</label>
</div>
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" id="forceMFACheckBox" name="force_mfa" value=1>
<label for="forceMFACheckBox" class="custom-control-label">
Force MFA
</label>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-user-access">
<div class="alert alert-info">
Check boxes to authorize user client access. No boxes grant full client access. Admin users are unaffected.
</div>
<ul class="list-group">
<li class="list-group-item bg-dark">
<div class="form-check">
<input type="checkbox" class="form-check-input" onclick="this.closest('.tab-pane').querySelectorAll('.client-checkbox').forEach(checkbox => checkbox.checked = this.checked);">
<label class="form-check-label ml-3"><strong>Restrict Access to Clients</strong></label>
</div>
</li>
<?php
$sql_client_select = mysqli_query($mysqli, "SELECT * FROM clients WHERE client_archived_at IS NULL ORDER BY client_name ASC");
while ($row = mysqli_fetch_assoc($sql_client_select)) {
$client_id = intval($row['client_id']);
$client_name = nullable_htmlentities($row['client_name']);
?>
<li class="list-group-item">
<div class="form-check">
<input type="checkbox" class="form-check-input client-checkbox" name="clients[]" value="<?php echo $client_id; ?>">
<label class="form-check-label ml-3"><?php echo $client_name; ?></label>
</div>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_user" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<script>
function generatePassword() {
jQuery.get(
"/agent/ajax.php", {
get_readable_pass: 'true'
},
function(data) {
const password = JSON.parse(data);
document.getElementById("password").value = password;
}
);
}
</script>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,35 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-body">
<div class="mb-4" style="text-align: center;">
<i class="far fas fa-10x fa-skull-crossbones text-danger mb-3 mt-3"></i>
<h2>Incident Response: Agent Password Reset</h2>
<br>
<div class="alert alert-danger" role="alert">
<b>This is a potentially destructive function.<br>It is intended to be used as part of a potential security incident.</b>
</div>
<h6 class="mb-4 text-secondary"><b>All ITFlow agent passwords will be reset and shown to you </b><i>(except yours - change yours first!)</i>.<br/><br/>You should communicate temporary passwords to agents out of band (e.g. via a phone call) and require they are changed ASAP.</h6>
<form action="post.php" method="POST">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="row col-7 offset-4">
<div class="input-group">
<div class="input-group-prepend">
<input type="password" class="form-control" placeholder="Enter your account password to continue" name="admin_password" required>
</div>
</div>
</div>
<br>
<button class="btn btn-danger" type="submit" name="ir_reset_user_password"><i class="fas fa-fw fa-key mr-2"></i>Reset passwords</button>
</form>
</div>
<button type="button" class="btn btn-outline-secondary btn-lg px-5 mr-4" data-dismiss="modal">Cancel</button>
</div>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,83 @@
<?php
require_once '../../../includes/modal_header.php';
$user_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM users WHERE users.user_id = $user_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$user_name = nullable_htmlentities($row['user_name']);
$user_email = nullable_htmlentities($row['user_email']);
$user_avatar = nullable_htmlentities($row['user_avatar']);
$user_initials = nullable_htmlentities(initials($user_name));
$sql_related_tickets = mysqli_query($mysqli, "SELECT * FROM tickets
WHERE ticket_assigned_to = $user_id AND ticket_resolved_at IS NULL AND ticket_closed_at IS NULL");
$ticket_count = mysqli_num_rows($sql_related_tickets);
// Related Recurring Tickets Query
$sql_related_recurring_tickets = mysqli_query($mysqli, "SELECT * FROM recurring_tickets WHERE recurring_ticket_assigned_to = $user_id");
$recurring_ticket_count = mysqli_num_rows($sql_related_recurring_tickets);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-slash mr-2"></i>Archiving user:
<strong><?php echo $user_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="user_id" value="<?php echo $user_id; ?>">
<div class="modal-body">
<center class="mb-3">
<?php if (!empty($user_avatar)) { ?>
<img class="img-fluid" src="<?php echo "../uploads/users/$user_id/$user_avatar"; ?>">
<?php } else { ?>
<span class="fa-stack fa-4x">
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
<span class="fa fa-stack-1x text-white"><?php echo $user_initials; ?></span>
</span>
<?php } ?>
</center>
<div class="form-group">
<label>Reassign <?= $ticket_count ?> Open Tickets and <?= $recurring_ticket_count ?> Recurring Tickets To:</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<select class="form-control select2" name="ticket_assign" required>
<option value="0">No one</option>
<?php
$sql_users = mysqli_query($mysqli, "SELECT * FROM users WHERE user_type = 1 AND user_archived_at IS NULL");
while ($row = mysqli_fetch_assoc($sql_users)) {
$user_id_select = intval($row['user_id']);
$user_name_select = nullable_htmlentities($row['user_name']);
?>
<option value="<?= $user_id_select ?>"><?= $user_name_select ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="archive_user" class="btn btn-danger text-bold"><i class="fas fa-archive mr-2"></i>Archive</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,225 @@
<?php
require_once '../../../includes/modal_header.php';
$user_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM users
LEFT JOIN user_settings ON users.user_id = user_settings.user_id
WHERE users.user_id = $user_id LIMIT 1"
);
$row = mysqli_fetch_assoc($sql);
$user_name = nullable_htmlentities($row['user_name']);
$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_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_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']);
}
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-edit mr-2"></i>Editing user:
<strong><?php echo $user_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="user_id" value="<?php echo $user_id; ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-user-details<?php echo $user_id; ?>">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-user-access<?php echo $user_id; ?>">Restrict Access</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-user-details<?php echo $user_id; ?>">
<center class="mb-3">
<?php if (!empty($user_avatar)) { ?>
<img class="img-fluid" src="<?php echo "../uploads/users/$user_id/$user_avatar"; ?>">
<?php } else { ?>
<span class="fa-stack fa-4x">
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
<span class="fa fa-stack-1x text-white"><?php echo $user_initials; ?></span>
</span>
<?php } ?>
</center>
<div class="form-group">
<label>Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Full Name" maxlength="200"
value="<?php echo $user_name; ?>" required>
</div>
</div>
<div class="form-group">
<label>Email <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-envelope"></i></span>
</div>
<input type="email" class="form-control" name="email" placeholder="Email Address" maxlength="200"
value="<?php echo $user_email; ?>" required>
</div>
</div>
<div class="form-group">
<label>New Password</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-lock"></i></span>
</div>
<input type="password" class="form-control" data-toggle="password" name="new_password" id="password"
placeholder="Leave Blank For No Password Change" autocomplete="new-password">
<div class="input-group-append">
<span class="input-group-text"><i class="fa fa-fw fa-eye"></i></span>
</div>
<div class="input-group-append">
<span class="btn btn-default"><i class="fa fa-fw fa-question" onclick="generatePassword()"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label>Role <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<select class="form-control select2" name="role" required>
<?php
$sql_user_roles = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE role_archived_at IS NULL");
while ($row = mysqli_fetch_assoc($sql_user_roles)) {
$role_id = intval($row['role_id']);
$role_name = nullable_htmlentities($row['role_name']);
?>
<option <?php if ($role_id == $user_role_id) {echo "selected";} ?> value="<?php echo $role_id; ?>"><?php echo $role_name; ?></option>
<?php } ?>
</select>
</div>
</div>
<div class="form-group">
<label>Avatar</label>
<input type="file" class="form-control-file" accept="image/*" name="file">
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input class="custom-control-input" type="checkbox" id="forceMFACheckBox<?php echo $user_id; ?>" name="force_mfa" value="1" <?php if($user_config_force_mfa == 1){ echo "checked"; } ?>>
<label for="forceMFACheckBox<?php echo $user_id; ?>" class="custom-control-label">
Force MFA
</label>
</div>
</div>
<?php if (!empty($user_token)) { ?>
<div class="form-group">
<label>2FA</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-id-card"></i></span>
</div>
<select class="form-control" name="2fa">
<option value="">Keep enabled</option>
<option value="disable">Disable</option>
</select>
</div>
</div>
<?php } ?>
</div>
<div class="tab-pane fade" id="pills-user-access<?php echo $user_id; ?>">
<div class="alert alert-info">
Check boxes to authorize user client access. No boxes grant full client access. Admin users are unaffected.
</div>
<ul class="list-group">
<li class="list-group-item bg-dark">
<div class="form-check">
<input type="checkbox" class="form-check-input" onclick="this.closest('.tab-pane').querySelectorAll('.client-checkbox').forEach(checkbox => checkbox.checked = this.checked);">
<label class="form-check-label ml-3"><strong>Restrict Access to Clients</strong></label>
</div>
</li>
<?php
$sql_client_select = mysqli_query($mysqli, "SELECT * FROM clients WHERE client_archived_at IS NULL ORDER BY client_name ASC");
while ($row = mysqli_fetch_assoc($sql_client_select)) {
$client_id_select = intval($row['client_id']);
$client_name_select = nullable_htmlentities($row['client_name']);
?>
<li class="list-group-item">
<div class="form-check">
<input type="checkbox" class="form-check-input client-checkbox" name="clients[]" value="<?php echo $client_id_select; ?>" <?php if (in_array($client_id_select, $client_access_array)) { echo "checked"; } ?>>
<label class="form-check-label ml-2"><?php echo $client_name_select; ?></label>
</div>
</li>
<?php } ?>
</ul>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="edit_user" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<script>
function generatePassword() {
// Send a GET request to ajax.php as ajax.php?get_readable_pass=true
jQuery.get(
"/agent/ajax.php", {
get_readable_pass: 'true'
},
function(data) {
//If we get a response from post.php, parse it as JSON
const password = JSON.parse(data);
document.getElementById("password").value = password;
}
);
}
</script>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,26 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-download mr-2"></i>Export Users to CSV</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
</div>
<div class="modal-footer">
<button type="submit" name="export_users_csv" class="btn btn-primary text-bold"><i class="fas fa-fw fa-download mr-2"></i>Download CSV</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,49 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-user-plus"></i>Invite User</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<div class="modal-body">
<div class="form-group">
<label>Email <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-envelope"></i></span>
</div>
<input type="email" class="form-control" name="email" placeholder="Email Address" maxlength="200" required>
</div>
</div>
<div class="form-group">
<label>Role <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<select class="form-control select2" name="role" required>
<option value="">- Role -</option>
<!-- //TODO: Pull from roles -->
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="invite_user" class="btn btn-primary text-bold"><i class="fas fa-paper-plane mr-2"></i>Send Invite</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,87 @@
<?php
require_once '../../../includes/modal_header.php';
$user_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM users WHERE user_id = $user_id AND user_archived_at IS NOT NULL LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$user_name = str_replace(" (archived)", "", $row['user_name']); //Removed (archived) from user_name
$user_name = nullable_htmlentities($user_name);
$user_email = nullable_htmlentities($row['user_email']);
$user_avatar = nullable_htmlentities($row['user_avatar']);
$user_initials = initials($user_name);
$user_role_id = intval($row['user_role_id']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-redo-alt mr-2"></i>Restoring user:
<strong><?php echo $user_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
<input type="hidden" name="user_id" value="<?php echo $user_id; ?>">
<div class="modal-body">
<center class="mb-3">
<?php if (!empty($user_avatar)) { ?>
<img class="img-fluid" src="<?php echo "../uploads/users/$user_id/$user_avatar"; ?>">
<?php } else { ?>
<span class="fa-stack fa-4x">
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
<span class="fa fa-stack-1x text-white"><?php echo $user_initials; ?></span>
</span>
<?php } ?>
</center>
<div class="form-group">
<label>Set a New Password</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-lock"></i></span>
</div>
<input type="password" class="form-control" data-toggle="password" name="new_password"
placeholder="Enter a new password" autocomplete="new-password" required>
<div class="input-group-append">
<span class="input-group-text"><i class="fa fa-fw fa-eye"></i></span>
</div>
</div>
</div>
<div class="form-group">
<label>Role <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user-shield"></i></span>
</div>
<select class="form-control select2" name="role" required>
<?php
$sql_user_roles = mysqli_query($mysqli, "SELECT * FROM user_roles WHERE role_archived_at IS NULL");
while ($row = mysqli_fetch_assoc($sql_user_roles)) {
$role_id = intval($row['role_id']);
$role_name = nullable_htmlentities($row['role_name']);
?>
<option <?php if ($role_id == $user_role_id) {echo "selected";} ?> value="<?php echo $role_id; ?>"><?php echo $role_name; ?></option>
<?php } ?>
</select>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="restore_user" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Restore</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once "../../../includes/modal_footer.php";

View File

@@ -0,0 +1,171 @@
<?php
require_once '../../../includes/modal_header.php';
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-building mr-2"></i>New Vendor Template</h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-details">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-support">Support</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-notes">Notes</a>
</li>
</ul>
<hr>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-details">
<div class="form-group">
<label>Vendor Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-building"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Vendor Name" maxlength="200" required autofocus>
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Description" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Account Number</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-fingerprint"></i></span>
</div>
<input type="text" class="form-control" name="account_number" placeholder="Account number" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Account Manager</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<input type="text" class="form-control" name="contact_name" placeholder="Account manager's name" maxlength="200">
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-support">
<label>Support Phone / <span class="text-secondary">Extension</span></label>
<div class="form-row">
<div class="col-9">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-phone"></i></span>
</div>
<input type="tel" class="form-control col-2" name="phone_country_code" placeholder="+" maxlength="4">
<input type="tel" class="form-control" name="phone" placeholder="Phone Number" maxlength="200">
</div>
</div>
</div>
<div class="col-3">
<div class="form-group">
<input type="text" class="form-control" name="extension" placeholder="ext." maxlength="200">
</div>
</div>
</div>
<div class="form-group">
<label>Support Hours</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="text" class="form-control" name="hours" placeholder="Support Hours" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Support Email</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-envelope"></i></span>
</div>
<input type="email" class="form-control" name="email" placeholder="Support Email" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Support Website URL</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
</div>
<input type="text" class="form-control" name="website" placeholder="Do not include http(s)://" maxlength="200">
</div>
</div>
<div class="form-group">
<label>Pin/Code</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="code" placeholder="Access Code or Pin" maxlength="200">
</div>
</div>
<div class="form-group">
<label>SLA</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-handshake"></i></span>
</div>
<input type="text" class="form-control" name="sla" placeholder="SLA Response Time" maxlength="200">
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-notes">
<div class="form-group">
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"></textarea>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" name="add_vendor_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create Template</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

View File

@@ -0,0 +1,254 @@
<?php
require_once '../../../includes/modal_header.php';
$vendor_template_id = intval($_GET['id']);
$sql = mysqli_query($mysqli, "SELECT * FROM vendor_templates WHERE vendor_template_id = $vendor_template_id LIMIT 1");
$row = mysqli_fetch_assoc($sql);
$vendor_name = nullable_htmlentities($row['vendor_template_name']);
$vendor_description = nullable_htmlentities($row['vendor_template_description']);
$vendor_account_number = nullable_htmlentities($row['vendor_template_account_number']);
$vendor_contact_name = nullable_htmlentities($row['vendor_template_contact_name']);
$vendor_phone_country_code = intval($row['vendor_template_phone_country_code']);
$vendor_phone = formatPhoneNumber($row['vendor_template_phone'], $vendor_phone_country_code);
$vendor_extension = nullable_htmlentities($row['vendor_template_extension']);
$vendor_email = nullable_htmlentities($row['vendor_template_email']);
$vendor_website = nullable_htmlentities($row['vendor_template_website']);
$vendor_hours = nullable_htmlentities($row['vendor_template_hours']);
$vendor_sla = nullable_htmlentities($row['vendor_template_sla']);
$vendor_code = nullable_htmlentities($row['vendor_template_code']);
$vendor_notes = nullable_htmlentities($row['vendor_template_notes']);
// Generate the HTML form content using output buffering.
ob_start();
?>
<div class="modal-header bg-dark">
<h5 class="modal-title"><i class="fas fa-fw fa-building mr-2"></i>Editing vendor template: <strong><?php echo $vendor_name; ?></strong></h5>
<button type="button" class="close text-white" data-dismiss="modal">
<span>&times;</span>
</button>
</div>
<form action="post.php" method="post" autocomplete="off">
<input type="hidden" name="vendor_template_id" value="<?php echo $vendor_template_id; ?>">
<div class="modal-body">
<ul class="nav nav-pills nav-justified mb-3">
<li class="nav-item">
<a class="nav-link active" data-toggle="pill" href="#pills-details<?php echo $vendor_template_id; ?>">Details</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-support<?php echo $vendor_template_id; ?>">Support</a>
</li>
<li class="nav-item">
<a class="nav-link" data-toggle="pill" href="#pills-notes<?php echo $vendor_template_id; ?>">Notes</a>
</li>
</ul>
<hr>
<div class="alert alert-info">Check the fields you would like to update globally</div>
<div class="tab-content">
<div class="tab-pane fade show active" id="pills-details<?php echo $vendor_template_id; ?>">
<div class="form-group">
<label>Vendor Name <strong class="text-danger">*</strong></label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-building"></i></span>
</div>
<input type="text" class="form-control" name="name" placeholder="Vendor Name" maxlength="200" value="<?php echo "$vendor_name"; ?>" required>
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_name" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Description</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
</div>
<input type="text" class="form-control" name="description" placeholder="Description" maxlength="200" value="<?php echo $vendor_description; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_description" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Account Number</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-fingerprint"></i></span>
</div>
<input type="text" class="form-control" name="account_number" placeholder="Account number" maxlength="200" value="<?php echo $vendor_account_number; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_account_number" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Account Manager</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-user"></i></span>
</div>
<input type="text" class="form-control" name="contact_name" maxlength="200" value="<?php echo $vendor_contact_name; ?>" placeholder="Vendor contact name">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_contact_name" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<div class="custom-control custom-checkbox">
<input type="checkbox" class="custom-control-input" id="updateVendorsCheckbox<?php echo $vendor_template_id; ?>" name="update_base_vendors" value="1" >
<label class="custom-control-label" for="updateVendorsCheckbox<?php echo $vendor_template_id; ?>">Update All Base Vendors</label>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-support<?php echo $vendor_template_id; ?>">
<label>Support Phone</label>
<div class="form-row">
<div class="col-8">
<div class="form-group">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-phone"></i></span>
</div>
<input type="tel" class="form-control col-2" name="phone_country_code" placeholder="+" maxlength="4" value="<?php echo $vendor_phone_country_code; ?>">
<input type="tel" class="form-control" name="phone" value="<?php echo $vendor_phone; ?>">
</div>
</div>
</div>
<div class="col-4">
<div class="input-group">
<input type="text" class="form-control" name="extension" placeholder="Prompts" maxlength="200" value="<?php echo $vendor_extension; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_phone" value="1">
</div>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Support Hours</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
</div>
<input type="text" class="form-control" name="hours" placeholder="Support Hours" maxlength="200" value="<?php echo $vendor_hours; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_hours" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Support Email</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-envelope"></i></span>
</div>
<input type="email" class="form-control" name="email" placeholder="Support Email" maxlength="200" value="<?php echo $vendor_email; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_email" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Support Website URL</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
</div>
<input type="text" class="form-control" name="website" placeholder="Do not include http(s)://" maxlength="200" value="<?php echo $vendor_website; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_website" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>SLA</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-handshake"></i></span>
</div>
<input type="text" class="form-control" name="sla" placeholder="SLA Response Time" maxlength="200" value="<?php echo $vendor_sla; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_sla" value="1">
</div>
</div>
</div>
</div>
<div class="form-group">
<label>Pin/Code</label>
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text"><i class="fa fa-fw fa-key"></i></span>
</div>
<input type="text" class="form-control" name="code" placeholder="Access Code or Pin" maxlength="200" value="<?php echo $vendor_code; ?>">
<div class="input-group-append">
<div class="input-group-text">
<input type="checkbox" name="global_update_vendor_code" value="1">
</div>
</div>
</div>
</div>
</div>
<div class="tab-pane fade" id="pills-notes<?php echo $vendor_template_id; ?>">
<div class="form-group">
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?php echo $vendor_notes; ?></textarea>
</div>
<div class="form-group">
<label>Update Notes Globally?</label>
<input type="checkbox" name="global_update_vendor_notes" value="1">
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary text-bold" name="edit_vendor_template"><i class="fa fa-check mr-2"></i>Update Template</button>
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
</div>
</form>
<?php
require_once '../../../includes/modal_footer.php';

113
admin/modules.php Normal file
View File

@@ -0,0 +1,113 @@
<?php
// Default Column Sortby Filter
$sort = "module_name";
$order = "DESC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query(
$mysqli,
"SELECT SQL_CALC_FOUND_ROWS * FROM modules
WHERE (module_name LIKE '%$q%' OR module_description LIKE '%$q%')
ORDER BY $sort $order LIMIT $record_from, $record_to"
);
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
?>
<div class="card card-dark">
<div class="card-header py-2">
<h3 class="card-title mt-2"><i class="fas fa-fw fa-puzzle-piece mr-2"></i>Access Modules</h3>
<div class="card-tools">
<div class="btn-group">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/module/module_add.php">
<i class="fas fa-fw fa-plus mr-2"></i>New Module
</button>
</div>
</div>
</div>
<div class="card-body">
<form class="mb-4" autocomplete="off">
<div class="row">
<div class="col-md-4">
<div class="input-group">
<input type="search" class="form-control" name="q" value="<?php if (isset($q)) {echo stripslashes(nullable_htmlentities($q));} ?>" placeholder="Search Modules">
<div class="input-group-append">
<button class="btn btn-primary"><i class="fa fa-search"></i></button>
</div>
</div>
</div>
</div>
</form>
<hr>
<div class="table-responsive-sm">
<table class="table table-striped table-borderless table-hover">
<thead class="text-dark <?php if ($num_rows[0] == 0) { echo "d-none"; } ?> text-nowrap">
<tr>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=module_name&order=<?php echo $disp; ?>">
Module <?php if ($sort == 'module_name') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$module_id = intval($row['module_id']);
$module_name = nullable_htmlentities($row['module_name']);
$module_description = nullable_htmlentities($row['module_description']);
?>
<tr>
<td>
<a href="#" <?php if ($module_id > 6) { ?> class="ajax-modal" data-modal-url="modals/modules/module_edit.php?id=<?= $module_id ?>" <?php } ?>>
<strong class="text-dark"><?= $module_name ?></strong>
</a>
<div class="text-secondary"><?= $module_description ?></div>
</td>
<td>
<?php if ($module_id > 6) { ?>
<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/module/module_edit.php?id=<?= $module_id ?>">
<i class="fas fa-fw fa-user-edit mr-2"></i>Edit
</a>
<div class="dropdown-divider"></div>
<a class="dropdown-item text-danger confirm-link" href="post.php?delete_module=<?= $module_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-archive mr-2"></i>Delete
</a>
</div>
</div>
<?php } else { echo "<p class='text-center'>N/A Predefined</p>"; } ?>
</td>
</tr>
<?php
}
?>
</tbody>
</table>
</div>
<?php require_once "../includes/filter_footer.php";
?>
</div>
</div>
<?php
require_once "../includes/footer.php";

View File

@@ -0,0 +1,103 @@
<?php
require_once "../config.php";
require_once "../functions.php";
require_once "../includes/check_login.php";
$settings_mail_path = '/admin/settings_mail.php';
if (!isset($session_is_admin) || !$session_is_admin) {
flash_alert("Admin access required.", 'error');
redirect($settings_mail_path);
}
$state = sanitizeInput($_GET['state'] ?? '');
$code = $_GET['code'] ?? '';
$error = sanitizeInput($_GET['error'] ?? '');
$error_description = sanitizeInput($_GET['error_description'] ?? '');
$session_state = $_SESSION['mail_oauth_state'] ?? '';
$session_state_expires = intval($_SESSION['mail_oauth_state_expires_at'] ?? 0);
unset($_SESSION['mail_oauth_state'], $_SESSION['mail_oauth_state_expires_at']);
if (!empty($error)) {
$msg = "Microsoft OAuth authorization failed: $error";
if (!empty($error_description)) {
$msg .= " ($error_description)";
}
flash_alert($msg, 'error');
redirect($settings_mail_path);
}
if (empty($state) || empty($code) || empty($session_state) || !hash_equals($session_state, $state) || time() > $session_state_expires) {
flash_alert("Microsoft OAuth callback validation failed. Please try connecting again.", 'error');
redirect($settings_mail_path);
}
if (empty($config_mail_oauth_client_id) || empty($config_mail_oauth_client_secret) || empty($config_mail_oauth_tenant_id)) {
flash_alert("Microsoft OAuth settings are incomplete. Please fill Client ID, Client Secret, and Tenant ID.", 'error');
redirect($settings_mail_path);
}
if (defined('BASE_URL') && !empty(BASE_URL)) {
$base_url = rtrim((string) BASE_URL, '/');
} else {
$base_url = 'https://' . rtrim((string) $config_base_url, '/');
}
$redirect_uri = $base_url . '/admin/oauth_microsoft_mail_callback.php';
$token_url = 'https://login.microsoftonline.com/' . rawurlencode($config_mail_oauth_tenant_id) . '/oauth2/v2.0/token';
$scope = 'offline_access openid profile https://outlook.office.com/IMAP.AccessAsUser.All https://outlook.office.com/SMTP.Send';
$ch = curl_init($token_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'client_id' => $config_mail_oauth_client_id,
'client_secret' => $config_mail_oauth_client_secret,
'grant_type' => 'authorization_code',
'code' => $code,
'redirect_uri' => $redirect_uri,
'scope' => $scope,
], '', '&'));
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$raw_body = curl_exec($ch);
$curl_err = curl_error($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($raw_body === false || $http_code < 200 || $http_code >= 300) {
$reason = !empty($curl_err) ? $curl_err : "HTTP $http_code";
flash_alert("Microsoft OAuth token exchange failed: $reason", 'error');
redirect($settings_mail_path);
}
$json = json_decode($raw_body, true);
if (!is_array($json) || empty($json['refresh_token']) || empty($json['access_token'])) {
flash_alert("Microsoft OAuth token exchange failed: refresh token or access token missing.", 'error');
redirect($settings_mail_path);
}
$refresh_token = (string) $json['refresh_token'];
$access_token = (string) $json['access_token'];
$expires_at = date('Y-m-d H:i:s', time() + (int)($json['expires_in'] ?? 3600));
$refresh_token_esc = mysqli_real_escape_string($mysqli, $refresh_token);
$access_token_esc = mysqli_real_escape_string($mysqli, $access_token);
$expires_at_esc = mysqli_real_escape_string($mysqli, $expires_at);
mysqli_query($mysqli, "UPDATE settings SET
config_imap_provider = 'microsoft_oauth',
config_smtp_provider = 'microsoft_oauth',
config_mail_oauth_refresh_token = '$refresh_token_esc',
config_mail_oauth_access_token = '$access_token_esc',
config_mail_oauth_access_token_expires_at = '$expires_at_esc'
WHERE company_id = 1
");
logAction("Settings", "Edit", "$session_name completed Microsoft OAuth connect flow for mail settings");
flash_alert("Microsoft OAuth connected successfully. Token expires at $expires_at.");
redirect($settings_mail_path);

101
admin/payment_method.php Normal file
View File

@@ -0,0 +1,101 @@
<?php
// Default Column Sortby Filter
$sort = "payment_method_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query($mysqli, "SELECT * FROM payment_methods 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-credit-card mr-2"></i>Payment Methods</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/payment_method/payment_method_add.php"><i class="fas fa-plus mr-2"></i>Add Payment Method</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=payment_method_name&order=<?php echo $disp; ?>">
Method <?php if ($sort == 'payment_method_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=payment_method_description&order=<?php echo $disp; ?>">
Description <?php if ($sort == 'payment_method_description') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=payment_method_created_at&order=<?php echo $disp; ?>">
Created at <?php if ($sort == 'payment_method_created_at') { echo $order_icon; } ?>
</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$payment_method_id = intval($row['payment_method_id']);
$payment_method_name = nullable_htmlentities($row['payment_method_name']);
$payment_method_description = nullable_htmlentities($row['payment_method_description']);
$payment_method_created_at = nullable_htmlentities($row['payment_method_created_at']);
?>
<tr>
<td>
<a class="text-dark text-bold ajax-modal" href="#"
data-modal-url="modals/payment_method/payment_method_edit.php?id=<?= $payment_method_id ?>">
<?php echo $payment_method_name; ?>
</a>
</td>
<td><?php echo $payment_method_description; ?></td>
<td><?php echo $payment_method_created_at; ?></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/payment_method/payment_method_edit.php?id=<?= $payment_method_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_payment_method=<?php echo $payment_method_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 "../includes/footer.php";

142
admin/payment_provider.php Normal file
View File

@@ -0,0 +1,142 @@
<?php
// Default Column Sortby Filter
$sort = "payment_provider_name";
$order = "ASC";
require_once "includes/inc_all_admin.php";
$sql = mysqli_query($mysqli, "SELECT * FROM payment_providers
LEFT JOIN accounts ON payment_provider_account = account_id
LEFT JOIN vendors ON payment_provider_expense_vendor = vendor_id
LEFT JOIN categories ON payment_provider_expense_category = category_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-credit-card mr-2"></i>Payment Providers</h3>
<div class="card-tools">
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/payment_provider/payment_provider_add.php"><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=payment_provider_name&order=<?php echo $disp; ?>">
Provider <?php if ($sort == 'payment_provider_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=account_name&order=<?php echo $disp; ?>">
Expense / Income Account <?php if ($sort == 'account_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=payment_provider_threshold&order=<?php echo $disp; ?>">
Threshold <?php if ($sort == 'payment_provider_threshold') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=vendor_name&order=<?php echo $disp; ?>">
Expense Vendor <?php if ($sort == 'vendor_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark" href="?<?php echo $url_query_strings_sort; ?>&sort=category_name&order=<?php echo $disp; ?>">
Expense Category <?php if ($sort == 'category_name') { echo $order_icon; } ?>
</a>
</th>
<th>
<a class="text-dark">Expensed Fee</a>
</th>
<th class="text-center">
<a class="text-dark">Saved Payment Methods</a>
</th>
<th class="text-center">Action</th>
</tr>
</thead>
<tbody>
<?php
while ($row = mysqli_fetch_assoc($sql)) {
$provider_id = intval($row['payment_provider_id']);
$provider_name = nullable_htmlentities($row['payment_provider_name']);
$provider_description = nullable_htmlentities($row['payment_provider_description']);
$account_name = nullable_htmlentities($row['account_name']);
$threshold = floatval($row['payment_provider_threshold']);
$vendor_name = nullable_htmlentities($row['vendor_name'] ?? "Expense Disabled");
$category = nullable_htmlentities($row['category_name']);
$percent_fee = floatval($row['payment_provider_expense_percentage_fee']) * 100;
$flat_fee = floatval($row['payment_provider_expense_flat_fee']);
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "SELECT COUNT('saved_payment_id') AS saved_payment_count FROM client_saved_payment_methods WHERE saved_payment_provider_id = $provider_id"));
$saved_payment_count = intval($row['saved_payment_count']);
?>
<tr>
<td>
<a class="text-dark text-bold ajax-modal" href="#"
data-modal-url="modals/payment_provider/payment_provider_edit.php?id=<?= $provider_id ?>">
<?php echo $provider_name; ?>
</a>
<span class="text-secondary"><?php echo $provider_description; ?></span>
</td>
<td><?php echo $account_name; ?></td>
<td><?php echo numfmt_format_currency($currency_format, $threshold, $session_company_currency); ?></td>
<td><?php echo $vendor_name; ?></td>
<td><?php echo $category; ?></td>
<td><?php echo $percent_fee; ?>% + <?php echo numfmt_format_currency($currency_format, $flat_fee, $session_company_currency); ?></td>
<td class="text-center">
<a class="badge badge-dark badge-pill p-2" href="saved_payment_method.php"><?= $saved_payment_count ?></a>
</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/payment_provider/payment_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_payment_provider=<?= $provider_id ?>&csrf_token=<?= $_SESSION['csrf_token'] ?>">
<i class="fas fa-fw fa-trash mr-2"></i><strong>Delete Provider and</strong>
<ul class="text-xs">
<li>Related Recurring Payments</li>
<li>Related Saved cards</li>
<li>Client Provider Relations</li>
</ul>
</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 "../includes/footer.php";

39
admin/post.php Normal file
View File

@@ -0,0 +1,39 @@
<?php
/*
* ITFlow - Admin GET/POST request handler
*/
require_once "../config.php";
require_once "../functions.php";
require_once "../includes/check_login.php";
// Define a variable that we can use to only allow running post files via inclusion (prevents people/bots poking them)
define('FROM_POST_HANDLER', true);
// Determine which files we should load
// Parse URL & get the path
$path = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_PATH);
// Get the base name (the page name)
$module = explode(".", basename($path))[0];
// Strip off any _details bits
$module = str_ireplace('_details', '', $module);
// Dynamically load admin-related module POST logic
if (isset($session_is_admin) && $session_is_admin) {
// As (almost) every admin setting is only changed from 1 page, we can dynamically load the relevant logic inside this single admin check IF statement
// To add a new admin POST request handler, add a file named after the admin page
// e.g. changes made on the page http://itflow/admin_ticket_statues.php will load the page admin/post/admin_ticket_statues.php to handle the changes
include_once "post/$module.php";
}
// Logout is the same for user and admin
require_once "../post/logout.php";
// TODO: Find a home for these
require_once "../post/misc.php";

65
admin/post/ai_model.php Normal file
View File

@@ -0,0 +1,65 @@
<?php
/*
* ITFlow - GET/POST request handler for AI Models ('ai_model')
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_ai_model'])) {
validateCSRFToken($_POST['csrf_token']);
$provider_id = intval($_POST['provider']);
$model = sanitizeInput($_POST['model']);
$prompt = sanitizeInput($_POST['prompt']);
$use_case = sanitizeInput($_POST['use_case']);
mysqli_query($mysqli,"INSERT INTO ai_models SET ai_model_name = '$model', ai_model_prompt = '$prompt', ai_model_use_case = '$use_case', ai_model_ai_provider_id = $provider_id");
$ai_model_id = mysqli_insert_id($mysqli);
logAction("AI Model", "Create", "$session_name created AI Model $model");
flash_alert("AI Model <strong>$model</strong> created");
redirect();
}
if (isset($_POST['edit_ai_model'])) {
validateCSRFToken($_POST['csrf_token']);
$model_id = intval($_POST['model_id']);
$model = sanitizeInput($_POST['model']);
$prompt = sanitizeInput($_POST['prompt']);
$use_case = sanitizeInput($_POST['use_case']);
mysqli_query($mysqli,"UPDATE ai_models SET ai_model_name = '$model', ai_model_prompt = '$prompt', ai_model_use_case = '$use_case' WHERE ai_model_id = $model_id");
logAction("AI Model", "Edit", "$session_name edited AI Model $model");
flash_alert("AI Model <strong>$model</strong> edited");
redirect();
}
if (isset($_GET['delete_ai_model'])) {
validateCSRFToken($_GET['csrf_token']);
$model_id = intval($_GET['delete_ai_model']);
$model_name = sanitizeInput(getFieldById('ai_models', $model_id, 'ai_model_name'));
mysqli_query($mysqli,"DELETE FROM ai_models WHERE ai_model_id = $model_id");
logAction("AI Model", "Delete", "$session_name deleted AI Model $model_name");
flash_alert("AI Model <strong>$model_name</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,65 @@
<?php
/*
* ITFlow - GET/POST request handler for AI Providers ('ai_provider')
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_ai_provider'])) {
validateCSRFToken($_POST['csrf_token']);
$provider = sanitizeInput($_POST['provider']);
$url = sanitizeInput($_POST['url']);
$model = sanitizeInput($_POST['model']);
$api_key = sanitizeInput($_POST['api_key']);
mysqli_query($mysqli,"INSERT INTO ai_providers SET ai_provider_name = '$provider', ai_provider_api_url = '$url', ai_provider_api_key = '$api_key'");
$ai_provider_id = mysqli_insert_id($mysqli);
logAction("AI Provider", "Create", "$session_name created AI Provider $provider");
flash_alert("AI Model <strong>$provider</strong> created");
redirect();
}
if (isset($_POST['edit_ai_provider'])) {
validateCSRFToken($_POST['csrf_token']);
$provider_id = intval($_POST['provider_id']);
$provider = sanitizeInput($_POST['provider']);
$url = sanitizeInput($_POST['url']);
$api_key = sanitizeInput($_POST['api_key']);
mysqli_query($mysqli,"UPDATE ai_providers SET ai_provider_name = '$provider', ai_provider_api_url = '$url', ai_provider_api_key = '$api_key' WHERE ai_provider_id = $provider_id");
logAction("AI Provider", "Edit", "$session_name edited AI Provider $provider");
flash_alert("AI Model <strong>$provider</strong> edited");
redirect();
}
if (isset($_GET['delete_ai_provider'])) {
validateCSRFToken($_GET['csrf_token']);
$provider_id = intval($_GET['delete_ai_provider']);
$provider_name = sanitizeInput(getFieldById('ai_providers', $provider_id, 'ai_provider_name'));
mysqli_query($mysqli,"DELETE FROM ai_providers WHERE ai_provider_id = $provider_id");
logAction("AI Provider", "Delete", "$session_name deleted AI Provider $provider_name", 'error');
flash_alert("AI Provider <strong>$provider_name</strong> deleted", 'error');
redirect();
}

108
admin/post/api_keys.php Normal file
View File

@@ -0,0 +1,108 @@
<?php
/*
* ITFlow - GET/POST request handler for API settings
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_api_key'])) {
validateCSRFToken($_POST['csrf_token']);
$name = sanitizeInput($_POST['name']);
$expire = sanitizeInput($_POST['expire']);
$client_id = intval($_POST['client']);
$secret = sanitizeInput($_POST['key']); // API Key
// Credential decryption password
$password = password_hash(trim($_POST['password']), PASSWORD_DEFAULT);
$apikey_specific_encryption_ciphertext = encryptUserSpecificKey(trim($_POST['password']));
mysqli_query($mysqli,"INSERT INTO api_keys SET api_key_name = '$name', api_key_secret = '$secret', api_key_decrypt_hash = '$apikey_specific_encryption_ciphertext', api_key_expire = '$expire', api_key_client_id = $client_id");
$api_key_id = mysqli_insert_id($mysqli);
logAction("API Key", "Create", "$session_name created API key $name set to expire on $expire", $client_id, $api_key_id);
flash_alert("API Key <strong>$name</strong> created");
redirect();
}
if (isset($_GET['revoke_api_key'])) {
validateCSRFToken($_GET['csrf_token']);
$api_key_id = intval($_GET['revoke_api_key']);
// Get API Key Name
$row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT api_key_name, api_key_client_id FROM api_keys WHERE api_key_id = $api_key_id"));
$api_key_name = sanitizeInput($row['api_key_name']);
$client_id = intval($row['api_key_client_id']);
mysqli_query($mysqli,"UPDATE api_keys SET api_key_expire = NOW() WHERE api_key_id = $api_key_id");
logAction("API Key", "Revoke", "$session_name revoked API key $name", $client_id);
flash_alert("API Key <strong>$name</strong> revoked", 'error');
redirect();
}
if (isset($_GET['delete_api_key'])) {
validateCSRFToken($_GET['csrf_token']);
$api_key_id = intval($_GET['delete_api_key']);
// Get API Key Name
$row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT api_key_name, api_key_client_id FROM api_keys WHERE api_key_id = $api_key_id"));
$api_key_name = sanitizeInput($row['api_key_name']);
$client_id = intval($row['api_key_client_id']);
mysqli_query($mysqli,"DELETE FROM api_keys WHERE api_key_id = $api_key_id");
logAction("API Key", "Delete", "$session_name deleted API key $name", $client_id);
flash_alert("API Key <strong>$name</strong> deleted", 'error');
redirect();
}
if (isset($_POST['bulk_delete_api_keys'])) {
validateCSRFToken($_POST['csrf_token']);
if (isset($_POST['api_key_ids'])) {
$count = count($_POST['api_key_ids']);
// Cycle through array and delete each record
foreach ($_POST['api_key_ids'] as $api_key_id) {
$api_key_id = intval($api_key_id);
// Get API Key Name
$row = mysqli_fetch_assoc(mysqli_query($mysqli,"SELECT api_key_name, api_key_client_id FROM api_keys WHERE api_key_id = $api_key_id"));
$api_key_name = sanitizeInput($row['api_key_name']);
$client_id = intval($row['api_key_client_id']);
mysqli_query($mysqli, "DELETE FROM api_keys WHERE api_key_id = $api_key_id");
logAction("API Key", "Delete", "$session_name deleted API key $name", $client_id);
}
logAction("API Key", "Bulk Delete", "$session_name deleted $count API key(s)");
flash_alert("Deleted <strong>$count</strong> API keys(s)", 'error');
}
redirect();
}

331
admin/post/backup.php Normal file
View File

@@ -0,0 +1,331 @@
<?php
/*
* ITFlow - GET/POST request handler for DB / master key backup
* Rewritten with streaming SQL dump, component checksums, safer zipping, and better headers.
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
require_once "../includes/app_version.php";
// --- Optional performance levers for big backups ---
@set_time_limit(0);
if (function_exists('ini_set')) {
@ini_set('memory_limit', '1024M');
}
/**
* Write a line to a file handle with newline.
*/
function fwrite_ln($fh, string $s): void {
fwrite($fh, $s);
fwrite($fh, PHP_EOL);
}
/**
* Stream a SQL dump of schema and data into $sqlFile.
* - Tables first (DROP + CREATE + INSERTs)
* - Views (DROP VIEW + CREATE VIEW)
* - Triggers (DROP TRIGGER + CREATE TRIGGER)
*
* NOTE: Routines/events are not dumped here. Add if needed.
*/
function dump_database_streaming(mysqli $mysqli, string $sqlFile): void {
$fh = fopen($sqlFile, 'wb');
if (!$fh) {
http_response_code(500);
exit("Cannot open dump file");
}
// Preamble
fwrite_ln($fh, "-- UTF-8 + Foreign Key Safe Dump");
fwrite_ln($fh, "SET NAMES 'utf8mb4';");
fwrite_ln($fh, "SET FOREIGN_KEY_CHECKS = 0;");
fwrite_ln($fh, "SET UNIQUE_CHECKS = 0;");
fwrite_ln($fh, "SET AUTOCOMMIT = 0;");
fwrite_ln($fh, "");
// Gather tables and views
$tables = [];
$views = [];
$res = $mysqli->query("SHOW FULL TABLES");
if (!$res) {
fclose($fh);
error_log("MySQL Error (SHOW FULL TABLES): " . $mysqli->error);
http_response_code(500);
exit("Error retrieving tables.");
}
while ($row = $res->fetch_array(MYSQLI_NUM)) {
$name = $row[0];
$type = strtoupper($row[1] ?? '');
if ($type === 'VIEW') {
$views[] = $name;
} else {
$tables[] = $name;
}
}
$res->close();
// --- TABLES: structure and data ---
foreach ($tables as $table) {
$createRes = $mysqli->query("SHOW CREATE TABLE `{$mysqli->real_escape_string($table)}`");
if (!$createRes) {
error_log("MySQL Error (SHOW CREATE TABLE $table): " . $mysqli->error);
// continue to next table
continue;
}
$createRow = $createRes->fetch_assoc();
$createSQL = array_values($createRow)[1] ?? '';
$createRes->close();
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "-- Table structure for `{$table}`");
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "DROP TABLE IF EXISTS `{$table}`;");
fwrite_ln($fh, $createSQL . ";");
fwrite_ln($fh, "");
// Dump data in a streaming fashion
$dataRes = $mysqli->query("SELECT * FROM `{$mysqli->real_escape_string($table)}`", MYSQLI_USE_RESULT);
if ($dataRes) {
$wroteHeader = false;
while ($row = $dataRes->fetch_assoc()) {
if (!$wroteHeader) {
fwrite_ln($fh, "-- Dumping data for table `{$table}`");
$wroteHeader = true;
}
$cols = array_map(fn($c) => '`' . $mysqli->real_escape_string($c) . '`', array_keys($row));
$vals = array_map(
function ($v) use ($mysqli) {
return is_null($v) ? "NULL" : "'" . $mysqli->real_escape_string($v) . "'";
},
array_values($row)
);
fwrite_ln($fh, "INSERT INTO `{$table}` (" . implode(", ", $cols) . ") VALUES (" . implode(", ", $vals) . ");");
}
$dataRes->close();
if ($wroteHeader) fwrite_ln($fh, "");
}
}
// --- VIEWS ---
foreach ($views as $view) {
$escView = $mysqli->real_escape_string($view);
$cRes = $mysqli->query("SHOW CREATE VIEW `{$escView}`");
if ($cRes) {
$row = $cRes->fetch_assoc();
$createView = $row['Create View'] ?? '';
$cRes->close();
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "-- View structure for `{$view}`");
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "DROP VIEW IF EXISTS `{$view}`;");
// Ensure statement ends with semicolon
if (!str_ends_with($createView, ';')) $createView .= ';';
fwrite_ln($fh, $createView);
fwrite_ln($fh, "");
}
}
// --- TRIGGERS ---
$tRes = $mysqli->query("SHOW TRIGGERS");
if ($tRes) {
while ($t = $tRes->fetch_assoc()) {
$triggerName = $t['Trigger'];
$escTrig = $mysqli->real_escape_string($triggerName);
$crt = $mysqli->query("SHOW CREATE TRIGGER `{$escTrig}`");
if ($crt) {
$row = $crt->fetch_assoc();
$createTrig = $row['SQL Original Statement'] ?? ($row['Create Trigger'] ?? '');
$crt->close();
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "-- Trigger for `{$triggerName}`");
fwrite_ln($fh, "-- ----------------------------");
fwrite_ln($fh, "DROP TRIGGER IF EXISTS `{$triggerName}`;");
if (!str_ends_with($createTrig, ';')) $createTrig .= ';';
fwrite_ln($fh, $createTrig);
fwrite_ln($fh, "");
}
}
$tRes->close();
}
// Postamble
fwrite_ln($fh, "SET FOREIGN_KEY_CHECKS = 1;");
fwrite_ln($fh, "SET UNIQUE_CHECKS = 1;");
fwrite_ln($fh, "COMMIT;");
fclose($fh);
}
/**
* Zip a folder to $zipFilePath, skipping symlinks and dot-entries.
*/
function zipFolderStrict(string $folderPath, string $zipFilePath): void {
$zip = new ZipArchive();
if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
error_log("Failed to open zip file: $zipFilePath");
http_response_code(500);
exit("Internal Server Error: Cannot open zip archive.");
}
$folderReal = realpath($folderPath);
if (!$folderReal || !is_dir($folderReal)) {
// Create an empty archive if uploads folder doesn't exist yet
$zip->close();
return;
}
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($folderReal, FilesystemIterator::SKIP_DOTS),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $file) {
/** @var SplFileInfo $file */
if ($file->isDir()) continue;
if ($file->isLink()) continue; // skip symlinks
$filePath = $file->getRealPath();
if ($filePath === false) continue;
// ensure path is inside the folder boundary
if (strpos($filePath, $folderReal . DIRECTORY_SEPARATOR) !== 0 && $filePath !== $folderReal) {
continue;
}
$relativePath = substr($filePath, strlen($folderReal) + 1);
$zip->addFile($filePath, $relativePath);
}
$zip->close();
}
if (isset($_GET['download_backup'])) {
validateCSRFToken($_GET['csrf_token']);
$timestamp = date('YmdHis');
$baseName = "itflow_{$timestamp}";
$downloadName = $baseName . ".zip";
// === Scoped cleanup of temp files ===
$cleanupFiles = [];
$registerTempFileForCleanup = function ($file) use (&$cleanupFiles) {
$cleanupFiles[] = $file;
};
register_shutdown_function(function () use (&$cleanupFiles) {
foreach ($cleanupFiles as $file) {
if (is_file($file)) { @unlink($file); }
}
});
// === Create temp files ===
$sqlFile = tempnam(sys_get_temp_dir(), $baseName . "_sql_");
$uploadsZip = tempnam(sys_get_temp_dir(), $baseName . "_uploads_");
$versionFile = tempnam(sys_get_temp_dir(), $baseName . "_version_");
$finalZip = tempnam(sys_get_temp_dir(), $baseName . "_backup_");
foreach ([$sqlFile, $uploadsZip, $versionFile, $finalZip] as $f) {
$registerTempFileForCleanup($f);
@chmod($f, 0600);
}
// === Generate SQL Dump (streaming) ===
dump_database_streaming($mysqli, $sqlFile);
// === Zip the uploads folder (strict) ===
zipFolderStrict("../uploads", $uploadsZip);
// === Gather metadata & checksums ===
$commitHash = (function_exists('shell_exec') ? trim(shell_exec('git log -1 --format=%H 2>/dev/null')) : '') ?: 'N/A';
$gitBranch = (function_exists('shell_exec') ? trim(shell_exec('git rev-parse --abbrev-ref HEAD 2>/dev/null')) : '') ?: 'N/A';
$dbSha = hash_file('sha256', $sqlFile) ?: 'N/A';
$upSha = hash_file('sha256', $uploadsZip) ?: 'N/A';
$versionContent = "ITFlow Backup Metadata\n";
$versionContent .= "-----------------------------\n";
$versionContent .= "Generated: " . date('Y-m-d H:i:s') . "\n";
$versionContent .= "Backup File: " . $downloadName . "\n";
$versionContent .= "Generated By: " . ($session_name ?? 'Unknown User') . "\n";
$versionContent .= "Host: " . gethostname() . "\n";
$versionContent .= "Git Branch: $gitBranch\n";
$versionContent .= "Git Commit: $commitHash\n";
$versionContent .= "ITFlow Version: " . (defined('APP_VERSION') ? APP_VERSION : 'Unknown') . "\n";
$versionContent .= "Database Version: " . (defined('CURRENT_DATABASE_VERSION') ? CURRENT_DATABASE_VERSION : 'Unknown') . "\n";
$versionContent .= "Checksums (SHA256):\n";
$versionContent .= " db.sql: $dbSha\n";
$versionContent .= " uploads.zip: $upSha\n";
file_put_contents($versionFile, $versionContent);
@chmod($versionFile, 0600);
// === Build final ZIP ===
$final = new ZipArchive();
if ($final->open($finalZip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
error_log("Failed to create final zip: $finalZip");
http_response_code(500);
exit("Internal Server Error: Unable to create backup archive.");
}
$final->addFile($sqlFile, "db.sql");
$final->addFile($uploadsZip, "uploads.zip");
$final->addFile($versionFile, "version.txt");
$final->close();
@chmod($finalZip, 0600);
// === Serve final ZIP with a stable filename ===
header('Content-Type: application/zip');
header('X-Content-Type-Options: nosniff');
header('Content-Disposition: attachment; filename="' . $downloadName . '"');
header('Content-Length: ' . filesize($finalZip));
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Transfer-Encoding: binary');
// Push file
flush();
$fp = fopen($finalZip, 'rb');
fpassthru($fp);
fclose($fp);
// Log + UX
logAction("System", "Backup Download", ($session_name ?? 'Unknown User') . " downloaded full backup.");
flash_alert("Full backup downloaded.");
exit;
}
if (isset($_POST['backup_master_key'])) {
validateCSRFToken($_POST['csrf_token']);
$password = $_POST['password'];
$sql = mysqli_query($mysqli, "SELECT * FROM users WHERE user_id = $session_user_id");
$row = mysqli_fetch_assoc($sql);
if (password_verify($password, $row['user_password'])) {
$site_encryption_master_key = decryptUserSpecificKey($row['user_specific_encryption_ciphertext'], $password);
logAction("Master Key", "Download", "$session_name retrieved the master encryption key");
appNotify("Master Key", "$session_name retrieved the master encryption key");
echo "==============================";
echo "<br>Master encryption key:<br>";
echo "<b>$site_encryption_master_key</b>";
echo "<br>==============================";
} else {
logAction("Master Key", "Download", "$session_name attempted to retrieve the master encryption key but failed");
flash_alert("Incorrect password.", 'error');
redirect();
}
}

99
admin/post/category.php Normal file
View File

@@ -0,0 +1,99 @@
<?php
/*
* ITFlow - GET/POST request handler for categories ('category')
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_category'])) {
require_once 'category_model.php';
mysqli_query($mysqli,"INSERT INTO categories SET category_name = '$name', category_type = '$type', category_color = '$color'");
$category_id = mysqli_insert_id($mysqli);
logAction("Category", "Create", "$session_name created category $type $name", 0, $category_id);
flash_alert("Category $type <strong>$name</strong> created");
redirect();
}
if (isset($_POST['edit_category'])) {
require_once 'category_model.php';
$category_id = intval($_POST['category_id']);
mysqli_query($mysqli,"UPDATE categories SET category_name = '$name', category_type = '$type', category_color = '$color' WHERE category_id = $category_id");
logAction("Category", "Edit", "$session_name edited category $type $name", 0, $category_id);
flash_alert("Category $type <strong>$name</strong> edited");
redirect();
}
if (isset($_GET['archive_category'])) {
$category_id = intval($_GET['archive_category']);
// Get Category Name and Type for logging
$sql = mysqli_query($mysqli,"SELECT category_name, category_type FROM categories WHERE category_id = $category_id");
$row = mysqli_fetch_assoc($sql);
$category_name = sanitizeInput($row['category_name']);
$category_type = sanitizeInput($row['category_type']);
mysqli_query($mysqli,"UPDATE categories SET category_archived_at = NOW() WHERE category_id = $category_id");
logAction("Category", "Archive", "$session_name archived category $category_type $category_name", 0, $category_id);
flash_alert("Category $category_type <strong>$category_name</strong> archived", 'error');
redirect();
}
if (isset($_GET['unarchive_category'])) {
$category_id = intval($_GET['unarchive_category']);
// Get Category Name and Type for logging
$sql = mysqli_query($mysqli,"SELECT category_name, category_type FROM categories WHERE category_id = $category_id");
$row = mysqli_fetch_assoc($sql);
$category_name = sanitizeInput($row['category_name']);
$category_type = sanitizeInput($row['category_type']);
mysqli_query($mysqli,"UPDATE categories SET category_archived_at = NULL WHERE category_id = $category_id");
logAction("Category", "Unarchive", "$session_name unarchived category $category_type $category_name", 0, $category_id);
flash_alert("Category $category_type <strong>$category_name</strong> unarchived");
redirect();
}
if (isset($_GET['delete_category'])) {
$category_id = intval($_GET['delete_category']);
// Get Category Name and Type for logging
$sql = mysqli_query($mysqli,"SELECT category_name, category_type FROM categories WHERE category_id = $category_id");
$row = mysqli_fetch_assoc($sql);
$category_name = sanitizeInput($row['category_name']);
$category_type = sanitizeInput($row['category_type']);
mysqli_query($mysqli,"DELETE FROM categories WHERE category_id = $category_id");
logAction("Category", "Delete", "$session_name deleted category $category_type $category_name");
flash_alert("Category $category_type <strong>$category_name</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,6 @@
<?php
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
$name = sanitizeInput($_POST['name']);
$type = sanitizeInput($_POST['type']);
$color = sanitizeInput($_POST['color']);

View File

@@ -0,0 +1,157 @@
<?php
/*
* ITFlow - GET/POST request handler for Contract Templates
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_contract_template'])) {
// Sanitize text inputs
$name = sanitizeInput($_POST['name']);
$description = sanitizeInput($_POST['description']);
$type = sanitizeInput($_POST['type']);
$renewal_frequency = sanitizeInput($_POST['renewal_frequency']);
$support_hours = sanitizeInput($_POST['support_hours']);
$details = mysqli_escape_string($mysqli, $_POST['details']);
// Numeric fields cast to integer
$sla_low_resp = intval($_POST['sla_low_response_time']);
$sla_med_resp = intval($_POST['sla_medium_response_time']);
$sla_high_resp = intval($_POST['sla_high_response_time']);
$sla_low_res = intval($_POST['sla_low_resolution_time']);
$sla_med_res = intval($_POST['sla_medium_resolution_time']);
$sla_high_res = intval($_POST['sla_high_resolution_time']);
$rate_standard = intval($_POST['rate_standard']);
$rate_after_hours = intval($_POST['hourly_rate_after_hours']);
$net_terms = intval($_POST['net_terms']);
// Insert into database (numbers not quoted)
mysqli_query($mysqli, "
INSERT INTO contract_templates SET
contract_template_name = '$name',
contract_template_description = '$description',
contract_template_details = '$details',
contract_template_type = '$type',
contract_template_renewal_frequency = '$renewal_frequency',
contract_template_sla_low_response_time = $sla_low_resp,
contract_template_sla_medium_response_time = $sla_med_resp,
contract_template_sla_high_response_time = $sla_high_resp,
contract_template_sla_low_resolution_time = $sla_low_res,
contract_template_sla_medium_resolution_time = $sla_med_res,
contract_template_sla_high_resolution_time = $sla_high_res,
contract_template_rate_standard = $rate_standard,
contract_template_rate_after_hours = $rate_after_hours,
contract_template_support_hours = '$support_hours',
contract_template_net_terms = $net_terms
");
$contract_template_id = mysqli_insert_id($mysqli);
// Log action
logAction("Contract Template", "Create", "$session_name created contract template $name", 0, $contract_template_id);
// Flash message
flash_alert("Contract Template <strong>$name</strong> created");
// Redirect back
redirect();
}
if (isset($_POST['edit_contract_template'])) {
$contract_template_id = intval($_POST['contract_template_id']);
$name = sanitizeInput($_POST['name']);
$description = sanitizeInput($_POST['description']);
$type = sanitizeInput($_POST['type']);
$renewal_frequency= sanitizeInput($_POST['renewal_frequency']);
$support_hours = sanitizeInput($_POST['support_hours']);
$details = mysqli_escape_string($mysqli, $_POST['details']);
$sla_low_resp = intval($_POST['sla_low_response_time']);
$sla_med_resp = intval($_POST['sla_medium_response_time']);
$sla_high_resp = intval($_POST['sla_high_response_time']);
$sla_low_res = intval($_POST['sla_low_resolution_time']);
$sla_med_res = intval($_POST['sla_medium_resolution_time']);
$sla_high_res = intval($_POST['sla_high_resolution_time']);
$rate_standard = intval($_POST['rate_standard']);
$rate_after_hours = intval($_POST['rate_after_hours']);
$net_terms = intval($_POST['net_terms']);
mysqli_query($mysqli, "
UPDATE contract_templates SET
contract_template_name = '$name',
contract_template_description = '$description',
contract_template_details = '$details',
contract_template_type = '$type',
contract_template_renewal_frequency = '$renewal_frequency',
contract_template_sla_low_response_time = $sla_low_resp,
contract_template_sla_medium_response_time = $sla_med_resp,
contract_template_sla_high_response_time = $sla_high_resp,
contract_template_sla_low_resolution_time = $sla_low_res,
contract_template_sla_medium_resolution_time = $sla_med_res,
contract_template_sla_high_resolution_time = $sla_high_res,
contract_template_rate_standard = $rate_standard,
contract_template_rate_after_hours = $rate_after_hours,
contract_template_support_hours = '$support_hours',
contract_template_net_terms = $net_terms
WHERE contract_template_id = $contract_template_id
");
// Log action
logAction("Contract Template", "Update", "$session_name updated contract template $name", 0, $contract_template_id);
// Flash + redirect
flash_alert("Contract Template <strong>$name</strong> updated");
redirect();
}
if (isset($_GET['archive_contract_template'])) {
$contract_template_id = intval($_GET['archive_contract_template']);
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
mysqli_query($mysqli, "
UPDATE contract_templates SET contract_template_archived_at = NOW()
WHERE contract_template_id = $contract_template_id
LIMIT 1
");
logAction("Contract Template", "Archive", "$session_name archived contract template $name", 0, $contract_template_id);
flash_alert("Contract Template <strong>$name</strong> archived", "danger");
redirect();
}
if (isset($_GET['restore_contract_template'])) {
$contract_template_id = intval($_GET['restore_contract_template']);
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
mysqli_query($mysqli, "
UPDATE contract_templates SET contract_template_archived_at = NULL
WHERE contract_template_id = $contract_template_id
LIMIT 1
");
logAction("Contract Template", "Restore", "$session_name restored contract template $name", 0, $contract_template_id);
flash_alert("Contract Template <strong>$name</strong> restored");
redirect();
}
if (isset($_GET['delete_contract_template'])) {
$contract_template_id = intval($_GET['delete_contract_template']);
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
mysqli_query($mysqli, "
DELETE FROM contract_templates
WHERE contract_template_id = $contract_template_id
LIMIT 1
");
logAction("Contract Template", "Delete", "$session_name deleted contract template $name", 0, $contract_template_id);
flash_alert("Contract Template <strong>$name</strong> deleted", "danger");
redirect();
}
?>

View File

@@ -0,0 +1,57 @@
<?php
/*
* ITFlow - GET/POST request handler for custom fields
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if(isset($_POST['create_custom_field'])){
require_once 'custom_field_model.php';
$table = sanitizeInput($_POST['table']);
mysqli_query($mysqli,"INSERT INTO custom_fields SET custom_field_table = '$table', custom_field_label = '$label', custom_field_type = '$type'");
$custom_field_id = mysqli_insert_id($mysqli);
logAction("Custom Field", "Create", "$session_name created custom field $label", 0, $custom_field_id);
flash_alert("Custom field <strong>$label</strong> created");
redirect();
}
if(isset($_POST['edit_custom_field'])){
require_once 'custom_field_model.php';
$custom_field_id = intval($_POST['custom_field_id']);
mysqli_query($mysqli,"UPDATE custom_fields SET custom_field_label = '$label', custom_field_type = '$type' WHERE custom_field_id = $custom_field_id");
logAction("Custom Field", "Edit", "$session_name edited custom field $label", 0, $custom_field_id);
flash_alert("Custom field <strong>$label</strong> edited");
redirect();
}
if(isset($_GET['delete_custom_field'])){
$custom_field_id = intval($_GET['delete_custom_field']);
$label = sanitizeInput(getFieldById('custom_fields', $custom_field_id, 'custom_field_label'));
mysqli_query($mysqli,"DELETE FROM custom_fields WHERE custom_field_id = $custom_field_id");
logAction("Custom Field", "Delete", "$session_name deleted custom field $label");
flash_alert("Custom field <strong>$label</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,5 @@
<?php
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
$label = sanitizeInput($_POST['label']);
$type = sanitizeInput($_POST['type']);

View File

@@ -0,0 +1,68 @@
<?php
/*
* ITFlow - GET/POST request handler for showing custom links on navbars
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_custom_link'])) {
$name = sanitizeInput($_POST['name']);
$uri = sanitizeInput($_POST['uri']);
$new_tab = intval($_POST['new_tab'] ?? 0);
$icon = preg_replace("/[^0-9a-zA-Z-]/", "", sanitizeInput($_POST['icon']));
$order = intval($_POST['order'] ?? 0);
$location = intval($_POST['location']);
mysqli_query($mysqli,"INSERT INTO custom_links SET custom_link_name = '$name', custom_link_uri = '$uri', custom_link_new_tab = $new_tab, custom_link_icon = '$icon', custom_link_order = $order, custom_link_location = $location");
$custom_link_id = mysqli_insert_id($mysqli);
logAction("Custom Link", "Create", "$session_name created custom link $name -> $uri", 0, $custom_link_id);
flash_alert("Custom link <strong>$name</strong> created");
redirect();
}
if (isset($_POST['edit_custom_link'])) {
$custom_link_id = intval($_POST['custom_link_id']);
$name = sanitizeInput($_POST['name']);
$uri = sanitizeInput($_POST['uri']);
$new_tab = intval($_POST['new_tab'] ?? 0);
$icon = preg_replace("/[^0-9a-zA-Z-]/", "", sanitizeInput($_POST['icon']));
$order = intval($_POST['order'] ?? 0);
$location = intval($_POST['location']);
mysqli_query($mysqli,"UPDATE custom_links SET custom_link_name = '$name', custom_link_uri = '$uri', custom_link_new_tab = $new_tab, custom_link_icon = '$icon', custom_link_order = $order, custom_link_location = $location WHERE custom_link_id = $custom_link_id");
logAction("Custom Link", "Edit", "$session_name edited custom link $name -> $uri", 0, $custom_link_id);
flash_alert("Custom Link <strong>$name</strong> edited");
redirect();
}
if (isset($_GET['delete_custom_link'])) {
$custom_link_id = intval($_GET['delete_custom_link']);
// Get Custom Link name and uri for logging
$sql = mysqli_query($mysqli,"SELECT custom_link_name, custom_link_uri FROM custom_links WHERE custom_link_id = $custom_link_id");
$row = mysqli_fetch_assoc($sql);
$custom_link_name = sanitizeInput($row['custom_link_name']);
$custom_link_uri = sanitizeInput($row['custom_link_uri']);
mysqli_query($mysqli,"DELETE FROM custom_links WHERE custom_link_id = $custom_link_id");
logAction("Custom Link", "Delete", "$session_name deleted custom link $custom_link_name -> $custom_link_uri");
flash_alert("Custom Link <strong>$name</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,87 @@
<?php
// Doc Templates
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_document_template'])) {
$name = sanitizeInput($_POST['name']);
$description = sanitizeInput($_POST['description']);
mysqli_query($mysqli,"INSERT INTO document_templates SET document_template_name = '$name', document_template_description = '$description', document_template_content = '', document_template_created_by = $session_user_id");
$document_template_id = mysqli_insert_id($mysqli);
$processed_content = mysqli_escape_string(
$mysqli,
saveBase64Images(
$_POST['content'],
$_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/",
"uploads/document_templates/",
$document_template_id
)
);
// Document template update content
mysqli_query($mysqli,"UPDATE document_templates SET document_template_content = '$processed_content' WHERE document_template_id = $document_template_id");
logAction("Document Template", "Create", "$session_name created document template $name", 0, $document_template_id);
flash_alert("Document template <strong>$name</strong> created");
redirect();
}
if (isset($_POST['edit_document_template'])) {
$document_template_id = intval($_POST['document_template_id']);
$name = sanitizeInput($_POST['name']);
$description = sanitizeInput($_POST['description']);
$processed_content = saveBase64Images(
$_POST['content'],
$_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/",
"uploads/document_templates/",
$document_template_id
);
$processed_content_escaped = mysqli_escape_string($mysqli, $processed_content);
// CLEAN UP unused images
cleanupUnusedImages(
$processed_content,
$_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/" . $document_template_id,
"/uploads/document_templates/" . $document_template_id
);
// Document edit query
mysqli_query($mysqli,"UPDATE document_templates SET document_template_name = '$name', document_template_description = '$description', document_template_content = '$processed_content_escaped', document_template_updated_by = $session_user_id WHERE document_template_id = $document_template_id");
logAction("Document Template", "Edit", "$session_name edited document template $name", 0, $document_template_id);
flash_alert("Document Template <strong>$name</strong> edited");
redirect();
}
if (isset($_GET['delete_document_template'])) {
$document_template_id = intval($_GET['delete_document_template']);
$document_template_name = sanitizeInput(getFieldById('document_templates', $document_template_id, 'document_template_name'));
mysqli_query($mysqli,"DELETE FROM document_templates WHERE document_template_id = $document_template_id");
// Delete uploads/document_templates/$document_template_id if exists
removeDirectory($_SERVER['DOCUMENT_ROOT'] . "/uploads/document_templates/" . $document_template_id);
logAction("Document Template", "Delete", "$session_name deleted document template $document_template_name");
flash_alert("Document Template <strong>$document_template_name</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,20 @@
<?php
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['edit_identity_provider'])) {
validateCSRFToken($_POST['csrf_token']);
$azure_client_id = sanitizeInput($_POST['azure_client_id']);
$azure_client_secret = sanitizeInput($_POST['azure_client_secret']);
mysqli_query($mysqli,"UPDATE settings SET config_azure_client_id = '$azure_client_id', config_azure_client_secret = '$azure_client_secret' WHERE company_id = 1");
logAction("Settings", "Edit", "$session_name edited identity provider settings");
flash_alert("Identity Provider Settings updated");
redirect();
}

87
admin/post/mail_queue.php Normal file
View File

@@ -0,0 +1,87 @@
<?php
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_GET['send_failed_mail'])) {
$email_id = intval($_GET['send_failed_mail']);
mysqli_query($mysqli,"UPDATE email_queue SET email_status = 0, email_attempts = 3 WHERE email_id = $email_id");
logAction("Email", "Send", "$session_name attempted to force send email id: $email_id in the mail queue", 0, $email_id);
flash_alert("Email Force Sent, give it a minute to resend");
redirect();
}
if (isset($_GET['cancel_mail'])) {
$email_id = intval($_GET['cancel_mail']);
mysqli_query($mysqli,"UPDATE email_queue SET email_status = 2, email_attempts = 99, email_failed_at = NOW() WHERE email_id = $email_id");
logAction("Email", "Send", "$session_name canceled send email id: $email_id in the mail queue", 0, $email_id);
flash_alert("Email cancelled and marked as failed.", 'error');
redirect();
}
if (isset($_POST['bulk_cancel_emails'])) {
validateCSRFToken($_POST['csrf_token']);
if (isset($_POST['email_ids'])) {
$count = count($_POST['email_ids']);
// Cycle through array and mark each email as failed
foreach ($_POST['email_ids'] as $email_id) {
$email_id = intval($email_id);
mysqli_query($mysqli,"UPDATE email_queue SET email_status = 2, email_attempts = 99, email_failed_at = NOW() WHERE email_id = $email_id");
logAction("Email", "Cancel", "$session_name cancelled email id: $email_id in the mail queue", 0, $email_id);
}
logAction("Email", "Bulk Cancel", "$session_name cancelled $count email(s) in the mail queue");
flash_alert("Cancelled <strong>$count</strong> email(s)", 'error');
}
redirect();
}
if (isset($_POST['bulk_delete_emails'])) {
validateCSRFToken($_POST['csrf_token']);
if (isset($_POST['email_ids'])) {
$count = count($_POST['email_ids']);
// Cycle through array and delete each email
foreach ($_POST['email_ids'] as $email_id) {
$email_id = intval($email_id);
mysqli_query($mysqli,"DELETE FROM email_queue WHERE email_id = $email_id");
logAction("Email", "Delete", "$session_name deleted email id: $email_id from the mail queue");
}
logAction("Email", "Bulk Delete", "$session_name deleted $count email(s) from the mail queue");
flash_alert("Deleted <strong>$count</strong> email(s)", 'error');
}
redirect();
}

View File

@@ -0,0 +1,74 @@
<?php
/*
* ITFlow - GET/POST request handler for AI Providers ('ai_providers')
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_payment_method'])) {
validateCSRFToken($_POST['csrf_token']);
$name = cleanInput($_POST['name']);
$description = cleanInput($_POST['description']);
$query = mysqli_prepare(
$mysqli, "INSERT INTO payment_methods
SET payment_method_name = ?, payment_method_description = ?"
);
mysqli_stmt_bind_param($query, "ss", $name, $description);
mysqli_stmt_execute($query);
logAction("Payment Method", "Create", "$session_name created Payment Method $name");
flash_alert("Payment Method <strong>$name</strong> created");
redirect();
}
if (isset($_POST['edit_payment_method'])) {
validateCSRFToken($_POST['csrf_token']);
$payment_method_id = intval($_POST['payment_method_id']);
$name = cleanInput($_POST['name']);
$description = cleanInput($_POST['description']);
$query = mysqli_prepare(
$mysqli,
"UPDATE payment_methods
SET payment_method_name = ?, payment_method_description = ?
WHERE payment_method_id = ?"
);
mysqli_stmt_bind_param($query, "ssi", $name, $description, $payment_method_id);
mysqli_stmt_execute($query);
logAction("Payment Method", "Edit", "$session_name edited Payment Method $name");
flash_alert("Payment Method <strong>$name</strong> edited");
redirect();
}
if (isset($_GET['delete_payment_method'])) {
$payment_method_id = intval($_GET['delete_payment_method']);
$payment_method_name = sanitizeInput(getFieldById('payment_methods', $payment_method_is, 'payment_method_name'));
mysqli_query($mysqli,"DELETE FROM payment_methods WHERE payment_method_id = $payment_method_id");
logAction("Payment Method", "Delete", "$session_name deleted Payment Method $payment_method_name");
flash_alert("Payment Method <strong>$payment_method_name</strong> deleted", 'error');
redirect();
}

View File

@@ -0,0 +1,89 @@
<?php
/*
* ITFlow - GET/POST request handler for AI Providers ('ai_providers')
*/
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
if (isset($_POST['add_payment_provider'])) {
validateCSRFToken($_POST['csrf_token']);
$provider = sanitizeInput($_POST['provider']);
$public_key = sanitizeInput($_POST['public_key']);
$private_key = sanitizeInput($_POST['private_key']);
$threshold = floatval($_POST['threshold']);
$account = intval($_POST['account']);
$expense_vendor = intval($_POST['expense_vendor']) ?? 0;
$expense_category = intval($_POST['expense_category']) ?? 0;
$percentage_fee = floatval($_POST['percentage_fee']) / 100 ?? 0;
$flat_fee = floatval($_POST['flat_fee']) ?? 0;
// Check to ensure provider isn't added twice
$sql = mysqli_query($mysqli, "SELECT 1 FROM payment_providers WHERE payment_provider_name = '$provider' LIMIT 1");
if (mysqli_num_rows($sql) > 0) {
flash_alert("Payment Provider <strong>$provider</strong> already exists", 'error');
redirect();
}
mysqli_query($mysqli,"INSERT INTO payment_providers SET payment_provider_name = '$provider', payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee");
$provider_id = mysqli_insert_id($mysqli);
logAction("Payment Provider", "Create", "$session_name created AI Provider $provider");
flash_alert("Payment provider <strong>$provider</strong> created");
redirect();
}
if (isset($_POST['edit_payment_provider'])) {
validateCSRFToken($_POST['csrf_token']);
$provider_id = intval($_POST['provider_id']);
$description = sanitizeInput($_POST['description']);
$public_key = sanitizeInput($_POST['public_key']);
$private_key = sanitizeInput($_POST['private_key']);
$threshold = floatval($_POST['threshold']);
$account = intval($_POST['account']);
$expense_vendor = intval($_POST['expense_vendor']) ?? 0;
$expense_category = intval($_POST['expense_category']) ?? 0;
$percentage_fee = floatval($_POST['percentage_fee']) / 100;
$flat_fee = floatval($_POST['flat_fee']);
mysqli_query($mysqli,"UPDATE payment_providers SET payment_provider_public_key = '$public_key', payment_provider_private_key = '$private_key', payment_provider_threshold = $threshold, payment_provider_account = $account, payment_provider_expense_vendor = $expense_vendor, payment_provider_expense_category = $expense_category, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee WHERE payment_provider_id = $provider_id");
logAction("Payment Provider", "Edit", "$session_name edited Payment Provider $provider");
flash_alert("Payment Provider <strong>$provider</strong> edited");
redirect();
}
if (isset($_GET['delete_payment_provider'])) {
validateCSRFToken($_GET['csrf_token']);
$provider_id = intval($_GET['delete_payment_provider']);
// When deleted it cascades deletes
// all Recurring paymentes related to payment provider
// Delete all Saved Cards related
// Delete Client Payment Provider Releation
$provider_name = sanitizeInput(getFieldById('payment_providers', $provider_id, 'provider_name'));
// Delete provider
mysqli_query($mysqli,"DELETE FROM payment_providers WHERE payment_provider_id = $provider_id");
logAction("Payment Provider", "Delete", "$session_name deleted Payment Provider $provider_name");
flash_alert("Payment Provider <strong>$provider_name</strong> deleted", 'error');
redirect();
}

Some files were not shown because too many files have changed in this diff Show More