Files
awo-hamburg-intranet/module/ticketcenter/show_ticketcenter_listform.inc.php
2026-02-17 14:56:23 +01:00

941 lines
46 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<script type="text/javascript" src="/mysyde/admin/admin.js"></script>
<?php
$formname = "form_ticket_list";
// Enable error reporting
// ini_set('display_errors', 1);
// ini_set('display_startup_errors', 1);
// error_reporting(E_ALL);
function load_ticket_list($cue)
{
// Query to get user's department and mandant information
$contact_info_query = "SELECT
mcd.main_mandant_id,
mcd.main_department_id
FROM
main_contact_department mcd
WHERE
mcd.main_contact_id = " . $GLOBALS['main_contact']['id'];
$contact_info_result = mysqli_query($GLOBALS['mysql_con'], $contact_info_query);
$mandant_ids = [];
$department_ids = [];
while ($contact_info = mysqli_fetch_assoc($contact_info_result)) {
if (!empty($contact_info['main_mandant_id']) && !in_array($contact_info['main_mandant_id'], $mandant_ids)) {
$mandant_ids[] = $contact_info['main_mandant_id'];
}
if (!empty($contact_info['main_department_id']) && !in_array($contact_info['main_department_id'], $department_ids)) {
$department_ids[] = $contact_info['main_department_id'];
}
}
// For debugging
// echo "User Mandant IDs: " . implode(', ', $mandant_ids) . "<br>";
// echo "User Department IDs: " . implode(', ', $department_ids) . "<br>";
// Store the result in contact_info for compatibility with existing code
$contact_info = [
'mandant_ids' => implode(', ', $mandant_ids),
'department_ids' => implode(', ', $department_ids)
];
$join = "";
$additional_joins = "";
$additional_where = "";
if (isset($cue)) {
switch ($cue) {
case '1000': // Meine offenen und in bearbeitung Tickets
$where = " WHERE sender_id = " . $GLOBALS['main_contact']['id'] . " AND current_state != 4";
break;
case '1500': // Meine offenen und in bearbeitung Tickets
$where = " WHERE receiver_id = " . $GLOBALS['main_contact']['id'] . " AND current_state != 4";
break;
case '2000': // Offene Tickets der Abteilung
// $join = " LEFT JOIN main_contact_department ON main_contact_department.main_contact_id = main_tickets.receiver_id";
// $where = " WHERE current_state != 4 AND (main_contact_department.main_mandant_id =" . $GLOBALS['main_contact']['master_mandant_id'] . " OR main_tickets_category.main_mandant_id = " . $GLOBALS['main_contact']['master_mandant_id'] . ")";
$where = " WHERE 1=1 and current_state != 4 and receiver_id = 0";
// Only add these joins for case 2000
// $additional_joins = "
// -- Category contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact cat_contact
// ON main_tickets.main_ticket_category_id = cat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_department cat_dept
// ON main_tickets.main_ticket_category_id = cat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_mandant cat_mandant
// ON main_tickets.main_ticket_category_id = cat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// -- Subcategory contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact subcat_contact
// ON main_tickets.main_ticket_subcategory_id = subcat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_department subcat_dept
// ON main_tickets.main_ticket_subcategory_id = subcat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_mandant subcat_mandant
// ON main_tickets.main_ticket_subcategory_id = subcat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// -- Subsubcategory contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact subsubcat_contact
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// LEFT JOIN main_tickets_category_department subsubcat_dept
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// LEFT JOIN main_tickets_category_mandant subsubcat_mandant
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// ";
// Only add these conditions for case 2000
// $additional_where = "
// OR current_state != 4 AND (
// -- For tickets with a category but no subcategory and no subsubcategory
// main_tickets.main_ticket_subcategory_id = 0 AND
// main_tickets.main_ticket_subsubcategory_id = 0 AND (
// cat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// cat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// cat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// ) OR current_state != 4 AND (
// -- For tickets with a subcategory but no subsubcategory
// main_tickets.main_ticket_subcategory_id != 0 AND
// main_tickets.main_ticket_subsubcategory_id = 0 AND (
// subcat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// subcat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// subcat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// ) OR current_state != 4 AND (
// -- For tickets with a subsubcategory (ignore category and subcategory)
// main_tickets.main_ticket_subsubcategory_id != 0 AND (
// subsubcat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// subsubcat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// subsubcat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// )
// ";
break;
case '2500': // Offene Tickets der Abteilung
// $join = " LEFT JOIN main_contact_department ON main_contact_department.main_contact_id = main_tickets.receiver_id";
// $where = " WHERE current_state != 4 AND (main_contact_department.main_mandant_id =" . $GLOBALS['main_contact']['master_mandant_id'] . " OR main_tickets_category.main_mandant_id = " . $GLOBALS['main_contact']['master_mandant_id'] . ")";
$where = " WHERE 1=1 and current_state != 4";
// Only add these joins for case 2000
// $additional_joins = "
// -- Category contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact cat_contact
// ON main_tickets.main_ticket_category_id = cat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_department cat_dept
// ON main_tickets.main_ticket_category_id = cat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_mandant cat_mandant
// ON main_tickets.main_ticket_category_id = cat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id = 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// -- Subcategory contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact subcat_contact
// ON main_tickets.main_ticket_subcategory_id = subcat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_department subcat_dept
// ON main_tickets.main_ticket_subcategory_id = subcat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// LEFT JOIN main_tickets_category_mandant subcat_mandant
// ON main_tickets.main_ticket_subcategory_id = subcat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subcategory_id != 0
// AND main_tickets.main_ticket_subsubcategory_id = 0
// -- Subsubcategory contact, department, mandant joins
// LEFT JOIN main_tickets_category_contact subsubcat_contact
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_contact.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// LEFT JOIN main_tickets_category_department subsubcat_dept
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_dept.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// LEFT JOIN main_tickets_category_mandant subsubcat_mandant
// ON main_tickets.main_ticket_subsubcategory_id = subsubcat_mandant.main_tickets_category_id
// AND main_tickets.main_ticket_subsubcategory_id != 0
// ";
// Only add these conditions for case 2000
// $additional_where = "
// OR current_state != 4 AND (
// -- For tickets with a category but no subcategory and no subsubcategory
// main_tickets.main_ticket_subcategory_id = 0 AND
// main_tickets.main_ticket_subsubcategory_id = 0 AND (
// cat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// cat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// cat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// ) OR current_state != 4 AND (
// -- For tickets with a subcategory but no subsubcategory
// main_tickets.main_ticket_subcategory_id != 0 AND
// main_tickets.main_ticket_subsubcategory_id = 0 AND (
// subcat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// subcat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// subcat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// ) OR current_state != 4 AND (
// -- For tickets with a subsubcategory (ignore category and subcategory)
// main_tickets.main_ticket_subsubcategory_id != 0 AND (
// subsubcat_contact.main_contact_id = " . $GLOBALS['main_contact']['id'] . " OR
// subsubcat_dept.main_department_id IN (" . ($contact_info['department_ids'] ?: "0") . ") OR
// subsubcat_mandant.main_mandant_id IN (" . ($contact_info['mandant_ids'] ?: "0") . ")
// )
// )
// ";
break;
case '3000': // Alle geschlossenen Tickets
$join = " LEFT JOIN main_contact_department ON main_contact_department.main_contact_id = main_tickets.receiver_id";
$where = " WHERE main_tickets.current_state = 4 AND ((main_contact_department.main_mandant_id =" . $GLOBALS['main_contact']['master_mandant_id'] . " OR main_contact_department.main_mandant_id IS NULL) OR main_tickets.sender_id = " . $GLOBALS['main_contact']['id'] . " )";
break;
case '4000': // Alle Tickets ungefiltert
// Fix for case 4000 - set a valid WHERE clause that's always true
$where = " WHERE 1=1";
break;
case '5000': // Alle Tickets die Eskalieren (die zu lange offen/in Bearbeitung sind)
$where = " WHERE due_date <> '0000-00-00' AND due_date < CURDATE() AND current_state IN (2, 3)";
break;
case '6000': // Alle Tickets die Eskalieren (die zu lange offen/in Bearbeitung sind)
$join = " LEFT JOIN main_contact_department ON main_contact_department.main_contact_id = main_tickets.receiver_id";
$where = " WHERE receiver_id = 0 ";
// $where = " WHERE receiver_id = 0 AND main_contact_department.main_mandant_id =".$GLOBALS['main_contact']['master_mandant_id'];
break;
default:
break;
}
} else {
$where = " WHERE (receiver_id = " . $GLOBALS['main_contact']['id'] . " OR sender_id = " . $GLOBALS['main_contact']['id'] . " ) AND current_state != 4";
}
$query = "SELECT DISTINCT
main_tickets.*,
main_tickets_category.description AS 'category_description',
COALESCE(main_tickets_subsubcategory.escalation_state, main_tickets_subcategory.escalation_state, main_tickets_category.escalation_state) AS 'escalation_state',
individual_state.description AS 'individual_state_description',
main_tickets_subcategory.description AS 'subcategory_description',
main_tickets_subsubcategory.description AS 'subsubcategory_description',
receiver.name AS 'receiver',
sender.name AS 'sender',
main_tickets_state.description AS 'state',
DATE_ADD(main_tickets.creation_date, INTERVAL COALESCE(main_tickets_subsubcategory.escalation_state, main_tickets_subcategory.escalation_state, main_tickets_category.escalation_state) DAY) AS 'escalation'
FROM
main_tickets
" . $join . "
LEFT JOIN main_contact AS receiver ON receiver.id = main_tickets.receiver_id
LEFT JOIN main_contact AS sender ON sender.id = main_tickets.sender_id
LEFT JOIN main_tickets_status AS individual_state ON individual_state.id = main_tickets.individual_state
LEFT JOIN main_tickets_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_category AS main_tickets_subcategory ON main_tickets.main_ticket_subcategory_id = main_tickets_subcategory.id
LEFT JOIN main_tickets_category AS main_tickets_subsubcategory ON main_tickets.main_ticket_subsubcategory_id = main_tickets_subsubcategory.id
LEFT JOIN main_tickets_state ON main_tickets.current_state = main_tickets_state.id
" . $additional_joins . "
WHERE
(" . substr($where, 7) . ")
" . $additional_where . "
ORDER BY
ticket_no DESC;";
// var_dump($query);
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
while ($row = @mysqli_fetch_array($result)) {
// var_dump($row);
if ($cue == 2000) {
if (checkUserPermission($row, $contact_info) == false) {
continue; // Skip this row if the user doesn't have permission
}
}
// var_dump("-----");
// print_r($row);
$unread = "";
$query2 = "SELECT * FROM main_tickets_notification
WHERE main_ticket_id = " . $row['id'] . " AND main_contact_id = " . $GLOBALS['main_contact']['id'] . " AND viewed = 0";
// var_dump($query2);
$result2 = @mysqli_query($GLOBALS['mysql_con'], $query2);
$viewed = @mysqli_num_rows($result2);
if ($viewed != 0) {
$unread = '<i class="fa-solid fa-circle-exclamation"></i>';
}
$creation_date = new DateTime($row['creation_date']);
$last_action = new DateTime($row['last_action_date']);
$escalation = new DateTime($row['escalation']);
$now = new DateTime(); // Aktuelles Datum und Uhrzeit
$escalated = "";
if ($escalation < $now && (isset($row['escalation_state']) && $row['escalation_state'] != "0")) {
$escalated = "escalated";
}
?>
<tr id="item_<?= $row['id'] ?>" class='list_item <?= $escalated ?>' data-checked="false" data-inputname="input_id"
data-action="edit" data-inputid="<?= encryptId($row['id']) ?>">
<td><?= $unread ?></td>
<td class=ticket_numb><?= $row['ticket_no'] ?></td>
<td>
<div class="status_container">
<span class="<?= $row['state'] ?>"><?= $row['state'] ?></span>
<?php if (!empty($row['individual_state_description'])): ?>
<span class="individual_state_span"><?= $row['individual_state_description'] ?></span>
<?php endif; ?>
</div>
</td>
<td><?= "1. " . $row['category_description'] . "<br>"?>
<?= !empty($row['subcategory_description']) ? "2. " . $row['subcategory_description'] . "<br>" : '' ?>
<?= !empty($row['subsubcategory_description']) ? "3. " . $row['subsubcategory_description'] : '' ?>
</td>
<td><?= $row['description'] ?></td>
<td><?= $row['sender'] ?></td>
<td><?= $row['receiver'] ?></td>
<td><?= $creation_date->format('d.m.y H:i') ?></td>
<td><?= $last_action->format('d.m.y H:i') ?></td>
<td>
<?php
if ($row['due_date'] != "0000-00-00") {
// var_dump($due_date);
$due_date = new DateTime($row['due_date']);
if ($due_date > $now) {
echo $due_date->format('d.m.y');
} else {
echo '<span class="overdue">' . $due_date->format('d.m.y') . '</span>';
}
} else {
echo '--.--.--';
}
?>
</td>
<td><?php
$now = new DateTime(); // Current date and time
$creation = clone $creation_date; // Clone to avoid modifying the original
$interval = $now->diff($creation);
if ($interval->y > 0) {
echo $interval->y . ' Jahre, ' . $interval->m . ' Monate';
} elseif ($interval->m > 0) {
echo $interval->m . ' Monate, ' . $interval->d . ' Tage';
} elseif ($interval->d > 0) {
echo $interval->d . ' Tage, ' . $interval->h . ' Std';
} elseif ($interval->h > 0) {
echo $interval->h . ' Std, ' . $interval->i . ' Min';
} else {
echo $interval->i . ' Minuten';
}
?></td>
<?php if ($cue == 5000) { ?>
<td>
<?php if (isset($row['escalation_state']) && $row['escalation_state'] != "0") {
echo $escalation->format('d.m.y H:i');
}
?>
</td>
<?php } ?>
<?php if ($cue == 7000 || $cue == 8000) { ?>
<td>
<?php
$supplierQuery = "SELECT s.description
FROM main_ticket_suplier l
LEFT JOIN main_tickets_supliers s ON l.main_ticket_suplier_id = s.id
WHERE l.main_ticket_id = " . (int) $row['id'];
$supplierResult = mysqli_query($GLOBALS['mysql_con'], $supplierQuery);
?>
<div class="suppliers">
<?php
while ($supplier = mysqli_fetch_assoc($supplierResult)) {
echo '<span class="ticket_supplier">' . htmlspecialchars($supplier['description']) . '</span> ';
}
?>
</div>
</td>
<?php } ?>
</tr>
<?php
}
}
function checkUserPermission($row, $contact_info) {
$category_keys = [
'main_ticket_subsubcategory_id',
'main_ticket_subcategory_id',
'main_ticket_category_id'
];
foreach ($category_keys as $key) {
if (isset($row[$key]) && $row[$key] != 0) {
$category_id = $row[$key];
// 1. Direct contact match
$contacts = getContactsByCategory($category_id);
if (in_array($GLOBALS['main_contact']['id'], $contacts)) {
return true;
}
// 2. Department and mandant matching
$departments = getDepartmentsByCategory($category_id);
$mandants = getMandantsByCategory($category_id);
// var_dump($mandants);
// var_dump($departments);
// var_dump($mandants);
// $userDepartments = array_map('trim', explode(',', $contact_info['department_ids']));
// $userMandants = array_map('trim', explode(',', $contact_info['mandant_ids']));
// $hasDepartments = !empty($departments) && $departments != [0];
// $hasMandants = !empty($mandants) && $mandants != [0];
// $departmentMatch = !$hasDepartments || count(array_intersect($userDepartments, $departments)) > 0;
// $mandantMatch = !$hasMandants || count(array_intersect($userMandants, $mandants)) > 0;
// // Check if the user has access to the department and mandant
// if ($departmentMatch && $mandantMatch) {
// return true;
// }
// 3. Check if the user has access to the department and mandant
// $array_dep_mand = [];
// foreach ($departments as $department) {
// foreach ($mandants as $mandant) {
// $dep_mand_bind = [
// 'department' => $department,
// 'mandant' => $mandant
// ];
// $array_dep_mand[] = $dep_mand_bind;
// }
// }
if (empty($departments) and empty($mandants)){
return false;
} else if (empty($mandants)) {
$query = "SELECT * FROM main_contact_department WHERE main_contact_id = " . $GLOBALS['main_contact']['id'] . "
AND main_department_id IN (" . implode(',', $departments) . ")";
} else if (empty($departments)) {
$query = "SELECT * FROM main_contact_department WHERE main_contact_id = " . $GLOBALS['main_contact']['id'] . "
AND main_department_id IN (" . implode(',', $departments) . ")";
} else {
$query = "SELECT * FROM main_contact_department WHERE main_contact_id = " . $GLOBALS['main_contact']['id'] . " AND main_mandant_id IN (" . implode(',', $mandants) . ") AND main_department_id IN (" . implode(',', $departments) . ")";
}
// var_dump($query);
// var_dump($query);
$result = mysqli_query($GLOBALS['mysql_con'], $query);
if (mysqli_num_rows($result) > 0) {
return true;
}
return false;
// If we checked one level and didn't find a match - don't exit, continue to the next one
}
}
return false;
}
// 1000: Meine offenen und in Bearbeitung Tickets
$query_count_1000 = "SELECT COUNT(*) FROM main_tickets WHERE (receiver_id = " . $GLOBALS['main_contact']['id'] . " OR sender_id = " . $GLOBALS['main_contact']['id'] . " ) AND current_state != 4";
$result_1000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_1000))[0];
// 2000: Offene Tickets der Abteilung
$query_count_2000 = "SELECT COUNT(DISTINCT main_tickets.id)
FROM main_tickets
LEFT JOIN main_contact_department ON main_contact_department.main_contact_id = main_tickets.receiver_id
LEFT JOIN main_tickets_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
WHERE current_state != 4
AND (
main_contact_department.main_mandant_id = " . $GLOBALS['main_contact']['master_mandant_id'] . "
OR main_tickets_category.main_mandant_id = " . $GLOBALS['main_contact']['master_mandant_id'] . "
)";
$result_2000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_2000))[0];
// 3000: Alle geschlossenen Tickets
$query_count_3000 = "SELECT COUNT(*) FROM main_tickets WHERE current_state = 4";
$result_3000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_3000))[0];
// 4000: Alle Tickets ungefiltert
$query_count_4000 = "SELECT COUNT(*) FROM main_tickets";
$result_4000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_4000))[0];
// 5000: Alle eskalierenden Tickets (zu lange offen/in Bearbeitung)
$query_count_5000 = "SELECT COUNT(*)
FROM main_tickets
LEFT JOIN main_tickets_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_category AS main_tickets_subcategory ON main_tickets.main_ticket_subcategory_id = main_tickets_subcategory.id
WHERE DATE_ADD(main_tickets.creation_date, INTERVAL COALESCE(main_tickets_subcategory.escalation_state, main_tickets_category.escalation_state) DAY) < NOW()
AND main_tickets.current_state IN (2, 3)";
$result_5000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_5000))[0];
// 6000: Alle nicht zugewiesenen Tickets
$query_count_6000 = "SELECT COUNT(*) FROM main_tickets WHERE receiver_id = 0";
$result_6000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_6000))[0];
// 7000: // Alle Tickets die im Bereich Einkauf sind (holen wir über main_mandant_id aus main_tickets_category = 15)
$query_count_7000 = "SELECT COUNT(*)
FROM main_tickets
LEFT JOIN main_tickets_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_category AS main_tickets_subcategory ON main_tickets.main_ticket_subcategory_id = main_tickets_subcategory.id
WHERE main_tickets_category.main_mandant_id = 15
OR main_tickets_subcategory.main_mandant_id = 15 AND main_tickets.current_state != 4";
$result_7000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_7000))[0];
// 8000: // Alle Tickets die im Bereich Einkauf sind (holen wir über main_mandant_id aus main_tickets_category = 15)
$query_count_8000 = "SELECT COUNT(*)
FROM main_tickets
LEFT JOIN main_tickets_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_category AS main_tickets_subcategory ON main_tickets.main_ticket_subcategory_id = main_tickets_subcategory.id
WHERE main_tickets_category.main_mandant_id = 15
OR main_tickets_subcategory.main_mandant_id = 15 AND main_tickets.current_state = 4";
$result_8000 = mysqli_fetch_array(mysqli_query($GLOBALS['mysql_con'], $query_count_8000))[0];
?>
<form action="" id="<?= $formname ?>" name="<?= $formname ?>" method="post">
<!-- DataTables -->
<!-- <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.css" /> -->
<link rel="stylesheet" href="https://cdn.datatables.net/searchbuilder/1.8.0/css/searchBuilder.dataTables.css" />
<link rel="stylesheet" href="https://cdn.datatables.net/2.0.2/css/dataTables.semanticui.css" />
<link rel="stylesheet" href="https://cdn.datatables.net/responsive/3.0.0/css/responsive.semanticui.css" />
<script src="https://code.jquery.com/jquery-3.7.1.js"></script>
<link
href="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.0.2/af-2.7.0/b-3.0.1/b-colvis-3.0.1/b-html5-3.0.1/b-print-3.0.1/cr-2.0.0/date-1.5.2/fc-5.0.0/fh-4.0.1/kt-2.12.0/r-3.0.0/rg-1.5.0/rr-1.5.0/sc-2.4.1/sb-1.7.0/sp-2.3.0/sl-2.0.0/sr-1.4.0/datatables.min.css"
rel="stylesheet">
<script src="https://cdnjs.cloudflare.com/ajax/libs/fomantic-ui/2.9.2/semantic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.2/moment.min.js"></script>
<script src="https://cdn.datatables.net/datetime/1.5.2/js/dataTables.dateTime.min.js"></script>
<script src="https://cdn.datatables.net/searchbuilder/1.8.0/js/searchBuilder.dataTables.js"></script>
<script src="https://cdn.datatables.net/searchbuilder/1.8.0/js/dataTables.searchBuilder.js"></script>
<script
src="https://cdn.datatables.net/v/se/jszip-3.10.1/dt-2.0.2/af-2.7.0/b-3.0.1/b-colvis-3.0.1/b-html5-3.0.1/b-print-3.0.1/cr-2.0.0/date-1.5.2/fc-5.0.0/fh-4.0.1/kt-2.12.0/r-3.0.0/rg-1.5.0/rr-1.5.0/sc-2.4.1/sb-1.7.0/sp-2.3.0/sl-2.0.0/sr-1.4.0/datatables.min.js"></script>
<script src="https://cdn.datatables.net/2.0.2/js/dataTables.semanticui.js"></script>
<script src="https://cdn.datatables.net/responsive/3.0.0/js/dataTables.responsive.js"></script>
<script src="https://cdn.datatables.net/responsive/3.0.0/js/responsive.semanticui.js"></script>
<script src="https://cdn.datatables.net/buttons/3.0.2/js/dataTables.buttons.js"></script>
<script src="https://cdn.datatables.net/buttons/3.0.2/js/buttons.semanticui.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script>
<script src="https://cdn.datatables.net/buttons/3.0.2/js/buttons.html5.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script>
<div class="loading" aria-busy="true"></div>
<input type='hidden' class='selected_linklist_row' name='input_id' value=''>
<div class="toolbar">
<div class="container">
<!-- <div class="right_toolbar">
<a role="button" class="secondary" href="?cue=1000">
Meine Tickets <span class="badge">(<?= $result_1000 ?>)</span>
</a>
<a role="button" class="secondary" href="?cue=2000">
Abteilungstickets <span class="badge">(<?= $result_2000 ?>)</span>
</a>
<a role="button" class="secondary" href="?cue=3000">
Archiv <span class="badge">(<?= $result_3000 ?>)</span>
</a>
<?php if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=4000">
Alle Tickets <span class="badge">(<?= $result_4000 ?>)</span>
</a>
<?php } ?>
<?php if (get_permission_state('escalated_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=5000">
Eskalierte Tickets <span class="badge">(<?= $result_5000 ?>)</span>
</a>
<?php } ?>
<?php if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=6000">
Nicht zugewiesene Tickets <span class="badge">(<?= $result_6000 ?>)</span>
</a>
<?php } ?>
</div> -->
<div class="right_toolbar">
<a role="button" class="secondary" href="?cue=1000">
Von mir erstellt <span class="badge"></span>
</a>
<a role="button" class="secondary" href="?cue=1500">
Zu bearbeitende Tickets <span class="badge"></span>
</a>
<a role="button" class="secondary" href="?cue=2000">
Ticket Pool <span class="badge"></span>
</a>
<a role="button" class="secondary" href="?cue=2500">
Ticket Übersicht <span class="badge"></span>
</a>
<a role="button" class="secondary" href="?cue=3000">
Archiv <span class="badge"></span>
</a>
<?php if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=4000">
Alle Tickets <span class="badge"></span>
</a>
<?php } ?>
<?php if (get_permission_state('escalated_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=5000">
Eskalierte Tickets <span class="badge"></span>
</a>
<?php } ?>
<?php if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) { ?>
<a role="button" class="secondary" href="?cue=6000">
Nicht zugewiesene Tickets <span class="badge"></span>
</a>
<?php } ?>
</div>
<div class="left_toolbar">
<?php if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
echo button("delete", "Löschen", $formname, "sendRequest('delete', true)");
} ?>
<a role="button" class="primary" href="?action=new">Ticket erstellen</a>
</div>
</div>
</div>
<section class="listform_content">
<div class="container">
<div class="titlebar">
<?php
if (isset($_GET["cue"])) {
switch ($_GET["cue"]) {
case 1000:
$title = "Von mir erstellt";
$description = "Meine eigenen Tickets";
break;
case 1500:
$title = "Zu bearbeitende Tickets";
$description = "Meine in Bearbeitung befindlichen Tickets";
break;
case 2000:
$title = "Abteilungstickets";
$description = "Alle laufenden Abteilungstickets";
break;
case 2500:
$title = "Ticket Übersicht";
$description = "Alle laufenden Tickets";
break;
case 3000:
$title = "Archiv";
$description = "Alle geschlossenen Abteilungstickets";
break;
case 4000:
$title = "Alle Tickets";
$description = "Alle laufenden und geschlossenen Tickets";
break;
case 5000:
$title = "Eskalierte Tickets";
$description = "Alle eskalierenden Tickets";
break;
case 6000:
$title = "Nicht zugewiesene Tickets";
$description = "Alle Tickets ohne aktuellen Bearbeiter";
break;
case 7000:
$title = "Einkauf Tickets";
$description = "Alle Tickets des Bereichs Einkauf";
break;
case 8000:
$title = "Einkauf Tickets (Archiv)";
$description = "Alle Tickets des Bereichs Einkauf";
break;
default:
$title = "Tickets";
$description = "Übersicht über Tickets";
break;
}
?>
<hgroup>
<h1><?php echo htmlspecialchars($title); ?></h1>
<p><?php echo htmlspecialchars($description); ?></p>
</hgroup>
<?php
} else {
?>
<hgroup>
<h1>Ticketcenter</h1>
</hgroup>
<?php
}
?>
<div>
<!-- <div title="Datumsfilter"role="button" id="openDateFilter" class="outline"><i class="fa-solid fa-calendar-days"></i></div>
<div title="Filter"role="button" id="openSearchBuilder" class="outline"><i class="fa-solid fa-filter"></i></div> -->
<select name="select_categoty" id="">
<option value="all">Alle Kategorien</option>
<?php
$query = "SELECT * FROM main_tickets_category ORDER BY description ASC";
$result = mysqli_query($GLOBALS['mysql_con'], $query);
while ($row = mysqli_fetch_array($result)) {
echo '<option value="' . $row['description'] . '">' . htmlspecialchars($row['description']) . '</option>';
}
?>
</select>
<input type="text" title="Suche..." placeholder="Suche..." id="listform_search">
</div>
</div>
<div class="date_filter_builder">
<div class="date_filter_builder_title_row">
<div class="dtsb-title">Datumsfilter</div>
</div>
<div class="date_filter_builder_group">
<label for="min">
Datum von...
<input placeholder="Datum von..." type="text" id="min" name="min">
</label>
<label for="max">
Datum bis...
<input placeholder="Datum bis..." type="text" id="max" name="max">
</label>
</div>
</div>
<table id="ticket" class="ui celled table selectable linklist" style="width:100%">
<thead>
<tr>
<th></th>
<th>Nr.</th>
<th>Status</th>
<th>Abteilung</th>
<th>Beschreibung</th>
<th>Ersteller</th>
<th>Akt. Bearbeiter</th>
<th>Erstellt</th>
<th>Letzte Aktion</th>
<th>Zu erledigen bis</th>
<th>Geöffnet seit</th>
<?php if ($_GET['cue'] == 5000) { ?>
<th>Eskaliert am</th>
<?php } ?>
</tr>
</thead>
<tbody>
<? load_ticket_list($_GET['cue']); ?>
</tbody>
</table>
</div>
</section>
</form>
<script>
$('#ticket').DataTable({
info: false,
responsive: true,
pageLength: 20,
colReorder: false,
pagingType: 'simple_numbers',
lengthChange: true,
lengthMenu: [10, 20, 50, 100],
paging: true,
sorting: 0,
language: {
url: '//cdn.datatables.net/plug-ins/2.0.2/i18n/de-DE.json',
searchPlaceholder: '',
search: '',
lengthMenu: 'Zeige _MENU_ Einträge',
paginate: {
next: '>',
previous: '<'
},
datetime: {
previous: 'Zurück',
next: 'Weiter',
months: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],
weekdays: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
amPm: ['am', 'pm'],
hours: 'Stunde',
minutes: 'Minute',
seconds: 'Sekunde',
unknown: '-'
},
// searchBuilder: {
// title: {
// 0: 'Filter',
// _: 'Filters (%d)'
// },
// }
},
layout: {
// top1: {
// searchBuilder: {
// greyscale: true
// }
// },
topStart: 'pageLength',
topEnd: '',
bottomStart: {
buttons: [
{
extend: 'collection',
// split: ['copyHtml5', 'excelHtml5', 'csvHtml5', 'print']
split: ['copyHtml5', 'excelHtml5', 'csvHtml5', 'print']
}
]
},
bottomEnd: 'paging',
},
// drawCallback: function(settings) {
// initLinklist();
// }
});
var table = $('#ticket').DataTable();
// Ermöglicht das durchsuchen von Tabellen
$('#listform_search').keyup(function () {
table.search($(this).val()).draw();
})
var minDate, maxDate;
// Custom filtering function which will search data in column four between two values
DataTable.ext.search.push(function (settings, data, dataIndex) {
var min = minDate.val();
var max = maxDate.val();
var date = new Date(moment(data[1], 'DD.MM.YYYY'));
if (
(min === null && max === null) ||
(min === null && date <= max) ||
(min <= date && max === null) ||
(min <= date && date <= max)
) {
return true;
}
return false;
});
// Create date inputs
minDate = new DateTime('#min', {
format: 'DD.MM.YYYY'
});
maxDate = new DateTime('#max', {
format: 'DD.MM.YYYY'
});
// Refilter the table
$('#min, #max').on('change', function () {
table.draw();
});
$(".list_item").click(function () {
// Hole die Datenattribute aus der geklickten Zeile
var inputId = $(this).data('inputid');
// Setze den Wert des versteckten Input-Feldes auf die inputid der geklickten Zeile
$('input[name="input_id"]').val(inputId);
});
$(window).on('load', function () {
$('.loading').hide();
$('.listform_content').show();
});
$(".list_item").dblclick(function () {
// Hole die Datenattribute aus der geklickten Zeile
var action = $(this).data('action');
var inputId = $(this).data('inputid');
// Erweitere die URL mit den Parametern
var newUrl = window.location.href.split('?')[0] + '?action=' + action + '&id=' + inputId;
// Aktualisiere die URL
window.location.href = newUrl;
});
// Funktion zum Ãffnen/Schließen der Filter Search Groups vom DataTable
$('#openSearchBuilder').click(function () {
$(".dtsb-searchBuilder").toggle();
$(this).toggleClass("active")
});
// Funktion zum Ãffnen/Schließen der Date Filter vom DataTable
$('#openDateFilter').click(function () {
$(".date_filter_builder").toggle();
$(this).toggleClass("active")
});
$(document).ready(function () {
// Hole den Wert des cue-Parameters aus der URL
const urlParams = new URLSearchParams(window.location.search);
const cue = urlParams.get('cue');
// Wenn ein cue-Wert vorhanden ist, füge die Klasse active zum passenden Button hinzu
if (cue) {
$(`a[href="?cue=${cue}"]`).addClass('active');
}
});
document.addEventListener('DOMContentLoaded', function () {
const urlParams = new URLSearchParams(window.location.search);
const cue = urlParams.get('cue');
if (cue) {
sessionStorage.setItem('lastCue', cue);
}
});
document.addEventListener('DOMContentLoaded', function () {
function filterByCategory() {
const selectedCategory = $('select[name="select_categoty"]').val();
console.log("Selected category:", selectedCategory);
const table = $('#ticket').DataTable();
if (selectedCategory === 'all') {
// Zeige alle Zeilen
table.column(3).search('').draw();
} else {
// Filtere nach der ausgewählten Kategorie (Spalte 3 ist "Abteilung")
table.column(3).search(selectedCategory, true, false).draw();
}
}
// Event Listener für die Kategorie-Auswahl
$('select[name="select_categoty"]').on('change', filterByCategory);
});
</script>