mirror of https://github.com/itflow-org/itflow
Added Bulk Create Tickets for Clients
This commit is contained in:
parent
c5dd5f2b6f
commit
303f9174c9
|
|
@ -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>
|
||||||
|
|
@ -600,7 +604,8 @@ $num_rows = mysqli_fetch_row(mysqli_query($mysqli, "SELECT FOUND_ROWS()"));
|
||||||
require_once "modals/client/client_bulk_edit_industry.php";
|
require_once "modals/client/client_bulk_edit_industry.php";
|
||||||
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>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,137 @@
|
||||||
|
<div class="modal" id="bulkAddTicketModal" tabindex="-1">
|
||||||
|
<div class="modal-dialog modal-lg">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header bg-dark">
|
||||||
|
<h5 class="modal-title"><i class="fas fa-fw fa-life-ring mr-2"></i>Creating Tickets for Clients</h5>
|
||||||
|
<button type="button" class="close text-white" data-dismiss="modal">
|
||||||
|
<span>×</span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Subject <strong class="text-danger">*</strong></label>
|
||||||
|
<input type="text" class="form-control" name="bulk_subject" placeholder="Enter a subject" maxlength="200">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea class="form-control tinymceTicket" id="textInput" name="bulk_details"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="col">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Priority <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-thermometer-half"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="bulk_priority">
|
||||||
|
<option>Low</option>
|
||||||
|
<option>Medium</option>
|
||||||
|
<option>High</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Category</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-layer-group"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="bulk_category">
|
||||||
|
<option value="0">- Not Categorized -</option>
|
||||||
|
<?php
|
||||||
|
$sql_categories = mysqli_query($mysqli, "SELECT category_id, category_name FROM categories WHERE category_type = 'Ticket' AND category_archived_at IS NULL");
|
||||||
|
while ($row = mysqli_fetch_array($sql_categories)) {
|
||||||
|
$category_id = intval($row['category_id']);
|
||||||
|
$category_name = nullable_htmlentities($row['category_name']);
|
||||||
|
|
||||||
|
?>
|
||||||
|
<option value="<?php echo $category_id; ?>"><?php echo $category_name; ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
<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-check"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="bulk_assigned_to">
|
||||||
|
<option value="0">Not Assigned</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$sql = mysqli_query(
|
||||||
|
$mysqli,
|
||||||
|
"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"
|
||||||
|
);
|
||||||
|
while ($row = mysqli_fetch_array($sql)) {
|
||||||
|
$user_id = intval($row['user_id']);
|
||||||
|
$user_name = nullable_htmlentities($row['user_name']); ?>
|
||||||
|
<option value="<?php echo $user_id; ?>"><?php echo $user_name; ?></option>
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col">
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Project</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<div class="input-group-prepend">
|
||||||
|
<span class="input-group-text"><i class="fa fa-fw fa-project-diagram"></i></span>
|
||||||
|
</div>
|
||||||
|
<select class="form-control select2" name="bulk_project">
|
||||||
|
<option value="0">- None -</option>
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$sql_projects = mysqli_query($mysqli, "SELECT * FROM projects WHERE project_completed_at IS NULL AND project_archived_at IS NULL ORDER BY project_name ASC");
|
||||||
|
while ($row = mysqli_fetch_array($sql_projects)) {
|
||||||
|
$project_id_select = intval($row['project_id']);
|
||||||
|
$project_name_select = nullable_htmlentities($row['project_name']); ?>
|
||||||
|
<option value="<?php echo $project_id_select; ?>"><?php echo $project_name_select; ?></option>
|
||||||
|
|
||||||
|
<?php } ?>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<?php if ($config_module_enable_accounting) { ?>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="custom-control custom-switch">
|
||||||
|
<input type="checkbox" class="custom-control-input" name="bulk_billable" <?php if ($config_ticket_default_billable == 1) { echo "checked"; } ?> value="1" id="billableSwitch">
|
||||||
|
<label class="custom-control-label" for="billableSwitch">Billable</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<?php } ?>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="submit" name="bulk_add_client_ticket" class="btn btn-primary text-bold"><i class="fas fa-check mr-2"></i>Create</button>
|
||||||
|
<button type="button" class="btn btn-light" data-dismiss="modal"><i class="fas fa-times mr-2"></i>Cancel</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
@ -598,6 +598,120 @@ if (isset($_GET['download_clients_csv_template'])) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (isset($_POST['bulk_add_client_ticket'])) {
|
||||||
|
|
||||||
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
||||||
|
enforceUserPermission('module_support', 2);
|
||||||
|
|
||||||
|
$assigned_to = intval($_POST['bulk_assigned_to']);
|
||||||
|
if ($assigned_to == 0) {
|
||||||
|
$ticket_status = 1;
|
||||||
|
} else {
|
||||||
|
$ticket_status = 2;
|
||||||
|
}
|
||||||
|
$subject = sanitizeInput($_POST['bulk_subject']);
|
||||||
|
$priority = sanitizeInput($_POST['bulk_priority']);
|
||||||
|
$category_id = intval($_POST['bulk_category']);
|
||||||
|
$details = mysqli_real_escape_string($mysqli, $_POST['bulk_details']);
|
||||||
|
$project_id = intval($_POST['bulk_project']);
|
||||||
|
$use_primary_contact = intval($_POST['use_primary_contact']);
|
||||||
|
$ticket_template_id = intval($_POST['bulk_ticket_template_id']);
|
||||||
|
$billable = intval($_POST['bulk_billable'] ?? 0);
|
||||||
|
|
||||||
|
// Check to see if adding a ticket by template
|
||||||
|
if($ticket_template_id) {
|
||||||
|
$sql = mysqli_query($mysqli, "SELECT * FROM ticket_templates WHERE ticket_template_id = $ticket_template_id");
|
||||||
|
$row = mysqli_fetch_array($sql);
|
||||||
|
|
||||||
|
// Override Template Subject
|
||||||
|
if(empty($subject)) {
|
||||||
|
$subject = sanitizeInput($row['ticket_template_subject']);
|
||||||
|
}
|
||||||
|
$details = mysqli_escape_string($mysqli, $row['ticket_template_details']);
|
||||||
|
|
||||||
|
// Get Associated Tasks from the ticket template
|
||||||
|
$sql_task_templates = mysqli_query($mysqli, "SELECT * FROM task_templates WHERE task_template_ticket_template_id = $ticket_template_id");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create ticket for each selected asset
|
||||||
|
if (isset($_POST['client_ids'])) {
|
||||||
|
|
||||||
|
// Get a Asset Count
|
||||||
|
$client_count = count($_POST['client_ids']);
|
||||||
|
|
||||||
|
foreach ($_POST['client_ids'] as $client_id) {
|
||||||
|
$client_id = intval($client_id);
|
||||||
|
|
||||||
|
$sql = mysqli_query($mysqli, "SELECT * FROM clients WHERE client_id = $client_id");
|
||||||
|
$row = mysqli_fetch_array($sql);
|
||||||
|
|
||||||
|
$client_name = sanitizeInput($row['client_name']);
|
||||||
|
|
||||||
|
// Get the next Ticket Number and update the config
|
||||||
|
$sql_ticket_number = mysqli_query($mysqli, "SELECT config_ticket_next_number FROM settings WHERE company_id = 1");
|
||||||
|
$ticket_number_row = mysqli_fetch_array($sql_ticket_number);
|
||||||
|
$ticket_number = intval($ticket_number_row['config_ticket_next_number']);
|
||||||
|
|
||||||
|
// Sanitize Config Vars from get_settings.php and Session Vars from check_login.php
|
||||||
|
$config_ticket_prefix = sanitizeInput($config_ticket_prefix);
|
||||||
|
$config_ticket_from_name = sanitizeInput($config_ticket_from_name);
|
||||||
|
$config_ticket_from_email = sanitizeInput($config_ticket_from_email);
|
||||||
|
$config_base_url = sanitizeInput($config_base_url);
|
||||||
|
|
||||||
|
//Generate a unique URL key for clients to access
|
||||||
|
$url_key = randomString(156);
|
||||||
|
|
||||||
|
// Increment the config ticket next number
|
||||||
|
$new_config_ticket_next_number = $ticket_number + 1;
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "UPDATE settings SET config_ticket_next_number = $new_config_ticket_next_number WHERE company_id = 1");
|
||||||
|
|
||||||
|
mysqli_query($mysqli, "INSERT INTO tickets SET ticket_prefix = '$config_ticket_prefix', ticket_number = $ticket_number, ticket_category = $category_id, ticket_subject = '$subject', ticket_details = '$details', ticket_priority = '$priority', ticket_billable = $billable, ticket_status = $ticket_status, ticket_created_by = $session_user_id, ticket_assigned_to = $assigned_to, ticket_url_key = '$url_key', ticket_client_id = $client_id, ticket_project_id = $project_id");
|
||||||
|
|
||||||
|
$ticket_id = mysqli_insert_id($mysqli);
|
||||||
|
|
||||||
|
// Update the next ticket number in the database
|
||||||
|
mysqli_query($mysqli, "UPDATE settings SET config_ticket_next_number = $new_config_ticket_next_number WHERE company_id = 1");
|
||||||
|
|
||||||
|
// Add Tasks
|
||||||
|
if (!empty($_POST['tasks'])) {
|
||||||
|
foreach ($_POST['tasks'] as $task) {
|
||||||
|
$task_name = sanitizeInput($task);
|
||||||
|
// Check that task_name is not-empty (For some reason the !empty on the array doesnt work here like in watchers)
|
||||||
|
if (!empty($task_name)) {
|
||||||
|
mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_ticket_id = $ticket_id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add Tasks from Template if Template was selected
|
||||||
|
if($ticket_template_id) {
|
||||||
|
if (mysqli_num_rows($sql_task_templates) > 0) {
|
||||||
|
while ($row = mysqli_fetch_array($sql_task_templates)) {
|
||||||
|
$task_order = intval($row['task_template_order']);
|
||||||
|
$task_name = sanitizeInput($row['task_template_name']);
|
||||||
|
|
||||||
|
mysqli_query($mysqli,"INSERT INTO tasks SET task_name = '$task_name', task_order = $task_order, task_ticket_id = $ticket_id");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Custom action/notif handler
|
||||||
|
customAction('ticket_create', $ticket_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
logAction("Ticket", "Bulk Create", "$session_name created $client_count tickets for $client_name");
|
||||||
|
|
||||||
|
flash_alert("<strong>$client_count</strong> tickets created for selected clients");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
redirect();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($_POST['bulk_edit_client_industry'])) {
|
if (isset($_POST['bulk_edit_client_industry'])) {
|
||||||
|
|
||||||
validateCSRFToken($_POST['csrf_token']);
|
validateCSRFToken($_POST['csrf_token']);
|
||||||
|
|
|
||||||
|
|
@ -1561,7 +1561,6 @@ if (isset($_POST['bulk_add_asset_ticket'])) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (isset($_POST['add_ticket_reply'])) {
|
if (isset($_POST['add_ticket_reply'])) {
|
||||||
|
|
||||||
enforceUserPermission('module_support', 2);
|
enforceUserPermission('module_support', 2);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue