mirror of https://github.com/itflow-org/itflow
[Feature] Added Asset Tags
This commit is contained in:
parent
6cdc26b55b
commit
abb97ad99f
|
|
@ -4059,9 +4059,7 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
|
||||||
|
|
||||||
`contract_template_created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
|
`contract_template_created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
|
||||||
`contract_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
`contract_template_updated_at` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
|
||||||
`contract_template_archived_at` DATETIME NULL DEFAULT NULL,
|
`contract_template_archived_at` DATETIME NULL DEFAULT NULL
|
||||||
|
|
||||||
`company_id` INT(11) NOT NULL
|
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -4115,10 +4113,31 @@ if (LATEST_DATABASE_VERSION > CURRENT_DATABASE_VERSION) {
|
||||||
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.7'");
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.7'");
|
||||||
}
|
}
|
||||||
|
|
||||||
// if (CURRENT_DATABASE_VERSION == '2.3.7') {
|
if (CURRENT_DATABASE_VERSION == '2.3.7') {
|
||||||
// // Insert queries here required to update to DB version 2.3.8
|
|
||||||
|
mysqli_query($mysqli, "
|
||||||
|
CREATE TABLE `asset_tags` (
|
||||||
|
`asset_tag_asset_id` INT(11) NOT NULL,
|
||||||
|
`asset_tag_tag_id` INT(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`asset_tag_asset_id`, `asset_tag_tag_id`),
|
||||||
|
CONSTRAINT `fk_asset`
|
||||||
|
FOREIGN KEY (`asset_tag_asset_id`)
|
||||||
|
REFERENCES `assets`(`asset_id`)
|
||||||
|
ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `fk_tag`
|
||||||
|
FOREIGN KEY (`asset_tag_tag_id`)
|
||||||
|
REFERENCES `tags`(`tag_id`)
|
||||||
|
ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
|
||||||
|
");
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.8'");
|
||||||
|
}
|
||||||
|
|
||||||
|
// if (CURRENT_DATABASE_VERSION == '2.3.8') {
|
||||||
|
// // Insert queries here required to update to DB version 2.3.9
|
||||||
// // 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.8'");
|
// mysqli_query($mysqli, "UPDATE `settings` SET `config_current_database_version` = '2.3.9'");
|
||||||
// }
|
// }
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -111,7 +111,7 @@
|
||||||
<li class="nav-header">TEMPLATES</li>
|
<li class="nav-header">TEMPLATES</li>
|
||||||
|
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a href="/admin/contract_templates.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'contract_templates.php' ? 'active' : ''); ?>">
|
<a href="/admin/contract_template.php" class="nav-link <?php echo (basename($_SERVER['PHP_SELF']) == 'contract_template.php' ? 'active' : ''); ?>">
|
||||||
<i class="nav-icon fas fa-file-contract"></i>
|
<i class="nav-icon fas fa-file-contract"></i>
|
||||||
<p>Contract Templates</p>
|
<p>Contract Templates</p>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,18 @@
|
||||||
<?php
|
<?php
|
||||||
require_once '../../../includes/modal_header.php';
|
require_once '../../../includes/modal_header.php';
|
||||||
ob_start();
|
|
||||||
|
|
||||||
$contract_types_array = ['Fully Managed', 'Partialy Managed', 'Break/Fix'];
|
$contract_types_array = ['Fully Managed', 'Partialy Managed', 'Break/Fix'];
|
||||||
$update_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '7 Year'];
|
$renewal_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '7 Year'];
|
||||||
|
|
||||||
|
ob_start();
|
||||||
?>
|
?>
|
||||||
|
|
||||||
<div class="modal-header bg-dark">
|
<div class="modal-header bg-dark">
|
||||||
<h5 class="modal-title"><i class="fa fa-fw fa-file-contract mr-2"></i>New Contract Template</h5>
|
<h5 class="modal-title"><i class="fa fa-fw fa-file-contract mr-2"></i>New Contract Template</h5>
|
||||||
<button type="button" class="close text-white" data-dismiss="modal"><span>×</span></button>
|
<button type="button" class="close text-white" data-dismiss="modal"><span>×</span></button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Tabs Navigation -->
|
<!-- Tabs Navigation -->
|
||||||
<ul class="modal-header nav nav-pills nav-justified">
|
<ul class="modal-header nav nav-pills nav-justified">
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
|
|
@ -25,103 +28,178 @@ $update_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '
|
||||||
<a class="nav-link" id="details-tab" data-toggle="tab" href="#details" role="tab">Details</a>
|
<a class="nav-link" id="details-tab" data-toggle="tab" href="#details" role="tab">Details</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<form action="post.php" method="post" autocomplete="off">
|
<form action="post.php" method="post" autocomplete="off">
|
||||||
|
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
|
|
||||||
<div class="tab-content" id="contractTemplateTabContent">
|
<div class="tab-content" id="contractTemplateTabContent">
|
||||||
|
|
||||||
<!-- General Info Tab -->
|
<!-- General Info Tab -->
|
||||||
<div class="tab-pane fade show active" id="general" role="tabpanel">
|
<div class="tab-pane fade show active" id="general" role="tabpanel">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Template Name <strong class="text-danger">*</strong></label>
|
<label>Template Name <strong class="text-danger">*</strong></label>
|
||||||
<input type="text" class="form-control" name="contract_template_name" placeholder="Contract Template Name" maxlength="200" required autofocus>
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-file-contract"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="name" placeholder="Contract Template Name" maxlength="200" required autofocus>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Template Description <strong class="text-danger">*</strong></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="description"
|
||||||
|
placeholder="Contract Template Description" maxlength="200" required>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Contract Type <strong class="text-danger">*</strong></label>
|
<label>Contract Type <strong class="text-danger">*</strong></label>
|
||||||
<select class="form-control select2" name="contract_template_type" required>
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="type" required>
|
||||||
<option value="">- Select Type -</option>
|
<option value="">- Select Type -</option>
|
||||||
<?php foreach ($contract_types_array as $type) { ?>
|
<?php foreach ($contract_types_array as $type) { ?>
|
||||||
<option><?php echo $type; ?></option>
|
<option><?= $type ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Update Frequency</label>
|
<label>Renewal Frequency</label>
|
||||||
<select class="form-control select2" name="contract_template_update_frequency">
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-sync-alt"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="renewal_frequency">
|
||||||
<option value="">- Select Frequency -</option>
|
<option value="">- Select Frequency -</option>
|
||||||
<?php foreach ($update_frequency_array as $freq) { ?>
|
<?php foreach ($renewal_frequency_array as $renewal_frequency) { ?>
|
||||||
<option><?php echo $freq; ?></option>
|
<option><?= $renewal_frequency ?></option>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- SLA Tab -->
|
<!-- SLA Tab -->
|
||||||
<div class="tab-pane fade" id="sla" role="tabpanel">
|
<div class="tab-pane fade" id="sla" role="tabpanel">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>Low Priority Response (hrs)</label>
|
<label>Low Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_low_response_time" placeholder="e.g., 24">
|
<input type="number" class="form-control" name="sla_low_response_time" placeholder="e.g., 24">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>Low Priority Resolution (hrs)</label>
|
<label>Low Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_low_resolution_time" placeholder="e.g., 48">
|
<input type="number" class="form-control" name="sla_low_resolution_time" placeholder="e.g., 48">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>Medium Priority Response (hrs)</label>
|
<label>Medium Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_medium_response_time" placeholder="e.g., 12">
|
<input type="number" class="form-control" name="sla_medium_response_time" placeholder="e.g., 12">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>Medium Priority Resolution (hrs)</label>
|
<label>Medium Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_medium_resolution_time" placeholder="e.g., 24">
|
<input type="number" class="form-control" name="sla_medium_resolution_time" placeholder="e.g., 24">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>High Priority Response (hrs)</label>
|
<label>High Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-bolt"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_high_response_time" placeholder="e.g., 1">
|
<input type="number" class="form-control" name="sla_high_response_time" placeholder="e.g., 1">
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
<div class="form-group col-md-6">
|
<div class="form-group col-md-6">
|
||||||
<label>High Priority Resolution (hrs)</label>
|
<label>High Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-stopwatch"></i></span>
|
||||||
|
</div>
|
||||||
<input type="number" class="form-control" name="sla_high_resolution_time" placeholder="e.g., 4">
|
<input type="number" class="form-control" name="sla_high_resolution_time" placeholder="e.g., 4">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<!-- Rates & Support Tab -->
|
<!-- Rates & Support Tab -->
|
||||||
<div class="tab-pane fade" id="rates" role="tabpanel">
|
<div class="tab-pane fade" id="rates" role="tabpanel">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Standard Hourly Rate</label>
|
<label>Standard Hourly Rate</label>
|
||||||
<input type="text" class="form-control" name="contract_template_hourly_rate" placeholder="e.g., 100">
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="rate_standard" placeholder="e.g., 100">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>After Hours Hourly Rate</label>
|
<label>After Hours Hourly Rate</label>
|
||||||
<input type="text" class="form-control" name="contract_template_after_hours_hourly_rate" placeholder="e.g., 150">
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-moon"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="rate_after_hours" placeholder="e.g., 150">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Support Hours</label>
|
<label>Support Hours</label>
|
||||||
<input type="text" class="form-control" name="contract_template_support_hours" placeholder="e.g., Mon-Fri 9am-5pm">
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="support_hours" placeholder="e.g., Mon-Fri 9am-5pm">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Net Terms</label>
|
<label>Net Terms</label>
|
||||||
<input type="text" class="form-control" name="contract_template_net_terms" placeholder="e.g., Net 30">
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-file-invoice-dollar"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="net_terms" placeholder="e.g., Net 30">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Details Tab -->
|
<!-- Details Tab -->
|
||||||
<div class="tab-pane fade" id="details" role="tabpanel">
|
<div class="tab-pane fade" id="details" role="tabpanel">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea class="form-control tinymce" rows="6" name="contract_template_details" placeholder="Enter Contract Details"></textarea>
|
<textarea class="form-control tinymce" rows="6" name="details" placeholder="Enter Contract Details"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -129,8 +207,12 @@ $update_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="submit" name="add_contract_template" class="btn btn-primary text-bold"><i class="fa fa-check mr-2"></i>Create Template</button>
|
<button type="submit" name="add_contract_template" class="btn btn-primary text-bold">
|
||||||
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
|
<i class="fa fa-check mr-2"></i>Create Template
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-light" data-dismiss="modal">
|
||||||
|
<i class="fa fa-times mr-2"></i>Cancel
|
||||||
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,265 @@
|
||||||
|
<?php
|
||||||
|
require_once '../../../includes/modal_header.php';
|
||||||
|
|
||||||
|
$contract_template_id = intval($_GET['id']);
|
||||||
|
|
||||||
|
$contract_types_array = ['Fully Managed', 'Partialy Managed', 'Break/Fix'];
|
||||||
|
$update_frequency_array = ['Manual', 'Annually', '2 Year', '3 Year', '5 Year', '7 Year'];
|
||||||
|
|
||||||
|
// Fetch existing template
|
||||||
|
$sql = mysqli_query($mysqli, "SELECT * FROM contract_templates WHERE contract_template_id = $contract_template_id LIMIT 1");
|
||||||
|
$row = mysqli_fetch_array($sql);
|
||||||
|
|
||||||
|
// Assign locals
|
||||||
|
$name = nullable_htmlentities($row['contract_template_name']);
|
||||||
|
$description = nullable_htmlentities($row['contract_template_description']);
|
||||||
|
$type = nullable_htmlentities($row['contract_template_type']);
|
||||||
|
$renewal_frequency = nullable_htmlentities($row['contract_template_renewal_frequency']);
|
||||||
|
$sla_low_resp = intval($row['contract_template_sla_low_response_time']);
|
||||||
|
$sla_med_resp = intval($row['contract_template_sla_medium_response_time']);
|
||||||
|
$sla_high_resp = intval($row['contract_template_sla_high_response_time']);
|
||||||
|
$sla_low_res = intval($row['contract_template_sla_low_resolution_time']);
|
||||||
|
$sla_med_res = intval($row['contract_template_sla_medium_resolution_time']);
|
||||||
|
$sla_high_res = intval($row['contract_template_sla_high_resolution_time']);
|
||||||
|
$hourly_rate = intval($row['contract_template_rate_standard']);
|
||||||
|
$after_hours = intval($row['contract_template_rate_after_hours']);
|
||||||
|
$support_hours = nullable_htmlentities($row['contract_template_support_hours']);
|
||||||
|
$net_terms = intval($row['contract_template_net_terms']);
|
||||||
|
$details = nullable_htmlentities($row['contract_template_details']);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="modal-header bg-dark">
|
||||||
|
<h5 class="modal-title"><i class="fa fa-fw fa-file-contract mr-2"></i>Edit Contract Template</h5>
|
||||||
|
<button type="button" class="close text-white" data-dismiss="modal"><span>×</span></button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Tabs Navigation -->
|
||||||
|
<ul class="modal-header nav nav-pills nav-justified">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link active" id="general-tab" data-toggle="tab" href="#general" role="tab">General Info</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" id="sla-tab" data-toggle="tab" href="#sla" role="tab">SLA</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" id="rates-tab" data-toggle="tab" href="#rates" role="tab">Rates & Support</a>
|
||||||
|
</li>
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link" id="details-tab" data-toggle="tab" href="#details" role="tab">Details</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<form action="post.php" method="post" autocomplete="off">
|
||||||
|
<input type="hidden" name="contract_template_id" value="<?php echo $contract_template_id; ?>">
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="tab-content" id="contractTemplateTabContent">
|
||||||
|
|
||||||
|
<!-- General Info Tab -->
|
||||||
|
<div class="tab-pane fade show active" id="general" role="tabpanel">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Template Name <strong class="text-danger">*</strong></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-file-contract"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="name"
|
||||||
|
placeholder="Contract Template Name" maxlength="200" required autofocus
|
||||||
|
value="<?= $name ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Template Description <strong class="text-danger">*</strong></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="description"
|
||||||
|
placeholder="Contract Template Description" maxlength="200" required
|
||||||
|
value="<?= $description ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Contract Type <strong class="text-danger">*</strong></label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-list"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="type" required>
|
||||||
|
<option value="">- Select Type -</option>
|
||||||
|
<?php foreach ($contract_types_array as $type_select) { ?>
|
||||||
|
<option <?php if ($type == $type_select) { echo "selected"; } ?>><?= $type_select ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Renewal Frequency</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-sync-alt"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="renewal_frequency">
|
||||||
|
<option value="">- Select Frequency -</option>
|
||||||
|
<?php foreach ($renewal_frequency_array as $renewal_frequency_select) { ?>
|
||||||
|
<option <?php if ($renewal_frequency == $renewal_frequency_select) { echo "selected"; } ?>><?= $renewal_frequency_select ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- SLA Tab -->
|
||||||
|
<div class="tab-pane fade" id="sla" role="tabpanel">
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>Low Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_low_response_time" placeholder="e.g., 24"
|
||||||
|
value="<?= $sla_low_resp ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>Low Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_low_resolution_time" placeholder="e.g., 48"
|
||||||
|
value="<?= $sla_low_res ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>Medium Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-clock"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_medium_response_time" placeholder="e.g., 12"
|
||||||
|
value="<?= $sla_med_resp ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>Medium Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-hourglass-half"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_medium_resolution_time" placeholder="e.g., 24"
|
||||||
|
value="<?= $sla_med_res ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-row">
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>High Priority Response (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-bolt"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_high_response_time" placeholder="e.g., 1"
|
||||||
|
value="<?= $sla_high_resp ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group col-md-6">
|
||||||
|
<label>High Priority Resolution (hrs)</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-stopwatch"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="number" class="form-control" name="sla_high_resolution_time" placeholder="e.g., 4"
|
||||||
|
value="<?= $sla_high_res ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rates & Support Tab -->
|
||||||
|
<div class="tab-pane fade" id="rates" role="tabpanel">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Standard Hourly Rate</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-dollar-sign"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="rate_standard" placeholder="e.g., 100"
|
||||||
|
value="<?= $rate_standard ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>After Hours Hourly Rate</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-moon"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="rate_after_hours" placeholder="e.g., 150"
|
||||||
|
value="<?= $rate_after_hours ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Support Hours</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-calendar"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="support_hours" placeholder="e.g., Mon-Fri 9am-5pm"
|
||||||
|
value="<?= $support_hours ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Net Terms</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-file-invoice-dollar"></i></span>
|
||||||
|
</div>
|
||||||
|
<input type="text" class="form-control" name="net_terms" placeholder="e.g., Net 30"
|
||||||
|
value="<?= $net_terms ?>">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Details Tab -->
|
||||||
|
<div class="tab-pane fade" id="details" role="tabpanel">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Contract Details</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-align-left"></i></span>
|
||||||
|
</div>
|
||||||
|
<textarea class="form-control tinymce" rows="6" name="details"
|
||||||
|
placeholder="Enter Contract Details"><?= $details ?></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="submit" name="edit_contract_template" class="btn btn-primary text-bold">
|
||||||
|
<i class="fa fa-check mr-2"></i>Save Changes
|
||||||
|
</button>
|
||||||
|
<button type="button" class="btn btn-light" data-dismiss="modal">
|
||||||
|
<i class="fa fa-times mr-2"></i>Cancel
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
require_once '../../../includes/modal_footer.php';
|
||||||
|
?>
|
||||||
|
|
@ -15,6 +15,8 @@ if (isset($_GET['type'])) {
|
||||||
$type_display = "Contact";
|
$type_display = "Contact";
|
||||||
} elseif ($type === 4) {
|
} elseif ($type === 4) {
|
||||||
$type_display = "Credential";
|
$type_display = "Credential";
|
||||||
|
} elseif ($type === 5) {
|
||||||
|
$type_display = "Asset";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ob_start();
|
ob_start();
|
||||||
|
|
@ -58,6 +60,7 @@ ob_start();
|
||||||
<option value="2">Location Tag</option>
|
<option value="2">Location Tag</option>
|
||||||
<option value="3">Contact Tag</option>
|
<option value="3">Contact Tag</option>
|
||||||
<option value="4">Credential Tag</option>
|
<option value="4">Credential Tag</option>
|
||||||
|
<option value="5">Asset Tag</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -86,7 +89,7 @@ ob_start();
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="submit" name="add_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
|
<button type="submit" name="add_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create Tag</button>
|
||||||
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
|
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,7 @@ ob_start();
|
||||||
<option value="2" <?php if ($tag_type == 2) { echo "selected"; } ?>>Location Tag</option>
|
<option value="2" <?php if ($tag_type == 2) { echo "selected"; } ?>>Location Tag</option>
|
||||||
<option value="3" <?php if ($tag_type == 3) { echo "selected"; } ?>>Contact Tag</option>
|
<option value="3" <?php if ($tag_type == 3) { echo "selected"; } ?>>Contact Tag</option>
|
||||||
<option value="4" <?php if ($tag_type == 4) { echo "selected"; } ?>>Credential Tag</option>
|
<option value="4" <?php if ($tag_type == 4) { echo "selected"; } ?>>Credential Tag</option>
|
||||||
|
<option value="5" <?php if ($tag_type == 5) { echo "selected"; } ?>>Asset Tag</option>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -73,7 +74,7 @@ ob_start();
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="submit" name="edit_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save</button>
|
<button type="submit" name="edit_tag" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Save changes</button>
|
||||||
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
|
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|
|
||||||
|
|
@ -9,11 +9,12 @@ defined('FROM_POST_HANDLER') || die("Direct file access is not allowed");
|
||||||
if (isset($_POST['add_contract_template'])) {
|
if (isset($_POST['add_contract_template'])) {
|
||||||
|
|
||||||
// Sanitize text inputs
|
// Sanitize text inputs
|
||||||
$name = sanitizeInput($_POST['contract_template_name']);
|
$name = sanitizeInput($_POST['name']);
|
||||||
$type = sanitizeInput($_POST['contract_template_type']);
|
$description = sanitizeInput($_POST['description']);
|
||||||
$update_frequency = sanitizeInput($_POST['contract_template_update_frequency']);
|
$type = sanitizeInput($_POST['type']);
|
||||||
$support_hours = sanitizeInput($_POST['contract_template_support_hours']);
|
$renewal_frequency = sanitizeInput($_POST['renewal_frequency']);
|
||||||
$details = mysql_escape_string($mysqli, $_POST['contract_template_details']);
|
$support_hours = sanitizeInput($_POST['support_hours']);
|
||||||
|
$details = mysqli_escape_string($mysqli, $_POST['details']);
|
||||||
|
|
||||||
// Numeric fields cast to integer
|
// Numeric fields cast to integer
|
||||||
$sla_low_resp = intval($_POST['sla_low_response_time']);
|
$sla_low_resp = intval($_POST['sla_low_response_time']);
|
||||||
|
|
@ -22,9 +23,9 @@ if (isset($_POST['add_contract_template'])) {
|
||||||
$sla_low_res = intval($_POST['sla_low_resolution_time']);
|
$sla_low_res = intval($_POST['sla_low_resolution_time']);
|
||||||
$sla_med_res = intval($_POST['sla_medium_resolution_time']);
|
$sla_med_res = intval($_POST['sla_medium_resolution_time']);
|
||||||
$sla_high_res = intval($_POST['sla_high_resolution_time']);
|
$sla_high_res = intval($_POST['sla_high_resolution_time']);
|
||||||
$hourly_rate = intval($_POST['contract_template_hourly_rate']);
|
$rate_standard = intval($_POST['rate_standard']);
|
||||||
$after_hours_rate = intval($_POST['contract_template_after_hours_hourly_rate']);
|
$rate_after_hours = intval($_POST['hourly_rate_after_hours']);
|
||||||
$net_terms = intval($_POST['contract_template_net_terms']);
|
$net_terms = intval($_POST['net_terms']);
|
||||||
|
|
||||||
// Insert into database (numbers not quoted)
|
// Insert into database (numbers not quoted)
|
||||||
mysqli_query($mysqli, "
|
mysqli_query($mysqli, "
|
||||||
|
|
@ -33,19 +34,17 @@ if (isset($_POST['add_contract_template'])) {
|
||||||
contract_template_description = '$description',
|
contract_template_description = '$description',
|
||||||
contract_template_details = '$details',
|
contract_template_details = '$details',
|
||||||
contract_template_type = '$type',
|
contract_template_type = '$type',
|
||||||
contract_template_update_frequency = '$update_frequency',
|
contract_template_renewal_frequency = '$renewal_frequency',
|
||||||
sla_low_response_time = $sla_low_resp,
|
contract_template_sla_low_response_time = $sla_low_resp,
|
||||||
sla_medium_response_time = $sla_med_resp,
|
contract_template_sla_medium_response_time = $sla_med_resp,
|
||||||
sla_high_response_time = $sla_high_resp,
|
contract_template_sla_high_response_time = $sla_high_resp,
|
||||||
sla_low_resolution_time = $sla_low_res,
|
contract_template_sla_low_resolution_time = $sla_low_res,
|
||||||
sla_medium_resolution_time = $sla_med_res,
|
contract_template_sla_medium_resolution_time = $sla_med_res,
|
||||||
sla_high_resolution_time = $sla_high_res,
|
contract_template_sla_high_resolution_time = $sla_high_res,
|
||||||
contract_template_hourly_rate = $hourly_rate,
|
contract_template_rate_standard = $rate_standard,
|
||||||
contract_template_after_hours_hourly_rate = $after_hours_rate,
|
contract_template_rate_after_hours = $rate_after_hours,
|
||||||
contract_template_support_hours = '$support_hours',
|
contract_template_support_hours = '$support_hours',
|
||||||
contract_template_net_terms = $net_terms,
|
contract_template_net_terms = $net_terms
|
||||||
contract_template_created_by = $session_user_id,
|
|
||||||
contract_template_created_at = NOW()
|
|
||||||
");
|
");
|
||||||
|
|
||||||
$contract_template_id = mysqli_insert_id($mysqli);
|
$contract_template_id = mysqli_insert_id($mysqli);
|
||||||
|
|
@ -60,4 +59,99 @@ if (isset($_POST['add_contract_template'])) {
|
||||||
redirect();
|
redirect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['edit_contract_template'])) {
|
||||||
|
|
||||||
|
$contract_template_id = intval($_POST['contract_template_id']);
|
||||||
|
$name = sanitizeInput($_POST['name']);
|
||||||
|
$description = sanitizeInput($_POST['description']);
|
||||||
|
$type = sanitizeInput($_POST['type']);
|
||||||
|
$renewal_frequency= sanitizeInput($_POST['renewal_frequency']);
|
||||||
|
$support_hours = sanitizeInput($_POST['support_hours']);
|
||||||
|
$details = mysqli_escape_string($mysqli, $_POST['details']);
|
||||||
|
$sla_low_resp = intval($_POST['sla_low_response_time']);
|
||||||
|
$sla_med_resp = intval($_POST['sla_medium_response_time']);
|
||||||
|
$sla_high_resp = intval($_POST['sla_high_response_time']);
|
||||||
|
$sla_low_res = intval($_POST['sla_low_resolution_time']);
|
||||||
|
$sla_med_res = intval($_POST['sla_medium_resolution_time']);
|
||||||
|
$sla_high_res = intval($_POST['sla_high_resolution_time']);
|
||||||
|
$rate_standard = intval($_POST['rate_standard']);
|
||||||
|
$rate_after_hours = intval($_POST['rate_after_hours']);
|
||||||
|
$net_terms = intval($_POST['net_terms']);
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "
|
||||||
|
UPDATE contract_templates SET
|
||||||
|
contract_template_name = '$name',
|
||||||
|
contract_template_description = '$description',
|
||||||
|
contract_template_details = '$details',
|
||||||
|
contract_template_type = '$type',
|
||||||
|
contract_template_renewal_frequency = '$renewal_frequency',
|
||||||
|
contract_template_sla_low_response_time = $sla_low_resp,
|
||||||
|
contract_template_sla_medium_response_time = $sla_med_resp,
|
||||||
|
contract_template_sla_high_response_time = $sla_high_resp,
|
||||||
|
contract_template_sla_low_resolution_time = $sla_low_res,
|
||||||
|
contract_template_sla_medium_resolution_time = $sla_med_res,
|
||||||
|
contract_template_sla_high_resolution_time = $sla_high_res,
|
||||||
|
contract_template_rate_standard = $rate_standard,
|
||||||
|
contract_template_rate_after_hours = $rate_after_hours,
|
||||||
|
contract_template_support_hours = '$support_hours',
|
||||||
|
contract_template_net_terms = $net_terms
|
||||||
|
WHERE contract_template_id = $contract_template_id
|
||||||
|
");
|
||||||
|
|
||||||
|
// Log action
|
||||||
|
logAction("Contract Template", "Update", "$session_name updated contract template $name", 0, $contract_template_id);
|
||||||
|
|
||||||
|
// Flash + redirect
|
||||||
|
flash_alert("Contract Template <strong>$name</strong> updated");
|
||||||
|
redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET['archive_contract_template'])) {
|
||||||
|
$contract_template_id = intval($_GET['archive_contract_template']);
|
||||||
|
|
||||||
|
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "
|
||||||
|
UPDATE contract_templates SET contract_template_archived_at = NOW()
|
||||||
|
WHERE contract_template_id = $contract_template_id
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
|
||||||
|
logAction("Contract Template", "Archive", "$session_name archived contract template $name", 0, $contract_template_id);
|
||||||
|
flash_alert("Contract Template <strong>$name</strong> archived", "danger");
|
||||||
|
redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET['restore_contract_template'])) {
|
||||||
|
$contract_template_id = intval($_GET['restore_contract_template']);
|
||||||
|
|
||||||
|
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "
|
||||||
|
UPDATE contract_templates SET contract_template_archived_at = NULL
|
||||||
|
WHERE contract_template_id = $contract_template_id
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
|
||||||
|
logAction("Contract Template", "Restore", "$session_name restored contract template $name", 0, $contract_template_id);
|
||||||
|
flash_alert("Contract Template <strong>$name</strong> restored");
|
||||||
|
redirect();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_GET['delete_contract_template'])) {
|
||||||
|
$contract_template_id = intval($_GET['delete_contract_template']);
|
||||||
|
|
||||||
|
$name = getFieldById('contract_templates', $contract_template_id, 'contract_template_name');
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "
|
||||||
|
DELETE FROM contract_templates
|
||||||
|
WHERE contract_template_id = $contract_template_id
|
||||||
|
LIMIT 1
|
||||||
|
");
|
||||||
|
|
||||||
|
logAction("Contract Template", "Delete", "$session_name deleted contract template $name", 0, $contract_template_id);
|
||||||
|
flash_alert("Contract Template <strong>$name</strong> deleted", "danger");
|
||||||
|
redirect();
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
|
||||||
|
|
@ -74,6 +74,8 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
$tag_type_display = "Contact Tag";
|
$tag_type_display = "Contact Tag";
|
||||||
} elseif ( $tag_type == 4) {
|
} elseif ( $tag_type == 4) {
|
||||||
$tag_type_display = "Credential Tag";
|
$tag_type_display = "Credential Tag";
|
||||||
|
} elseif ( $tag_type == 5) {
|
||||||
|
$tag_type_display = "Asset Tag";
|
||||||
} else {
|
} else {
|
||||||
$tag_type_display = "Unknown Tag";
|
$tag_type_display = "Unknown Tag";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,18 @@ if ($client_url && isset($_GET['location']) && !empty($_GET['location'])) {
|
||||||
$location_filter = 0;
|
$location_filter = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tags Filter
|
||||||
|
if (isset($_GET['tags']) && is_array($_GET['tags']) && !empty($_GET['tags'])) {
|
||||||
|
// Sanitize each element of the tags array
|
||||||
|
$sanitizedTags = array_map('intval', $_GET['tags']);
|
||||||
|
// Convert the sanitized tags into a comma-separated string
|
||||||
|
$tag_filter = implode(",", $sanitizedTags);
|
||||||
|
$tag_query = "AND tag_id IN ($tag_filter)";
|
||||||
|
} else {
|
||||||
|
$tag_filter = 0;
|
||||||
|
$tag_query = '';
|
||||||
|
}
|
||||||
|
|
||||||
//Get Asset Counts
|
//Get Asset Counts
|
||||||
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "
|
$row = mysqli_fetch_assoc(mysqli_query($mysqli, "
|
||||||
SELECT
|
SELECT
|
||||||
|
|
@ -93,9 +105,13 @@ $row = mysqli_fetch_assoc(mysqli_query($mysqli, "
|
||||||
LEFT JOIN contacts ON asset_contact_id = contact_id
|
LEFT JOIN contacts ON asset_contact_id = contact_id
|
||||||
LEFT JOIN locations ON asset_location_id = location_id
|
LEFT JOIN locations ON asset_location_id = location_id
|
||||||
LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1
|
LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1
|
||||||
|
LEFT JOIN asset_tags ON asset_tag_asset_id = asset_id
|
||||||
|
LEFT JOIN tags ON tag_id = asset_tag_tag_id
|
||||||
WHERE $archive_query
|
WHERE $archive_query
|
||||||
|
$tag_query
|
||||||
$access_permission_query
|
$access_permission_query
|
||||||
$client_query
|
$client_query
|
||||||
|
GROUP BY asset_id
|
||||||
) AS filtered_assets;
|
) AS filtered_assets;
|
||||||
"));
|
"));
|
||||||
|
|
||||||
|
|
@ -127,13 +143,16 @@ $sql = mysqli_query(
|
||||||
LEFT JOIN contacts ON asset_contact_id = contact_id
|
LEFT JOIN contacts ON asset_contact_id = contact_id
|
||||||
LEFT JOIN locations ON asset_location_id = location_id
|
LEFT JOIN locations ON asset_location_id = location_id
|
||||||
LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1
|
LEFT JOIN asset_interfaces ON interface_asset_id = asset_id AND interface_primary = 1
|
||||||
|
LEFT JOIN asset_tags ON asset_tag_asset_id = asset_id
|
||||||
|
LEFT JOIN tags ON tag_id = asset_tag_tag_id
|
||||||
WHERE $archive_query
|
WHERE $archive_query
|
||||||
AND (asset_name LIKE '%$q%' OR asset_description LIKE '%$q%' OR asset_type LIKE '%$q%' OR interface_ip LIKE '%$q%' OR interface_ipv6 LIKE '%$q%' OR interface_mac LIKE '%$q%' OR asset_make LIKE '%$q%' OR asset_model LIKE '%$q%' OR asset_serial LIKE '%$q%' OR asset_os LIKE '%$q%' OR contact_name LIKE '%$q%' OR location_name LIKE '%$q%' OR client_name LIKE '%$q%')
|
$tag_query
|
||||||
|
AND (asset_name LIKE '%$q%' OR asset_description LIKE '%$q%' OR asset_type LIKE '%$q%' OR interface_ip LIKE '%$q%' OR interface_ipv6 LIKE '%$q%' OR interface_mac LIKE '%$q%' OR asset_make LIKE '%$q%' OR asset_model LIKE '%$q%' OR asset_serial LIKE '%$q%' OR asset_os LIKE '%$q%' OR contact_name LIKE '%$q%' OR location_name LIKE '%$q%' OR client_name LIKE '%$q%' OR tag_name LIKE '%$q%')
|
||||||
AND ($type_query)
|
AND ($type_query)
|
||||||
$access_permission_query
|
$access_permission_query
|
||||||
$location_query
|
$location_query
|
||||||
$client_query
|
$client_query
|
||||||
|
GROUP BY asset_id
|
||||||
ORDER BY $sort $order LIMIT $record_from, $record_to"
|
ORDER BY $sort $order LIMIT $record_from, $record_to"
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -270,7 +289,32 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
<div class="col-md-3">
|
<div class="col-md-2">
|
||||||
|
<div class="input-group mb-3 mb-md-0">
|
||||||
|
<select onchange="this.form.submit()" class="form-control select2" name="tags[]" data-placeholder="- Select Tags -" multiple>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
$sql_tags_filter = mysqli_query($mysqli, "
|
||||||
|
SELECT tag_id, tag_name
|
||||||
|
FROM tags
|
||||||
|
LEFT JOIN asset_tags ON asset_tag_tag_id = tag_id
|
||||||
|
LEFT JOIN assets ON asset_tag_asset_id = asset_id
|
||||||
|
WHERE tag_type = 5
|
||||||
|
$client_query OR tag_id IN ($tag_filter)
|
||||||
|
GROUP BY tag_id
|
||||||
|
HAVING COUNT(asset_tag_asset_id) > 0 OR tag_id IN ($tag_filter)
|
||||||
|
");
|
||||||
|
while ($row = mysqli_fetch_array($sql_tags_filter)) {
|
||||||
|
$tag_id = intval($row['tag_id']);
|
||||||
|
$tag_name = nullable_htmlentities($row['tag_name']); ?>
|
||||||
|
|
||||||
|
<option value="<?php echo $tag_id ?>" <?php if (isset($_GET['tags']) && in_array($tag_id, $_GET['tags'])) { echo 'selected'; } ?>> <?php echo $tag_name ?> </option>
|
||||||
|
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<select onchange="this.form.submit()" class="form-control select2" name="show_column[]" data-placeholder="- Show Additional Columns -" multiple>
|
<select onchange="this.form.submit()" class="form-control select2" name="show_column[]" data-placeholder="- Show Additional Columns -" multiple>
|
||||||
<option
|
<option
|
||||||
|
|
@ -291,7 +335,7 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-3">
|
<div class="col-md-2">
|
||||||
<div class="btn-group float-right">
|
<div class="btn-group float-right">
|
||||||
<a href="?<?php echo $client_url; ?>&archived=<?php if($archived == 1){ echo 0; } else { echo 1; } ?>"
|
<a href="?<?php echo $client_url; ?>&archived=<?php if($archived == 1){ echo 0; } else { echo 1; } ?>"
|
||||||
class="btn btn-<?php if($archived == 1){ echo "primary"; } else { echo "default"; } ?>">
|
class="btn btn-<?php if($archived == 1){ echo "primary"; } else { echo "default"; } ?>">
|
||||||
|
|
@ -315,6 +359,12 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
<i class="fas fa-fw fa-map-marker-alt mr-2"></i>Assign Location
|
<i class="fas fa-fw fa-map-marker-alt mr-2"></i>Assign Location
|
||||||
</a>
|
</a>
|
||||||
<?php } ?>
|
<?php } ?>
|
||||||
|
<a class="dropdown-item ajax-modal" href="#"
|
||||||
|
data-modal-url="modals/asset/asset_bulk_assign_tags.php"
|
||||||
|
data-bulk="true">
|
||||||
|
<i class="fas fa-fw fa-tags mr-2"></i>Assign Tags
|
||||||
|
</a>
|
||||||
|
<div class="dropdown-divider"></div>
|
||||||
<a class="dropdown-item ajax-modal" href="#"
|
<a class="dropdown-item ajax-modal" href="#"
|
||||||
data-modal-url="modals/asset/asset_bulk_assign_physical_location.php"
|
data-modal-url="modals/asset/asset_bulk_assign_physical_location.php"
|
||||||
data-bulk="true">
|
data-bulk="true">
|
||||||
|
|
@ -576,20 +626,48 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
$sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_asset_id = $asset_id");
|
$sql_credentials = mysqli_query($mysqli, "SELECT * FROM credentials WHERE credential_asset_id = $asset_id");
|
||||||
$credential_count = mysqli_num_rows($sql_credentials);
|
$credential_count = mysqli_num_rows($sql_credentials);
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
$asset_tag_name_display_array = array();
|
||||||
|
$asset_tag_id_array = array();
|
||||||
|
$sql_asset_tags = mysqli_query($mysqli, "SELECT * FROM asset_tags LEFT JOIN tags ON asset_tag_tag_id = tag_id WHERE asset_tag_asset_id = $asset_id ORDER BY tag_name ASC");
|
||||||
|
while ($row = mysqli_fetch_array($sql_asset_tags)) {
|
||||||
|
|
||||||
|
$asset_tag_id = intval($row['tag_id']);
|
||||||
|
$asset_tag_name = nullable_htmlentities($row['tag_name']);
|
||||||
|
$asset_tag_color = nullable_htmlentities($row['tag_color']);
|
||||||
|
if (empty($asset_tag_color)) {
|
||||||
|
$asset_tag_color = "dark";
|
||||||
|
}
|
||||||
|
$asset_tag_icon = nullable_htmlentities($row['tag_icon']);
|
||||||
|
if (empty($asset_tag_icon)) {
|
||||||
|
$asset_tag_icon = "tag";
|
||||||
|
}
|
||||||
|
|
||||||
|
$asset_tag_id_array[] = $asset_tag_id;
|
||||||
|
$asset_tag_name_display_array[] = "<a href='assets.php?$client_url tags[]=$asset_tag_id'><span class='badge text-light p-1 mr-1' style='background-color: $asset_tag_color;'><i class='fa fa-fw fa-$asset_tag_icon mr-2'></i>$asset_tag_name</span></a>";
|
||||||
|
}
|
||||||
|
$asset_tags_display = implode('', $asset_tag_name_display_array);
|
||||||
|
|
||||||
?>
|
?>
|
||||||
<tr>
|
<tr>
|
||||||
<td class="pr-0 bg-light">
|
<td class="pr-0 bg-light">
|
||||||
<div class="form-check">
|
<div class="form-check">
|
||||||
<input class="form-check-input bulk-select" type="checkbox" name="asset_ids[]" value="<?php echo $asset_id ?>">
|
<input class="form-check-input bulk-select" type="checkbox" name="asset_ids[]" value="<?= $asset_id ?>">
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<a class="text-dark" href="asset_details.php?client_id=<?php echo $client_id; ?>&asset_id=<?php echo $asset_id; ?>">
|
<a class="text-dark" href="asset_details.php?client_id=<?= $client_id ?>&asset_id=<?= $asset_id ?>">
|
||||||
<div class="media">
|
<div class="media">
|
||||||
<i class="fa fa-fw fa-2x fa-<?php echo $device_icon; ?> mr-3 mt-1"></i>
|
<i class="fa fa-fw fa-2x fa-<?= $device_icon ?> mr-3 mt-1"></i>
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<div><?php echo $asset_name; ?></div>
|
<div><?= $asset_name ?></div>
|
||||||
<div><small class="text-secondary"><?php echo $asset_description; ?></small></div>
|
<div><small class="text-secondary"><?= $asset_description ?></small></div>
|
||||||
|
<?php
|
||||||
|
if ($asset_tags_display) { ?>
|
||||||
|
<div class="mt-1">
|
||||||
|
<?= $asset_tags_display ?>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ if ($os_sql && mysqli_num_rows($os_sql) > 0) {
|
||||||
$json_os = json_encode($os_arr);
|
$json_os = json_encode($os_arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$sql_tags_select = mysqli_query($mysqli, "SELECT tag_id, tag_name FROM tags WHERE tag_type = 5 ORDER BY tag_name ASC");
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|
@ -465,6 +467,33 @@ ob_start();
|
||||||
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"></textarea>
|
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Tags</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="tags[]" data-placeholder="Add some tags" multiple>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
while ($row = mysqli_fetch_array($sql_tags_select)) {
|
||||||
|
$tag_id = intval($row['tag_id']);
|
||||||
|
$tag_name = nullable_htmlentities($row['tag_name']);
|
||||||
|
?>
|
||||||
|
<option value="<?= $tag_id ?>"><?= $tag_name ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button class="btn btn-secondary ajax-modal" type="button"
|
||||||
|
data-modal-url="../admin/modals/tag/tag_add.php?type=5">
|
||||||
|
<i class="fas fa-plus"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,61 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
require_once '../../../includes/modal_header.php';
|
||||||
|
|
||||||
|
$selected_ids = array_map('intval', $_GET['selected_ids'] ?? []);
|
||||||
|
|
||||||
|
$count = count($selected_ids);
|
||||||
|
|
||||||
|
ob_start();
|
||||||
|
|
||||||
|
?>
|
||||||
|
|
||||||
|
<div class="modal-header bg-dark">
|
||||||
|
<h5 class="modal-title"><i class="fa fa-fw fa-tags mr-2"></i>Assign Tags for <strong><?= $count ?></strong> Assets</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="<?= $_SESSION['csrf_token'] ?>">
|
||||||
|
<?php foreach ($selected_ids as $id) { ?><input type="hidden" name="asset_ids[]" value="<?= $id ?>"><?php } ?>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<input type="hidden" name="remove_tags" value="0">
|
||||||
|
|
||||||
|
<div class="form-group form-check">
|
||||||
|
<input type="checkbox" class="form-check-input" name="remove_tags" value="1">
|
||||||
|
<label class="form-check-label text-danger">Remove Existing Tags</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Tags</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="tags[]" data-placeholder="Add some tags" multiple>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$sql_tags_select = mysqli_query($mysqli, "SELECT * FROM tags WHERE tag_type = 5 ORDER BY tag_name ASC");
|
||||||
|
while ($row = mysqli_fetch_array($sql_tags_select)) {
|
||||||
|
$tag_id_select = intval($row['tag_id']);
|
||||||
|
$tag_name_select = nullable_htmlentities($row['tag_name']);
|
||||||
|
?>
|
||||||
|
<option value="<?php echo $tag_id_select; ?>"><?php echo $tag_name_select; ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="submit" name="bulk_assign_asset_tags" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Assign Tags</button>
|
||||||
|
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fa fa-times mr-2"></i>Cancel</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
require_once '../../../includes/modal_footer.php';
|
||||||
|
|
@ -50,7 +50,14 @@ $sql_asset_history = mysqli_query($mysqli, "SELECT * FROM asset_history
|
||||||
DESC LIMIT 10"
|
DESC LIMIT 10"
|
||||||
);
|
);
|
||||||
|
|
||||||
// Generate the HTML form content using output buffering.
|
// Tags
|
||||||
|
$asset_tag_id_array = array();
|
||||||
|
$sql_asset_tags = mysqli_query($mysqli, "SELECT asset_tag_tag_id FROM asset_tags WHERE asset_tag_asset_id = $asset_id");
|
||||||
|
while ($row = mysqli_fetch_array($sql_asset_tags)) {
|
||||||
|
$asset_tag_tag_id = intval($row['asset_tag_tag_id']);
|
||||||
|
$asset_tag_id_array[] = $asset_tag_tag_id;
|
||||||
|
}
|
||||||
|
|
||||||
ob_start();
|
ob_start();
|
||||||
?>
|
?>
|
||||||
|
|
||||||
|
|
@ -462,6 +469,33 @@ ob_start();
|
||||||
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?= $asset_notes ?></textarea>
|
<textarea class="form-control" rows="8" placeholder="Enter some notes" name="notes"><?= $asset_notes ?></textarea>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Tags</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="tags[]" data-placeholder="Add some tags" multiple>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$sql_tags_select = mysqli_query($mysqli, "SELECT * FROM tags WHERE tag_type = 5 ORDER BY tag_name ASC");
|
||||||
|
while ($row = mysqli_fetch_array($sql_tags_select)) {
|
||||||
|
$tag_id_select = intval($row['tag_id']);
|
||||||
|
$tag_name_select = nullable_htmlentities($row['tag_name']);
|
||||||
|
?>
|
||||||
|
<option value="<?= $tag_id_select ?>" <?php if (in_array($tag_id_select, $asset_tag_id_array)) { echo "selected"; } ?>><?php echo $tag_name_select; ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
<div class="input-group-append">
|
||||||
|
<button class="btn btn-secondary ajax-modal" type="button"
|
||||||
|
data-modal-url="../admin/modals/tag/tag_add.php?type=5">
|
||||||
|
<i class="fas fa-plus"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<p class="text-muted text-right">Asset ID: <?= $asset_id ?></p>
|
<p class="text-muted text-right">Asset ID: <?= $asset_id ?></p>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,14 @@ if (isset($_POST['add_asset'])) {
|
||||||
|
|
||||||
$asset_id = mysqli_insert_id($mysqli);
|
$asset_id = mysqli_insert_id($mysqli);
|
||||||
|
|
||||||
|
// Add Tags
|
||||||
|
if (isset($_POST['tags'])) {
|
||||||
|
foreach($_POST['tags'] as $tag) {
|
||||||
|
$tag = intval($tag);
|
||||||
|
mysqli_query($mysqli, "INSERT INTO asset_tags SET asset_tag_asset_id = $asset_id, asset_tag_tag_id = $tag");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Add Photo
|
// Add Photo
|
||||||
if (isset($_FILES['file']['tmp_name'])) {
|
if (isset($_FILES['file']['tmp_name'])) {
|
||||||
if ($new_file_name = checkFileUpload($_FILES['file'], array('jpg', 'jpeg', 'gif', 'png', 'webp'))) {
|
if ($new_file_name = checkFileUpload($_FILES['file'], array('jpg', 'jpeg', 'gif', 'png', 'webp'))) {
|
||||||
|
|
@ -108,6 +116,18 @@ if (isset($_POST['edit_asset'])) {
|
||||||
mysqli_query($mysqli,"UPDATE assets SET asset_photo = '$new_file_name' WHERE asset_id = $asset_id");
|
mysqli_query($mysqli,"UPDATE assets SET asset_photo = '$new_file_name' WHERE asset_id = $asset_id");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tags
|
||||||
|
// Delete existing tags
|
||||||
|
mysqli_query($mysqli, "DELETE FROM asset_tags WHERE asset_tag_asset_id = $asset_id");
|
||||||
|
|
||||||
|
// Add new tags
|
||||||
|
if (isset($_POST['tags'])) {
|
||||||
|
foreach($_POST['tags'] as $tag) {
|
||||||
|
$tag = intval($tag);
|
||||||
|
mysqli_query($mysqli, "INSERT INTO asset_tags SET asset_tag_asset_id = $asset_id, asset_tag_tag_id = $tag");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
logAction("Asset", "Edit", "$session_name edited asset $name", $client_id, $asset_id);
|
logAction("Asset", "Edit", "$session_name edited asset $name", $client_id, $asset_id);
|
||||||
|
|
||||||
flash_alert("Asset <strong>$name</strong> edited");
|
flash_alert("Asset <strong>$name</strong> edited");
|
||||||
|
|
@ -188,6 +208,50 @@ if (isset($_GET['delete_asset'])) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['bulk_assign_asset_tags'])) {
|
||||||
|
|
||||||
|
enforceUserPermission('module_client', 2);
|
||||||
|
|
||||||
|
if (isset($_POST['asset_ids'])) {
|
||||||
|
|
||||||
|
$count = count($_POST['asset_ids']);
|
||||||
|
|
||||||
|
foreach($_POST['asset_ids'] as $asset_id) {
|
||||||
|
$asset_id = intval($asset_id);
|
||||||
|
|
||||||
|
$sql = mysqli_query($mysqli,"SELECT asset_name, asset_client_id FROM assets WHERE asset_id = $asset_id");
|
||||||
|
$row = mysqli_fetch_array($sql);
|
||||||
|
$asset_name = sanitizeInput($row['asset_name']);
|
||||||
|
$client_id = intval($row['asset_client_id']);
|
||||||
|
|
||||||
|
if($_POST['remove_tags']) {
|
||||||
|
mysqli_query($mysqli, "DELETE FROM asset_tags WHERE asset_tag_asset_id = $asset_id");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['tags'])) {
|
||||||
|
foreach($_POST['tags'] as $tag) {
|
||||||
|
$tag = intval($tag);
|
||||||
|
|
||||||
|
$sql = mysqli_query($mysqli,"SELECT * FROM asset_tags WHERE asset_tag_asset_id = $asset_id AND asset_tag_tag_id = $tag");
|
||||||
|
if (mysqli_num_rows($sql) == 0) {
|
||||||
|
mysqli_query($mysqli, "INSERT INTO asset_tags SET asset_tag_asset_id = $asset_id, asset_tag_tag_id = $tag");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
logAction("Asset", "Edit", "$session_name added tags to asset $asset_name", $client_id, $asset_id);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
logAction("Asset", "Bulk Edit", "$session_name added tags for $asset_count assets", $client_id);
|
||||||
|
|
||||||
|
flash_alert("Assigned tags for <strong>$count</strong> assets");
|
||||||
|
}
|
||||||
|
|
||||||
|
redirect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_POST['bulk_assign_asset_location'])) {
|
if (isset($_POST['bulk_assign_asset_location'])) {
|
||||||
|
|
||||||
validateCSRFToken($_POST['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
|
||||||
20
db.sql
20
db.sql
|
|
@ -275,6 +275,23 @@ CREATE TABLE `asset_notes` (
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
|
--
|
||||||
|
-- Table structure for table `asset_tags`
|
||||||
|
--
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS `asset_tags`;
|
||||||
|
/*!40101 SET @saved_cs_client = @@character_set_client */;
|
||||||
|
/*!40101 SET character_set_client = utf8mb4 */;
|
||||||
|
CREATE TABLE `asset_tags` (
|
||||||
|
`asset_tag_asset_id` int(11) NOT NULL,
|
||||||
|
`asset_tag_tag_id` int(11) NOT NULL,
|
||||||
|
PRIMARY KEY (`asset_tag_asset_id`,`asset_tag_tag_id`),
|
||||||
|
KEY `fk_tag` (`asset_tag_tag_id`),
|
||||||
|
CONSTRAINT `fk_asset` FOREIGN KEY (`asset_tag_asset_id`) REFERENCES `assets` (`asset_id`) ON DELETE CASCADE,
|
||||||
|
CONSTRAINT `fk_tag` FOREIGN KEY (`asset_tag_tag_id`) REFERENCES `tags` (`tag_id`) ON DELETE CASCADE
|
||||||
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
||||||
--
|
--
|
||||||
-- Table structure for table `assets`
|
-- Table structure for table `assets`
|
||||||
--
|
--
|
||||||
|
|
@ -800,7 +817,6 @@ CREATE TABLE `contract_templates` (
|
||||||
`contract_template_created_at` datetime DEFAULT current_timestamp(),
|
`contract_template_created_at` datetime DEFAULT current_timestamp(),
|
||||||
`contract_template_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),
|
`contract_template_updated_at` datetime DEFAULT NULL ON UPDATE current_timestamp(),
|
||||||
`contract_template_archived_at` datetime DEFAULT NULL,
|
`contract_template_archived_at` datetime DEFAULT NULL,
|
||||||
`company_id` int(11) NOT NULL,
|
|
||||||
PRIMARY KEY (`contract_template_id`)
|
PRIMARY KEY (`contract_template_id`)
|
||||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
|
||||||
/*!40101 SET character_set_client = @saved_cs_client */;
|
/*!40101 SET character_set_client = @saved_cs_client */;
|
||||||
|
|
@ -2897,4 +2913,4 @@ CREATE TABLE `vendors` (
|
||||||
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
|
||||||
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
|
||||||
|
|
||||||
-- Dump completed on 2025-11-07 16:47:40
|
-- Dump completed on 2025-11-11 19:57:21
|
||||||
|
|
|
||||||
|
|
@ -5,4 +5,4 @@
|
||||||
* It is used in conjunction with database_updates.php
|
* It is used in conjunction with database_updates.php
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEFINE("LATEST_DATABASE_VERSION", "2.3.7");
|
DEFINE("LATEST_DATABASE_VERSION", "2.3.8");
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue