mirror of
https://github.com/itflow-org/itflow
synced 2026-03-11 08:14:52 +00:00
Compare commits
157 Commits
v25.09
...
undefined-
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3917e66fd8 | ||
|
|
9f48e2d9f0 | ||
|
|
215eadcf2b | ||
|
|
d3d706ea68 | ||
|
|
8268761ef4 | ||
|
|
2850c35bdc | ||
|
|
24d8635dac | ||
|
|
8314a115bb | ||
|
|
b8e2423dbd | ||
|
|
52c67f4139 | ||
|
|
e895156d03 | ||
|
|
89abc18465 | ||
|
|
355dfbbb25 | ||
|
|
6d15640ae4 | ||
|
|
ad4ab5a54c | ||
|
|
3c5c86c4c5 | ||
|
|
09b91c8826 | ||
|
|
13ea48bff8 | ||
|
|
26bb430d6e | ||
|
|
82da54740f | ||
|
|
e02b10d12a | ||
|
|
1573045157 | ||
|
|
bf31c333a6 | ||
|
|
4229bca978 | ||
|
|
13bd929755 | ||
|
|
7f6c0346af | ||
|
|
0387e66066 | ||
|
|
04bae8dc37 | ||
|
|
559506fc90 | ||
|
|
f2b6d481a1 | ||
|
|
c66aa92365 | ||
|
|
e24ef68d8d | ||
|
|
0cacf83ae5 | ||
|
|
2dc66b329b | ||
|
|
10dc8ea2bf | ||
|
|
303f9174c9 | ||
|
|
c5dd5f2b6f | ||
|
|
ab77705ca2 | ||
|
|
10c89ebf73 | ||
|
|
ecce994921 | ||
|
|
5dd4f5ea62 | ||
|
|
93bb5db019 | ||
|
|
65ff008ccf | ||
|
|
f0c48d23fe | ||
|
|
975b52a43d | ||
|
|
079b0d5024 | ||
|
|
99ccb12b8c | ||
|
|
0bb7d24e07 | ||
|
|
b7a9f9ea38 | ||
|
|
21aee98f9f | ||
|
|
9a5a4be64a | ||
|
|
db7f8501d0 | ||
|
|
61d15cbf9e | ||
|
|
39c9c695f1 | ||
|
|
d97654581b | ||
|
|
2ee70fd3a8 | ||
|
|
b336ec4188 | ||
|
|
c77e1be1c3 | ||
|
|
986f688468 | ||
|
|
1d9429b762 | ||
|
|
d122d90a47 | ||
|
|
2c534d4d20 | ||
|
|
b7e0e5c5eb | ||
|
|
2915b12181 | ||
|
|
ed589ef65b | ||
|
|
fbf3346052 | ||
|
|
3ff206f84d | ||
|
|
a3b0fce961 | ||
|
|
8130280b35 | ||
|
|
fea3020d9a | ||
|
|
1eb9d163fa | ||
|
|
e3e7c2e38b | ||
|
|
27e1d6a9cd | ||
|
|
2ec4cdc4fb | ||
|
|
35a7506c26 | ||
|
|
16242be74e | ||
|
|
3fcbe440d3 | ||
|
|
4ef0755039 | ||
|
|
a4ed906dd1 | ||
|
|
416a8d9a94 | ||
|
|
d8803aaac2 | ||
|
|
01f6615ca0 | ||
|
|
fd93ee3263 | ||
|
|
32bfd298a1 | ||
|
|
5de2e7a3bd | ||
|
|
6e8c133a99 | ||
|
|
956f18430b | ||
|
|
76c9933baf | ||
|
|
6c6a988c2b | ||
|
|
0e401df3c0 | ||
|
|
9072c37e95 | ||
|
|
2eff11efbf | ||
|
|
6a7a02d220 | ||
|
|
d6349bbc5c | ||
|
|
9a2f887db1 | ||
|
|
71d30ff95f | ||
|
|
3135247936 | ||
|
|
0d629221fe | ||
|
|
181ea4b487 | ||
|
|
fa769665df | ||
|
|
00f5198bed | ||
|
|
785a291614 | ||
|
|
92209c7125 | ||
|
|
690007be5c | ||
|
|
e6bcf0e12f | ||
|
|
ca6a903b8f | ||
|
|
50f790dd6c | ||
|
|
ed6aa843b7 | ||
|
|
52a27699f1 | ||
|
|
dba08714bf | ||
|
|
edabc5c33f | ||
|
|
6b6c70f1df | ||
|
|
93061eb695 | ||
|
|
1f9133c188 | ||
|
|
e7dcc6df3c | ||
|
|
fbd58b4723 | ||
|
|
e992138456 | ||
|
|
058f79d0a1 | ||
|
|
5c448c05a9 | ||
|
|
e966cd3068 | ||
|
|
6d3351b2f7 | ||
|
|
61a1d61901 | ||
|
|
4ff3231451 | ||
|
|
ce832d2805 | ||
|
|
565f9ab314 | ||
|
|
9435434cf9 | ||
|
|
a58ca6f66d | ||
|
|
c769bbc405 | ||
|
|
0379143829 | ||
|
|
ee235cf231 | ||
|
|
04b29d43df | ||
|
|
dc0715da57 | ||
|
|
902323a75b | ||
|
|
3a5b18f3dd | ||
|
|
ce7d84aa2f | ||
|
|
981fb9585d | ||
|
|
23b2dcba70 | ||
|
|
e4a437f54c | ||
|
|
d4167f9595 | ||
|
|
88475a2b76 | ||
|
|
c26ce4b7dc | ||
|
|
5960e7cbd9 | ||
|
|
68872ab9fb | ||
|
|
64f12b42b8 | ||
|
|
8c0d542d7d | ||
|
|
c016b67c3a | ||
|
|
2b7017fae2 | ||
|
|
da0b01e23f | ||
|
|
d450ea4beb | ||
|
|
9210734911 | ||
|
|
ebae80bb7e | ||
|
|
dcade3a5c7 | ||
|
|
f51c3e9e3f | ||
|
|
b34298e45b | ||
|
|
9fa78897bc | ||
|
|
9642babb7e | ||
|
|
d2d1aed393 |
19
.gitignore
vendored
19
.gitignore
vendored
@@ -25,6 +25,23 @@ plugins/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer/CSS/*
|
|||||||
xcustom/*
|
xcustom/*
|
||||||
!xcustom/readme.php
|
!xcustom/readme.php
|
||||||
post/xcustom
|
post/xcustom
|
||||||
custom/*
|
|
||||||
!post/xcustom/readme.php
|
!post/xcustom/readme.php
|
||||||
|
admin/custom/*
|
||||||
|
!admin/custom/readme.php
|
||||||
|
agent/custom/*
|
||||||
|
!agent/custom/readme.php
|
||||||
|
client/custom/*
|
||||||
|
!client/custom/readme.php
|
||||||
|
guest/custom/*
|
||||||
|
!guest/custom/readme.php
|
||||||
|
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
|
.zed
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
100
CHANGELOG.md
100
CHANGELOG.md
@@ -2,6 +2,106 @@
|
|||||||
|
|
||||||
This file documents all notable changes made to ITFlow.
|
This file documents all notable changes made to ITFlow.
|
||||||
|
|
||||||
|
## [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]
|
## [25.09]
|
||||||
|
|
||||||
***BACK UP*** before updating.
|
***BACK UP*** before updating.
|
||||||
|
|||||||
@@ -97,34 +97,15 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse mt-3 <?php if (!empty($_GET['dtf']) || $_GET['canned_date'] !== "custom" ) { echo "show"; } ?>" id="advancedFilter">
|
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned Date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date From</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date To</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -159,34 +159,15 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse mt-3 <?php if (!empty($_GET['dtf']) || $_GET['canned_date'] !== "custom" ) { echo "show"; } ?>" id="advancedFilter">
|
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned Date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date From</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date To</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -266,7 +247,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
if (empty($client_name)) {
|
if (empty($client_name)) {
|
||||||
$client_name_display = "-";
|
$client_name_display = "-";
|
||||||
} else {
|
} else {
|
||||||
$client_name_display = "<a href='../user/client_overview.php?client_id=$client_id'>$client_name</a>";
|
$client_name_display = "<a href='../agent/client_overview.php?client_id=$client_id'>$client_name</a>";
|
||||||
}
|
}
|
||||||
$log_entity_id = intval($row['log_entity_id']);
|
$log_entity_id = intval($row['log_entity_id']);
|
||||||
|
|
||||||
|
|||||||
8
admin/custom/readme.php
Normal file
8
admin/custom/readme.php
Normal 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
|
||||||
|
*/
|
||||||
@@ -96,6 +96,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
$custom_link_location_display = "Top Nav";
|
$custom_link_location_display = "Top Nav";
|
||||||
} elseif ($custom_link_location == 3) {
|
} elseif ($custom_link_location == 3) {
|
||||||
$custom_link_location_display = "Client Portal Nav";
|
$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";
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -3969,10 +3969,74 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
|
|||||||
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.2'");
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.2'");
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (CURRENT_DATABASE_VERSION == '2.3.2') {
|
if (CURRENT_DATABASE_VERSION == '2.3.2') {
|
||||||
// // Insert queries here required to update to DB version 2.3.3
|
|
||||||
|
mysqli_query($mysqli, "ALTER TABLE settings
|
||||||
|
ADD `config_imap_provider` ENUM('standard_imap','google_oauth','microsoft_oauth') NULL DEFAULT NULL AFTER `config_mail_from_name`,
|
||||||
|
ADD `config_mail_oauth_client_id` VARCHAR(255) NULL AFTER `config_imap_provider`,
|
||||||
|
ADD `config_mail_oauth_client_secret` VARCHAR(255) NULL AFTER `config_mail_oauth_client_id`,
|
||||||
|
ADD `config_mail_oauth_tenant_id` VARCHAR(255) NULL AFTER `config_mail_oauth_client_secret`,
|
||||||
|
ADD `config_mail_oauth_refresh_token` TEXT NULL AFTER `config_mail_oauth_tenant_id`,
|
||||||
|
ADD `config_mail_oauth_access_token` TEXT NULL AFTER `config_mail_oauth_refresh_token`,
|
||||||
|
ADD `config_mail_oauth_access_token_expires_at` DATETIME NULL AFTER `config_mail_oauth_access_token`
|
||||||
|
");
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.3'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CURRENT_DATABASE_VERSION == '2.3.3') {
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "ALTER TABLE settings
|
||||||
|
ADD `config_smtp_provider` ENUM('standard_smtp','google_oauth','microsoft_oauth') NULL DEFAULT NULL AFTER `config_start_page`
|
||||||
|
");
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.4'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CURRENT_DATABASE_VERSION == '2.3.4') {
|
||||||
|
|
||||||
|
// Add Software Keys
|
||||||
|
mysqli_query($mysqli, "CREATE TABLE `software_keys` (
|
||||||
|
`software_key_id` INT(11) NOT NULL AUTO_INCREMENT,
|
||||||
|
`software_key` VARCHAR(400) NOT NULL,
|
||||||
|
`software_key_software_id` INT(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`software_key_id`),
|
||||||
|
FOREIGN KEY (`software_key_software_id`) REFERENCES `software`(`software_id`) ON DELETE CASCADE
|
||||||
|
)");
|
||||||
|
|
||||||
|
// Software Key Assignments to Contacts
|
||||||
|
mysqli_query($mysqli, "CREATE TABLE `software_key_contact_assignments` (
|
||||||
|
`software_key_id` INT(11) NOT NULL,
|
||||||
|
`contact_id` INT(11) NOT NULL,
|
||||||
|
`software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`software_key_id`, `contact_id`),
|
||||||
|
FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (`contact_id`) REFERENCES `contacts`(`contact_id`) ON DELETE CASCADE
|
||||||
|
)");
|
||||||
|
|
||||||
|
// Software Key Assignments to Assets
|
||||||
|
mysqli_query($mysqli, "CREATE TABLE `software_key_asset_assignments` (
|
||||||
|
`software_key_id` INT(11) NOT NULL,
|
||||||
|
`asset_id` INT(11) NOT NULL,
|
||||||
|
`software_key_assigned_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
PRIMARY KEY (`software_key_id`, `asset_id`),
|
||||||
|
FOREIGN KEY (`software_key_id`) REFERENCES `software_keys`(`software_key_id`) ON DELETE CASCADE,
|
||||||
|
FOREIGN KEY (`asset_id`) REFERENCES `assets`(`asset_id`) ON DELETE CASCADE
|
||||||
|
)");
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.5'");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (CURRENT_DATABASE_VERSION == '2.3.5') {
|
||||||
|
mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_smtp_provider` `config_smtp_provider` VARCHAR(200) DEFAULT NULL");
|
||||||
|
mysqli_query($mysqli, "ALTER TABLE `settings` CHANGE `config_imap_provider` `config_imap_provider` VARCHAR(200) DEFAULT NULL");
|
||||||
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.6'");
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (CURRENT_DATABASE_VERSION == '2.3.5') {
|
||||||
|
// // Insert queries here required to update to DB version 2.3.5
|
||||||
// // Then, update the database to the next sequential version
|
// // Then, update the database to the next sequential version
|
||||||
// mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.3'");
|
// mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.6'");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once "../config.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/config.php';
|
||||||
require_once "../functions.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/functions.php';
|
||||||
require_once "../includes/router.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/check_login.php';
|
||||||
require_once "../includes/check_login.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/page_title.php';
|
||||||
require_once "../includes/page_title.php";
|
|
||||||
if (!isset($session_is_admin) || !$session_is_admin) {
|
if (!isset($session_is_admin) || !$session_is_admin) {
|
||||||
exit(WORDING_ROLECHECK_FAILED . "<br>Tell your admin: Your role does not have admin access.");
|
exit(WORDING_ROLECHECK_FAILED . "<br>Tell your admin: Your role does not have admin access.");
|
||||||
}
|
}
|
||||||
require_once "../includes/header.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
|
||||||
require_once "../includes/top_nav.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php';
|
||||||
require_once "includes/side_nav.php";
|
require_once 'includes/side_nav.php';
|
||||||
require_once "../includes/inc_wrapper.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_wrapper.php';
|
||||||
require_once "../includes/inc_alert_feedback.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_alert_feedback.php';
|
||||||
require_once "../includes/filter_header.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/filter_header.php';
|
||||||
require_once "../includes/app_version.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/app_version.php';
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<!-- Main Sidebar Container -->
|
<!-- Main Sidebar Container -->
|
||||||
<aside class="main-sidebar sidebar-dark-<?php echo nullable_htmlentities($config_theme); ?> d-print-none">
|
<aside class="main-sidebar sidebar-dark-<?php echo nullable_htmlentities($config_theme); ?> d-print-none">
|
||||||
<a class="brand-link pb-1 mt-1" href="../user/dashboard.php">
|
<a class="brand-link pb-1 mt-1" href="/agent/<?php echo $config_start_page ?>">
|
||||||
<p class="h6">
|
<p class="h6">
|
||||||
<i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
|
<i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
|
||||||
<span class="brand-text">
|
<span class="brand-text">
|
||||||
@@ -14,21 +14,27 @@
|
|||||||
<!-- Sidebar Menu -->
|
<!-- Sidebar Menu -->
|
||||||
<nav>
|
<nav>
|
||||||
<ul class="nav nav-pills nav-sidebar flex-column mt-2" data-widget="treeview" data-accordion="false">
|
<ul class="nav nav-pills nav-sidebar flex-column mt-2" data-widget="treeview" data-accordion="false">
|
||||||
<!-- ACCESS Section -->
|
<li class="nav-header">ACCESS</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="users.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "users.php") {echo "active";} ?>">
|
<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>
|
<i class="nav-icon fas fa-users"></i>
|
||||||
<p>Users</p>
|
<p>Users</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="roles.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "roles.php") {echo "active";} ?>">
|
<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>
|
<i class="nav-icon fas fa-user-shield"></i>
|
||||||
<p>Roles</p>
|
<p>Roles</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="api_keys.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "api_keys.php") {echo "active";} ?>">
|
<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>
|
<i class="nav-icon fas fa-key"></i>
|
||||||
<p>API Keys</p>
|
<p>API Keys</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -36,65 +42,66 @@
|
|||||||
<li class="nav-header">TAGS & CATEGORIES</li>
|
<li class="nav-header">TAGS & CATEGORIES</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="tag.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'tag.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-tags"></i>
|
||||||
<p>Tags</p>
|
<p>Tags</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="category.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'category.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-list-ul"></i>
|
||||||
<p>Categories</p>
|
<p>Categories</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php if ($config_module_enable_accounting) { ?>
|
<?php if ($config_module_enable_accounting) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="tax.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'tax.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-balance-scale"></i>
|
||||||
<p>Taxes</p>
|
<p>Taxes</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="payment_method.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'payment_method.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-hand-holding-usd"></i>
|
||||||
<p>Payment Methods</p>
|
<p>Payment Methods</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="payment_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'payment_provider.php' ? 'active' : ''); ?>">
|
<a href="/admin/payment_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'payment_provider.php' ? 'active' : ''); ?>">
|
||||||
<i class="nav-icon far fa-credit-card"></i>
|
<i class="nav-icon far fa-credit-card"></i>
|
||||||
<p>Payment Providers</p>
|
<p>Payment Providers</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="saved_payment_method.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'saved_payment_method.php' ? 'active' : ''); ?>">
|
<a href="/admin/saved_payment_method.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'saved_payment_method.php' ? 'active' : ''); ?>">
|
||||||
<i class="nav-icon far fa-credit-card"></i>
|
<i class="nav-icon far fa-credit-card"></i>
|
||||||
<p>Saved Payments</p>
|
<p>Saved Payments</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
<?php } ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="ai_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ai_provider.php' ? 'active' : ''); ?>">
|
<a href="/admin/ai_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ai_provider.php' ? 'active' : ''); ?>">
|
||||||
<i class="nav-icon fas fa-robot"></i>
|
<i class="nav-icon fas fa-robot"></i>
|
||||||
<p>AI Providers</p>
|
<p>AI Providers</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="ai_model.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ai_model.php' ? 'active' : ''); ?>">
|
<a href="/admin/ai_model.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ai_model.php' ? 'active' : ''); ?>">
|
||||||
<i class="nav-icon fas fa-robot"></i>
|
<i class="nav-icon fas fa-robot"></i>
|
||||||
<p>AI Models</p>
|
<p>AI Models</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php } ?>
|
|
||||||
<?php if ($config_module_enable_ticketing) { ?>
|
<?php if ($config_module_enable_ticketing) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="ticket_status.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'ticket_status.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-info-circle"></i>
|
||||||
<p>Ticket Statuses</p>
|
<p>Ticket Statuses</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="custom_link.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'custom_link.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-external-link-alt"></i>
|
||||||
<p>Custom Links</p>
|
<p>Custom Links</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -104,31 +111,31 @@
|
|||||||
<li class="nav-header">TEMPLATES</li>
|
<li class="nav-header">TEMPLATES</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="project_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['project_template.php', 'project_template_details.php']) ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-project-diagram"></i>
|
||||||
<p>Project Templates</p>
|
<p>Project Templates</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="ticket_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['ticket_template.php', 'ticket_template_details.php']) ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-life-ring"></i>
|
||||||
<p>Ticket Templates</p>
|
<p>Ticket Templates</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="vendor_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'vendor_template.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-building"></i>
|
||||||
<p>Vendor Templates</p>
|
<p>Vendor Templates</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="software_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'software_template.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-rocket"></i>
|
||||||
<p>License Templates</p>
|
<p>License Templates</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="document_template.php" class="nav-link <?php echo (in_array(basename($_SERVER['PHP_SELF']), ['document_template.php', 'document_template_details.php']) ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-file"></i>
|
||||||
<p>Document Templates</p>
|
<p>Document Templates</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -138,37 +145,37 @@
|
|||||||
<li class="nav-header">MAINTENANCE</li>
|
<li class="nav-header">MAINTENANCE</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="mail_queue.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'mail_queue.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-mail-bulk"></i>
|
||||||
<p>Mail Queue</p>
|
<p>Mail Queue</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="audit_log.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'audit_log.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-history"></i>
|
||||||
<p>Audit Logs</p>
|
<p>Audit Logs</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="app_log.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'app_log.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-history"></i>
|
||||||
<p>App Logs</p>
|
<p>App Logs</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="backup.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'backup.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-cloud-upload-alt"></i>
|
||||||
<p>Backup</p>
|
<p>Backup</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="debug.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'debug.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-bug"></i>
|
||||||
<p>Debug</p>
|
<p>Debug</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="update.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'update.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-download"></i>
|
||||||
<p>Update</p>
|
<p>Update</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -184,56 +191,56 @@
|
|||||||
</a>
|
</a>
|
||||||
<ul class="nav nav-treeview">
|
<ul class="nav nav-treeview">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_company.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_company.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fa fa-briefcase"></i>
|
||||||
<p>Company Details</p>
|
<p>Company Details</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_localization.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_localization.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fa fa-globe"></i>
|
||||||
<p>Localization</p>
|
<p>Localization</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_theme.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_theme.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fa fa-paint-brush"></i>
|
||||||
<p>Theme</p>
|
<p>Theme</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_security.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_security.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-shield-alt"></i>
|
||||||
<p>Security</p>
|
<p>Security</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_mail.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_mail.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon far fa-envelope"></i>
|
||||||
<p>Mail</p>
|
<p>Mail</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_notification.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_notification.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon far fa-bell"></i>
|
||||||
<p>Notifications</p>
|
<p>Notifications</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_default.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_default.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-cogs"></i>
|
||||||
<p>Defaults</p>
|
<p>Defaults</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php if ($config_module_enable_accounting) { ?>
|
<?php if ($config_module_enable_accounting) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_invoice.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_invoice.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-file-invoice"></i>
|
||||||
<p>Invoice</p>
|
<p>Invoice</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_quote.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_quote.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-comment-dollar"></i>
|
||||||
<p>Quote</p>
|
<p>Quote</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -241,13 +248,13 @@
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
<?php if ($config_module_enable_ticketing) { ?>
|
<?php if ($config_module_enable_ticketing) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_project.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_project.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-project-diagram"></i>
|
||||||
<p>Project</p>
|
<p>Project</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_ticket.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_ticket.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-life-ring"></i>
|
||||||
<p>Ticket</p>
|
<p>Ticket</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -256,26 +263,56 @@
|
|||||||
<!-- Currently the only integration is the client portal SSO -->
|
<!-- Currently the only integration is the client portal SSO -->
|
||||||
<?php if ($config_client_portal_enable) { ?>
|
<?php if ($config_client_portal_enable) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="identity_provider.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'identity_provider.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-fingerprint"></i>
|
||||||
<p>Identity Provider</p>
|
<p>Identity Provider</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_telemetry.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_telemetry.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-satellite-dish"></i>
|
||||||
<p>Telemetry</p>
|
<p>Telemetry</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="settings_module.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'settings_module.php' ? 'active' : ''); ?>">
|
<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>
|
<i class="nav-icon fas fa-cube"></i>
|
||||||
<p>Modules</p>
|
<p>Modules</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</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_array($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>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
<!-- /.sidebar-menu -->
|
<!-- /.sidebar-menu -->
|
||||||
|
|||||||
@@ -53,34 +53,15 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse mt-3 <?php if (!empty($_GET['dtf']) || $_GET['canned_date'] !== "custom" ) { echo "show"; } ?>" id="advancedFilter">
|
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned Date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date From</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date To</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -66,6 +66,8 @@
|
|||||||
<option value="1">Main Side Nav</option>
|
<option value="1">Main Side Nav</option>
|
||||||
<option value="2">Top Nav (Icon Required)</option>
|
<option value="2">Top Nav (Icon Required)</option>
|
||||||
<option value="3">Client Portal Nav</option>
|
<option value="3">Client Portal Nav</option>
|
||||||
|
<option value="4">Admin Nav</option>
|
||||||
|
<option value="5">Reports Nav</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -81,9 +81,11 @@ ob_start();
|
|||||||
<span class="input-group-text"><i class="fa fa-fw fa-home"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-home"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<select class="form-control select2" name="location" required>
|
<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="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="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="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>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -14,8 +14,6 @@
|
|||||||
<input type="text" class="form-control" name="name" placeholder="Template name" maxlength="200">
|
<input type="text" class="form-control" name="name" placeholder="Template name" maxlength="200">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<?php if ($config_ai_enable == 1) { ?>
|
|
||||||
<!-- Prompt for AI -->
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Enter a prompt for the type of IT documentation you want to generate:</label>
|
<label>Enter a prompt for the type of IT documentation you want to generate:</label>
|
||||||
<div class="input-group mb-3">
|
<div class="input-group mb-3">
|
||||||
@@ -27,7 +25,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
|
||||||
|
|
||||||
<!-- TinyMCE Content -->
|
<!-- TinyMCE Content -->
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
@@ -58,7 +58,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" inputmode="numeric" pattern="[0-9]*\.?[0-9]{0,2}" name="threshold" placeholder="1000.00">
|
<input type="text" class="form-control" inputmode="numeric" pattern="[0-9]*\.?[0-9]{0,2}" name="threshold" placeholder="1000.00">
|
||||||
</div>
|
</div>
|
||||||
<small class="form-text text-muted">Will not show as an option at Checkout if above this number</small>
|
<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>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|||||||
@@ -58,7 +58,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" inputmode="numeric" pattern="[0-9]*\.?[0-9]{0,2}" name="Threshold" placeholder="1000.00" value="<?php echo $threshold; ?>">
|
<input type="text" class="form-control" inputmode="numeric" pattern="[0-9]*\.?[0-9]{0,2}" name="threshold" placeholder="1000.00" value="<?php echo $threshold; ?>">
|
||||||
</div>
|
</div>
|
||||||
<small class="form-text text-muted">Will not show as an option at Checkout if above this number</small>
|
<small class="form-text text-muted">Will not show as an option at Checkout if above this number</small>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,204 +0,0 @@
|
|||||||
<?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_array($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>×</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"
|
|
||||||
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>
|
|
||||||
</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_array($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_array($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>
|
|
||||||
|
|
||||||
<?php
|
|
||||||
require_once '../../includes/modal_footer.php';
|
|
||||||
@@ -1,16 +1,83 @@
|
|||||||
<div class="modal" id="archiveUserModal<?php echo $user_id; ?>" tabindex="-1">
|
<?php
|
||||||
<div class="modal-dialog">
|
|
||||||
<div class="modal-content">
|
require_once '../../../includes/modal_header.php';
|
||||||
<div class="modal-body">
|
|
||||||
<div class="mb-4" style="text-align: center;">
|
$user_id = intval($_GET['id']);
|
||||||
<i class="far fa-10x fa-times-circle text-danger mb-3 mt-3"></i>
|
|
||||||
<h2>Are you sure?</h2>
|
$sql = mysqli_query($mysqli, "SELECT * FROM users WHERE users.user_id = $user_id LIMIT 1");
|
||||||
<h6 class="mb-4 text-secondary">Do you really want to <b>archive <?php echo $user_name; ?></b>? This process cannot be undone.</h6>
|
|
||||||
<h6 class="mb-4 text-secondary"><?php echo $user_name ?> will no longer be able to log in or use ITFlow, but all associated content will remain accessible.</h6>
|
$row = mysqli_fetch_array($sql);
|
||||||
<button type="button" class="btn btn-outline-secondary btn-lg px-5 mr-4" data-dismiss="modal">Cancel</button>
|
$user_name = nullable_htmlentities($row['user_name']);
|
||||||
<a class="btn btn-danger btn-lg px-5" href="post.php?archive_user=<?php echo $user_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">Yes, archive!</a>
|
$user_email = nullable_htmlentities($row['user_email']);
|
||||||
</div>
|
$user_avatar = nullable_htmlentities($row['user_avatar']);
|
||||||
</div>
|
$user_initials = nullable_htmlentities(initials($user_name));
|
||||||
</div>
|
|
||||||
</div>
|
$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>×</span>
|
||||||
|
</button>
|
||||||
</div>
|
</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_array($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";
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ ob_start();
|
|||||||
|
|
||||||
<center class="mb-3">
|
<center class="mb-3">
|
||||||
<?php if (!empty($user_avatar)) { ?>
|
<?php if (!empty($user_avatar)) { ?>
|
||||||
<img class="img-fluid" src="<?php echo "uploads/users/$user_id/$user_avatar"; ?>">
|
<img class="img-fluid" src="<?php echo "../uploads/users/$user_id/$user_avatar"; ?>">
|
||||||
<?php } else { ?>
|
<?php } else { ?>
|
||||||
<span class="fa-stack fa-4x">
|
<span class="fa-stack fa-4x">
|
||||||
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
|
<i class="fa fa-circle fa-stack-2x text-secondary"></i>
|
||||||
@@ -201,4 +201,4 @@ ob_start();
|
|||||||
</form>
|
</form>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
require_once "../../../includes/modal_footer_new.php";
|
require_once "../../../includes/modal_footer.php";
|
||||||
|
|||||||
87
admin/modals/user/user_restore.php
Normal file
87
admin/modals/user/user_restore.php
Normal 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_array($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>×</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_array($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";
|
||||||
113
admin/modules.php
Normal file
113
admin/modules.php
Normal 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_array($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";
|
||||||
@@ -55,7 +55,7 @@ $num_rows = mysqli_num_rows($sql);
|
|||||||
</a>
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
<a class="text-dark">Fee</a>
|
<a class="text-dark">Expensed Fee</a>
|
||||||
</th>
|
</th>
|
||||||
<th>
|
<th>
|
||||||
<a class="text-dark">Saved Payment Methods</a>
|
<a class="text-dark">Saved Payment Methods</a>
|
||||||
@@ -93,7 +93,7 @@ $num_rows = mysqli_num_rows($sql);
|
|||||||
<td><?php echo numfmt_format_currency($currency_format, $threshold, $session_company_currency); ?></td>
|
<td><?php echo numfmt_format_currency($currency_format, $threshold, $session_company_currency); ?></td>
|
||||||
<td><?php echo $vendor_name; ?></td>
|
<td><?php echo $vendor_name; ?></td>
|
||||||
<td><?php echo $category; ?></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><?php echo $percent_fee; ?>% + <?php echo numfmt_format_currency($currency_format, $flat_fee, $session_company_currency); ?></td>
|
||||||
<td><?php echo $saved_payment_count; ?></td>
|
<td><?php echo $saved_payment_count; ?></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="dropdown dropleft text-center">
|
<div class="dropdown dropleft text-center">
|
||||||
@@ -106,9 +106,12 @@ $num_rows = mysqli_num_rows($sql);
|
|||||||
<i class="fas fa-fw fa-edit mr-2"></i>Edit
|
<i class="fas fa-fw fa-edit mr-2"></i>Edit
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item text-danger confirm-link" href="post.php?disable_payment_provicer=<?php echo $provider_id; ?>&csrf_token=<?php echo $_SESSION['csrf_token'] ?>">
|
<!-- <a class="dropdown-item text-danger confirm-link" href="post.php?disable_payment_provider=--><?php //echo $provider_id; ?><!--&csrf_token=--><?php //echo $_SESSION['csrf_token'] ?><!--">-->
|
||||||
<i class="fas fa-fw fa-thumbs-down mr-2"></i>Disable
|
<!-- <i class="fas fa-fw fa-thumbs-down mr-2"></i>Disable-->
|
||||||
</a>
|
<!-- </a>-->
|
||||||
|
<!-- <a class="dropdown-item text-danger confirm-link" href="post.php?delete_payment_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>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -2,36 +2,170 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* ITFlow - GET/POST request handler for DB / master key backup
|
* 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");
|
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
||||||
|
|
||||||
require_once "../includes/app_version.php";
|
require_once "../includes/app_version.php";
|
||||||
|
|
||||||
if (isset($_GET['download_backup'])) {
|
// --- Optional performance levers for big backups ---
|
||||||
|
@set_time_limit(0);
|
||||||
|
if (function_exists('ini_set')) {
|
||||||
|
@ini_set('memory_limit', '1024M');
|
||||||
|
}
|
||||||
|
|
||||||
validateCSRFToken($_GET['csrf_token']);
|
/**
|
||||||
|
* Write a line to a file handle with newline.
|
||||||
|
*/
|
||||||
|
function fwrite_ln($fh, string $s): void {
|
||||||
|
fwrite($fh, $s);
|
||||||
|
fwrite($fh, PHP_EOL);
|
||||||
|
}
|
||||||
|
|
||||||
$timestamp = date('YmdHis');
|
/**
|
||||||
$baseName = "itflow_$timestamp";
|
* 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");
|
||||||
|
}
|
||||||
|
|
||||||
// === 0. Scoped cleanup ===
|
// Preamble
|
||||||
$cleanupFiles = [];
|
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, "");
|
||||||
|
|
||||||
$registerTempFileForCleanup = function ($file) use (&$cleanupFiles) {
|
// Gather tables and views
|
||||||
$cleanupFiles[] = $file;
|
$tables = [];
|
||||||
};
|
$views = [];
|
||||||
|
|
||||||
register_shutdown_function(function () use (&$cleanupFiles) {
|
$res = $mysqli->query("SHOW FULL TABLES");
|
||||||
foreach ($cleanupFiles as $file) {
|
if (!$res) {
|
||||||
if (is_file($file)) {
|
fclose($fh);
|
||||||
@unlink($file);
|
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();
|
||||||
|
|
||||||
// === 1. Local helper function: zipFolder
|
// --- TABLES: structure and data ---
|
||||||
$zipFolder = function ($folderPath, $zipFilePath) {
|
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();
|
$zip = new ZipArchive();
|
||||||
if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
|
if ($zip->open($zipFilePath, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
|
||||||
error_log("Failed to open zip file: $zipFilePath");
|
error_log("Failed to open zip file: $zipFilePath");
|
||||||
@@ -39,30 +173,57 @@ if (isset($_GET['download_backup'])) {
|
|||||||
exit("Internal Server Error: Cannot open zip archive.");
|
exit("Internal Server Error: Cannot open zip archive.");
|
||||||
}
|
}
|
||||||
|
|
||||||
$folderPath = realpath($folderPath);
|
$folderReal = realpath($folderPath);
|
||||||
if (!$folderPath) {
|
if (!$folderReal || !is_dir($folderReal)) {
|
||||||
error_log("Invalid folder path: $folderPath");
|
// Create an empty archive if uploads folder doesn't exist yet
|
||||||
http_response_code(500);
|
$zip->close();
|
||||||
exit("Internal Server Error: Invalid folder path.");
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$files = new RecursiveIteratorIterator(
|
$files = new RecursiveIteratorIterator(
|
||||||
new RecursiveDirectoryIterator($folderPath),
|
new RecursiveDirectoryIterator($folderReal, FilesystemIterator::SKIP_DOTS),
|
||||||
RecursiveIteratorIterator::LEAVES_ONLY
|
RecursiveIteratorIterator::LEAVES_ONLY
|
||||||
);
|
);
|
||||||
|
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
if (!$file->isDir()) {
|
/** @var SplFileInfo $file */
|
||||||
|
if ($file->isDir()) continue;
|
||||||
|
if ($file->isLink()) continue; // skip symlinks
|
||||||
$filePath = $file->getRealPath();
|
$filePath = $file->getRealPath();
|
||||||
$relativePath = substr($filePath, strlen($folderPath) + 1);
|
if ($filePath === false) continue;
|
||||||
$zip->addFile($filePath, $relativePath);
|
|
||||||
|
// 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();
|
$zip->close();
|
||||||
};
|
}
|
||||||
|
|
||||||
// === 2. Create all temp files
|
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_");
|
$sqlFile = tempnam(sys_get_temp_dir(), $baseName . "_sql_");
|
||||||
$uploadsZip = tempnam(sys_get_temp_dir(), $baseName . "_uploads_");
|
$uploadsZip = tempnam(sys_get_temp_dir(), $baseName . "_uploads_");
|
||||||
$versionFile = tempnam(sys_get_temp_dir(), $baseName . "_version_");
|
$versionFile = tempnam(sys_get_temp_dir(), $baseName . "_version_");
|
||||||
@@ -70,117 +231,75 @@ if (isset($_GET['download_backup'])) {
|
|||||||
|
|
||||||
foreach ([$sqlFile, $uploadsZip, $versionFile, $finalZip] as $f) {
|
foreach ([$sqlFile, $uploadsZip, $versionFile, $finalZip] as $f) {
|
||||||
$registerTempFileForCleanup($f);
|
$registerTempFileForCleanup($f);
|
||||||
chmod($f, 0600);
|
@chmod($f, 0600);
|
||||||
}
|
}
|
||||||
|
|
||||||
// === 3. Generate SQL Dump
|
// === Generate SQL Dump (streaming) ===
|
||||||
$sqlContent = "-- UTF-8 + Foreign Key Safe Dump\n";
|
dump_database_streaming($mysqli, $sqlFile);
|
||||||
$sqlContent .= "SET NAMES 'utf8mb4';\n";
|
|
||||||
$sqlContent .= "SET foreign_key_checks = 0;\n\n";
|
|
||||||
|
|
||||||
$tables = [];
|
// === Zip the uploads folder (strict) ===
|
||||||
$res = $mysqli->query("SHOW TABLES");
|
zipFolderStrict("../uploads", $uploadsZip);
|
||||||
if (!$res) {
|
|
||||||
error_log("MySQL Error: " . $mysqli->error);
|
|
||||||
exit("Error retrieving tables.");
|
|
||||||
}
|
|
||||||
|
|
||||||
while ($row = $res->fetch_row()) {
|
// === Gather metadata & checksums ===
|
||||||
$tables[] = $row[0];
|
$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';
|
||||||
|
|
||||||
foreach ($tables as $table) {
|
$dbSha = hash_file('sha256', $sqlFile) ?: 'N/A';
|
||||||
$createRes = $mysqli->query("SHOW CREATE TABLE `$table`");
|
$upSha = hash_file('sha256', $uploadsZip) ?: 'N/A';
|
||||||
if (!$createRes) {
|
|
||||||
error_log("MySQL Error: " . $mysqli->error);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$createRow = $createRes->fetch_assoc();
|
|
||||||
$createSQL = array_values($createRow)[1];
|
|
||||||
|
|
||||||
$sqlContent .= "\n-- ----------------------------\n";
|
|
||||||
$sqlContent .= "-- Table structure for `$table`\n";
|
|
||||||
$sqlContent .= "-- ----------------------------\n";
|
|
||||||
$sqlContent .= "DROP TABLE IF EXISTS `$table`;\n";
|
|
||||||
$sqlContent .= $createSQL . ";\n\n";
|
|
||||||
|
|
||||||
$dataRes = $mysqli->query("SELECT * FROM `$table`");
|
|
||||||
if ($dataRes && $dataRes->num_rows > 0) {
|
|
||||||
$sqlContent .= "-- Dumping data for table `$table`\n";
|
|
||||||
while ($row = $dataRes->fetch_assoc()) {
|
|
||||||
$columns = array_map(fn($col) => '`' . $mysqli->real_escape_string($col) . '`', array_keys($row));
|
|
||||||
$values = array_map(function ($val) use ($mysqli) {
|
|
||||||
return is_null($val) ? "NULL" : "'" . $mysqli->real_escape_string($val) . "'";
|
|
||||||
}, array_values($row));
|
|
||||||
$sqlContent .= "INSERT INTO `$table` (" . implode(", ", $columns) . ") VALUES (" . implode(", ", $values) . ");\n";
|
|
||||||
}
|
|
||||||
$sqlContent .= "\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$sqlContent .= "SET foreign_key_checks = 1;\n";
|
|
||||||
file_put_contents($sqlFile, $sqlContent);
|
|
||||||
|
|
||||||
// === 4. Zip the uploads folder
|
|
||||||
$zipFolder("../uploads", $uploadsZip);
|
|
||||||
|
|
||||||
// === 5. Create version.txt
|
|
||||||
$commitHash = trim(shell_exec('git log -1 --format=%H')) ?: 'N/A';
|
|
||||||
$gitBranch = trim(shell_exec('git rev-parse --abbrev-ref HEAD')) ?: 'N/A';
|
|
||||||
|
|
||||||
$versionContent = "ITFlow Backup Metadata\n";
|
$versionContent = "ITFlow Backup Metadata\n";
|
||||||
$versionContent .= "-----------------------------\n";
|
$versionContent .= "-----------------------------\n";
|
||||||
$versionContent .= "Generated: " . date('Y-m-d H:i:s') . "\n";
|
$versionContent .= "Generated: " . date('Y-m-d H:i:s') . "\n";
|
||||||
$versionContent .= "Backup File: " . basename($finalZip) . "\n";
|
$versionContent .= "Backup File: " . $downloadName . "\n";
|
||||||
$versionContent .= "Generated By: $session_name\n";
|
$versionContent .= "Generated By: " . ($session_name ?? 'Unknown User') . "\n";
|
||||||
$versionContent .= "Host: " . gethostname() . "\n";
|
$versionContent .= "Host: " . gethostname() . "\n";
|
||||||
$versionContent .= "Git Branch: $gitBranch\n";
|
$versionContent .= "Git Branch: $gitBranch\n";
|
||||||
$versionContent .= "Git Commit: $commitHash\n";
|
$versionContent .= "Git Commit: $commitHash\n";
|
||||||
$versionContent .= "ITFlow Version: " . (defined('APP_VERSION') ? APP_VERSION : 'Unknown') . "\n";
|
$versionContent .= "ITFlow Version: " . (defined('APP_VERSION') ? APP_VERSION : 'Unknown') . "\n";
|
||||||
$versionContent .= "Database Version: " . (defined('CURRENT_DATABASE_VERSION') ? CURRENT_DATABASE_VERSION : 'Unknown') . "\n";
|
$versionContent .= "Database Version: " . (defined('CURRENT_DATABASE_VERSION') ? CURRENT_DATABASE_VERSION : 'Unknown') . "\n";
|
||||||
$versionContent .= "Checksum (SHA256): \n";
|
$versionContent .= "Checksums (SHA256):\n";
|
||||||
|
$versionContent .= " db.sql: $dbSha\n";
|
||||||
|
$versionContent .= " uploads.zip: $upSha\n";
|
||||||
|
|
||||||
file_put_contents($versionFile, $versionContent);
|
file_put_contents($versionFile, $versionContent);
|
||||||
|
@chmod($versionFile, 0600);
|
||||||
|
|
||||||
// === 6. Build final ZIP
|
// === Build final ZIP ===
|
||||||
$final = new ZipArchive();
|
$final = new ZipArchive();
|
||||||
if ($final->open($finalZip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
|
if ($final->open($finalZip, ZipArchive::CREATE | ZipArchive::OVERWRITE) !== TRUE) {
|
||||||
error_log("Failed to create final zip: $finalZip");
|
error_log("Failed to create final zip: $finalZip");
|
||||||
http_response_code(500);
|
http_response_code(500);
|
||||||
exit("Internal Server Error: Unable to create backup archive.");
|
exit("Internal Server Error: Unable to create backup archive.");
|
||||||
}
|
}
|
||||||
|
|
||||||
$final->addFile($sqlFile, "db.sql");
|
$final->addFile($sqlFile, "db.sql");
|
||||||
$final->addFile($uploadsZip, "uploads.zip");
|
$final->addFile($uploadsZip, "uploads.zip");
|
||||||
$final->addFile($versionFile, "version.txt");
|
$final->addFile($versionFile, "version.txt");
|
||||||
$final->close();
|
$final->close();
|
||||||
|
|
||||||
chmod($finalZip, 0600);
|
@chmod($finalZip, 0600);
|
||||||
|
|
||||||
$checksum = hash_file('sha256', $finalZip);
|
// === Serve final ZIP with a stable filename ===
|
||||||
file_put_contents($versionFile, $versionContent . "$checksum\n");
|
|
||||||
|
|
||||||
// === 7. Serve final ZIP
|
|
||||||
header('Content-Type: application/zip');
|
header('Content-Type: application/zip');
|
||||||
header('Content-Disposition: attachment; filename="' . basename($finalZip) . '"');
|
header('X-Content-Type-Options: nosniff');
|
||||||
|
header('Content-Disposition: attachment; filename="' . $downloadName . '"');
|
||||||
header('Content-Length: ' . filesize($finalZip));
|
header('Content-Length: ' . filesize($finalZip));
|
||||||
header('Pragma: public');
|
header('Pragma: public');
|
||||||
header('Expires: 0');
|
header('Expires: 0');
|
||||||
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
|
||||||
header('Content-Transfer-Encoding: binary');
|
header('Content-Transfer-Encoding: binary');
|
||||||
|
|
||||||
|
// Push file
|
||||||
flush();
|
flush();
|
||||||
$fp = fopen($finalZip, 'rb');
|
$fp = fopen($finalZip, 'rb');
|
||||||
fpassthru($fp);
|
fpassthru($fp);
|
||||||
fclose($fp);
|
fclose($fp);
|
||||||
|
|
||||||
logAction("System", "Backup Download", "$session_name downloaded full backup.");
|
// Log + UX
|
||||||
|
logAction("System", "Backup Download", ($session_name ?? 'Unknown User') . " downloaded full backup.");
|
||||||
flash_alert("Full backup downloaded.");
|
flash_alert("Full backup downloaded.");
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (isset($_POST['backup_master_key'])) {
|
if (isset($_POST['backup_master_key'])) {
|
||||||
|
|
||||||
validateCSRFToken($_POST['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ if (isset($_POST['add_payment_provider'])) {
|
|||||||
$private_key = sanitizeInput($_POST['private_key']);
|
$private_key = sanitizeInput($_POST['private_key']);
|
||||||
$threshold = floatval($_POST['threshold']);
|
$threshold = floatval($_POST['threshold']);
|
||||||
$enable_expense = intval($_POST['enable_expense'] ?? 0);
|
$enable_expense = intval($_POST['enable_expense'] ?? 0);
|
||||||
$percentage_fee = floatval($_POST['percentage_fee']) / 100;
|
$percentage_fee = floatval($_POST['percentage_fee']) / 100 ?? 0;
|
||||||
$flat_fee = floatval($_POST['flat_fee']);
|
$flat_fee = floatval($_POST['flat_fee']) ?? 0;
|
||||||
|
|
||||||
// Check to make sure Provider isnt added Twice
|
// Check to ensure provider isn't added twice
|
||||||
$sql = "SELECT 1 FROM payment_providers WHERE payment_provider_name = '$provider' LIMIT 1";
|
$sql = "SELECT 1 FROM payment_providers WHERE payment_provider_name = '$provider' LIMIT 1";
|
||||||
$result = mysqli_query($mysqli, $sql);
|
$result = mysqli_query($mysqli, $sql);
|
||||||
if (mysqli_num_rows($result) > 0) {
|
if (mysqli_num_rows($result) > 0) {
|
||||||
@@ -26,7 +26,7 @@ if (isset($_POST['add_payment_provider'])) {
|
|||||||
redirect();
|
redirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for Stripe Account if not create it
|
// Check for Stripe Account, if not create it
|
||||||
$sql_account = mysqli_query($mysqli,"SELECT account_id FROM accounts WHERE account_name = '$provider' AND account_archived_at IS NULL LIMIT 1");
|
$sql_account = mysqli_query($mysqli,"SELECT account_id FROM accounts WHERE account_name = '$provider' AND account_archived_at IS NULL LIMIT 1");
|
||||||
if (mysqli_num_rows($sql_account) == 0) {
|
if (mysqli_num_rows($sql_account) == 0) {
|
||||||
$account_id = mysqli_insert_id($mysqli);
|
$account_id = mysqli_insert_id($mysqli);
|
||||||
@@ -35,6 +35,10 @@ if (isset($_POST['add_payment_provider'])) {
|
|||||||
$account_id = intval($row['account_id']);
|
$account_id = intval($row['account_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Expense defaults
|
||||||
|
$category_id = 0;
|
||||||
|
$vendor_id = 0;
|
||||||
|
|
||||||
if ($enable_expense) {
|
if ($enable_expense) {
|
||||||
// Category
|
// Category
|
||||||
$sql_category = mysqli_query($mysqli,"SELECT category_id FROM categories WHERE category_name = 'Payment Processing' AND category_type = 'Expense' AND category_archived_at IS NULL LIMIT 1");
|
$sql_category = mysqli_query($mysqli,"SELECT category_id FROM categories WHERE category_name = 'Payment Processing' AND category_type = 'Expense' AND category_archived_at IS NULL LIMIT 1");
|
||||||
@@ -45,10 +49,10 @@ if (isset($_POST['add_payment_provider'])) {
|
|||||||
$row = mysqli_fetch_array($sql_category);
|
$row = mysqli_fetch_array($sql_category);
|
||||||
$category_id = intval($row['category_id']);
|
$category_id = intval($row['category_id']);
|
||||||
}
|
}
|
||||||
//Vendor
|
// Vendor
|
||||||
$sql_vendor = mysqli_query($mysqli,"SELECT vendor_id FROM vendors WHERE vendor_name = '$provider' AND vendor_client_id = 0 AND vendor_archived_at IS NULL LIMIT 1");
|
$sql_vendor = mysqli_query($mysqli,"SELECT vendor_id FROM vendors WHERE vendor_name = '$provider' AND vendor_client_id = 0 AND vendor_archived_at IS NULL LIMIT 1");
|
||||||
if (mysqli_num_rows($sql_vendor) == 0) {
|
if (mysqli_num_rows($sql_vendor) == 0) {
|
||||||
mysqli_query($mysqli,"INSERT INTO vendors SET vendor_name = '$provider', vendor_descripion = 'Payment Processor Provider', vendor_client_id = 0");
|
mysqli_query($mysqli,"INSERT INTO vendors SET vendor_name = '$provider', vendor_description = 'Payment Processor Provider', vendor_client_id = 0");
|
||||||
$vendor_id = mysqli_insert_id($mysqli);
|
$vendor_id = mysqli_insert_id($mysqli);
|
||||||
} else {
|
} else {
|
||||||
$row = mysqli_fetch_array($sql_vendor);
|
$row = mysqli_fetch_array($sql_vendor);
|
||||||
@@ -56,7 +60,7 @@ if (isset($_POST['add_payment_provider'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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_account = $account_id, payment_provider_expense_vendor = $vendor_id, payment_provider_expense_category = $category_id, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee");
|
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_id, payment_provider_expense_vendor = $vendor_id, payment_provider_expense_category = $category_id, payment_provider_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee");
|
||||||
|
|
||||||
$provider_id = mysqli_insert_id($mysqli);
|
$provider_id = mysqli_insert_id($mysqli);
|
||||||
|
|
||||||
@@ -81,7 +85,7 @@ if (isset($_POST['edit_payment_provider'])) {
|
|||||||
$percentage_fee = floatval($_POST['percentage_fee']) / 100;
|
$percentage_fee = floatval($_POST['percentage_fee']) / 100;
|
||||||
$flat_fee = floatval($_POST['flat_fee']);
|
$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_expense_percentage_fee = $percentage_fee, payment_provider_expense_flat_fee = $flat_fee WHERE payment_provider_id = $provider_id");
|
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_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");
|
logAction("Payment Provider", "Edit", "$session_name edited Payment Provider $provider");
|
||||||
|
|
||||||
@@ -93,10 +97,13 @@ if (isset($_POST['edit_payment_provider'])) {
|
|||||||
|
|
||||||
if (isset($_GET['delete_payment_provider'])) {
|
if (isset($_GET['delete_payment_provider'])) {
|
||||||
|
|
||||||
|
validateCSRFToken($_GET['csrf_token']);
|
||||||
|
|
||||||
$provider_id = intval($_GET['delete_payment_provider']);
|
$provider_id = intval($_GET['delete_payment_provider']);
|
||||||
|
|
||||||
$provider_name = sanitizeInput(getFieldById('provider_providers', $provider_id, 'provider_name'));
|
$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");
|
mysqli_query($mysqli,"DELETE FROM payment_providers WHERE payment_provider_id = $provider_id");
|
||||||
|
|
||||||
logAction("Payment Provider", "Delete", "$session_name deleted Payment Provider $provider_name");
|
logAction("Payment Provider", "Delete", "$session_name deleted Payment Provider $provider_name");
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ if (isset($_GET['delete_saved_payment'])) {
|
|||||||
|
|
||||||
$private_key = $row['payment_provider_private_key'];
|
$private_key = $row['payment_provider_private_key'];
|
||||||
|
|
||||||
// Seperate logic for each Payment Provider
|
// Separate logic for each Payment Provider
|
||||||
if ($payment_provider_name == 'Stripe') {
|
if ($payment_provider_name == 'Stripe') {
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,15 +6,37 @@ if (isset($_POST['edit_mail_smtp_settings'])) {
|
|||||||
|
|
||||||
validateCSRFToken($_POST['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
||||||
|
$config_smtp_provider = sanitizeInput($_POST['config_smtp_provider']);
|
||||||
$config_smtp_host = sanitizeInput($_POST['config_smtp_host']);
|
$config_smtp_host = sanitizeInput($_POST['config_smtp_host']);
|
||||||
$config_smtp_port = intval($_POST['config_smtp_port']);
|
$config_smtp_port = intval($_POST['config_smtp_port'] ?? 0);
|
||||||
$config_smtp_encryption = sanitizeInput($_POST['config_smtp_encryption']);
|
$config_smtp_encryption = sanitizeInput($_POST['config_smtp_encryption']);
|
||||||
$config_smtp_username = sanitizeInput($_POST['config_smtp_username']);
|
$config_smtp_username = sanitizeInput($_POST['config_smtp_username']);
|
||||||
$config_smtp_password = sanitizeInput($_POST['config_smtp_password']);
|
$config_smtp_password = sanitizeInput($_POST['config_smtp_password']);
|
||||||
|
|
||||||
mysqli_query($mysqli,"UPDATE settings SET config_smtp_host = '$config_smtp_host', config_smtp_port = $config_smtp_port, config_smtp_encryption = '$config_smtp_encryption', config_smtp_username = '$config_smtp_username', config_smtp_password = '$config_smtp_password' WHERE company_id = 1");
|
// Shared OAuth fields
|
||||||
|
$config_mail_oauth_client_id = sanitizeInput($_POST['config_mail_oauth_client_id']);
|
||||||
|
$config_mail_oauth_client_secret = sanitizeInput($_POST['config_mail_oauth_client_secret']);
|
||||||
|
$config_mail_oauth_tenant_id = sanitizeInput($_POST['config_mail_oauth_tenant_id']);
|
||||||
|
$config_mail_oauth_refresh_token = sanitizeInput($_POST['config_mail_oauth_refresh_token']);
|
||||||
|
$config_mail_oauth_access_token = sanitizeInput($_POST['config_mail_oauth_access_token']);
|
||||||
|
|
||||||
logAction("Settings", "Edit", "$session_name edited SMTP mail settings");
|
mysqli_query($mysqli, "
|
||||||
|
UPDATE settings SET
|
||||||
|
config_smtp_provider = '$config_smtp_provider',
|
||||||
|
config_smtp_host = '$config_smtp_host',
|
||||||
|
config_smtp_port = $config_smtp_port,
|
||||||
|
config_smtp_encryption = '$config_smtp_encryption',
|
||||||
|
config_smtp_username = '$config_smtp_username',
|
||||||
|
config_smtp_password = '$config_smtp_password',
|
||||||
|
config_mail_oauth_client_id = '$config_mail_oauth_client_id',
|
||||||
|
config_mail_oauth_client_secret = '$config_mail_oauth_client_secret',
|
||||||
|
config_mail_oauth_tenant_id = '$config_mail_oauth_tenant_id',
|
||||||
|
config_mail_oauth_refresh_token = '$config_mail_oauth_refresh_token',
|
||||||
|
config_mail_oauth_access_token = '$config_mail_oauth_access_token'
|
||||||
|
WHERE company_id = 1
|
||||||
|
");
|
||||||
|
|
||||||
|
logAction("Settings", "Edit", "$session_name edited SMTP settings");
|
||||||
|
|
||||||
flash_alert("SMTP Mail Settings updated");
|
flash_alert("SMTP Mail Settings updated");
|
||||||
|
|
||||||
@@ -26,15 +48,37 @@ if (isset($_POST['edit_mail_imap_settings'])) {
|
|||||||
|
|
||||||
validateCSRFToken($_POST['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
||||||
|
$config_imap_provider = sanitizeInput($_POST['config_imap_provider']);
|
||||||
$config_imap_host = sanitizeInput($_POST['config_imap_host']);
|
$config_imap_host = sanitizeInput($_POST['config_imap_host']);
|
||||||
|
$config_imap_port = intval($_POST['config_imap_port'] ?? 0);
|
||||||
|
$config_imap_encryption = sanitizeInput($_POST['config_imap_encryption']);
|
||||||
$config_imap_username = sanitizeInput($_POST['config_imap_username']);
|
$config_imap_username = sanitizeInput($_POST['config_imap_username']);
|
||||||
$config_imap_password = sanitizeInput($_POST['config_imap_password']);
|
$config_imap_password = sanitizeInput($_POST['config_imap_password']);
|
||||||
$config_imap_port = intval($_POST['config_imap_port']);
|
|
||||||
$config_imap_encryption = sanitizeInput($_POST['config_imap_encryption']);
|
|
||||||
|
|
||||||
mysqli_query($mysqli,"UPDATE settings SET config_imap_host = '$config_imap_host', config_imap_port = $config_imap_port, config_imap_encryption = '$config_imap_encryption', config_imap_username = '$config_imap_username', config_imap_password = '$config_imap_password' WHERE company_id = 1");
|
// Shared OAuth fields
|
||||||
|
$config_mail_oauth_client_id = sanitizeInput($_POST['config_mail_oauth_client_id']);
|
||||||
|
$config_mail_oauth_client_secret = sanitizeInput($_POST['config_mail_oauth_client_secret']);
|
||||||
|
$config_mail_oauth_tenant_id = sanitizeInput($_POST['config_mail_oauth_tenant_id']);
|
||||||
|
$config_mail_oauth_refresh_token = sanitizeInput($_POST['config_mail_oauth_refresh_token']);
|
||||||
|
$config_mail_oauth_access_token = sanitizeInput($_POST['config_mail_oauth_access_token']);
|
||||||
|
|
||||||
logAction("Settings", "Edit", "$session_name edited IMAP mail settings");
|
mysqli_query($mysqli, "
|
||||||
|
UPDATE settings SET
|
||||||
|
config_imap_provider = '$config_imap_provider',
|
||||||
|
config_imap_host = '$config_imap_host',
|
||||||
|
config_imap_port = $config_imap_port,
|
||||||
|
config_imap_encryption = '$config_imap_encryption',
|
||||||
|
config_imap_username = '$config_imap_username',
|
||||||
|
config_imap_password = '$config_imap_password',
|
||||||
|
config_mail_oauth_client_id = '$config_mail_oauth_client_id',
|
||||||
|
config_mail_oauth_client_secret = '$config_mail_oauth_client_secret',
|
||||||
|
config_mail_oauth_tenant_id = '$config_mail_oauth_tenant_id',
|
||||||
|
config_mail_oauth_refresh_token = '$config_mail_oauth_refresh_token',
|
||||||
|
config_mail_oauth_access_token = '$config_mail_oauth_access_token'
|
||||||
|
WHERE company_id = 1
|
||||||
|
");
|
||||||
|
|
||||||
|
logAction("Settings", "Edit", "$session_name edited IMAP settings");
|
||||||
|
|
||||||
flash_alert("IMAP Mail Settings updated");
|
flash_alert("IMAP Mail Settings updated");
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
||||||
|
|
||||||
// Import shared code from user-side tickets/tasks as we reuse functions
|
// Import shared code from user-side tickets/tasks as we reuse functions
|
||||||
require_once '../user/post/ticket.php';
|
require_once '../agent/post/ticket.php';
|
||||||
require_once '../user/post/task.php';
|
require_once '../agent/post/task.php';
|
||||||
|
|
||||||
if (isset($_POST['add_ticket_template'])) {
|
if (isset($_POST['add_ticket_template'])) {
|
||||||
|
|
||||||
|
|||||||
@@ -236,16 +236,20 @@ if (isset($_GET['revoke_remember_me'])) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_GET['archive_user'])) {
|
if (isset($_POST['archive_user'])) {
|
||||||
|
|
||||||
validateCSRFToken($_GET['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
||||||
// Variables from GET
|
$user_id = intval($_POST['user_id']);
|
||||||
$user_id = intval($_GET['archive_user']);
|
$ticket_assign = intval($_POST['ticket_assign']);
|
||||||
$password = password_hash(randomString(), PASSWORD_DEFAULT);
|
$password = password_hash(randomString(), PASSWORD_DEFAULT);
|
||||||
|
|
||||||
$user_name = sanitizeInput(getFieldById('users', $user_id, 'user_name'));
|
$user_name = sanitizeInput(getFieldById('users', $user_id, 'user_name'));
|
||||||
|
|
||||||
|
// Un-assign / Re-assign tickets
|
||||||
|
mysqli_query($mysqli, "UPDATE tickets SET ticket_assigned_to = $ticket_assign WHERE ticket_assigned_to = $user_id AND ticket_closed_at IS NULL AND ticket_resolved_at IS NULL");
|
||||||
|
mysqli_query($mysqli, "UPDATE recurring_tickets SET recurring_ticket_assigned_to = $ticket_assign WHERE recurring_ticket_assigned_to = $user_id");
|
||||||
|
|
||||||
// Archive user query
|
// Archive user query
|
||||||
mysqli_query($mysqli, "UPDATE users SET user_name = '$user_name (archived)', user_password = '$password', user_status = 0, user_specific_encryption_ciphertext = '', user_archived_at = NOW() WHERE user_id = $user_id");
|
mysqli_query($mysqli, "UPDATE users SET user_name = '$user_name (archived)', user_password = '$password', user_status = 0, user_specific_encryption_ciphertext = '', user_archived_at = NOW() WHERE user_id = $user_id");
|
||||||
|
|
||||||
@@ -257,6 +261,36 @@ if (isset($_GET['archive_user'])) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['restore_user'])) {
|
||||||
|
|
||||||
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
||||||
|
$user_id = intval($_POST['user_id']);
|
||||||
|
$new_password = trim($_POST['new_password']);
|
||||||
|
$role = intval($_POST['role']);
|
||||||
|
|
||||||
|
$user_name = getFieldById('users', $user_id, 'user_name');
|
||||||
|
$user_name = sanitizeInput(str_replace(" (archived)", "", $user_name)); //Removed (archived) from user_name
|
||||||
|
|
||||||
|
// Restore user query
|
||||||
|
mysqli_query($mysqli, "UPDATE users SET user_name = '$user_name', user_status = 1, user_role_id = $role, user_archived_at = NULL WHERE user_id = $user_id");
|
||||||
|
|
||||||
|
if (!empty($new_password)) {
|
||||||
|
$new_password = password_hash($new_password, PASSWORD_DEFAULT);
|
||||||
|
$user_specific_encryption_ciphertext = encryptUserSpecificKey(trim($_POST['new_password']));
|
||||||
|
mysqli_query($mysqli, "UPDATE users SET user_password = '$new_password', user_specific_encryption_ciphertext = '$user_specific_encryption_ciphertext' WHERE user_id = $user_id");
|
||||||
|
//Extended Logging
|
||||||
|
$extended_log_description .= ", password changed";
|
||||||
|
}
|
||||||
|
|
||||||
|
logAction("User", "Restored", "$session_name restored user $user_name", 0, $user_id);
|
||||||
|
|
||||||
|
flash_alert("User <strong>$user_name</strong> restored");
|
||||||
|
|
||||||
|
redirect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_POST['export_users_csv'])) {
|
if (isset($_POST['export_users_csv'])) {
|
||||||
|
|
||||||
//get records from database
|
//get records from database
|
||||||
@@ -266,6 +300,8 @@ if (isset($_POST['export_users_csv'])) {
|
|||||||
|
|
||||||
if ($count > 0) {
|
if ($count > 0) {
|
||||||
$delimiter = ",";
|
$delimiter = ",";
|
||||||
|
$enclosure = '"';
|
||||||
|
$escape = '\\'; // backslash
|
||||||
$filename = "Users-" . date('Y-m-d') . ".csv";
|
$filename = "Users-" . date('Y-m-d') . ".csv";
|
||||||
|
|
||||||
//create a file pointer
|
//create a file pointer
|
||||||
@@ -273,7 +309,7 @@ if (isset($_POST['export_users_csv'])) {
|
|||||||
|
|
||||||
//set column headers
|
//set column headers
|
||||||
$fields = array('Name', 'Email', 'Role', 'Status', 'Creation Date');
|
$fields = array('Name', 'Email', 'Role', 'Status', 'Creation Date');
|
||||||
fputcsv($f, $fields, $delimiter);
|
fputcsv($f, $fields, $delimiter, $enclosure, $escape);
|
||||||
|
|
||||||
//output each row of the data, format line as csv and write to file pointer
|
//output each row of the data, format line as csv and write to file pointer
|
||||||
while($row = $sql->fetch_assoc()) {
|
while($row = $sql->fetch_assoc()) {
|
||||||
@@ -288,7 +324,7 @@ if (isset($_POST['export_users_csv'])) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$lineData = array($row['user_name'], $row['user_email'], $row['role_name'], $user_status_display, $row['user_created_at']);
|
$lineData = array($row['user_name'], $row['user_email'], $row['role_name'], $user_status_display, $row['user_created_at']);
|
||||||
fputcsv($f, $lineData, $delimiter);
|
fputcsv($f, $lineData, $delimiter, $enclosure, $escape);
|
||||||
}
|
}
|
||||||
|
|
||||||
//move back to beginning of file
|
//move back to beginning of file
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
||||||
|
|
||||||
// Import shared code from user-side vendor management as we reuse functions
|
// Import shared code from user-side vendor management as we reuse functions
|
||||||
require_once '../user/post/vendor.php';
|
require_once '../agent/post/vendor.php';
|
||||||
|
|
||||||
if (isset($_POST['add_vendor_template'])) {
|
if (isset($_POST['add_vendor_template'])) {
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,28 @@ require_once "includes/inc_all_admin.php";
|
|||||||
<form action="post.php" method="post" autocomplete="off">
|
<form action="post.php" method="post" autocomplete="off">
|
||||||
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
|
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
|
||||||
|
|
||||||
|
<!-- SMTP Provider -->
|
||||||
|
<div class="form-group">
|
||||||
|
<label>SMTP Provider</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-cloud"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control" name="config_smtp_provider" id="config_smtp_provider">
|
||||||
|
<option value="" <?php if(empty($config_smtp_provider)) { echo 'selected'; } ?>>None (Disabled)</option>
|
||||||
|
<option value="standard_smtp" <?php if($config_smtp_provider === 'standard_smtp') { echo 'selected'; } ?>>Standard SMTP (Username/Password)</option>
|
||||||
|
<option value="google_oauth" <?php if($config_smtp_provider === 'google_oauth') { echo 'selected'; } ?>>Google Workspace (OAuth)</option>
|
||||||
|
<option value="microsoft_oauth" <?php if($config_smtp_provider === 'microsoft_oauth') { echo 'selected'; } ?>>Microsoft 365 (OAuth)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<small class="text-secondary d-block mt-1" id="smtp_provider_hint">
|
||||||
|
Choose your SMTP provider. OAuth options ignore the SMTP password here.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Standard SMTP fields (show only for standard_smtp) -->
|
||||||
|
<div id="smtp_standard_fields">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>SMTP Host</label>
|
<label>SMTP Host</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
@@ -54,6 +76,7 @@ require_once "includes/inc_all_admin.php";
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group" id="smtp_password_group">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>SMTP Password</label>
|
<label>SMTP Password</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
@@ -66,6 +89,9 @@ require_once "includes/inc_all_admin.php";
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
@@ -83,6 +109,24 @@ require_once "includes/inc_all_admin.php";
|
|||||||
<form action="post.php" method="post" autocomplete="off">
|
<form action="post.php" method="post" autocomplete="off">
|
||||||
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
|
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token'] ?>">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>IMAP Provider</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-cloud"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control" name="config_imap_provider" id="config_imap_provider">
|
||||||
|
<option value="" <?php if(empty($config_imap_provider)) { echo 'selected'; } ?>>None (Disabled)</option>
|
||||||
|
<option value="standard_imap" <?php if($config_imap_provider === 'standard_imap') { echo 'selected'; } ?>>Standard IMAP (Username/Password)</option>
|
||||||
|
<option value="google_oauth" <?php if($config_imap_provider === 'google_oauth') { echo 'selected'; } ?>>Google Workspace (OAuth)</option>
|
||||||
|
<option value="microsoft_oauth" <?php if($config_imap_provider === 'microsoft_oauth') { echo 'selected'; } ?>>Microsoft 365 (OAuth)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<small class="text-secondary d-block mt-1" id="imap_provider_hint">
|
||||||
|
Select your mailbox provider. OAuth options ignore the IMAP password here.
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
<div id="standard_fields" style="display:none;">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>IMAP Host</label>
|
<label>IMAP Host</label>
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
@@ -116,6 +160,7 @@ require_once "includes/inc_all_admin.php";
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class='form-group'>
|
<div class='form-group'>
|
||||||
<label>IMAP Username</label>
|
<label>IMAP Username</label>
|
||||||
@@ -123,25 +168,81 @@ require_once "includes/inc_all_admin.php";
|
|||||||
<div class='input-group-prepend'>
|
<div class='input-group-prepend'>
|
||||||
<span class='input-group-text'><i class='fa fa-fw fa-user'></i></span>
|
<span class='input-group-text'><i class='fa fa-fw fa-user'></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type='text' class='form-control' name='config_imap_username' placeholder='Username' value="<?php
|
<input type='text' class='form-control' name='config_imap_username' placeholder='Username (email address)' value="<?php echo nullable_htmlentities($config_imap_username); ?>" required>
|
||||||
echo nullable_htmlentities($config_imap_username); ?>" required>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class='form-group'>
|
<div class='form-group' id="imap_password_group">
|
||||||
<label>IMAP Password</label>
|
<label>IMAP Password</label>
|
||||||
<div class='input-group'>
|
<div class='input-group'>
|
||||||
<div class='input-group-prepend'>
|
<div class='input-group-prepend'>
|
||||||
<span class='input-group-text'><i class='fa fa-fw fa-key'></i></span>
|
<span class='input-group-text'><i class='fa fa-fw fa-key'></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type='password' class='form-control' data-toggle='password' name='config_imap_password' placeholder='Password' value="<?php
|
<input type='password' class='form-control' data-toggle='password' name='config_imap_password' placeholder='Password (not used for OAuth)' value="<?php echo nullable_htmlentities($config_imap_password); ?>" autocomplete='new-password'>
|
||||||
echo nullable_htmlentities($config_imap_password); ?>" autocomplete='new-password' required>
|
|
||||||
<div class='input-group-append'>
|
<div class='input-group-append'>
|
||||||
<span class='input-group-text'><i class='fa fa-fw fa-eye'></i></span>
|
<span class='input-group-text'><i class='fa fa-fw fa-eye'></i></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- OAuth shared fields (show for google_oauth / microsoft_oauth) -->
|
||||||
|
<div id="smtp_oauth_fields" style="display:none;">
|
||||||
|
<hr>
|
||||||
|
<h5 class="mb-2">OAuth Settings (shared for IMAP & SMTP)</h5>
|
||||||
|
<p class="text-secondary" id="oauth_hint">
|
||||||
|
Configure OAuth credentials for the selected provider.
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>OAuth Client ID</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-fw fa-id-badge"></i></span></div>
|
||||||
|
<input type="text" class="form-control" name="config_mail_oauth_client_id"
|
||||||
|
value="<?php echo nullable_htmlentities($config_mail_oauth_client_id ?? ''); ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>OAuth Client 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" data-toggle="password" name="config_mail_oauth_client_secret"
|
||||||
|
value="<?php echo nullable_htmlentities($config_mail_oauth_client_secret ?? ''); ?>" autocomplete="new-password">
|
||||||
|
<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" id="tenant_row" style="display:none;">
|
||||||
|
<label>Tenant ID (Microsoft 365 only)</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="config_mail_oauth_tenant_id"
|
||||||
|
value="<?php echo nullable_htmlentities($config_mail_oauth_tenant_id ?? ''); ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Refresh Token</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>
|
||||||
|
<textarea class="form-control" name="config_mail_oauth_refresh_token" rows="2"
|
||||||
|
placeholder="Paste refresh token"><?php echo nullable_htmlentities($config_mail_oauth_refresh_token ?? ''); ?></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Access Token (optional – will refresh if expired)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend"><span class="input-group-text"><i class="fa fa-fw fa-shield-alt"></i></span></div>
|
||||||
|
<textarea class="form-control" name="config_mail_oauth_access_token" rows="2"
|
||||||
|
placeholder="Can be left blank; system refreshes using the refresh token"><?php echo nullable_htmlentities($config_mail_oauth_access_token ?? ''); ?></textarea>
|
||||||
|
</div>
|
||||||
|
<small class="text-secondary">
|
||||||
|
Expires at: <?php echo !empty($config_mail_oauth_access_token_expires_at) ? htmlspecialchars($config_mail_oauth_access_token_expires_at) : 'n/a'; ?>
|
||||||
|
</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
<button type="submit" name="edit_mail_imap_settings" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
|
<button type="submit" name="edit_mail_imap_settings" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
|
||||||
@@ -327,5 +428,68 @@ require_once "includes/inc_all_admin.php";
|
|||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<?php require_once "../includes/footer.php";
|
<script>
|
||||||
|
(function(){
|
||||||
|
function setDisabled(container, disabled){
|
||||||
|
if(!container) return;
|
||||||
|
container.querySelectorAll('input, select, textarea').forEach(el => el.disabled = !!disabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
function wireProvider(selectId, standardWrapId, passwordGroupId, oauthWrapId, tenantRowId, hintId, oauthHintId){
|
||||||
|
const sel = document.getElementById(selectId);
|
||||||
|
const std = document.getElementById(standardWrapId);
|
||||||
|
const pwd = document.getElementById(passwordGroupId);
|
||||||
|
const oauth = document.getElementById(oauthWrapId);
|
||||||
|
const ten = document.getElementById(tenantRowId);
|
||||||
|
const hint = document.getElementById(hintId);
|
||||||
|
const ohint = document.getElementById(oauthHintId);
|
||||||
|
|
||||||
|
function toggle(){
|
||||||
|
const v = (sel && sel.value) || '';
|
||||||
|
const isNone = (v === 'none' || v === '');
|
||||||
|
const isStd = v === 'standard_smtp' || v === 'standard_imap';
|
||||||
|
const isG = v === 'google_oauth';
|
||||||
|
const isM = v === 'microsoft_oauth';
|
||||||
|
const isOAuth = isG || isM;
|
||||||
|
|
||||||
|
if (std) std.style.display = isStd ? '' : 'none';
|
||||||
|
if (pwd) pwd.style.display = isStd ? '' : 'none';
|
||||||
|
if (oauth) oauth.style.display = isOAuth ? '' : 'none';
|
||||||
|
if (ten) ten.style.display = isM ? '' : 'none';
|
||||||
|
|
||||||
|
setDisabled(std, !isStd);
|
||||||
|
setDisabled(pwd, !isStd);
|
||||||
|
setDisabled(oauth, !isOAuth);
|
||||||
|
|
||||||
|
if (hint) {
|
||||||
|
hint.textContent = isNone
|
||||||
|
? 'Disabled.'
|
||||||
|
: isStd
|
||||||
|
? 'Standard: provide host, port, encryption, username & password.'
|
||||||
|
: isG
|
||||||
|
? 'Google OAuth: set Client ID/Secret; paste a refresh token; username should be the mailbox email.'
|
||||||
|
: 'Microsoft 365 OAuth: set Client ID/Secret/Tenant; paste a refresh token; username should be the mailbox email.';
|
||||||
|
}
|
||||||
|
if (ohint) {
|
||||||
|
ohint.textContent = isG
|
||||||
|
? 'Google Workspace OAuth: Client ID/Secret from Google Cloud; Refresh token via consent.'
|
||||||
|
: isM
|
||||||
|
? 'Microsoft 365 OAuth: Client ID/Secret/Tenant from Entra ID; Refresh token via consent.'
|
||||||
|
: 'Configure OAuth credentials for the selected provider.';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sel) { sel.addEventListener('change', toggle); toggle(); }
|
||||||
|
}
|
||||||
|
|
||||||
|
// IMAP (you already have these IDs in your page)
|
||||||
|
wireProvider('config_imap_provider', 'standard_fields', 'imap_password_group',
|
||||||
|
'oauth_fields', 'tenant_row', 'imap_provider_hint', 'oauth_hint');
|
||||||
|
|
||||||
|
// SMTP (the IDs we just added)
|
||||||
|
wireProvider('config_smtp_provider', 'smtp_standard_fields', 'smtp_password_group',
|
||||||
|
'smtp_oauth_fields', 'smtp_tenant_row', 'smtp_provider_hint', 'smtp_oauth_hint');
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<?php require_once "../includes/footer.php";
|
||||||
|
|||||||
@@ -8,10 +8,15 @@ require_once "includes/inc_all_admin.php";
|
|||||||
|
|
||||||
$sql = mysqli_query(
|
$sql = mysqli_query(
|
||||||
$mysqli,
|
$mysqli,
|
||||||
"SELECT SQL_CALC_FOUND_ROWS * FROM ticket_templates
|
"SELECT SQL_CALC_FOUND_ROWS *,
|
||||||
|
COUNT(task_template_id) AS task_count
|
||||||
|
FROM ticket_templates
|
||||||
|
LEFT JOIN task_templates ON task_template_ticket_template_id = ticket_template_id
|
||||||
WHERE (ticket_template_name LIKE '%$q%' OR ticket_template_description LIKE '%$q%')
|
WHERE (ticket_template_name LIKE '%$q%' OR ticket_template_description LIKE '%$q%')
|
||||||
AND ticket_template_archived_at IS NULL
|
AND ticket_template_archived_at IS NULL
|
||||||
ORDER BY $sort $order LIMIT $record_from, $record_to"
|
GROUP BY ticket_template_id
|
||||||
|
ORDER BY $sort $order
|
||||||
|
LIMIT $record_from, $record_to"
|
||||||
);
|
);
|
||||||
|
|
||||||
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
@@ -46,14 +51,18 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<hr>
|
<hr>
|
||||||
<div class="table-responsive-sm">
|
<div class="table-responsive-sm">
|
||||||
<table class="table table-striped table-borderless table-hover">
|
<table class="table table-striped table-borderless table-hover">
|
||||||
<thead class="text-dark <?php if($num_rows[0] == 0){ echo "d-none"; } ?>">
|
<thead class="text-dark <?php if($num_rows[0] == 0) { echo "d-none"; } ?>">
|
||||||
<tr>
|
<tr>
|
||||||
<th>
|
<th>
|
||||||
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=ticket_template_name&order=<?php echo $disp; ?>">
|
<a class="text-secondary" href="?<?= $url_query_strings_sort ?>&sort=ticket_template_name&order=<?= $disp ?>">
|
||||||
Template <?php if ($sort == 'ticket_template_name') { echo $order_icon; } ?>
|
Template <?php if ($sort == 'ticket_template_name') { echo $order_icon; } ?>
|
||||||
</a>
|
</a>
|
||||||
</th>
|
</th>
|
||||||
<th>Tasks</th>
|
<th>
|
||||||
|
<a class="text-secondary" href="?<?php echo $url_query_strings_sort; ?>&sort=task_count&order=<?php echo $disp; ?>">
|
||||||
|
Tasks <?php if ($sort == 'task_count') { echo $order_icon; } ?>
|
||||||
|
</a>
|
||||||
|
</th>
|
||||||
<th class="text-center">Action</th>
|
<th class="text-center">Action</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -66,6 +75,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
$ticket_template_description = nullable_htmlentities($row['ticket_template_description']);
|
$ticket_template_description = nullable_htmlentities($row['ticket_template_description']);
|
||||||
$ticket_template_subject = nullable_htmlentities($row['ticket_template_subject']);
|
$ticket_template_subject = nullable_htmlentities($row['ticket_template_subject']);
|
||||||
$ticket_template_created_at = nullable_htmlentities($row['ticket_template_created_at']);
|
$ticket_template_created_at = nullable_htmlentities($row['ticket_template_created_at']);
|
||||||
|
$task_count = intval($row['task_count']);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
@@ -75,23 +85,23 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<i class="fa fa-fw fa-2x fa-life-ring mr-3"></i>
|
<i class="fa fa-fw fa-2x fa-life-ring mr-3"></i>
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<div>
|
<div>
|
||||||
<a href="ticket_template_details.php?ticket_template_id=<?php echo $ticket_template_id; ?>">
|
<a href="ticket_template_details.php?ticket_template_id=<?= $ticket_template_id ?>">
|
||||||
<?php echo $ticket_template_name; ?>
|
<?= $ticket_template_name ?>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div><small class="text-secondary"><?php echo $ticket_template_description; ?></small></div>
|
<div><small class="text-secondary"><?= $ticket_template_description ?></small></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
<td>0</td>
|
<td><?= $task_count ?></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="dropdown dropleft text-center">
|
<div class="dropdown dropleft text-center">
|
||||||
<button class="btn btn-secondary btn-sm" data-toggle="dropdown">
|
<button class="btn btn-secondary btn-sm" data-toggle="dropdown">
|
||||||
<i class="fas fa-ellipsis-h"></i>
|
<i class="fas fa-ellipsis-h"></i>
|
||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_ticket_template=<?php echo $ticket_template_id; ?>">
|
<a class="dropdown-item text-danger text-bold confirm-link" href="post.php?delete_ticket_template=<?= $ticket_template_id ?>">
|
||||||
<i class="fas fa-fw fa-trash mr-2"></i>Delete
|
<i class="fas fa-fw fa-trash mr-2"></i>Delete
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -112,4 +122,3 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<?php
|
<?php
|
||||||
require_once "modals/ticket_template/ticket_template_add.php";
|
require_once "modals/ticket_template/ticket_template_add.php";
|
||||||
require_once "../includes/footer.php";
|
require_once "../includes/footer.php";
|
||||||
|
|
||||||
|
|||||||
@@ -56,8 +56,6 @@ $git_log = shell_exec("git log $repo_branch..origin/$repo_branch --pretty=format
|
|||||||
<p class="text-center font-weight-bold">Ignore this warning at your own risk.</p>
|
<p class="text-center font-weight-bold">Ignore this warning at your own risk.</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="btn btn-primary btn-lg my-4 confirm-link" href="post.php?no"><i class="fas fa-fw fa-4x fa-download mb-1"></i><h5>TEST</h5></a>
|
|
||||||
|
|
||||||
<a class="btn btn-primary btn-lg my-4 confirm-link" href="post.php?update"><i class="fas fa-fw fa-4x fa-download mb-1"></i><h5>Update App</h5></a>
|
<a class="btn btn-primary btn-lg my-4 confirm-link" href="post.php?update"><i class="fas fa-fw fa-4x fa-download mb-1"></i><h5>Update App</h5></a>
|
||||||
<a class="btn btn-danger btn-lg confirm-link" href="post.php?update&force_update=1"><i class="fas fa-fw fa-4x fa-hammer mb-1"></i><h5>FORCE Update App</h5></a>
|
<a class="btn btn-danger btn-lg confirm-link" href="post.php?update&force_update=1"><i class="fas fa-fw fa-4x fa-hammer mb-1"></i><h5>FORCE Update App</h5></a>
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ $sql = mysqli_query(
|
|||||||
LEFT JOIN user_settings ON users.user_id = user_settings.user_id
|
LEFT JOIN user_settings ON users.user_id = user_settings.user_id
|
||||||
WHERE (user_name LIKE '%$q%' OR user_email LIKE '%$q%')
|
WHERE (user_name LIKE '%$q%' OR user_email LIKE '%$q%')
|
||||||
AND user_type = 1
|
AND user_type = 1
|
||||||
AND user_archived_at IS NULL
|
AND user_$archive_query
|
||||||
ORDER BY $sort $order LIMIT $record_from, $record_to"
|
ORDER BY $sort $order LIMIT $record_from, $record_to"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -53,6 +53,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
|
<div class="btn-group float-right">
|
||||||
|
<a href="?archived=<?php if($archived == 1){ echo 0; } else { echo 1; } ?>"
|
||||||
|
class="btn btn-<?php if($archived == 1){ echo "primary"; } else { echo "default"; } ?>">
|
||||||
|
<i class="fa fa-fw fa-archive mr-2"></i>Archived
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@@ -113,8 +119,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
$user_config_force_mfa = intval($row['user_config_force_mfa']);
|
$user_config_force_mfa = intval($row['user_config_force_mfa']);
|
||||||
$user_role = intval($row['user_role_id']);
|
$user_role = intval($row['user_role_id']);
|
||||||
$user_role_display = nullable_htmlentities($row['role_name']);
|
$user_role_display = nullable_htmlentities($row['role_name']);
|
||||||
|
$user_archived_at = nullable_htmlentities($row['user_archived_at']);
|
||||||
$user_initials = nullable_htmlentities(initials($user_name));
|
$user_initials = nullable_htmlentities(initials($user_name));
|
||||||
|
|
||||||
|
|
||||||
$sql_last_login = mysqli_query(
|
$sql_last_login = mysqli_query(
|
||||||
$mysqli,
|
$mysqli,
|
||||||
"SELECT * FROM logs
|
"SELECT * FROM logs
|
||||||
@@ -196,10 +204,17 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<i class="fas fa-fw fa-user-slash mr-2"></i>Disable
|
<i class="fas fa-fw fa-user-slash mr-2"></i>Disable
|
||||||
</a>
|
</a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
<?php if ($user_archived_at) { ?>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item text-danger" href="#" data-toggle="modal" data-target="#archiveUserModal<?php echo $user_id; ?>">
|
<a class="dropdown-item text-info ajax-modal" href="#" data-modal-url="modals/user/user_restore.php?id=<?= $user_id ?>">
|
||||||
|
<i class="fas fa-fw fa-redo-alt mr-2"></i>Restore
|
||||||
|
</a>
|
||||||
|
<?php } else { ?>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
|
<a class="dropdown-item text-danger ajax-modal" href="#" data-modal-url="modals/user/user_archive.php?id=<?= $user_id ?>">
|
||||||
<i class="fas fa-fw fa-archive mr-2"></i>Archive
|
<i class="fas fa-fw fa-archive mr-2"></i>Archive
|
||||||
</a>
|
</a>
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -207,9 +222,6 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require "modals/user/user_archive.php";
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
@@ -675,3 +675,27 @@ if (isset($_POST['update_recurring_invoice_items_order'])) {
|
|||||||
echo json_encode(['status' => 'success']);
|
echo json_encode(['status' => 'success']);
|
||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_GET['client_duplicate_check'])) {
|
||||||
|
enforceUserPermission('module_client', 2);
|
||||||
|
|
||||||
|
$name = sanitizeInput($_GET['name']);
|
||||||
|
|
||||||
|
$response['message'] = ""; // default
|
||||||
|
|
||||||
|
if (strlen($name) >= 5) {
|
||||||
|
$sql_clients = mysqli_query($mysqli, "SELECT client_name FROM clients
|
||||||
|
WHERE client_archived_at IS NULL
|
||||||
|
AND client_name LIKE '%$name%'
|
||||||
|
ORDER BY client_id DESC LIMIT 1"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mysqli_num_rows($sql_clients) > 0) {
|
||||||
|
while ($row = mysqli_fetch_array($sql_clients)) {
|
||||||
|
$response['message'] = "<i class='fas fa-fw fa-copy mr-2'></i> Potential duplicate: <i>" . nullable_htmlentities($row['client_name']) . "</i> already exists.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
echo json_encode($response);
|
||||||
|
}
|
||||||
1236
agent/asset_details.php
Normal file
1236
agent/asset_details.php
Normal file
File diff suppressed because it is too large
Load Diff
@@ -37,17 +37,23 @@ enforceUserPermission('module_support');
|
|||||||
//Asset Type from GET
|
//Asset Type from GET
|
||||||
if (isset($_GET['type']) && ($_GET['type']) == 'workstation') {
|
if (isset($_GET['type']) && ($_GET['type']) == 'workstation') {
|
||||||
$type_query = "asset_type = 'desktop' OR asset_type = 'laptop'";
|
$type_query = "asset_type = 'desktop' OR asset_type = 'laptop'";
|
||||||
|
$type_filter = "workstation";
|
||||||
} elseif (isset($_GET['type']) && ($_GET['type']) == 'server') {
|
} elseif (isset($_GET['type']) && ($_GET['type']) == 'server') {
|
||||||
$type_query = "asset_type = 'server'";
|
$type_query = "asset_type = 'server'";
|
||||||
|
$type_filter = "server";
|
||||||
} elseif (isset($_GET['type']) && ($_GET['type']) == 'virtual') {
|
} elseif (isset($_GET['type']) && ($_GET['type']) == 'virtual') {
|
||||||
$type_query = "asset_type = 'Virtual Machine'";
|
$type_query = "asset_type = 'Virtual Machine'";
|
||||||
|
$type_filter = "virtual";
|
||||||
} elseif (isset($_GET['type']) && ($_GET['type']) == 'network') {
|
} elseif (isset($_GET['type']) && ($_GET['type']) == 'network') {
|
||||||
$type_query = "asset_type = 'Firewall/Router' OR asset_type = 'Switch' OR asset_type = 'Access Point'";
|
$type_query = "asset_type = 'Firewall/Router' OR asset_type = 'Switch' OR asset_type = 'Access Point'";
|
||||||
|
$type_filter = "network";
|
||||||
} elseif (isset($_GET['type']) && ($_GET['type']) == 'other') {
|
} elseif (isset($_GET['type']) && ($_GET['type']) == 'other') {
|
||||||
$type_query = "asset_type NOT LIKE 'laptop' AND asset_type NOT LIKE 'desktop' AND asset_type NOT LIKE 'server' AND asset_type NOT LIKE 'virtual machine' AND asset_type NOT LIKE 'firewall/router' AND asset_type NOT LIKE 'switch' AND asset_type NOT LIKE 'access point'";
|
$type_query = "asset_type NOT LIKE 'laptop' AND asset_type NOT LIKE 'desktop' AND asset_type NOT LIKE 'server' AND asset_type NOT LIKE 'virtual machine' AND asset_type NOT LIKE 'firewall/router' AND asset_type NOT LIKE 'switch' AND asset_type NOT LIKE 'access point'";
|
||||||
|
$type_filter = "other";
|
||||||
} else {
|
} else {
|
||||||
$type_query = "asset_type LIKE '%'";
|
$type_query = "asset_type LIKE '%'";
|
||||||
$_GET['type'] = '';
|
$_GET['type'] = '';
|
||||||
|
$type_filter = '';
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!$client_url) {
|
if (!$client_url) {
|
||||||
@@ -133,19 +139,6 @@ $sql = mysqli_query(
|
|||||||
|
|
||||||
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
$num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
|
|
||||||
|
|
||||||
// OS typeahead suggestions
|
|
||||||
$os_sql = mysqli_query($mysqli, "SELECT DISTINCT asset_os AS label FROM assets WHERE asset_archived_at IS NULL");
|
|
||||||
if ($os_sql && mysqli_num_rows($os_sql) > 0) {
|
|
||||||
$os_arr = [];
|
|
||||||
while ($row = mysqli_fetch_assoc($os_sql)) {
|
|
||||||
// jQuery UI Autocomplete expects {label: "...", value: "..."}
|
|
||||||
$label = $row['label'];
|
|
||||||
$os_arr[] = ['label' => $label, 'value' => $label];
|
|
||||||
}
|
|
||||||
$json_os = json_encode($os_arr);
|
|
||||||
}
|
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="col-sm-12 mb-3">
|
<div class="col-sm-12 mb-3">
|
||||||
@@ -185,8 +178,8 @@ if ($os_sql && mysqli_num_rows($os_sql) > 0) {
|
|||||||
<div class="card-tools">
|
<div class="card-tools">
|
||||||
<?php if (lookupUserPermission("module_support") >= 2) { ?>
|
<?php if (lookupUserPermission("module_support") >= 2) { ?>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addAssetModal">
|
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/asset/asset_add.php?<?= $client_url ?>&type=<?= $type_filter ?>">
|
||||||
<i class="fas fa-plus mr-2"></i>New <?php if (!empty($_GET['type'])) { echo ucwords(strip_tags(nullable_htmlentities($_GET['type']))); } else { echo "Asset"; } ?>
|
<i class="fas fa-plus mr-2"></i>New <?php if ($type_filter) { echo ucwords($type_filter); } else { echo "Asset"; } ?>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
@@ -716,24 +709,7 @@ if ($os_sql && mysqli_num_rows($os_sql) > 0) {
|
|||||||
|
|
||||||
<script src="../js/bulk_actions.js"></script>
|
<script src="../js/bulk_actions.js"></script>
|
||||||
|
|
||||||
<!-- JSON Autocomplete / type ahead -->
|
|
||||||
<link rel="stylesheet" href="../plugins/jquery-ui/jquery-ui.min.css">
|
|
||||||
<script src="../plugins/jquery-ui/jquery-ui.min.js"></script>
|
|
||||||
<script>
|
|
||||||
$(function() {
|
|
||||||
var operatingSystems = <?php echo $json_os; ?>;
|
|
||||||
$("#os").autocomplete({
|
|
||||||
source: operatingSystems, // Should be an array of objects with 'label' and 'value'
|
|
||||||
select: function(event, ui) {
|
|
||||||
$("#os").val(ui.item.label); // Set the input field value to the selected label
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
require_once "modals/asset/asset_add.php";
|
|
||||||
require_once "modals/asset/asset_export.php";
|
require_once "modals/asset/asset_export.php";
|
||||||
if ($client_url) {
|
if ($client_url) {
|
||||||
require_once "modals/asset/asset_import.php";
|
require_once "modals/asset/asset_import.php";
|
||||||
@@ -106,7 +106,7 @@ while ($row = mysqli_fetch_array($sql)) {
|
|||||||
<?php require_once "../includes/footer.php";
|
<?php require_once "../includes/footer.php";
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<script src='../plugins/fullcalendar/dist/index.global.js'></script>
|
<script src='/plugins/fullcalendar/dist/index.global.js'></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
document.addEventListener('DOMContentLoaded', function() {
|
document.addEventListener('DOMContentLoaded', function() {
|
||||||
@@ -86,7 +86,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<div class="card-tools">
|
<div class="card-tools">
|
||||||
<?php if (lookupUserPermission("module_client") >= 2) { ?>
|
<?php if (lookupUserPermission("module_client") >= 2) { ?>
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addClientModal">
|
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/client/client_add.php<?php if ($leads_filter) { echo "?lead=1"; } ?>">
|
||||||
<i class="fas fa-plus mr-2"></i>New
|
<i class="fas fa-plus mr-2"></i>New
|
||||||
<?php if ($leads_filter == 0) { echo "Client"; } else { echo "Lead"; } ?>
|
<?php if ($leads_filter == 0) { echo "Client"; } else { echo "Lead"; } ?>
|
||||||
</button>
|
</button>
|
||||||
@@ -137,6 +137,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<i class="fas fa-fw fa-layer-group"></i><span class="d-none d-sm-inline ml-2">Action</span> (<span id="selectedCount">0</span>)
|
<i class="fas fa-fw fa-layer-group"></i><span class="d-none d-sm-inline ml-2">Action</span> (<span id="selectedCount">0</span>)
|
||||||
</button>
|
</button>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
|
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#bulkAddTicketModal">
|
||||||
|
<i class="fas fa-fw fa-life-ring mr-2"></i>Open Tickets
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#bulkEditHourlyRateModal">
|
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#bulkEditHourlyRateModal">
|
||||||
<i class="fas fa-fw fa-clock mr-2"></i>Set Hourly Rate
|
<i class="fas fa-fw fa-clock mr-2"></i>Set Hourly Rate
|
||||||
</a>
|
</a>
|
||||||
@@ -178,49 +182,27 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<div
|
<div
|
||||||
class="collapse
|
class="collapse
|
||||||
<?php
|
<?php
|
||||||
if (
|
if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01'
|
||||||
isset($_GET['dtf'])
|
|
||||||
|| $industry_filter
|
|| $industry_filter
|
||||||
|| $referral_filter
|
|| $referral_filter
|
||||||
|| (isset($_GET['tags']) && is_array($_GET['tags']))
|
|| (isset($_GET['tags']) && is_array($_GET['tags']))
|
||||||
|| $_GET['canned_date'] !== "custom" )
|
)
|
||||||
{
|
{ echo "show"; }
|
||||||
echo "show";
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
"
|
"
|
||||||
id="advancedFilter"
|
id="advancedFilter"
|
||||||
>
|
>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="custom">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
|
||||||
<label>Date from</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date to</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Tag</label>
|
<label>Tag</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="tags[]" data-placeholder="- Select Tags -" multiple>
|
<select onchange="this.form.submit()" class="form-control select2" name="tags[]" data-placeholder="- Select Tags -" multiple>
|
||||||
@@ -504,7 +486,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
<?php
|
<?php
|
||||||
if (!empty($client_tags_display)) { ?>
|
if (!empty($client_tags_display)) { ?>
|
||||||
<div class="mt-1">
|
<div class="mt-1 text-wrap">
|
||||||
<?php echo $client_tags_display; ?>
|
<?php echo $client_tags_display; ?>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -566,10 +548,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<span class="text-secondary">Paid</span>
|
<span class="text-secondary">Paid</span>
|
||||||
<span><?php echo numfmt_format_currency($currency_format, $amount_paid, $session_company_currency); ?></span>
|
<span><?php echo numfmt_format_currency($currency_format, $amount_paid, $session_company_currency); ?></span>
|
||||||
</div>
|
</div>
|
||||||
|
<?php if ($credit_balance > 0) { ?>
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<span class="text-secondary">Credit</span>
|
<span class="text-secondary">Credit</span>
|
||||||
<span class="text-success"><?php echo numfmt_format_currency($currency_format, $credit_balance, $session_company_currency); ?></span>
|
<span class="text-success"><?php echo numfmt_format_currency($currency_format, $credit_balance, $session_company_currency); ?></span>
|
||||||
</div>
|
</div>
|
||||||
|
<?php } ?>
|
||||||
<div class="d-flex justify-content-between">
|
<div class="d-flex justify-content-between">
|
||||||
<span class="text-secondary">Monthly</span>
|
<span class="text-secondary">Monthly</span>
|
||||||
<span><?php echo numfmt_format_currency($currency_format, $recurring_monthly, $session_company_currency); ?></span>
|
<span><?php echo numfmt_format_currency($currency_format, $recurring_monthly, $session_company_currency); ?></span>
|
||||||
@@ -621,6 +605,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
require_once "modals/client/client_bulk_edit_referral.php";
|
require_once "modals/client/client_bulk_edit_referral.php";
|
||||||
require_once "modals/client/client_bulk_edit_hourly_rate.php";
|
require_once "modals/client/client_bulk_edit_hourly_rate.php";
|
||||||
require_once "modals/client/client_bulk_assign_tags.php";
|
require_once "modals/client/client_bulk_assign_tags.php";
|
||||||
|
require_once "modals/client/client_bulk_add_ticket.php";
|
||||||
require_once "modals/client/client_bulk_email.php";
|
require_once "modals/client/client_bulk_email.php";
|
||||||
?>
|
?>
|
||||||
</form>
|
</form>
|
||||||
@@ -632,7 +617,6 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<script src="../js/bulk_actions.js"></script>
|
<script src="../js/bulk_actions.js"></script>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
require_once "modals/client/client_add.php";
|
|
||||||
require_once "modals/client/client_import.php";
|
require_once "modals/client/client_import.php";
|
||||||
require_once "modals/client/client_export.php";
|
require_once "modals/client/client_export.php";
|
||||||
require_once "../includes/footer.php";
|
require_once "../includes/footer.php";
|
||||||
@@ -263,7 +263,7 @@ if (isset($_GET['contact_id'])) {
|
|||||||
<i class="fa fa-fw fa-recycle mr-2"></i>New Recurring Ticket
|
<i class="fa fa-fw fa-recycle mr-2"></i>New Recurring Ticket
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item text-dark" href="#" data-toggle="modal" data-target="#addAssetModal">
|
<a class="dropdown-item text-dark ajax-modal" href="#" data-modal-url="modals/asset/asset_add.php?<?= $client_url ?>&contact_id=<?= $contact_id ?>">
|
||||||
<i class="fa fa-fw fa-desktop mr-2"></i>New Asset
|
<i class="fa fa-fw fa-desktop mr-2"></i>New Asset
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
@@ -1175,7 +1175,6 @@ if (isset($_GET['contact_id'])) {
|
|||||||
|
|
||||||
require_once "modals/ticket/ticket_add.php";
|
require_once "modals/ticket/ticket_add.php";
|
||||||
require_once "modals/recurring_ticket/recurring_ticket_add.php";
|
require_once "modals/recurring_ticket/recurring_ticket_add.php";
|
||||||
require_once "modals/asset/asset_add.php";
|
|
||||||
require_once "modals/credential/credential_add.php";
|
require_once "modals/credential/credential_add.php";
|
||||||
require_once "modals/document/document_add.php";
|
require_once "modals/document/document_add.php";
|
||||||
require_once "modals/file/file_upload.php";
|
require_once "modals/file/file_upload.php";
|
||||||
@@ -90,7 +90,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<h3 class="card-title mt-2"><i class="fa fa-fw fa-address-book mr-2"></i>Contacts</h3>
|
<h3 class="card-title mt-2"><i class="fa fa-fw fa-address-book mr-2"></i>Contacts</h3>
|
||||||
<div class="card-tools">
|
<div class="card-tools">
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-primary" data-toggle="modal" data-target="#addContactModal">
|
<button type="button" class="btn btn-primary ajax-modal" data-modal-url="modals/contact/contact_add.php?client_id=<?= $client_id ?>">
|
||||||
<i class="fas fa-plus mr-2"></i>New Contact
|
<i class="fas fa-plus mr-2"></i>New Contact
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
<button type="button" class="btn btn-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
||||||
@@ -557,48 +557,10 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- JavaScript to Show/Hide Password Form Group -->
|
|
||||||
<script>
|
|
||||||
|
|
||||||
function generatePassword(type, id) {
|
|
||||||
// Send a GET request to ajax.php as ajax.php?get_readable_pass=true
|
|
||||||
jQuery.get(
|
|
||||||
"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);
|
|
||||||
|
|
||||||
// Set the password value to the correct modal, based on the type
|
|
||||||
if (type == "add") {
|
|
||||||
document.getElementById("password-add").value = password;
|
|
||||||
} else if (type == "edit") {
|
|
||||||
document.getElementById("password-edit-"+id.toString()).value = password;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$(document).ready(function() {
|
|
||||||
$('.authMethod').on('change', function() {
|
|
||||||
var $form = $(this).closest('.authForm');
|
|
||||||
if ($(this).val() === 'local') {
|
|
||||||
$form.find('.passwordGroup').show();
|
|
||||||
} else {
|
|
||||||
$form.find('.passwordGroup').hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('.authMethod').trigger('change');
|
|
||||||
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script src="../js/bulk_actions.js"></script>
|
<script src="../js/bulk_actions.js"></script>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once "modals/contact/contact_add.php";
|
|
||||||
require_once "modals/contact/contact_export.php";
|
require_once "modals/contact/contact_export.php";
|
||||||
if ($client_url) {
|
if ($client_url) {
|
||||||
require_once "modals/contact/contact_invite.php";
|
require_once "modals/contact/contact_invite.php";
|
||||||
45
agent/custom/includes/custom_side_nav.php
Normal file
45
agent/custom/includes/custom_side_nav.php
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<!-- Main Sidebar Container -->
|
||||||
|
<aside class="main-sidebar sidebar-dark-primary d-print-none">
|
||||||
|
|
||||||
|
<a class="pb-1 mt-1 brand-link" href="../<?php echo $config_start_page ?>">
|
||||||
|
<p class="h5"><i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
|
||||||
|
<span class="brand-text ">Back | <strong>Custom</strong>
|
||||||
|
</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">CUSTOM HEADER</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a href="index.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "index.php") { echo "active"; } ?>">
|
||||||
|
<i class="far fa-circle nav-icon"></i>
|
||||||
|
<p>custom</p>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
<!-- /.sidebar-menu -->
|
||||||
|
|
||||||
|
<div class="sidebar-custom mb-3">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<!-- /.sidebar -->
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
13
agent/custom/includes/inc_all_custom.php
Normal file
13
agent/custom/includes/inc_all_custom.php
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once "../../config.php";
|
||||||
|
require_once "../../functions.php";
|
||||||
|
require_once "../../includes/check_login.php";
|
||||||
|
require_once "../../includes/page_title.php";
|
||||||
|
require_once "../../includes/header.php";
|
||||||
|
require_once "../../includes/top_nav.php";
|
||||||
|
require_once "includes/custom_side_nav.php";
|
||||||
|
require_once "../../includes/inc_wrapper.php";
|
||||||
|
require_once "../../includes/inc_alert_feedback.php";
|
||||||
|
require_once "../../includes/filter_header.php";
|
||||||
|
|
||||||
72
agent/custom/index.php
Normal file
72
agent/custom/index.php
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
<?php require_once "includes/inc_all_custom.php"; ?>
|
||||||
|
|
||||||
|
<!-- Breadcrumbs-->
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item">
|
||||||
|
<a href="index.html">Dashboard</a>
|
||||||
|
</li>
|
||||||
|
<li class="breadcrumb-item active">Blank Page</li>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<!-- Page Content -->
|
||||||
|
<h1>Blank Page</h1>
|
||||||
|
<hr>
|
||||||
|
<p>This is a great starting point for new custom pages.</p>
|
||||||
|
<h1><?php echo $session_user_role; ?></h1>
|
||||||
|
<?php validateAdminRole(); ?>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$start_date = date('Y') . "-10-10";
|
||||||
|
|
||||||
|
echo "<H1>$start_date</H1>";
|
||||||
|
|
||||||
|
echo "<H2>User Agent</H2>";
|
||||||
|
echo getUserAgent();
|
||||||
|
|
||||||
|
|
||||||
|
?>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<input type="tel" name="phone" id="phone">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Minimal</label>
|
||||||
|
<select class="form-control select2 select2-hidden-accessible" style="width: 100%;" data-select2-id="1" tabindex="-1" aria-hidden="true">
|
||||||
|
<option selected="selected" data-select2-id="3">Alabama</option>
|
||||||
|
<option data-select2-id="35">Alaska</option>
|
||||||
|
<option data-select2-id="36">California</option>
|
||||||
|
<option data-select2-id="37">Delaware</option>
|
||||||
|
<option data-select2-id="38">Tennessee</option>
|
||||||
|
<option data-select2-id="39">Texas</option>
|
||||||
|
<option data-select2-id="40">Washington</option>
|
||||||
|
</select><span class="select2 select2-container select2-container--default select2-container--below" dir="ltr" data-select2-id="2" style="width: 100%;"><span class="selection"><span class="select2-selection select2-selection--single" role="combobox" aria-haspopup="true" aria-expanded="false" tabindex="0" aria-disabled="false" aria-labelledby="select2-nbex-container"><span class="select2-selection__rendered" id="select2-nbex-container" role="textbox" aria-readonly="true" title="Alabama">Alabama</span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span></span></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt>Requester</dt>
|
||||||
|
<dd>Sam Adams</dd>
|
||||||
|
|
||||||
|
<dt>Created</dt>
|
||||||
|
<dd><time datetime="2024-04-11T17:52:30+00:00" title="2024-04-11 13:52" data-datetime="calendar">Today at 13:52</time></dd>
|
||||||
|
|
||||||
|
<dt>Last activity</dt>
|
||||||
|
<dd><time datetime="2024-04-11T18:08:55+00:00" title="2024-04-11 14:08" data-datetime="calendar">Today at 14:08</time></dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<?php echo randomString(100); ?>
|
||||||
|
<br>
|
||||||
|
<textarea class="tinymceTest"></textarea>
|
||||||
|
|
||||||
|
<textarea class="tinymce"></textarea>
|
||||||
|
|
||||||
|
<textarea class="tinymceTicket"></textarea>
|
||||||
|
<?php
|
||||||
|
// show the current Date and Time
|
||||||
|
$date_time = date('Y-m-d H:i:s');
|
||||||
|
echo "Current Date and Time: <strong>$date_time</strong>";
|
||||||
|
?>
|
||||||
|
|
||||||
|
<script>toastr.success('Have Fun Wozz!!')</script>
|
||||||
|
|
||||||
|
<?php require_once "../../includes/footer.php";
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ITFlow - Custom GET/POST request handler
|
* ITFlow - User GET/POST request handler
|
||||||
*/
|
*/
|
||||||
|
|
||||||
require_once "../config.php";
|
require_once "../../config.php";
|
||||||
require_once "../functions.php";
|
require_once "../../functions.php";
|
||||||
require_once "../includes/check_login.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 a variable that we can use to only allow running post files via inclusion (prevents people/bots poking them)
|
||||||
define('FROM_POST_HANDLER', true);
|
define('FROM_POST_HANDLER', true);
|
||||||
@@ -24,17 +24,23 @@ $module = explode(".", basename($path))[0];
|
|||||||
$module = str_ireplace('_details', '', $module);
|
$module = str_ireplace('_details', '', $module);
|
||||||
|
|
||||||
// Dynamically load admin-related module POST logic
|
// Dynamically load admin-related module POST logic
|
||||||
if (str_contains($module, 'custom')) {
|
|
||||||
// Dynamically load any custom POST logic
|
|
||||||
|
|
||||||
include_once "post/$module.php";
|
// Load all module POST logic
|
||||||
|
// Loads everything in post/user/
|
||||||
|
// Eventually, it would be nice to only specifically load what we need like we do for admins
|
||||||
|
|
||||||
|
foreach (glob("post/*.php") as $user_module) {
|
||||||
|
if (!preg_match('/_model\.php$/', basename($user_module))) {
|
||||||
|
require_once $user_module;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Logout is the same for user and admin
|
// Logout is the same for user and admin
|
||||||
require_once "../post/logout.php";
|
require_once "../../post/logout.php";
|
||||||
|
|
||||||
// TODO: Find a home for these
|
// TODO: Find a home for these
|
||||||
|
|
||||||
require_once "../post/ai.php";
|
require_once "../../post/ai.php";
|
||||||
require_once "../post/misc.php";
|
require_once "../../post/misc.php";
|
||||||
|
|
||||||
@@ -209,7 +209,7 @@ if ($user_config_dashboard_financial_enable == 1) {
|
|||||||
|
|
||||||
<div class="col-lg-4 col-md-6 col-sm-12">
|
<div class="col-lg-4 col-md-6 col-sm-12">
|
||||||
<!-- small box -->
|
<!-- small box -->
|
||||||
<a class="small-box bg-success" href="report_profit_loss.php">
|
<a class="small-box bg-success" href="reports/profit_loss.php">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<h3><?php echo numfmt_format_currency($currency_format, $profit, "$session_company_currency"); ?></h3>
|
<h3><?php echo numfmt_format_currency($currency_format, $profit, "$session_company_currency"); ?></h3>
|
||||||
<p>Profit</p>
|
<p>Profit</p>
|
||||||
@@ -223,7 +223,7 @@ if ($user_config_dashboard_financial_enable == 1) {
|
|||||||
|
|
||||||
<div class="col-lg-6 col-md-6 col-sm-12">
|
<div class="col-lg-6 col-md-6 col-sm-12">
|
||||||
<!-- small box -->
|
<!-- small box -->
|
||||||
<a class="small-box bg-info" href="report_recurring_by_client.php">
|
<a class="small-box bg-info" href="reports/recurring_by_client.php">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<h3><?php echo numfmt_format_currency($currency_format, $recurring_monthly_total, "$session_company_currency"); ?></h3>
|
<h3><?php echo numfmt_format_currency($currency_format, $recurring_monthly_total, "$session_company_currency"); ?></h3>
|
||||||
<p>Monthly Recurring Income</p>
|
<p>Monthly Recurring Income</p>
|
||||||
@@ -252,7 +252,7 @@ if ($user_config_dashboard_financial_enable == 1) {
|
|||||||
<?php if ($config_module_enable_ticketing && $config_module_enable_accounting) { ?>
|
<?php if ($config_module_enable_ticketing && $config_module_enable_accounting) { ?>
|
||||||
<div class="col-lg-2 col-md-6 col-sm-12">
|
<div class="col-lg-2 col-md-6 col-sm-12">
|
||||||
<!-- small box -->
|
<!-- small box -->
|
||||||
<a class="small-box bg-secondary" href="report_tickets_unbilled.php">
|
<a class="small-box bg-secondary" href="reports/tickets_unbilled.php">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<h3><?php echo $unbilled_tickets; ?></h3>
|
<h3><?php echo $unbilled_tickets; ?></h3>
|
||||||
<p>Unbilled Ticket<?php if ($unbilled_tickets > 1 || $unbilled_tickets == 0) { echo "s"; } ?></p>
|
<p>Unbilled Ticket<?php if ($unbilled_tickets > 1 || $unbilled_tickets == 0) { echo "s"; } ?></p>
|
||||||
@@ -338,7 +338,7 @@ if ($user_config_dashboard_financial_enable == 1) {
|
|||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title"><i class="fas fa-fw fa-chart-area mr-2"></i>Cash Flow</h3>
|
<h3 class="card-title"><i class="fas fa-fw fa-chart-area mr-2"></i>Cash Flow</h3>
|
||||||
<div class="card-tools">
|
<div class="card-tools">
|
||||||
<a href="report_income_summary.php" class="btn btn-tool">
|
<a href="reports/income_summary.php" class="btn btn-tool">
|
||||||
<i class="fas fa-eye"></i>
|
<i class="fas fa-eye"></i>
|
||||||
</a>
|
</a>
|
||||||
<button type="button" class="btn btn-tool" data-card-widget="remove">
|
<button type="button" class="btn btn-tool" data-card-widget="remove">
|
||||||
@@ -660,7 +660,7 @@ if ($user_config_dashboard_technical_enable == 1) {
|
|||||||
<a class="small-box bg-warning" href="domains.php?sort=domain_expire&order=ASC">
|
<a class="small-box bg-warning" href="domains.php?sort=domain_expire&order=ASC">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<h3><?php echo $expiring_domains; ?></h3>
|
<h3><?php echo $expiring_domains; ?></h3>
|
||||||
<p>Expiring Domains</p>
|
<p>Expiring Domains <small>30 Day</small></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<i class="fa fa-globe"></i>
|
<i class="fa fa-globe"></i>
|
||||||
@@ -673,7 +673,7 @@ if ($user_config_dashboard_technical_enable == 1) {
|
|||||||
<a class="small-box bg-primary" href="certificates.php?sort=certificate_expire&order=ASC">
|
<a class="small-box bg-primary" href="certificates.php?sort=certificate_expire&order=ASC">
|
||||||
<div class="inner">
|
<div class="inner">
|
||||||
<h3><?php echo $expiring_certificates; ?></h3>
|
<h3><?php echo $expiring_certificates; ?></h3>
|
||||||
<p>Expiring Certificates</p>
|
<p>Expiring Certificates<small>30 Day</small></p>
|
||||||
</div>
|
</div>
|
||||||
<div class="icon">
|
<div class="icon">
|
||||||
<i class="fa fa-lock"></i>
|
<i class="fa fa-lock"></i>
|
||||||
@@ -163,17 +163,19 @@ $page_title = $row['document_name'];
|
|||||||
<div class="col-md-3 d-print-none">
|
<div class="col-md-3 d-print-none">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 mb-3">
|
<div class="col-12 mb-3">
|
||||||
<button type="button" class="btn btn-primary ajax-modal mr-2"
|
<button type="button" class="btn btn-primary ajax-modal mr-1"
|
||||||
data-modal-size="lg"
|
data-modal-size="lg"
|
||||||
data-modal-url="modals/document/document_edit.php?id=<?= $document_id ?>">
|
data-modal-url="modals/document/document_edit.php?id=<?= $document_id ?>">
|
||||||
<i class="fas fa-fw fa-edit"></i>
|
<i class="fas fa-fw fa-edit" title="Edit"></i>
|
||||||
</button>
|
</button>
|
||||||
<button type="button" class="btn btn-secondary mr-2" data-toggle="modal" data-target="#shareModal"
|
<button type="button" class="btn btn-secondary mr-1" data-toggle="modal" data-target="#shareModal"
|
||||||
onclick="populateShareModal(<?php echo "$client_id, 'Document', $document_id"; ?>)">
|
onclick="populateShareModal(<?php echo "$client_id, 'Document', $document_id"; ?>)">
|
||||||
<i class="fas fa-fw fa-share"></i>
|
<i class="fas fa-fw fa-share" title="Share"></i>
|
||||||
</button>
|
</button>
|
||||||
<a class="btn btn-success mr-2" href="post.php?export_document=<?php echo $document_id; ?>"><i class='fas fa-fw fa-file-pdf'></i></a>
|
<a class="btn btn-success mr-1" href="post.php?export_document=<?php echo $document_id; ?>"><i class='fas fa-fw fa-file-pdf' title="PDF Export"></i></a>
|
||||||
<button type="button" class="btn btn-secondary" onclick="window.print();"><i class="fas fa-fw fa-print"></i></button>
|
<button type="button" class="btn btn-secondary mr-4" onclick="window.print();"><i class="fas fa-fw fa-print" title="Print"></i></button>
|
||||||
|
<a class="btn btn-warning mr-1 confirm-link" href="post.php?archive_document=<?= $document_id ?>" title="Archive"><i class='fas fa-fw fa-archive'></i></a>
|
||||||
|
<a class="btn btn-danger confirm-link" href="post.php?delete_document=<?= $document_id ?>&from=document_details" title="Delete"><i class='fas fa-fw fa-trash-alt'></i></a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="card card-body bg-light">
|
<div class="card card-body bg-light">
|
||||||
@@ -117,34 +117,15 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) || $_GET['canned_date'] !== "custom" || $account_filter || $vendor_filter || $category_filter) { echo "show"; } ?>" id="advancedFilter">
|
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01' || $account_filter || $vendor_filter || $category_filter) { echo "show"; } ?>" id="advancedFilter">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned Date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date From</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo nullable_htmlentities($dtf); ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date To</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo nullable_htmlentities($dtt); ?>">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-2">
|
<div class="col-sm-2">
|
||||||
@@ -85,6 +85,8 @@ if (isset($_GET['query'])) {
|
|||||||
LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id
|
LEFT JOIN ticket_statuses ON ticket_status = ticket_status_id
|
||||||
WHERE ticket_archived_at IS NULL
|
WHERE ticket_archived_at IS NULL
|
||||||
AND (ticket_subject LIKE '%$query%'
|
AND (ticket_subject LIKE '%$query%'
|
||||||
|
OR ticket_details LIKE '%$query%'
|
||||||
|
OR CONCAT(ticket_prefix,ticket_number) LIKE '%$query%'
|
||||||
OR ticket_number = '$ticket_num_query')
|
OR ticket_number = '$ticket_num_query')
|
||||||
$access_permission_query
|
$access_permission_query
|
||||||
ORDER BY ticket_id DESC LIMIT 5"
|
ORDER BY ticket_id DESC LIMIT 5"
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<!-- Main Sidebar Container -->
|
<!-- Main Sidebar Container -->
|
||||||
<aside class="main-sidebar sidebar-dark-<?php if (isset($_GET['client_id'])) { echo "gray"; } else { echo nullable_htmlentities($config_theme); } ?> d-print-none">
|
<aside class="main-sidebar sidebar-dark-<?php if (isset($_GET['client_id'])) { echo "gray"; } else { echo nullable_htmlentities($config_theme); } ?> d-print-none">
|
||||||
|
|
||||||
<a class="brand-link pb-1 mt-1" href="clients.php">
|
<a class="brand-link pb-1 mt-1" href="/agent/clients.php">
|
||||||
<p class="h5">
|
<p class="h5">
|
||||||
<i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
|
<i class="nav-icon fas fa-arrow-left ml-3 mr-2"></i>
|
||||||
<span class="brand-text">
|
<span class="brand-text">
|
||||||
@@ -19,14 +19,14 @@
|
|||||||
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
|
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
|
||||||
|
|
||||||
<li class="nav-item mt-3">
|
<li class="nav-item mt-3">
|
||||||
<a href="client_overview.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "client_overview.php") { echo "active"; } ?>">
|
<a href="/agent/client_overview.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "client_overview.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-tachometer-alt"></i>
|
<i class="nav-icon fas fa-tachometer-alt"></i>
|
||||||
<p>Overview</p>
|
<p>Overview</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="contacts.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "contacts.php" || basename($_SERVER["PHP_SELF"]) == "contact_details.php") { echo "active"; } ?>">
|
<a href="/agent/contacts.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "contacts.php" || basename($_SERVER["PHP_SELF"]) == "contact_details.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-address-book"></i>
|
<i class="nav-icon fas fa-address-book"></i>
|
||||||
<p>
|
<p>
|
||||||
Contacts
|
Contacts
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="locations.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "locations.php") { echo "active"; } ?>">
|
<a href="/agent/locations.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "locations.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-map-marker-alt"></i>
|
<i class="nav-icon fas fa-map-marker-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Locations
|
Locations
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
<li class="nav-header mt-3">SUPPORT</li>
|
<li class="nav-header mt-3">SUPPORT</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="tickets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "tickets.php" || basename($_SERVER["PHP_SELF"]) == "ticket.php") { echo "active"; } ?>">
|
<a href="/agent/tickets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "tickets.php" || basename($_SERVER["PHP_SELF"]) == "ticket.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-life-ring"></i>
|
<i class="nav-icon fas fa-life-ring"></i>
|
||||||
<p>
|
<p>
|
||||||
Tickets
|
Tickets
|
||||||
@@ -69,7 +69,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="recurring_tickets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_tickets.php") { echo "active"; } ?>">
|
<a href="/agent/recurring_tickets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_tickets.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-redo-alt"></i>
|
<i class="nav-icon fas fa-redo-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Recurring Tickets
|
Recurring Tickets
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="projects.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "projects.php" || basename($_SERVER["PHP_SELF"]) == "project_details.php") { echo "active"; } ?>">
|
<a href="/agent/projects.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "projects.php" || basename($_SERVER["PHP_SELF"]) == "project_details.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-project-diagram"></i>
|
<i class="nav-icon fas fa-project-diagram"></i>
|
||||||
<p>
|
<p>
|
||||||
Projects
|
Projects
|
||||||
@@ -97,7 +97,7 @@
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="vendors.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "vendors.php") { echo "active"; } ?>">
|
<a href="/agent/vendors.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "vendors.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-building"></i>
|
<i class="nav-icon fas fa-building"></i>
|
||||||
<p>
|
<p>
|
||||||
Vendors
|
Vendors
|
||||||
@@ -110,7 +110,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="calendar.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "calendar.php") { echo "active"; } ?>">
|
<a href="/agent/calendar.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "calendar.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-calendar-alt"></i>
|
<i class="nav-icon fas fa-calendar-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Calendar
|
Calendar
|
||||||
@@ -128,7 +128,7 @@
|
|||||||
|
|
||||||
<?php if (lookupUserPermission("module_support") >= 1) { ?>
|
<?php if (lookupUserPermission("module_support") >= 1) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="assets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "assets.php" || basename($_SERVER["PHP_SELF"]) == "client_asset_details.php") { echo "active"; } ?>">
|
<a href="/agent/assets.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "assets.php" || basename($_SERVER["PHP_SELF"]) == "client_asset_details.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-desktop"></i>
|
<i class="nav-icon fas fa-desktop"></i>
|
||||||
<p>
|
<p>
|
||||||
Assets
|
Assets
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="software.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "software.php") { echo "active"; } ?>">
|
<a href="/agent/software.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "software.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-cube"></i>
|
<i class="nav-icon fas fa-cube"></i>
|
||||||
<p>
|
<p>
|
||||||
Licenses
|
Licenses
|
||||||
@@ -155,7 +155,7 @@
|
|||||||
|
|
||||||
<?php if (lookupUserPermission("module_credential") >= 1) { ?>
|
<?php if (lookupUserPermission("module_credential") >= 1) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="credentials.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "credentials.php") { echo "active"; } ?>">
|
<a href="/agent/credentials.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "credentials.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-key"></i>
|
<i class="nav-icon fas fa-key"></i>
|
||||||
<p>
|
<p>
|
||||||
Credentials
|
Credentials
|
||||||
@@ -169,7 +169,7 @@
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="networks.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "networks.php") { echo "active"; } ?>">
|
<a href="/agent/networks.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "networks.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-network-wired"></i>
|
<i class="nav-icon fas fa-network-wired"></i>
|
||||||
<p>
|
<p>
|
||||||
Networks
|
Networks
|
||||||
@@ -182,7 +182,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="racks.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "racks.php") { echo "active"; } ?>">
|
<a href="/agent/racks.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "racks.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-server"></i>
|
<i class="nav-icon fas fa-server"></i>
|
||||||
<p>
|
<p>
|
||||||
Racks
|
Racks
|
||||||
@@ -195,7 +195,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="certificates.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "certificates.php") { echo "active"; } ?>">
|
<a href="/agent/certificates.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "certificates.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-lock"></i>
|
<i class="nav-icon fas fa-lock"></i>
|
||||||
<p>
|
<p>
|
||||||
Certificates
|
Certificates
|
||||||
@@ -209,7 +209,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="domains.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "domains.php") { echo "active"; } ?>">
|
<a href="/agent/domains.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "domains.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-globe"></i>
|
<i class="nav-icon fas fa-globe"></i>
|
||||||
<p>
|
<p>
|
||||||
Domains
|
Domains
|
||||||
@@ -223,7 +223,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="services.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "services.php") { echo "active"; } ?>">
|
<a href="/agent/services.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "services.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-stream"></i>
|
<i class="nav-icon fas fa-stream"></i>
|
||||||
<p>
|
<p>
|
||||||
Services
|
Services
|
||||||
@@ -236,7 +236,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="documents.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "documents.php" || basename($_SERVER["PHP_SELF"]) == "document_details.php") { echo "active"; } ?>">
|
<a href="/agent/documents.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "documents.php" || basename($_SERVER["PHP_SELF"]) == "document_details.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-folder"></i>
|
<i class="nav-icon fas fa-folder"></i>
|
||||||
<p>
|
<p>
|
||||||
Documents
|
Documents
|
||||||
@@ -252,7 +252,7 @@
|
|||||||
|
|
||||||
<!-- Allow files even without module_support for things like contracts, etc. ) -->
|
<!-- Allow files even without module_support for things like contracts, etc. ) -->
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="files.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "files.php") { echo "active"; } ?>">
|
<a href="/agent/files.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "files.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-paperclip"></i>
|
<i class="nav-icon fas fa-paperclip"></i>
|
||||||
<p>
|
<p>
|
||||||
Files
|
Files
|
||||||
@@ -273,7 +273,7 @@
|
|||||||
<?php if (lookupUserPermission("module_sales") >= 1) { ?>
|
<?php if (lookupUserPermission("module_sales") >= 1) { ?>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="invoices.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "invoices.php" || basename($_SERVER["PHP_SELF"]) == "invoice.php") { echo "active"; } ?>">
|
<a href="/agent/invoices.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "invoices.php" || basename($_SERVER["PHP_SELF"]) == "invoice.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-file-invoice"></i>
|
<i class="nav-icon fas fa-file-invoice"></i>
|
||||||
<p>
|
<p>
|
||||||
Invoices
|
Invoices
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="recurring_invoices.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_invoices.php" || basename($_SERVER["PHP_SELF"]) == "recurring_invoice.php") { echo "active"; } ?>">
|
<a href="/agent/recurring_invoices.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_invoices.php" || basename($_SERVER["PHP_SELF"]) == "recurring_invoice.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-redo-alt"></i>
|
<i class="nav-icon fas fa-redo-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Recurring Invoices
|
Recurring Invoices
|
||||||
@@ -299,7 +299,7 @@
|
|||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="quotes.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "quotes.php" || basename($_SERVER["PHP_SELF"]) == "quote.php") { echo "active"; } ?>">
|
<a href="/agent/quotes.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "quotes.php" || basename($_SERVER["PHP_SELF"]) == "quote.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-comment-dollar"></i>
|
<i class="nav-icon fas fa-comment-dollar"></i>
|
||||||
<p>
|
<p>
|
||||||
Quotes
|
Quotes
|
||||||
@@ -315,7 +315,7 @@
|
|||||||
|
|
||||||
<?php if (lookupUserPermission("module_financial") >= 1) { ?>
|
<?php if (lookupUserPermission("module_financial") >= 1) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="payments.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "payments.php") { echo "active"; } ?>">
|
<a href="/agent/payments.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "payments.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-credit-card"></i>
|
<i class="nav-icon fas fa-credit-card"></i>
|
||||||
<p>
|
<p>
|
||||||
Payments
|
Payments
|
||||||
@@ -329,7 +329,7 @@
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="trips.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "trips.php") { echo "active"; } ?>">
|
<a href="/agent/trips.php?client_id=<?php echo $client_id; ?>" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "trips.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-route"></i>
|
<i class="nav-icon fas fa-route"></i>
|
||||||
<p>
|
<p>
|
||||||
Trips
|
Trips
|
||||||
19
agent/includes/inc_all.php
Normal file
19
agent/includes/inc_all.php
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?php
|
||||||
|
// Configuration & core
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/config.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/functions.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/check_login.php';
|
||||||
|
|
||||||
|
// Page setup
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/page_title.php';
|
||||||
|
|
||||||
|
// Layout UI
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php';
|
||||||
|
require_once 'includes/get_side_nav_counts.php';
|
||||||
|
require_once 'includes/side_nav.php';
|
||||||
|
|
||||||
|
// Wrapper & alerts
|
||||||
|
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';
|
||||||
@@ -1,10 +1,9 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once "../config.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/config.php';
|
||||||
require_once "../functions.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/functions.php';
|
||||||
require_once "../includes/router.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/check_login.php';
|
||||||
require_once "../includes/check_login.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/page_title.php';
|
||||||
require_once "../includes/page_title.php";
|
|
||||||
|
|
||||||
// Perms
|
// Perms
|
||||||
enforceUserPermission('module_client');
|
enforceUserPermission('module_client');
|
||||||
@@ -36,7 +35,7 @@ if (isset($_GET['client_id'])) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (mysqli_num_rows($sql) == 0) {
|
if (mysqli_num_rows($sql) == 0) {
|
||||||
require_once "../includes/header.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
|
||||||
|
|
||||||
echo "<center><h1 class='text-secondary mt-5'>Nothing to see here</h1></center>";
|
echo "<center><h1 class='text-secondary mt-5'>Nothing to see here</h1></center>";
|
||||||
} else {
|
} else {
|
||||||
@@ -305,10 +304,10 @@ if (isset($_GET['client_id'])) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
require_once "../includes/header.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
|
||||||
require_once "../includes/top_nav.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php';
|
||||||
require_once "includes/client_side_nav.php";
|
require_once 'includes/client_side_nav.php';
|
||||||
require_once "../includes/inc_wrapper.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_wrapper.php';
|
||||||
require_once "../includes/inc_alert_feedback.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/inc_alert_feedback.php';
|
||||||
require_once "includes/inc_client_top_head.php";
|
require_once 'includes/inc_client_top_head.php';
|
||||||
require_once "../includes/filter_header.php";
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/filter_header.php';
|
||||||
12
agent/includes/inc_client_overview_all.php
Normal file
12
agent/includes/inc_client_overview_all.php
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?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';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/header.php';
|
||||||
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/includes/top_nav.php';
|
||||||
|
require_once 'includes/client_overview_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';
|
||||||
@@ -1,3 +1,5 @@
|
|||||||
|
<?php $show_add_credit = 0; // Remove once credits is added hides the button ?>
|
||||||
|
|
||||||
<div class="card d-print-none">
|
<div class="card d-print-none">
|
||||||
<div class="card-header pb-1 pt-2 px-3">
|
<div class="card-header pb-1 pt-2 px-3">
|
||||||
<div class="card-title">
|
<div class="card-title">
|
||||||
@@ -16,11 +18,13 @@
|
|||||||
<i class="fas fa-fw fa-edit mr-2"></i>Edit Client
|
<i class="fas fa-fw fa-edit mr-2"></i>Edit Client
|
||||||
</a>
|
</a>
|
||||||
<?php if (lookupUserPermission("module_billing") >= 2) { ?>
|
<?php if (lookupUserPermission("module_billing") >= 2) { ?>
|
||||||
|
<?php if ($show_add_credit) { ?>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#addCreditModal">
|
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#addCreditModal">
|
||||||
<i class="fas fa-fw fa-wallet mr-2"></i>Add Credit
|
<i class="fas fa-fw fa-wallet mr-2"></i>Add Credit
|
||||||
</a>
|
</a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
<?php } ?>
|
||||||
<?php if (lookupUserPermission("module_client") >= 3) { ?>
|
<?php if (lookupUserPermission("module_client") >= 3) { ?>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#exportClientPDFModal">
|
<a class="dropdown-item" href="#" data-toggle="modal" data-target="#exportClientPDFModal">
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
<!-- Main Sidebar Container -->
|
<!-- Main Sidebar Container -->
|
||||||
<aside class="main-sidebar sidebar-dark-<?php echo nullable_htmlentities($config_theme); ?> d-print-none">
|
<aside class="main-sidebar sidebar-dark-<?php echo nullable_htmlentities($config_theme); ?> d-print-none">
|
||||||
|
|
||||||
<a class="brand-link" href="dashboard.php">
|
<a class="brand-link" href="/agent/dashboard.php">
|
||||||
<div class="brand-image"></div>
|
<div class="brand-image"></div>
|
||||||
<span class="brand-text h4"><?php echo nullable_htmlentities($session_company_name); ?></span>
|
<span class="brand-text h4"><?php echo nullable_htmlentities($session_company_name); ?></span>
|
||||||
</a>
|
</a>
|
||||||
@@ -13,14 +13,14 @@
|
|||||||
<nav>
|
<nav>
|
||||||
<ul class="nav nav-pills nav-sidebar flex-column mt-3" data-widget="treeview" data-accordion="false">
|
<ul class="nav nav-pills nav-sidebar flex-column mt-3" data-widget="treeview" data-accordion="false">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="dashboard.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "dashboard.php") { echo "active"; } ?>">
|
<a href="/agent/dashboard.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "dashboard.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-tachometer-alt"></i>
|
<i class="nav-icon fas fa-tachometer-alt"></i>
|
||||||
<p>Dashboard</p>
|
<p>Dashboard</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<?php if (lookupUserPermission("module_client") >= 1) { ?>
|
<?php if (lookupUserPermission("module_client") >= 1) { ?>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="clients.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "clients.php") { echo "active"; } ?>">
|
<a href="/agent/clients.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "clients.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-users"></i>
|
<i class="nav-icon fas fa-users"></i>
|
||||||
<p>
|
<p>
|
||||||
Clients
|
Clients
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<?php if ($config_module_enable_ticketing == 1) { ?>
|
<?php if ($config_module_enable_ticketing == 1) { ?>
|
||||||
<li class="nav-header mt-3">SUPPORT</li>
|
<li class="nav-header mt-3">SUPPORT</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="tickets.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "tickets.php" || basename($_SERVER["PHP_SELF"]) == "ticket.php") { echo "active"; } ?>">
|
<a href="/agent/tickets.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "tickets.php" || basename($_SERVER["PHP_SELF"]) == "ticket.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-life-ring"></i>
|
<i class="nav-icon fas fa-life-ring"></i>
|
||||||
<p>
|
<p>
|
||||||
Tickets
|
Tickets
|
||||||
@@ -47,7 +47,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="recurring_tickets.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_tickets.php") { echo "active"; } ?>">
|
<a href="/agent/recurring_tickets.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_tickets.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-redo-alt"></i>
|
<i class="nav-icon fas fa-redo-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Recurring Tickets
|
Recurring Tickets
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="projects.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "projects.php" || basename($_SERVER["PHP_SELF"]) == "project_details.php") { echo "active"; } ?>">
|
<a href="/agent/projects.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "projects.php" || basename($_SERVER["PHP_SELF"]) == "project_details.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-project-diagram"></i>
|
<i class="nav-icon fas fa-project-diagram"></i>
|
||||||
<p>
|
<p>
|
||||||
Projects
|
Projects
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="calendar.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "calendar.php") { echo "active"; } ?>">
|
<a href="/agent/calendar.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "calendar.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-calendar-alt"></i>
|
<i class="nav-icon fas fa-calendar-alt"></i>
|
||||||
<p>Calendar</p>
|
<p>Calendar</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -80,7 +80,7 @@
|
|||||||
<?php if ($config_module_enable_accounting == 1 && lookupUserPermission("module_sales") >= 1) { ?>
|
<?php if ($config_module_enable_accounting == 1 && lookupUserPermission("module_sales") >= 1) { ?>
|
||||||
<li class="nav-header mt-3">BILLING</li>
|
<li class="nav-header mt-3">BILLING</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="quotes.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "quotes.php" || basename($_SERVER["PHP_SELF"]) == "quote.php") { echo "active"; } ?>">
|
<a href="/agent/quotes.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "quotes.php" || basename($_SERVER["PHP_SELF"]) == "quote.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-comment-dollar"></i>
|
<i class="nav-icon fas fa-comment-dollar"></i>
|
||||||
<p>
|
<p>
|
||||||
Quotes
|
Quotes
|
||||||
@@ -91,7 +91,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="invoices.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "invoices.php" || basename($_SERVER["PHP_SELF"]) == "invoice.php") { echo "active"; } ?>">
|
<a href="/agent/invoices.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "invoices.php" || basename($_SERVER["PHP_SELF"]) == "invoice.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-file-invoice"></i>
|
<i class="nav-icon fas fa-file-invoice"></i>
|
||||||
<p>
|
<p>
|
||||||
Invoices
|
Invoices
|
||||||
@@ -102,7 +102,7 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="recurring_invoices.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_invoices.php" || basename($_SERVER["PHP_SELF"]) == "recurring_invoice.php") { echo "active"; } ?>">
|
<a href="/agent/recurring_invoices.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_invoices.php" || basename($_SERVER["PHP_SELF"]) == "recurring_invoice.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-redo-alt"></i>
|
<i class="nav-icon fas fa-redo-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Recurring Invoices
|
Recurring Invoices
|
||||||
@@ -113,13 +113,13 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="revenues.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "revenues.php") { echo "active"; } ?>">
|
<a href="/agent/revenues.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "revenues.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-hand-holding-usd"></i>
|
<i class="nav-icon fas fa-hand-holding-usd"></i>
|
||||||
<p>Revenues</p>
|
<p>Revenues</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="products.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "products.php") { echo "active"; } ?>">
|
<a href="/agent/products.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "products.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-box-open"></i>
|
<i class="nav-icon fas fa-box-open"></i>
|
||||||
<p>Products</p>
|
<p>Products</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -128,25 +128,25 @@
|
|||||||
<?php if ($config_module_enable_accounting == 1 && lookupUserPermission("module_financial") >= 1) { ?>
|
<?php if ($config_module_enable_accounting == 1 && lookupUserPermission("module_financial") >= 1) { ?>
|
||||||
<li class="nav-header mt-3">FINANCE</li>
|
<li class="nav-header mt-3">FINANCE</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="payments.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "payments.php") { echo "active"; } ?>">
|
<a href="/agent/payments.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "payments.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-credit-card"></i>
|
<i class="nav-icon fas fa-credit-card"></i>
|
||||||
<p>Payments</p>
|
<p>Payments</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="vendors.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "vendors.php") { echo "active"; } ?>">
|
<a href="/agent/vendors.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "vendors.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-building"></i>
|
<i class="nav-icon fas fa-building"></i>
|
||||||
<p>Vendors</p>
|
<p>Vendors</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="expenses.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "expenses.php") { echo "active"; } ?>">
|
<a href="/agent/expenses.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "expenses.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-shopping-cart"></i>
|
<i class="nav-icon fas fa-shopping-cart"></i>
|
||||||
<p>Expenses</p>
|
<p>Expenses</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="recurring_expenses.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_expenses.php") { echo "active"; } ?>">
|
<a href="/agent/recurring_expenses.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "recurring_expenses.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-redo-alt"></i>
|
<i class="nav-icon fas fa-redo-alt"></i>
|
||||||
<p>
|
<p>
|
||||||
Recurring Expenses
|
Recurring Expenses
|
||||||
@@ -157,19 +157,19 @@
|
|||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="accounts.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "accounts.php") { echo "active"; } ?>">
|
<a href="/agent/accounts.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "accounts.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-piggy-bank"></i>
|
<i class="nav-icon fas fa-piggy-bank"></i>
|
||||||
<p>Accounts</p>
|
<p>Accounts</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="transfers.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "transfers.php") { echo "active"; } ?>">
|
<a href="/agent/transfers.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "transfers.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-exchange-alt"></i>
|
<i class="nav-icon fas fa-exchange-alt"></i>
|
||||||
<p>Transfers</p>
|
<p>Transfers</p>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="trips.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "trips.php") { echo "active"; } ?>">
|
<a href="/agent/trips.php" class="nav-link <?php if (basename($_SERVER["PHP_SELF"]) == "trips.php") { echo "active"; } ?>">
|
||||||
<i class="nav-icon fas fa-route"></i>
|
<i class="nav-icon fas fa-route"></i>
|
||||||
<p>Trips</p>
|
<p>Trips</p>
|
||||||
</a>
|
</a>
|
||||||
@@ -178,7 +178,7 @@
|
|||||||
|
|
||||||
<?php if (lookupUserPermission("module_client") >= 1) { ?>
|
<?php if (lookupUserPermission("module_client") >= 1) { ?>
|
||||||
<li class="nav-item mt-3">
|
<li class="nav-item mt-3">
|
||||||
<a href="contacts.php" class="nav-link">
|
<a href="/agent/contacts.php" class="nav-link">
|
||||||
<i class="fas fa-users nav-icon"></i>
|
<i class="fas fa-users nav-icon"></i>
|
||||||
<p>Client Overview</p>
|
<p>Client Overview</p>
|
||||||
<i class="fas fa-angle-right nav-icon float-right"></i>
|
<i class="fas fa-angle-right nav-icon float-right"></i>
|
||||||
@@ -188,7 +188,7 @@
|
|||||||
|
|
||||||
<?php if (lookupUserPermission("module_reporting") >= 1) { ?>
|
<?php if (lookupUserPermission("module_reporting") >= 1) { ?>
|
||||||
<li class="nav-item mt-3">
|
<li class="nav-item mt-3">
|
||||||
<a href="report_overview.php" class="nav-link">
|
<a href="/agent/reports/" class="nav-link">
|
||||||
<i class="fas fa-chart-line nav-icon"></i>
|
<i class="fas fa-chart-line nav-icon"></i>
|
||||||
<p>Reports</p>
|
<p>Reports</p>
|
||||||
<i class="fas fa-angle-right nav-icon float-right"></i>
|
<i class="fas fa-angle-right nav-icon float-right"></i>
|
||||||
@@ -15,10 +15,8 @@ require_once "includes/inc_all.php";
|
|||||||
<!-- Page Content -->
|
<!-- Page Content -->
|
||||||
<h1>Blank Page</h1>
|
<h1>Blank Page</h1>
|
||||||
<hr>
|
<hr>
|
||||||
|
|
||||||
|
<meta http-equiv="refresh" content="0;url=<?php echo $config_start_page; ?>">
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
if (isset($config_start_page)) { ?>
|
|
||||||
<meta http-equiv="refresh" content="0;url=<?php echo $config_start_page; ?>">
|
|
||||||
<?php }
|
|
||||||
|
|
||||||
require_once "../includes/footer.php";
|
require_once "../includes/footer.php";
|
||||||
@@ -163,7 +163,9 @@ if (isset($_GET['invoice_id'])) {
|
|||||||
//Product autocomplete
|
//Product autocomplete
|
||||||
$products_sql = mysqli_query($mysqli, "
|
$products_sql = mysqli_query($mysqli, "
|
||||||
SELECT
|
SELECT
|
||||||
product_name AS label,
|
CONCAT(product_code, ' - ', product_name) AS label,
|
||||||
|
product_name,
|
||||||
|
product_code,
|
||||||
product_type AS type,
|
product_type AS type,
|
||||||
product_description AS description,
|
product_description AS description,
|
||||||
product_price AS price,
|
product_price AS price,
|
||||||
@@ -247,12 +249,12 @@ if (isset($_GET['invoice_id'])) {
|
|||||||
<?php if ($invoice_status !== 'Paid' && $invoice_status !== 'Cancelled' && $invoice_status !== 'Draft' && $invoice_status !== 'Non-Billable' && $invoice_amount != 0) { ?>
|
<?php if ($invoice_status !== 'Paid' && $invoice_status !== 'Cancelled' && $invoice_status !== 'Draft' && $invoice_status !== 'Non-Billable' && $invoice_amount != 0) { ?>
|
||||||
|
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
<button type="button" class="btn btn-success ajax-modal" data-modal-url="modals/invoice/invoice_pay.php?id=<?= $invoice_id ?>"><i class="fa fa-fw fa-credit-card mr-2"></i>Add Payment</button>
|
<button type="button" class="btn btn-success ajax-modal" data-modal-url="modals/payment/payment_add.php?id=<?= $invoice_id ?>"><i class="fa fa-fw fa-credit-card mr-2"></i>Add Payment</button>
|
||||||
|
|
||||||
<?php if (mysqli_num_rows($sql_saved_payment_methods) > 0 && ($invoice_status === 'Sent' || $invoice_status === 'Viewed')) { ?>
|
<?php if (mysqli_num_rows($sql_saved_payment_methods) > 0 && ($invoice_status === 'Sent' || $invoice_status === 'Viewed')) { ?>
|
||||||
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
<button type="button" class="btn btn-success dropdown-toggle dropdown-toggle-split" data-toggle="dropdown"></button>
|
||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/invoice/invoice_saved_method_pay.php?id=<?= $invoice_id ?>"><i class="fas fa-fw fa-wallet mr-2"></i>Pay with Saved Card</a>
|
<a class="dropdown-item ajax-modal" href="#" data-modal-url="modals/payment/payment_saved_method_add.php?id=<?= $invoice_id ?>"><i class="fas fa-fw fa-wallet mr-2"></i>Pay with Saved Card</a>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
@@ -747,12 +749,20 @@ require_once "../includes/footer.php";
|
|||||||
<script>
|
<script>
|
||||||
|
|
||||||
$(function() {
|
$(function() {
|
||||||
|
|
||||||
var availableProducts = <?php echo $json_products ?? '[]'?>;
|
var availableProducts = <?php echo $json_products ?? '[]'?>;
|
||||||
|
|
||||||
$("#name").autocomplete({
|
$("#name").autocomplete({
|
||||||
source: availableProducts,
|
|
||||||
minLength: 1,
|
minLength: 1,
|
||||||
delay: 0,
|
delay: 0,
|
||||||
|
source: function(request, response) {
|
||||||
|
var term = $.ui.autocomplete.escapeRegex(request.term.toLowerCase());
|
||||||
|
var matcher = new RegExp(term, "i");
|
||||||
|
var matches = $.grep(availableProducts, function(item) {
|
||||||
|
return matcher.test(item.label) || matcher.test(item.product_name) || matcher.test(item.product_code);
|
||||||
|
});
|
||||||
|
response(matches);
|
||||||
|
},
|
||||||
select: function (event, ui) {
|
select: function (event, ui) {
|
||||||
$("#name").val(ui.item.label);
|
$("#name").val(ui.item.label);
|
||||||
$("#desc").val(ui.item.description);
|
$("#desc").val(ui.item.description);
|
||||||
@@ -97,6 +97,7 @@ $sql = mysqli_query(
|
|||||||
"SELECT SQL_CALC_FOUND_ROWS * FROM invoices
|
"SELECT SQL_CALC_FOUND_ROWS * FROM invoices
|
||||||
LEFT JOIN clients ON invoice_client_id = client_id
|
LEFT JOIN clients ON invoice_client_id = client_id
|
||||||
LEFT JOIN categories ON invoice_category_id = category_id
|
LEFT JOIN categories ON invoice_category_id = category_id
|
||||||
|
LEFT JOIN recurring_invoices ON invoice_recurring_invoice_id = recurring_invoice_id
|
||||||
WHERE ($status_query)
|
WHERE ($status_query)
|
||||||
$overdue_query
|
$overdue_query
|
||||||
$category_query
|
$category_query
|
||||||
@@ -230,34 +231,15 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="collapse mt-3 <?php if (!empty($_GET['dtf']) || $_GET['canned_date'] !== "custom" ) { echo "show"; } ?>" id="advancedFilter">
|
<div class="collapse mt-3 <?php if (isset($_GET['dtf']) && $_GET['dtf'] !== '1970-01-01') { echo "show"; } ?>" id="advancedFilter">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-3">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Canned Date</label>
|
<label>Date range</label>
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="canned_date">
|
<input type="text" id="dateFilter" class="form-control" autocomplete="off">
|
||||||
<option <?php if ($_GET['canned_date'] == "custom") { echo "selected"; } ?> value="custom">Custom</option>
|
<input type="hidden" name="canned_date" id="canned_date" value="<?php echo nullable_htmlentities($_GET['canned_date']) ?? ''; ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "today") { echo "selected"; } ?> value="today">Today</option>
|
<input type="hidden" name="dtf" id="dtf" value="<?php echo nullable_htmlentities($dtf ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "yesterday") { echo "selected"; } ?> value="yesterday">Yesterday</option>
|
<input type="hidden" name="dtt" id="dtt" value="<?php echo nullable_htmlentities($dtt ?? ''); ?>">
|
||||||
<option <?php if ($_GET['canned_date'] == "thisweek") { echo "selected"; } ?> value="thisweek">This Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastweek") { echo "selected"; } ?> value="lastweek">Last Week</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thismonth") { echo "selected"; } ?> value="thismonth">This Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastmonth") { echo "selected"; } ?> value="lastmonth">Last Month</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "thisyear") { echo "selected"; } ?> value="thisyear">This Year</option>
|
|
||||||
<option <?php if ($_GET['canned_date'] == "lastyear") { echo "selected"; } ?> value="lastyear">Last Year</option>
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date From</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtf" max="2999-12-31" value="<?php echo $dtf; ?>">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-2">
|
|
||||||
<div class="form-group">
|
|
||||||
<label>Date To</label>
|
|
||||||
<input onchange="this.form.submit()" type="date" class="form-control" name="dtt" max="2999-12-31" value="<?php echo $dtt; ?>">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -317,6 +299,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
Status <?php if ($sort == 'invoice_status') { echo $order_icon; } ?>
|
Status <?php if ($sort == 'invoice_status') { echo $order_icon; } ?>
|
||||||
</a>
|
</a>
|
||||||
</th>
|
</th>
|
||||||
|
<th>Recurring</th>
|
||||||
<th class="text-center">Action</th>
|
<th class="text-center">Action</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
@@ -349,6 +332,16 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
if ($client_net_terms == 0) {
|
if ($client_net_terms == 0) {
|
||||||
$client_net_terms = $config_default_net_terms;
|
$client_net_terms = $config_default_net_terms;
|
||||||
}
|
}
|
||||||
|
$recurring_invoice_id = intval($row['recurring_invoice_id']);
|
||||||
|
$recurring_invoice_prefix = nullable_htmlentities($row['recurring_invoice_prefix']);
|
||||||
|
$recurring_invoice_number = nullable_htmlentities($row['recurring_invoice_number']);
|
||||||
|
if($recurring_invoice_id) {
|
||||||
|
$recurring_invoice_display = "<i class='fas fa-fw fa-redo-alt text-secondary mr-1'></i><a href='recurring_invoice.php?recurring_invoice_id=$recurring_invoice_id'>$recurring_invoice_prefix$recurring_invoice_number</a>";
|
||||||
|
} else {
|
||||||
|
$recurring_invoice_display = "-";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
$now = time();
|
$now = time();
|
||||||
|
|
||||||
@@ -386,6 +379,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<?php echo $invoice_status; ?>
|
<?php echo $invoice_status; ?>
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
|
<td><?= $recurring_invoice_display ?></td>
|
||||||
<td>
|
<td>
|
||||||
<div class="dropdown dropleft text-center">
|
<div class="dropdown dropleft text-center">
|
||||||
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
|
<button class="btn btn-secondary btn-sm" type="button" data-toggle="dropdown">
|
||||||
@@ -394,7 +388,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
<div class="dropdown-menu">
|
<div class="dropdown-menu">
|
||||||
<?php if ($invoice_status !== 'Paid' && $invoice_status !== 'Cancelled' && $invoice_status !== 'Draft' && $invoice_status !== 'Non-Billable' && $invoice_amount != 0) { ?>
|
<?php if ($invoice_status !== 'Paid' && $invoice_status !== 'Cancelled' && $invoice_status !== 'Draft' && $invoice_status !== 'Non-Billable' && $invoice_amount != 0) { ?>
|
||||||
<a class="dropdown-item ajax-modal" href="#"
|
<a class="dropdown-item ajax-modal" href="#"
|
||||||
data-modal-url="modals/invoice/invoice_pay.php?id=<?= $invoice_id ?>">
|
data-modal-url="modals/payment/payment_add.php?id=<?= $invoice_id ?>">
|
||||||
<i class="fa fa-fw fa-credit-card mr-2"></i>Add Payment
|
<i class="fa fa-fw fa-credit-card mr-2"></i>Add Payment
|
||||||
</a>
|
</a>
|
||||||
<div class="dropdown-divider"></div>
|
<div class="dropdown-divider"></div>
|
||||||
@@ -454,6 +448,6 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
|||||||
|
|
||||||
<?php
|
<?php
|
||||||
require_once "modals/invoice/invoice_add.php";
|
require_once "modals/invoice/invoice_add.php";
|
||||||
if ($client_url) { require_once "modals/invoice/invoice_payment_add_bulk.php"; }
|
if ($client_url) { require_once "modals/payment/payment_bulk_add.php"; }
|
||||||
require_once "modals/invoice/invoice_export.php";
|
require_once "modals/invoice/invoice_export.php";
|
||||||
require_once "../includes/footer.php";
|
require_once "../includes/footer.php";
|
||||||
@@ -23,6 +23,15 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function displayTime() {
|
function displayTime() {
|
||||||
|
|
||||||
|
// Show hrs, mins, sec input placeholders if auto-start is off
|
||||||
|
if (elapsedSecs === 0) {
|
||||||
|
document.getElementById("hours").value = "";
|
||||||
|
document.getElementById("minutes").value = "";
|
||||||
|
document.getElementById("seconds").value = "";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let totalSeconds = elapsedSecs;
|
let totalSeconds = elapsedSecs;
|
||||||
let hours = Math.floor(totalSeconds / 3600);
|
let hours = Math.floor(totalSeconds / 3600);
|
||||||
totalSeconds %= 3600;
|
totalSeconds %= 3600;
|
||||||
496
agent/modals/asset/asset_add.php
Normal file
496
agent/modals/asset/asset_add.php
Normal file
@@ -0,0 +1,496 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require_once '../../../includes/modal_header.php';
|
||||||
|
|
||||||
|
$client_id = intval($_GET['client_id'] ?? 0);
|
||||||
|
$contact_id = intval($_GET['contact_id'] ?? 0);
|
||||||
|
$type = nullable_htmlentities($_GET['type'] ?? '');
|
||||||
|
|
||||||
|
if ($client_id) {
|
||||||
|
$sql_network_select = mysqli_query($mysqli, "SELECT * FROM networks WHERE network_archived_at IS NULL AND network_client_id = $client_id ORDER BY network_name ASC");
|
||||||
|
$sql_vendor_select = mysqli_query($mysqli, "SELECT * FROM vendors WHERE vendor_archived_at IS NULL AND vendor_client_id = $client_id ORDER BY vendor_name ASC");
|
||||||
|
$sql_location_select = mysqli_query($mysqli, "SELECT location_id, location_name FROM locations WHERE location_archived_at IS NULL AND location_client_id = $client_id ORDER BY location_name ASC");
|
||||||
|
$sql_contact_select = mysqli_query($mysqli, "SELECT * FROM contacts WHERE contact_archived_at IS NULL AND contact_client_id = $client_id ORDER BY contact_name ASC");
|
||||||
|
} else {
|
||||||
|
$sql_client_select = mysqli_query($mysqli, "SELECT client_id, client_name FROM clients WHERE client_archived_at IS NULL $access_permission_query ORDER BY client_name ASC");
|
||||||
|
}
|
||||||
|
|
||||||
|
// OS typeahead suggestions
|
||||||
|
$os_sql = mysqli_query($mysqli, "SELECT DISTINCT asset_os AS label FROM assets WHERE asset_archived_at IS NULL");
|
||||||
|
if ($os_sql && mysqli_num_rows($os_sql) > 0) {
|
||||||
|
$os_arr = [];
|
||||||
|
while ($row = mysqli_fetch_assoc($os_sql)) {
|
||||||
|
// jQuery UI Autocomplete expects {label: "...", value: "..."}
|
||||||
|
$label = $row['label'];
|
||||||
|
$os_arr[] = ['label' => $label, 'value' => $label];
|
||||||
|
}
|
||||||
|
$json_os = json_encode($os_arr);
|
||||||
|
}
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
?>
|
||||||
|
<div class="modal-header bg-dark">
|
||||||
|
<h5 class="modal-title"><i class="fa fa-fw fa-desktop mr-2"></i>New <?php if ($type) { echo ucwords($type); } else { echo "Asset"; } ?></h5>
|
||||||
|
<button type="button" class="close text-white" data-dismiss="modal">
|
||||||
|
<span>×</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 ui-front">
|
||||||
|
|
||||||
|
<ul class="nav nav-pills nav-justified mb-3">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" data-toggle="pill" href="#pills-asset-details">Details</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" data-toggle="pill" href="#pills-asset-network">Network</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" data-toggle="pill" href="#pills-asset-assignment">Assignment</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" data-toggle="pill" href="#pills-asset-purchase">Purchase</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" data-toggle="pill" href="#pills-asset-login">Login</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" data-toggle="pill" href="#pills-asset-notes">Notes</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<div class="tab-content">
|
||||||
|
|
||||||
|
<div class="tab-pane fade show active" id="pills-asset-details">
|
||||||
|
|
||||||
|
<?php if ($client_id) { ?>
|
||||||
|
<input type="hidden" name="client_id" value="<?= $client_id ?>">
|
||||||
|
<?php } else { ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Client <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_id" required>
|
||||||
|
<option value="">- Select Client -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_client_select)) {
|
||||||
|
$client_id_select = intval($row['client_id']);
|
||||||
|
$client_name = nullable_htmlentities($row['client_name']); ?>
|
||||||
|
<option <?php if ($client_id == $client_id_select) { echo "selected"; } ?> value="<?= $client_id_select ?>"><?= $client_name ?></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-tag"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="name" placeholder="Asset name or asset tag" 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 of the asset" maxlength="255">
|
||||||
|
</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-tags"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="type" required>
|
||||||
|
<option value="">- Select Type -</option>
|
||||||
|
<?php foreach($asset_types_array as $asset_type => $asset_icon) { ?>
|
||||||
|
<option><?= $asset_type ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php //Do not display Make Model or Serial if Virtual is selected
|
||||||
|
if ($type !== 'virtual') { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Make</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="make" placeholder="Manufacturer" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Model</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="model" placeholder="Model Number" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Serial Number</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="serial" placeholder="Serial number" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if ($type !== 'network' && $type !== 'other') { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Operating System</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fab fa-fw fa-windows"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="os" id="os" placeholder="ex Windows 10 Pro" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-asset-network">
|
||||||
|
<?php if ($client_id) { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Network</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-network-wired"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="network">
|
||||||
|
<option value="">- Select Network -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_network_select)) {
|
||||||
|
$network_id = intval($row['network_id']);
|
||||||
|
$network_name = nullable_htmlentities($row['network_name']);
|
||||||
|
$network = nullable_htmlentities($row['network']);
|
||||||
|
|
||||||
|
?>
|
||||||
|
<option value="<?= $network_id ?>"><?= $network_name ?> - <?= $network ?></option>
|
||||||
|
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>IP Address or DHCP</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="ip" placeholder="192.168.10.250" data-inputmask="'alias': 'ip'" data-mask>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<div class="input-group-text">
|
||||||
|
<input type="checkbox" name="dhcp" value="1">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>NAT IP Address</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-random"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="nat_ip" placeholder="10.52.4.55" data-inputmask="'alias': 'ip'" maxlength="200" data-mask>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>IPv6 Address</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="ipv6" placeholder="ex. 2001:0db8:0000:0000:0000:ff00:0042:8329" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>MAC Address</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="mac" placeholder="MAC Address" data-inputmask="'alias': 'mac'" maxlength="200" data-mask>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>URI</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="uri" placeholder="URI http:// ftp:// ssh: etc" maxlength="500">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>URI 2</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="uri_2" placeholder="URI http:// ftp:// ssh: etc" maxlength="500">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Client URI</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="uri_client" placeholder="URI http:// ftp:// ssh: etc -- viewable in Client Portal" maxlength="500">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-asset-assignment">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Physical Location</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-map-marker-alt"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="physical_location" placeholder="Physical location eg. Floor 2, Closet B" maxlength="200">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ($client_id) { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Location</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-map-marker-alt"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="location">
|
||||||
|
<option value="">- Select Location -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_location_select)) {
|
||||||
|
$location_id = intval($row['location_id']);
|
||||||
|
$location_name = nullable_htmlentities($row['location_name']);
|
||||||
|
?>
|
||||||
|
<option value="<?= $location_id ?>"><?= $location_name ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Assign 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="contact">
|
||||||
|
<option value="">- Select Contact -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_contact_select)) {
|
||||||
|
$contact_id_select = intval($row['contact_id']);
|
||||||
|
$contact_name = nullable_htmlentities($row['contact_name']);
|
||||||
|
?>
|
||||||
|
<option
|
||||||
|
<?php if ($contact_id == $contact_id_select) {
|
||||||
|
echo "selected"; }
|
||||||
|
?>
|
||||||
|
value="<?= $contact_id_select ?>"><?= $contact_name ?>
|
||||||
|
</option>
|
||||||
|
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Status</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-info"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="status">
|
||||||
|
<option value="">- Select Status -</option>
|
||||||
|
<?php foreach($asset_status_array as $asset_status) { ?>
|
||||||
|
<option><?php echo $asset_status; ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-asset-purchase">
|
||||||
|
|
||||||
|
<?php if ($client_id) { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Vendor</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="vendor">
|
||||||
|
<option value="">- Select Vendor -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_vendor_select)) {
|
||||||
|
$vendor_id = intval($row['vendor_id']);
|
||||||
|
$vendor_name = nullable_htmlentities($row['vendor_name']);
|
||||||
|
?>
|
||||||
|
<option value="<?php echo $vendor_id; ?>"><?php echo $vendor_name; ?></option>
|
||||||
|
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<?php if ($type !== 'virtual') { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Purchase Reference</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" name="purchase_reference" placeholder="eg. Invoice, PO Number">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Purchase Date</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="purchase_date" max="2999-12-31">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Install Date</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar-check"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="date" class="form-control" name="install_date" max="2999-12-31">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ($type !== 'virtual') { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Warranty Expire</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar-times"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="date" class="form-control" name="warranty_expire" max="2999-12-31">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-asset-login">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Username</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="username" placeholder="Username">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>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="text" class="form-control" name="password" placeholder="Password" autocomplete="off">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tab-pane fade" id="pills-asset-notes">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Upload Photo</label>
|
||||||
|
<input type="file" class="form-control-file" name="file" accept="image/*">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<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_asset" 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>
|
||||||
|
|
||||||
|
<!-- JSON Autocomplete / type ahead -->
|
||||||
|
<link rel="stylesheet" href="/plugins/jquery-ui/jquery-ui.min.css">
|
||||||
|
<script src="/plugins/jquery-ui/jquery-ui.min.js"></script>
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
var operatingSystems = <?php echo $json_os; ?>;
|
||||||
|
$("#os").autocomplete({
|
||||||
|
source: operatingSystems, // Should be an array of objects with 'label' and 'value'
|
||||||
|
select: function(event, ui) {
|
||||||
|
$("#os").val(ui.item.label); // Set the input field value to the selected label
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once '../../../includes/modal_footer.php';
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea class="form-control tinymceTicket<?php if($config_ai_enable) { echo "AI"; } ?>" id="textInput" name="bulk_details"></textarea>
|
<textarea class="form-control tinymceTicket" id="textInput" name="bulk_details"></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -52,7 +52,7 @@
|
|||||||
<select class="form-control select2" name="bulk_category">
|
<select class="form-control select2" name="bulk_category">
|
||||||
<option value="0">- Not Categorized -</option>
|
<option value="0">- Not Categorized -</option>
|
||||||
<?php
|
<?php
|
||||||
$sql_categories = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Ticket' AND category_archived_at IS NULL");
|
$sql_categories = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Ticket' AND category_archived_at IS NULL ORDER BY category_name ASC");
|
||||||
while ($row = mysqli_fetch_array($sql_categories)) {
|
while ($row = mysqli_fetch_array($sql_categories)) {
|
||||||
$category_id = intval($row['category_id']);
|
$category_id = intval($row['category_id']);
|
||||||
$category_name = nullable_htmlentities($row['category_name']);
|
$category_name = nullable_htmlentities($row['category_name']);
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
$sql = mysqli_query(
|
$sql = mysqli_query(
|
||||||
$mysqli,
|
$mysqli,
|
||||||
"SELECT user_id, user_name FROM users
|
"SELECT user_id, user_name FROM users
|
||||||
WHERE user_role_id > 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC"
|
WHERE user_type = 1 AND user_status = 1 AND user_archived_at IS NULL ORDER BY user_name ASC"
|
||||||
);
|
);
|
||||||
while ($row = mysqli_fetch_array($sql)) {
|
while ($row = mysqli_fetch_array($sql)) {
|
||||||
$user_id = intval($row['user_id']);
|
$user_id = intval($row['user_id']);
|
||||||
@@ -53,37 +53,38 @@ $sql_asset_history = mysqli_query($mysqli, "SELECT * FROM asset_history
|
|||||||
// Generate the HTML form content using output buffering.
|
// Generate the HTML form content using output buffering.
|
||||||
ob_start();
|
ob_start();
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="modal-header bg-dark">
|
<div class="modal-header bg-dark">
|
||||||
<h5 class="modal-title"><i class='fa fa-fw fa-<?php echo $device_icon; ?> mr-2'></i>Editing asset: <strong><?php echo $asset_name; ?></strong></h5>
|
<h5 class="modal-title"><i class='fa fa-fw fa-<?= $device_icon ?> mr-2'></i>Editing asset: <strong><?= $asset_name ?></strong></h5>
|
||||||
<button type="button" class="close text-white" data-dismiss="modal">
|
<button type="button" class="close text-white" data-dismiss="modal">
|
||||||
<span>×</span>
|
<span>×</span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
<form action="post.php" method="post" enctype="multipart/form-data" autocomplete="off">
|
<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="csrf_token" value="<?= $_SESSION['csrf_token'] ?>">
|
||||||
<input type="hidden" name="asset_id" value="<?php echo $asset_id; ?>">
|
<input type="hidden" name="asset_id" value="<?= $asset_id ?>">
|
||||||
<input type="hidden" name="client_id" value="<?php echo $client_id; ?>">
|
<input type="hidden" name="client_id" value="<?= $client_id ?>">
|
||||||
|
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
|
||||||
<ul class="nav nav-pills nav-justified mb-3">
|
<ul class="nav nav-pills nav-justified mb-3">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link active" data-toggle="pill" href="#pills-details<?php echo $asset_id; ?>">Details</a>
|
<a class="nav-link active" data-toggle="pill" href="#pills-details">Details</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" data-toggle="pill" href="#pills-network<?php echo $asset_id; ?>">Network</a>
|
<a class="nav-link" data-toggle="pill" href="#pills-network">Network</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" data-toggle="pill" href="#pills-assignment<?php echo $asset_id; ?>">Assignment</a>
|
<a class="nav-link" data-toggle="pill" href="#pills-assignment">Assignment</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" data-toggle="pill" href="#pills-purchase<?php echo $asset_id; ?>">Purchase</a>
|
<a class="nav-link" data-toggle="pill" href="#pills-purchase">Purchase</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" data-toggle="pill" href="#pills-notes<?php echo $asset_id; ?>">Notes</a>
|
<a class="nav-link" data-toggle="pill" href="#pills-notes">Notes</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" data-toggle="pill" href="#pills-history<?php echo $asset_id; ?>">History</a>
|
<a class="nav-link" data-toggle="pill" href="#pills-history">History</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
@@ -91,7 +92,7 @@ ob_start();
|
|||||||
|
|
||||||
<div class="tab-content" <?php if (lookupUserPermission('module_support') <= 1) { echo 'inert'; } ?>>
|
<div class="tab-content" <?php if (lookupUserPermission('module_support') <= 1) { echo 'inert'; } ?>>
|
||||||
|
|
||||||
<div class="tab-pane fade show active" id="pills-details<?php echo $asset_id; ?>">
|
<div class="tab-pane fade show active" id="pills-details">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Name <strong class="text-danger">*</strong></label>
|
<label>Name <strong class="text-danger">*</strong></label>
|
||||||
@@ -99,7 +100,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="name" placeholder="Name the asset" maxlength="200" value="<?php echo $asset_name; ?>" required>
|
<input type="text" class="form-control" name="name" placeholder="Name the asset" maxlength="200" value="<?= $asset_name ?>" required>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -109,7 +110,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-angle-right"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="description" placeholder="Description of the asset" maxlength="255" value="<?php echo $asset_description; ?>">
|
<input type="text" class="form-control" name="description" placeholder="Description of the asset" maxlength="255" value="<?= $asset_description ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -135,7 +136,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="make" placeholder="Manufacturer" maxlength="200" value="<?php echo $asset_make; ?>">
|
<input type="text" class="form-control" name="make" placeholder="Manufacturer" maxlength="200" value="<?= $asset_make ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-tag"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="model" placeholder="Model Number" maxlength="200" value="<?php echo $asset_model; ?>">
|
<input type="text" class="form-control" name="model" placeholder="Model Number" maxlength="200" value="<?= $asset_model ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -155,7 +156,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-barcode"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="serial" placeholder="Serial number" maxlength="200" value="<?php echo $asset_serial; ?>">
|
<input type="text" class="form-control" name="serial" placeholder="Serial number" maxlength="200" value="<?= $asset_serial ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -167,14 +168,14 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fab fa-fw fa-windows"></i></span>
|
<span class="input-group-text"><i class="fab fa-fw fa-windows"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="os" placeholder="ex Windows 10 Pro" maxlength="200" value="<?php echo $asset_os; ?>">
|
<input type="text" class="form-control" name="os" id="os" placeholder="ex Windows 10 Pro" maxlength="200" value="<?= $asset_os ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-network<?php echo $asset_id; ?>">
|
<div class="tab-pane fade" id="pills-network">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Network</label>
|
<label>Network</label>
|
||||||
@@ -227,7 +228,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-random"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-random"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="nat_ip" value="<?php echo $asset_nat_ip; ?>" placeholder="10.52.4.55" data-inputmask="'alias': 'ip'" maxlength="200" data-mask>
|
<input type="text" class="form-control" name="nat_ip" value="<?= $asset_nat_ip ?>" placeholder="10.52.4.55" data-inputmask="'alias': 'ip'" maxlength="200" data-mask>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -237,7 +238,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="ipv6" value="<?php echo $asset_ipv6; ?>" placeholder="ex. 2001:0db8:0000:0000:0000:ff00:0042:8329" maxlength="200">
|
<input type="text" class="form-control" name="ipv6" value="<?= $asset_ipv6 ?>" placeholder="ex. 2001:0db8:0000:0000:0000:ff00:0042:8329" maxlength="200">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -247,7 +248,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-ethernet"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="mac" value="<?php echo $asset_mac; ?>" placeholder="MAC Address" data-inputmask="'alias': 'mac'" maxlength="200" data-mask>
|
<input type="text" class="form-control" name="mac" value="<?= $asset_mac ?>" placeholder="MAC Address" data-inputmask="'alias': 'mac'" maxlength="200" data-mask>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -257,7 +258,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-globe"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="uri" placeholder="URI http:// ftp:// ssh: etc" maxlength="500" value="<?php echo $asset_uri; ?>">
|
<input type="text" class="form-control" name="uri" placeholder="URI http:// ftp:// ssh: etc" maxlength="500" value="<?= $asset_uri ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -282,7 +283,7 @@ ob_start();
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-assignment<?php echo $asset_id; ?>">
|
<div class="tab-pane fade" id="pills-assignment">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Physical Location</label>
|
<label>Physical Location</label>
|
||||||
@@ -290,7 +291,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-map-marker-alt"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-map-marker-alt"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="physical_location" placeholder="Physical location eg. Floor 2, Closet B" maxlength="200" value="<?php echo $asset_physical_location; ?>">
|
<input type="text" class="form-control" name="physical_location" placeholder="Physical location eg. Floor 2, Closet B" maxlength="200" value="<?= $asset_physical_location ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -315,7 +316,7 @@ ob_start();
|
|||||||
$location_name_select_display = $location_name_select;
|
$location_name_select_display = $location_name_select;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<option <?php if ($asset_location_id == $location_id_select) { echo "selected"; } ?> value="<?php echo $location_id_select; ?>"><?php echo $location_name_select_display; ?></option>
|
<option <?php if ($asset_location_id == $location_id_select) { echo "selected"; } ?> value="<?= $location_id_select ?>"><?= $location_name_select_display ?></option>
|
||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
@@ -343,8 +344,8 @@ ob_start();
|
|||||||
$contact_name_select_display = $contact_name_select;
|
$contact_name_select_display = $contact_name_select;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<option <?php if ($asset_contact_id == $contact_id_select) { echo "selected"; } ?> value="<?php echo $contact_id_select; ?>">
|
<option <?php if ($asset_contact_id == $contact_id_select) { echo "selected"; } ?> value="<?= $contact_id_select ?>">
|
||||||
<?php echo $contact_name_select_display; ?>
|
<?= $contact_name_select_display ?>
|
||||||
</option>
|
</option>
|
||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -360,7 +361,7 @@ ob_start();
|
|||||||
</div>
|
</div>
|
||||||
<select class="form-control select2" name="status">
|
<select class="form-control select2" name="status">
|
||||||
<?php foreach($asset_status_array as $asset_status_select) { ?>
|
<?php foreach($asset_status_array as $asset_status_select) { ?>
|
||||||
<option <?php if ($asset_status_select == $asset_status) { echo "selected"; } ?>><?php echo $asset_status_select; ?></option>
|
<option <?php if ($asset_status_select == $asset_status) { echo "selected"; } ?>><?= $asset_status_select ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
@@ -368,7 +369,7 @@ ob_start();
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-purchase<?php echo $asset_id; ?>">
|
<div class="tab-pane fade" id="pills-purchase">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Vendor</label>
|
<label>Vendor</label>
|
||||||
@@ -391,7 +392,7 @@ ob_start();
|
|||||||
$vendor_name_select_display = $vendor_name_select;
|
$vendor_name_select_display = $vendor_name_select;
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
<option <?php if ($asset_vendor_id == $vendor_id_select) { echo "selected"; } ?> value="<?php echo $vendor_id_select; ?>"><?php echo $vendor_name_select_display; ?></option>
|
<option <?php if ($asset_vendor_id == $vendor_id_select) { echo "selected"; } ?> value="<?= $vendor_id_select ?>"><?= $vendor_name_select_display ?></option>
|
||||||
|
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
@@ -405,7 +406,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-shopping-cart"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" class="form-control" name="purchase_reference" placeholder="eg. Invoice, PO Number" value="<?php echo $asset_purchase_reference; ?>">
|
<input type="text" class="form-control" name="purchase_reference" placeholder="eg. Invoice, PO Number" value="<?= $asset_purchase_reference ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -415,7 +416,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="date" class="form-control" name="purchase_date" max="2999-12-31" value="<?php echo $asset_purchase_date; ?>">
|
<input type="date" class="form-control" name="purchase_date" max="2999-12-31" value="<?= $asset_purchase_date ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
@@ -426,7 +427,7 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-calendar-check"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar-check"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="date" class="form-control" name="install_date" max="2999-12-31" value="<?php echo $asset_install_date; ?>">
|
<input type="date" class="form-control" name="install_date" max="2999-12-31" value="<?= $asset_install_date ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -437,18 +438,18 @@ ob_start();
|
|||||||
<div class="input-group-prepend">
|
<div class="input-group-prepend">
|
||||||
<span class="input-group-text"><i class="fa fa-fw fa-calendar-times"></i></span>
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar-times"></i></span>
|
||||||
</div>
|
</div>
|
||||||
<input type="date" class="form-control" name="warranty_expire" max="2999-12-31" value="<?php echo $asset_warranty_expire; ?>">
|
<input type="date" class="form-control" name="warranty_expire" max="2999-12-31" value="<?= $asset_warranty_expire ?>">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-notes<?php echo $asset_id; ?>">
|
<div class="tab-pane fade" id="pills-notes">
|
||||||
|
|
||||||
<div class="mb-3 text-center">
|
<div class="mb-3 text-center">
|
||||||
<?php if ($asset_photo) { ?>
|
<?php if ($asset_photo) { ?>
|
||||||
<img class="img-fluid" alt="asset_photo" src="<?php echo "../uploads/clients/$client_id/$asset_photo"; ?>">
|
<img class="img-fluid" alt="asset_photo" src="<?= "../uploads/clients/$client_id/$asset_photo" ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -458,7 +459,7 @@ ob_start();
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?php echo $asset_notes; ?></textarea>
|
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?= $asset_notes ?></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<p class="text-muted text-right">Asset ID: <?= $asset_id ?></p>
|
<p class="text-muted text-right">Asset ID: <?= $asset_id ?></p>
|
||||||
@@ -466,7 +467,7 @@ ob_start();
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div class="tab-pane fade" id="pills-history<?php echo $asset_id; ?>">
|
<div class="tab-pane fade" id="pills-history">
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Asset History</label>
|
<label>Asset History</label>
|
||||||
@@ -14,7 +14,7 @@
|
|||||||
<input type="hidden" name="client_id" value="<?php echo $client_id; ?>">
|
<input type="hidden" name="client_id" value="<?php echo $client_id; ?>">
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<p><strong>Format csv file with headings & data:</strong><br>Name, Description, Type, Make, Model, Serial, OS, Purchase Date, Assigned To, Location, Physical Location</p>
|
<p><strong>Format csv file with headings & data:</strong><br>Name, Description, Type, Make, Model, Serial, OS, Purchase Date, Assigned To, Location, Physical Location, Notes</p>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="form-group my-4">
|
<div class="form-group my-4">
|
||||||
<input type="file" class="form-control-file" name="file" accept=".csv" required>
|
<input type="file" class="form-control-file" name="file" accept=".csv" required>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user