Refactor contact management functions and remove phpinfo.php

- Updated formatting and structure of functions in edit_contact.inc.php for better readability and consistency.
- Added comments to clarify the purpose of certain code sections, especially regarding mandant handling.
- Removed the deprecated phpinfo.php file to clean up the codebase.
This commit is contained in:
2026-05-11 08:54:44 +02:00
parent 8749bc7994
commit 52ca9249c3
64 changed files with 13445 additions and 3562 deletions

View File

@@ -0,0 +1,417 @@
:root {
--main-nav-hight: 200px;
--ticket-nav-hight: 200px;
--cardform_header-height: 90px;
}
@media (width < 1200px) {
:root {
--main-nav-hight: 260px;
}
}
@media (width < 991px) {
:root {
--main-nav-hight: 0px;
}
#hero_content {
display: none !important;
}
.cardform_body_left {
display: none;
}
}
body {
overflow: hidden;
}
.ticket_edit {
.cardform_content .container {
padding: 0px;
}
}
#area-2 {
padding: 0px;
>.container {
padding-left: 0px !important;
padding-right: 0px !important;
}
}
.tickets_cardform {
min-height: calc(100dvh - var(--main-nav-hight));
max-height: calc(100dvh - var(--main-nav-hight));
height: calc(100dvh - var(--main-nav-hight));
background: var(--bg-white);
.cardform_header {
padding: 20px 30px 20px 30px;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
.cardform_header_left {
display: flex;
align-items: center;
gap: 10px;
h2 {
margin-bottom: 0px;
}
}
.cardform_header_right {
display: flex;
gap: 10px;
align-items: center;
a {
display: block;
}
}
}
.cardform_body {
display: flex;
max-height: calc(100% - var(--cardform_header-height));
height: 100%;
.cardform_body_left {
flex: 1 1 25%;
padding: 10px;
border-right: 1px solid var(--border);
@media (width < 991px) {
display: none;
}
&.is-closed {
width: 40px;
flex: unset;
.ticket_list {
display: none;
}
h3 {
display: none;
}
.body_left_line {
button {
i {
transform: rotate(180deg);
}
}
}
}
.body_left_line {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 10px;
button {
background: var(--blur);
color: var(--fc-dark);
font-size: var(--fs-500);
padding: 8px;
text-align: left;
font-size: var(--fs-500);
padding: 4px;
}
}
.ticket_list {
height: calc(100% - 33px);
overflow-y: scroll;
display: flex;
flex-direction: column;
-ms-overflow-style: none;
/* IE and old Edge */
scrollbar-width: none;
/* Firefox */
.ticket_card {
position: relative;
a {
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 100%;
}
font-size: 14px;
border: 1px solid var(--border);
border-radius: 5px;
padding: 10px;
margin-bottom: 10px;
transition-duration: 200ms;
&:hover {
border-color: var(--primary);
background-color: #FAFAFA;
transition-duration: 200ms;
}
&.active {
background-color: #FAFAFA;
}
.card_header {
display: flex;
.ticket_status {
font-size: 12px;
padding: 2px 5px;
border-radius: 3px;
background-color: #000;
color: #fff;
}
}
.card_body {
display: flex;
gap: 5px;
margin-top: 3px;
.ticket_no {
font-weight: var(--fw-bold);
}
.ticket_desc {
font-weight: var(--fw-bold);
}
}
.card_footer {
color: gray;
}
}
}
}
.cardform_body_middle {
flex: 1 1 45%;
/* padding-left: 20px; */
/* padding-right: 20px; */
background-color: #F6F5F8;
.communication {
height: 100%;
.messages_scroll_container {
min-height: calc(100% - 200px);
max-height: calc(100% - 200px);
overflow-y: auto;
display: flex;
flex-direction: column-reverse;
padding-left: 20px;
padding-right: 20px;
}
.communication_toolbar {
max-height: 200px;
padding-left: 20px;
padding-right: 20px;
background: #fff;
height: 200px;
border-top: 1px solid var(--border);
&.communication_toolbar--closed {
display: flex;
align-items: center;
justify-content: center;
p {
margin: 0;
color: gray;
font-size: var(--fs-500);
}
}
}
}
}
.cardform_body_right {
flex: 1 1 30%;
border-left: 1px solid var(--border);
padding: 16px;
overflow-y: scroll;
@media (width < 991px) {
position: fixed;
top: 60px;
right: 0px;
width: 90dvw;
height: calc(100dvh - 60px);
z-index: 100;
background-color: #fff;
padding-bottom: 100px;
}
&.is-closed {
width: 50px;
flex: unset;
@media (width < 991px) {
position: static;
}
h3 {
display: none;
}
.ticketinfo_body {
display: none;
}
.ticketinfo_header_status {
display: none;
}
}
.ticketinfo_header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
.ticketinfo_header_title {
display: flex;
gap: 10px;
align-items: center;
h3 {
margin-bottom: 0px;
}
button {
background: var(--blur);
color: var(--fc-dark);
font-size: var(--fs-500);
padding: 8px;
text-align: left;
font-size: var(--fs-500);
padding: 4px;
}
}
.ticketinfo_header_status {
font-size: 12px;
padding: 4px 5px;
border-radius: 3px;
background-color: #000;
color: #fff;
}
}
.ticketinfo_body {
h3 {
border-top: 1px solid var(--border);
padding-top: 12px;
margin-top: 12px;
}
.ticketinfo_item {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 6px;
.ticketinfo_item_links {
font-size: var(--fs-500);
color: gray;
width: 50%;
}
.ticketinfo_item_right {
width: 50%;
font-weight: 700;
}
}
}
}
}
}
* {
scrollbar-color: unset;
}
@media (width < 768px) {
form#form_ticket_card {
padding-bottom: 85px;
}
body {
overflow: auto;
}
}
.close-ticket-modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: 1000;
.close-ticket-modal-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 20px;
border-radius: 8px;
min-width: 300px;
border: 1px solid var(--border);
}
.close-ticket-warning {
color: #d32f2f;
font-weight: bold;
}
.close-ticket-modal-buttons {
text-align: right;
gap: 10px;
display: flex;
justify-content: flex-end;
margin-top: 20px;
.btn-cancel {
background: #ededed;
text-align: center;
padding: 10px;
border-radius: var(--br);
color: black;
}
.btn-confirm {
background: var(--clr-mandant);
color: var(--fc-white-8);
padding: 10px 15px;
border-radius: var(--br);
cursor: pointer;
border: none;
}
}
}

View File

@@ -0,0 +1,55 @@
:root {
--main-nav-width: 250px;
--ticket-nav-width: 200px;
}
.ticket_edit {
.create_cardform_content .container {
padding: 0px;
}
}
#area-2 {
padding: 0px;
> .container {
padding-left: 0px !important;
padding-right: 0px !important;
}
}
.tickets_create_cardform {
min-height: calc(100dvh - var(--ticket-nav-width));
background: var(--bg-white);
.create_cardform_header {
padding: 20px 30px 20px 30px;
border-bottom: 1px solid var(--border);
display: flex;
justify-content: space-between;
.create_cardform_header_left {
display: flex;
align-items: center;
gap: 10px;
h2 {
margin-bottom: 0px;
}
}
.create_cardform_header_right {
a {
display: block;
}
}
}
.create_cardform_body {
.create_cardform_content {
display: flex;
gap: 30px;
.create_cardform_content_left {
width: 50%;
padding: 30px;
}
.create_cardform_content_right {
width: 50%;
}
}
}
}

View File

@@ -0,0 +1,140 @@
:root {
--main-nav-width: 250px;
--ticket-nav-width: 300px;
}
#area-2 {
padding: 0px;
> .container {
padding: 0px;
}
}
#footer-header {
display: none;
}
.listform_body {
display: flex;
.listform_navigation {
width: var(--ticket-nav-width);
display: flex;
flex-direction: column;
background: var(--bg-white);
border: 1px solid var(--border);
padding: 12px;
gap: 4px;
min-height: calc(100dvh - 200px);
/* min-height: calc(100% - 200px); */
position: sticky;
top: 0px;
.listform_navigation_header {
display: flex;
flex-direction: column;
gap: 4px;
button {
background: var(--blur);
color: var(--fc-dark);
font-size: var(--fs-500);
padding: 8px;
text-align: left;
&.active {
background: var(--clr-mandant);
color: var(--fc-white-8);
}
}
a[role="button"] {
border-radius: var(--br);
background: var(--clr-mandant);
color: var(--fc-white-8);
font-size: var(--fs-500);
padding: 8px;
text-align: left;
margin-bottom: 10px;
}
.listform_navigation_header_line {
display: flex;
justify-content: space-between;
align-items: center;
button {
padding: 4px;
}
}
}
&.is-closed {
overflow: hidden;
width: unset;
.to-hide-on-close {
display: none;
}
i {
transform: rotate(180deg);
}
}
}
.listform_content {
flex: 1;
/* padding: 20px 20px 20px 20px; */
padding-top: 20px;
background: var(--bg-white);
padding-bottom: 100px;
overflow-x: scroll;
#grid {
.gridjs-head {
padding-top: 0px;
}
}
}
}
#grid {
height: 100%;
}
.gridjs-container {
position: relative;
padding: 0px !important;
height: 100%;
.gridjs-head {
padding-left: 20px;
}
.gridjs-wrapper {
border: unset;
box-shadow: unset;
border-radius: 0px;
overflow-x: auto;
-webkit-overflow-scrolling: touch;
.gridjs-thead {
tr.gridjs-tr {
th.gridjs-th {
padding: 6px 14px;
/* background-color: var(--bg-white); */
/* border-bottom: 1px solid var(--border); */
color: var(--fc-dark);
}
}
}
.gridjs-tbody {
cursor: pointer;
tr.gridjs-tr {
&:hover {
background-color: #f9fafb;
td {
background-color: #f9fafb;
}
}
td.gridjs-td {
padding: 6px 14px;
}
}
}
}
.gridjs-footer {
border: unset;
box-shadow: unset;
position: fixed;
bottom: 0px;
width: stretch;
background-color: var(--bg-white);
border-top: 1px solid var(--border);
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,4 +1,3 @@
/* Ticketcenter */
.ticketcenter {
@@ -372,7 +371,7 @@ i.fa-solid.fa-circle-exclamation {
.history {
padding: 1rem;
border-left: 1px solid var(--border);
/* border-left: 1px solid var(--border); */
}
table#service_item_create td {
@@ -476,12 +475,6 @@ table#service_item_create td input {
border: 1px solid var(--border);
}
.messages_scroll_container {
overflow-y: scroll;
height: 500px;
display: flex;
flex-direction: column-reverse;
}
p.date {
font-size: 12px;
@@ -663,8 +656,7 @@ a.button_send_message_button {
.message.outbound {
width: 100%;
margin-left: auto;
background: var(--blue-accent);
color: white;
background: var(--bg-white);
}
.info_labels label div {
@@ -679,7 +671,7 @@ a.button_send_message_button {
padding-bottom: 0 !important;
}
.card_header {
/* .card_header {
display: flex;
align-items: center;
justify-content: space-between;
@@ -687,7 +679,7 @@ a.button_send_message_button {
padding: 0.5rem;
padding-inline: 1rem;
min-height: 57px;
}
} */
.card_title h3 {
margin: 0;
@@ -722,7 +714,7 @@ div.dt-container.ui.grid>div.row:first-child {
.breadcrumb a {
color: white;
}
body.wiki .subcategory {
.pct_textcontent:after {
content: '';
@@ -736,9 +728,11 @@ body.wiki .subcategory {
left: 50%;
transform: translateX(-50%);
}
.pct_read{
margin-bottom: 10px;
.pct_read {
margin-bottom: 10px;
}
.pct_status {
height: 10px;
background: #5a9c9d;
@@ -747,6 +741,7 @@ body.wiki .subcategory {
position: relative;
}
}
body.wiki .category {
.pct_textcontent:after {
content: '';
@@ -760,9 +755,11 @@ body.wiki .category {
left: 50%;
transform: translateX(-50%);
}
.pct_read{
margin-bottom: 10px;
.pct_read {
margin-bottom: 10px;
}
.pct_status {
height: 10px;
background: #5a9c9d;
@@ -774,8 +771,8 @@ body.wiki .category {
.unreaded {
border: 1px solid red !important;
}
border: 1px solid red !important;
}
@@ -933,9 +930,9 @@ body.ticket_edit {
position: unset;
}
div#hero_content {
/* div#hero_content {
height: unset;
}
} */
.modal.category_edit {
max-width: 600px;
@@ -960,7 +957,7 @@ body.ticket_edit {
z-index: 999;
}
#category_edit {
display: block;
@@ -1008,26 +1005,34 @@ body.ticket_edit {
/* Ticketcenter Ende */
body.ticketcenter, body.servicecenter {
background-image: url(/userdata/01_Basis/Intranet_bg.webp) !important;
body.ticketcenter,
body.servicecenter {
background-image: url(/userdata/01_Basis/Intranet_bg.webp) !important;
}
.ticketcenter .right_toolbar a[role="button"].active {
border-bottom: 2px solid var(--clr-mandant);
}
.ticketcenter .right_toolbar a[role="button"]:hover {
border-bottom: 2px solid var(--clr-mandant);
}
.ticketcenter .right_toolbar {
border-bottom: 1px solid var(--border);
}
border-bottom: 2px solid var(--clr-mandant);
}
.ticketcenter .right_toolbar a[role="button"] {
background: transparent;
border: 0;
color: var(--fc-primary);
padding: 5px 10px;
border-radius: 0;
}
.ticketcenter .right_toolbar a[role="button"]:hover {
border-bottom: 2px solid var(--clr-mandant);
}
.ticketcenter .right_toolbar {
border-bottom: 1px solid var(--border);
}
.ticketcenter .right_toolbar a[role="button"] {
background: transparent;
border: 0;
color: var(--fc-primary);
padding: 5px 10px;
border-radius: 0;
}
.footer-header_1 {
display: none;
}
.footer-header_2 {
display: none;
}

View File

@@ -0,0 +1,222 @@
$(document).ready(function () {
// Hole die aktuelle URL
var currentUrl = window.location.href;
// Überprüfen, ob ?action= in der URL vorhanden ist
if (currentUrl.indexOf("?action=") !== -1) {
// Entferne den Teil ab ?action=, inkl. allem, was danach kommt
var newUrl = currentUrl.split("?action=")[0];
// Aktualisiere die URL ohne Neuladen der Seite
window.history.replaceState(null, null, newUrl);
}
});
document.addEventListener("DOMContentLoaded", function () {
// Initial load of category data
const categorySelect = document.getElementById('input_category');
if (categorySelect) {
let selectedId = categorySelect.value;
removeAjaxContent();
// Initial AJAX call
fetchCategoryData(selectedId);
// Add change event listener to category select
categorySelect.addEventListener('change', function() {
selectedId = this.value;
removeAjaxContent();
fetchCategoryData(selectedId);
getCategoryDescription();
});
// Initial description load
getCategoryDescription();
}
});
// Helper function to remove ajax content
function removeAjaxContent() {
const ajaxContents = document.querySelectorAll('.ajax-content');
ajaxContents.forEach(content => content.remove());
}
// Helper function to remove ajax subcontent
function removeAjaxSubContent() {
const ajaxSubContents = document.querySelectorAll('.ajax-subcontent');
ajaxSubContents.forEach(content => content.remove());
}
// Fetch category data via AJAX
function fetchCategoryData(categoryId) {
$.ajax({
url: '/module/ticketcenter/views/ticketcenter/show_ticketcenter_ajax.php',
type: 'POST',
data: { category_id: categoryId },
success: function (response) {
const categorySelect = document.getElementById('input_category');
const parentDiv = categorySelect.parentNode;
// Insert response after the parent div
const ajaxContent = document.createElement('div');
ajaxContent.className = 'ajax-content';
ajaxContent.innerHTML = response;
parentDiv.after(ajaxContent);
// Add event listener to subcategory select if it exists
const subcategorySelect = document.getElementById('input_subcategory');
if (subcategorySelect) {
subcategorySelect.addEventListener('change', function() {
getSubCategoryDescription();
getSubSubCategory();
});
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getCategoryDescription() {
const categorySelect = document.getElementById('input_category');
const selectedId = categorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".category_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/views/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'category_desc';
descDiv.innerHTML = "<h5>Kategoriebeschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("afterbegin", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubCategoryDescription() {
const subcategorySelect = document.getElementById('input_subcategory');
if (!subcategorySelect) return;
const selectedId = subcategorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".subcategory_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/views/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'subcategory_desc';
descDiv.style.marginTop = '20px';
descDiv.innerHTML = "<h5>Unterkategoriebeschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("beforeend", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubSubCategoryDescription() {
const subsubcategorySelect = document.getElementById('input_subsubcategory');
if (!subsubcategorySelect) return;
const selectedId = subsubcategorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".subsubcategory_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/views/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'subsubcategory_desc';
descDiv.style.marginTop = '20px';
descDiv.innerHTML = "<h5>Beschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("beforeend", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubSubCategory() {
const subcategorySelect = document.getElementById('input_subcategory');
if (!subcategorySelect) return;
const selectedId = subcategorySelect.value;
removeAjaxSubContent();
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_subcategory_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const parentDiv = subcategorySelect.parentNode;
// Insert response after the parent div
const ajaxSubContent = document.createElement('div');
ajaxSubContent.className = 'ajax-subcontent';
ajaxSubContent.innerHTML = response;
parentDiv.after(ajaxSubContent);
// Add event listener to subsubcategory select if it exists
const subsubcategorySelect = document.getElementById('input_subsubcategory');
if (subsubcategorySelect) {
subsubcategorySelect.addEventListener('change', function() {
getSubSubCategoryDescription();
});
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}

View File

@@ -0,0 +1,3 @@
function toggleSideboard(sideboard) {
document.querySelector(sideboard).classList.toggle('is-closed');
}

File diff suppressed because one or more lines are too long

View File

@@ -8,7 +8,7 @@ $currDir = __DIR__;
$rootDir = dirname(dirname(dirname($currDir)));
$mysydeDir = $rootDir . '/mysyde';
require_once($rootDir . '/vendor/autoload.php');
require_once($rootDir . '/vendor/autoload.php');
require_once($rootDir . "/mysyde/frontend/frontend_functions.inc.php");
$envDir = $rootDir . '/config';
@@ -17,28 +17,309 @@ if (is_dir($envDir) && file_exists($envFilePath) && is_file($envFilePath) && is_
$dotenv = new \Dotenv\Dotenv($envDir);
$dotenv->load();
}
$common = $mysydeDir ."/common/common_functions.inc.php";
$common = $mysydeDir . "/common/common_functions.inc.php";
require_once($common);
$connEnv = (local_environment()) ? $mysydeDir."/dc.config.php" : $mysydeDir."/dc-server.config.php";
$connEnv = (local_environment()) ? $mysydeDir . "/dc.config.php" : $mysydeDir . "/dc-server.config.php";
require_once($connEnv);
db_connect();
function parse_ids_list(?string $csv): array
{
if ($csv === null)
return [];
$csv = trim($csv);
if ($csv === '')
return [];
switch ($_POST['action']) {
$parts = explode(',', $csv);
$out = [];
foreach ($parts as $p) {
$p = trim($p);
if ($p === '')
continue;
if (ctype_digit($p))
$out[] = (int) $p;
}
$out = array_values(array_unique($out));
return $out;
}
function build_user_pairs(array $contact_rows): array
{
$pairs = [];
foreach ($contact_rows as $row) {
$m = $row['main_mandant_id'] ?? null;
$d = $row['main_department_id'] ?? null;
if ($m === null || $d === null)
continue;
if (!is_numeric($m) || !is_numeric($d))
continue;
$pairs[((int) $m) . ':' . ((int) $d)] = true;
}
return $pairs; // associative set
}
function user_can_see_ticket(int $contact_id, array $user_pairs, array $ticket): bool
{
$contact_ids = parse_ids_list($ticket['contact_ids'] ?? null);
$mandant_ids = parse_ids_list($ticket['mandant_ids'] ?? null);
$department_ids = parse_ids_list($ticket['department_ids'] ?? null);
if (!empty($contact_ids) && in_array($contact_id, $contact_ids, true)) {
return true;
}
$mandant_unrestricted = empty($mandant_ids);
$department_unrestricted = empty($department_ids);
if ($mandant_unrestricted && $department_unrestricted) {
return true;
}
if (!$mandant_unrestricted && $department_unrestricted) {
foreach ($user_pairs as $pairKey => $_) {
[$um, $ud] = array_map('intval', explode(':', $pairKey, 2));
if (in_array($um, $mandant_ids, true))
return true;
}
return false;
}
if ($mandant_unrestricted && !$department_unrestricted) {
foreach ($user_pairs as $pairKey => $_) {
[$um, $ud] = array_map('intval', explode(':', $pairKey, 2));
if (in_array($ud, $department_ids, true))
return true;
}
return false;
}
foreach ($mandant_ids as $m) {
foreach ($department_ids as $d) {
if (isset($user_pairs[$m . ':' . $d])) {
return true;
}
}
}
return false;
}
function filter_tickets_for_user(int $contact_id, array $contact_rows, array $tickets): array
{
$user_pairs = build_user_pairs($contact_rows);
$out = [];
foreach ($tickets as $ticket) {
if (user_can_see_ticket($contact_id, $user_pairs, $ticket)) {
$out[] = $ticket;
}
}
return $out;
}
$json = file_get_contents('php://input');
$data = json_decode($json, true);
switch ($data['action']) {
case 'get_tickets':
get_tickets();
get_tickets($data);
break;
case 'getSubCategories':
get_sub_categories($data);
break;
case 'getParendCategories':
get_parent_categories($data);
break;
case 'getCategorieInfo':
get_categorie_info($data);
break;
default:
echo json_encode(['error' => 'Invalid action']);
break;
}
function get_tickets() {
$contact = $_SESSION['main_contact'];
$contact_json = json_encode($contact);
function get_categorie_info($data)
{
$category_id = $data['category_id'] ?? '';
return json_encode(['contact' => $contact_json]);
}
$query = "SELECT id, description, text FROM main_tickets_category WHERE id = :category_id";
$stmt = $GLOBALS['pdo_conn']->prepare($query);
$stmt->bindParam(':category_id', $category_id);
$stmt->execute();
$category_info = $stmt->fetch(PDO::FETCH_ASSOC);
echo json_encode($category_info);
}
function get_parent_categories($data)
{
$query = "SELECT id, description, text FROM main_tickets_category WHERE parent_id IS NULL ORDER BY sorting";
$stmt = $GLOBALS['pdo_conn']->prepare($query);
$stmt->execute();
$parent_categories = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($parent_categories);
}
function get_sub_categories($data)
{
$category_id = $data['category_id'] ?? '';
$query = "SELECT id, description, text FROM main_tickets_category WHERE parent_id = :category_id ORDER BY sorting";
$stmt = $GLOBALS['pdo_conn']->prepare($query);
$stmt->bindParam(':category_id', $category_id);
$stmt->execute();
$sub_categories = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode($sub_categories);
}
function get_tickets($data)
{
$cue = $data['cue'] ?? '';
$contact_id = $data['contactID'] ?? '';
$query = "SELECT
main_contact.id AS contact_id,
main_contact_department.main_mandant_id,
main_contact_department.main_department_id,
main_contact_department.main_role_id,
main_contact_department.main_bereich_id,
main_contact_department.main_einricht_id
FROM main_contact
LEFT JOIN main_contact_department AS main_contact_department ON main_contact_department.main_contact_id = main_contact.id
WHERE main_contact.id = :contact_id
";
$stmt = $GLOBALS['pdo_conn']->prepare($query);
$stmt->bindParam(':contact_id', $contact_id);
$stmt->execute();
$contact_rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
switch ($cue) {
case '1000':
$where = "WHERE main_tickets.sender_id = :contact_id
AND current_state != 4";
break;
case '2000':
$where = "WHERE main_tickets.receiver_id = :contact_id
AND current_state != 4";
break;
case '3000':
$where = "WHERE current_state != 4";
break;
case '4000':
$where = "WHERE main_tickets.current_state = 4";
break;
case '6000':
$where = "";
break;
case '7000':
$where = "WHERE main_tickets.receiver_id = 0";
break;
case '8000':
$where = "WHERE main_tickets.insurance_claim = 1";
break;
default:
$where = "";
break;
}
$query = "SELECT
main_tickets.id,
main_tickets.id AS 'ticket_no',
main_tickets.description,
main_tickets.creation_date,
receiver.name AS 'receiver',
sender.name AS 'sender',
main_tickets_category.description AS 'category_description',
individual_state.description AS 'individual_state_description',
GROUP_CONCAT(DISTINCT main_tickets_category_mandant.main_mandant_id) AS mandant_ids,
GROUP_CONCAT(DISTINCT main_tickets_category_department.main_department_id) AS department_ids,
GROUP_CONCAT(DISTINCT main_tickets_category_contact.main_contact_id) AS contact_ids
FROM main_tickets
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_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_status AS individual_state ON individual_state.id = main_tickets.individual_state
LEFT JOIN main_tickets_category_mandant AS main_tickets_category_mandant ON main_tickets_category_mandant.main_tickets_category_id = main_tickets.main_ticket_category_id
LEFT JOIN main_tickets_category_department AS main_tickets_category_department ON main_tickets_category_department.main_tickets_category_id = main_tickets.main_ticket_category_id
LEFT JOIN main_tickets_category_contact AS main_tickets_category_contact ON main_tickets_category_contact.main_tickets_category_id = main_tickets.main_ticket_category_id
$where
GROUP BY main_tickets.id
";
$stmt = $GLOBALS['pdo_conn']->prepare($query);
switch ($cue) {
case '1000':
$stmt->bindParam(':contact_id', $contact_id, PDO::PARAM_INT);
break;
case '2000':
$stmt->bindParam(':contact_id', $contact_id, PDO::PARAM_INT);
break;
case '3000':
break;
case '4000':
break;
case '5000':
break;
case '6000':
break;
case '7000':
break;
default:
break;
}
$stmt->execute();
$tickets = $stmt->fetchAll(PDO::FETCH_ASSOC);
$contact_id_int = (int) $contact_id;
switch ($cue) {
case '1000':
break;
case '2000':
break;
case '3000':
$tickets = filter_tickets_for_user($contact_id_int, $contact_rows, $tickets);
break;
case '4000':
$tickets = filter_tickets_for_user($contact_id_int, $contact_rows, $tickets);
break;
case '5000':
break;
case '6000':
break;
case '7000':
break;
default:
break;
}
$tickets = array_map(function ($ticket) {
$ticket['id'] = encryptId($ticket['id']);
return $ticket;
}, $tickets);
echo json_encode($tickets);
}

View File

@@ -0,0 +1,105 @@
<?
date_default_timezone_set('Europe/Berlin');
$messages = array();
$error = FALSE;
if (isset($custom_action)) {
$action = $custom_action;
} else {
$action = $_REQUEST["action"];
}
switch ($action) {
case 'save_status':
save_status();
break;
default:
require_once("settings_cardform.inc.php");
break;
}
function save_status() {
$translation = \DynCom\mysyde\common\classes\Registry::get("translation");
$inserted = FALSE;
$messages = array();
if ($_REQUEST["input_status_id"] <> '') {
$query = "UPDATE main_tickets_status SET
description = '" . mysqli_real_escape_string($GLOBALS['mysql_con'], $_REQUEST["input_description"]) . "'
WHERE id = '" . $_REQUEST["input_status_id"] . "' LIMIT 1";
$inserted = TRUE;
} else {
$sorting = @mysqli_fetch_array(@mysqli_query($GLOBALS['mysql_con'], "SELECT MAX(sorting)+1 AS 'newsorting' FROM main_tickets_status"));
$sorting = ($sorting["newsorting"] <> "") ? $sorting = $sorting["newsorting"] : $sorting = 1;
$query = "INSERT INTO main_tickets_status (description) VALUES (
'" . mysqli_real_escape_string($GLOBALS['mysql_con'], $_REQUEST["input_description"]) . "'
)";
$inserted = TRUE;
}
@mysqli_query($GLOBALS['mysql_con'], $query);
if ($inserted == TRUE) {
$input_id = mysqli_insert_id($GLOBALS['mysql_con']);
$messages[] = '<div class="successbox">' . $translation->get("msg_success") . '</div>';
} else {
$messages[] = '<div class="successbox">' . $translation->get("msg_error") . '</div>';
}
if ($_REQUEST['save_and_close'] == 1) {
require_once("status_listform.inc.php");
} else {
edit_status($input_id);
}
}
function selectContact($group_id)
{
$translation = \DynCom\mysyde\common\classes\Registry::get("translation");
$query = "SELECT * FROM main_contact";
$result_contact = @mysqli_query($GLOBALS['mysql_con'], $query);
if (@mysqli_num_rows($result_contact) == 0) {
return;
}
$preselect = array();
$query = "SELECT main_contact.* FROM main_contact INNER JOIN main_tickets_category_contact ON main_contact.id = main_tickets_category_contact.main_contact_id WHERE main_tickets_category_contact.main_tickets_category_id = '" . $group_id . "'";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
while ($row = @mysqli_fetch_array($result)) {
array_push($preselect, $row['name']);
}
$allselect = array();
?>
<div class="label">Zusätzlicher Benutzer auswählen</div>
<div class="contacts bc-select-ui ui fluid multiple search selection dropdown" style="clear:both;display:inline-block;">
<input type="hidden" name="select_user">
<i class="dropdown icon"></i>
<div class="default text"><?php echo $translation->get("top_user") ?></div>
<div class="menu">
<?
while ($contact = @mysqli_fetch_array($result_contact)) {
array_push($allselect, $contact['id']);
echo "<div class=\"item\" data-value=\"{$contact['id']}\">" . $contact["name"] . "</div>";
}
?>
</div>
</div>
<script type="text/javascript" src="/plugins/jquery/jquery-3.5.1.min.js"></script>
<script type="text/javascript" src="/plugins/Semantic-UI-master/semantic.min.js"></script>
<link rel="stylesheet" type="text/css"
href="/plugins/Semantic-UI-master/bc-semantic.css?time=<?= filemtime($_SERVER['DOCUMENT_ROOT'] . '/plugins/Semantic-UI-master/bc-semantic.css') ?>">
<script>
var $y = jQuery.noConflict();
$y(document).ready(function () {
$y('.contacts.ui.fluid.multiple.dropdown').dropdown('set selected', <?= json_encode($preselect) ?>);
});
</script>
<?php
}

View File

@@ -0,0 +1,10 @@
<div id="mainContent">
<h1><?php echo get_translation('Einstellungen'); ?></h1>
<form id="<?= $formname ?>" name="<?= $formname ?>" method="post">
<? selectContact($input_category['id']) ?>
</form>
</div>

View File

@@ -17,7 +17,7 @@ $inputname = "input_status_id";
<div class="requestLoader"></div>
<?
$query = "SELECT id, description AS '" . $translation->get("description") . "' FROM main_tickets_status WHERE id NOT IN (0, 1, 2, 3)";
$query = "SELECT id, description AS '" . $translation->get("description") . "' FROM main_tickets_status WHERE id NOT IN (0, 1, 2, 3, 4)";
$format = array("option", "text");
if ($result = mysqli_query($GLOBALS['mysql_con'], $query)) {
linklist($result, "form_status_list", $format);

View File

@@ -1,14 +1,15 @@
<?php
// Display only errors (no notices, warnings, or deprecation messages)
error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
?>
<script src="/module/ticketcenter/js/functions.js?v=<?= filemtime(__DIR__ . "/../../js/functions.js") ?>"></script>
<link href="/layout/frontend/b2c/dist/fontawesome/css/fontawesome.css" rel="stylesheet" />
<link href="/layout/frontend/b2c/dist/fontawesome/css/brands.css" rel="stylesheet" />
<link href="/layout/frontend/b2c/dist/fontawesome/css/solid.css" rel="stylesheet" />
<!-- <script src="https://kit.fontawesome.com/e89a33a132.js" crossorigin="anonymous"></script> -->
<script src="/layout/frontend/b2c/dist/js/fonta.js" crossorigin="anonymous"></script>
<div class="ticket_overlay" style="display:none;">
<div class="ticket_overlay_content">
<div class="ticket_overlay_content_header">
@@ -31,7 +32,7 @@ error_reporting(E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR);
switch ($_GET['action']) {
case 'new':
require_once("show_ticketcenter_cardform.inc.php");
require_once("show_ticketcenter_create_cardform.inc.php");
break;
case 'save':
save_ticket();
@@ -39,61 +40,42 @@ switch ($_GET['action']) {
case 'update_ticket':
update_ticket();
break;
case 'save_new_ticket_receiver':
save_new_ticket_receiver();
save_new_due_date();
save_new_ticket_individual_state();
break;
case 'save_new_due_date':
save_new_due_date();
break;
case 'save_category':
save_category();
break;
case 'save_new_ticket_individual_state':
// save_new_ticket_individual_state();
break;
case 'save_ticket_supplieres':
save_ticket_supplieres();
break;
case 'save_and_close':
save_ticket(TRUE);
break;
case 'edit':
edit_ticket(decryptId($_GET['id']));
edit_ticket(decryptId(trim($_GET['id'])));
break;
case 'delete':
delete_ticket();
break;
case 'close':
close_ticket();
break;
case 'send_message':
send_message();
save_new_ticket_receiver();
save_new_due_date();
save_new_ticket_individual_state();
// Kategorie ebenfalls mitschreiben, wenn Werte übergeben wurden (silent, ohne direktes Rendern)
save_category(true);
// Nach Abschluss alles per Redirect neu laden, damit die Seite mit frischen DB-Werten gerendert wird
$tid = null;
if (isset($_POST['input_id']) && is_numeric($_POST['input_id'])) {
$tid = (int)$_POST['input_id'];
} elseif (isset($_POST['ticket_id']) && is_numeric($_POST['ticket_id'])) {
$tid = (int)$_POST['ticket_id'];
}
if ($tid) {
$encId = encryptId($tid);
$encId = encryptId($_POST['input_id']);
echo "<script>window.location.href='/intranet/de/ticketcenter/?action=edit&id=" . $encId . "';</script>";
}
break;
case 'save_forward_ticket':
// Speichert alle relevanten Felder in einem Durchlauf und rendert erst am Ende
save_new_ticket_receiver();
save_new_due_date();
save_new_ticket_individual_state();
// Kategorie still (ohne direktes Rendern) speichern
save_category(true);
if (isset($_POST['input_id']) && is_numeric($_POST['input_id'])) {
// Statt direkt zu rendern: Redirect per JS auf GET-Edit-Ansicht,
// damit der Browser keine alten Formularwerte aus dem POST puffert.
$insurance_claim = isset($_POST['input_insurance_case']) ? 1 : 0;
$stmt = mysqli_prepare($GLOBALS['mysql_con'], "UPDATE main_tickets SET insurance_claim = ? WHERE id = ?");
if ($stmt) {
$input_id = (int)$_POST['input_id'];
mysqli_stmt_bind_param($stmt, "ii", $insurance_claim, $input_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
}
if (isset($_POST['input_id']) && is_numeric($_POST['input_id'])) {
$encId = encryptId($_POST['input_id']);
echo "<script>window.location.href='/intranet/de/ticketcenter/?action=edit&id=" . $encId . "';</script>";
}
@@ -103,6 +85,28 @@ switch ($_GET['action']) {
break;
}
function edit_ticket($_id = "")
{
if ((int) $_id > 0) {
$input_id = $_id;
}
if ($input_id <> '') {
$query = "SELECT main_tickets.*,main_tickets_category.description AS 'category_description',receiver.name as 'receiver',sender.name as 'sender',main_tickets_state.description as 'state' FROM main_tickets
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_category ON main_tickets.main_ticket_category_id = main_tickets_category.id
LEFT JOIN main_tickets_state ON main_tickets.current_state = main_tickets_state.id
WHERE main_tickets.id = '" . $input_id . "'";
// $query = "SELECT * FROM main_tickets WHERE id = '".$input_id."'";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
$ticket = @mysqli_fetch_array($result);
}
$query_update = "UPDATE main_tickets_notification SET viewed = 1 WHERE main_ticket_id = '" . $input_id . "' AND main_contact_id = '" . $GLOBALS['main_contact']['id'] . "'";
@mysqli_query($GLOBALS['mysql_con'], $query_update);
require_once("show_ticketcenter_cardform.inc.php");
}
// Speichert einen neuen oder aktualisierten ticket in der Datenbank und leitet je nach Bedarf entweder zum Listenformular zurück oder schließt das Bearbeitungsformular.
function save_ticket($close = FALSE)
{
@@ -113,39 +117,38 @@ function save_ticket($close = FALSE)
$input_id = $_POST["input_id"];
} else {
// $query_contact = "SELECT main_mandant.main_contact_id FROM main_tickets_category LEFT JOIN main_mandant ON main_mandant.id = main_tickets_category.main_mandant_id WHERE main_tickets_category.id = ".$_POST["input_category"];
// if(isset($_POST['input_subcategory'])){
// $query_contact = "SELECT main_mandant.main_contact_id FROM main_tickets_category LEFT JOIN main_mandant ON main_mandant.id = main_tickets_category.main_mandant_id WHERE main_tickets_category.id = ".$_POST["input_subcategory"];
// }
// $result = mysqli_query($GLOBALS['mysql_con'], $query_contact);
// $contact = @mysqli_fetch_array($result);
// $approval_by_manager = isset($_POST["input_approval_by_manager"]) ? 1 : 0;
$sender_id = $GLOBALS['main_contact']['id'];
// if($_POST['input_new_ticket_sender'] != ""){
// $sender_id = $_POST['input_new_ticket_sender'];
// }
$location = isset($_POST["input_location"]) ? $_POST["input_location"] : "";
$address = isset($_POST["input_address"]) ? $_POST["input_address"] : "";
$facility = isset($_POST["input_facility"]) ? $_POST["input_facility"] : "";
// last element of array $_POST["input_category"]
$category = $_POST["input_category"];
$lastCategory = end($category);
$insurance_claim = $_POST["input_insurance_case"] == "on" ? 1 : 0;
$query = "INSERT INTO main_tickets (
ticket_no,
description,
main_ticket_category_id,
main_ticket_subcategory_id,
main_ticket_subsubcategory_id,
main_ticket_category_id,
service_item_no,
last_action_date,
last_opening_date,
creation_date,
current_state,
individual_state,
sender_id,
cost_center,
link
link,
location,
address,
facility,
insurance_claim
) VALUES (
'" . $_POST["input_ticket_no"] . "',
'" . strip_tags($_POST["input_description"]) . "',
'" . $_POST["input_category"] . "',
'" . $_POST["input_subcategory"] . "',
'" . $_POST["input_subsubcategory"] . "',
'" . $lastCategory . "',
'" . $_POST["input_service_item"] . "',
NOW(),
NOW(),
@@ -153,7 +156,11 @@ function save_ticket($close = FALSE)
2,
'" . $sender_id . "',
'" . $_POST["input_cost_center"] . "',
'" . $_POST["input_link"] . "'
'" . $_POST["input_link"] . "',
'" . $location . "',
'" . $address . "',
'" . $facility . "',
'" . $insurance_claim . "'
)";
$inserted = TRUE;
$message = "success";
@@ -179,7 +186,7 @@ function save_ticket($close = FALSE)
$content = "";
$type = "message";
if (isset($_FILES['input_image']) && $_FILES['input_image']['error'] === UPLOAD_ERR_OK) {
$baseDir = realpath(__DIR__ . '/../../');
$baseDir = realpath(__DIR__ . '/../../../../');
$uploadDir = $baseDir . '/userdata/Tickets/' . $input_id . '/';
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0777, true);
@@ -203,7 +210,7 @@ function save_ticket($close = FALSE)
}
$query_insert_message = "INSERT INTO main_tickets_messages(message, content, datetime, main_tickets_id, main_contact_id, type) VALUES(
'" . strip_tags($_POST["input_message"]) . "',
'" . $_POST["input_message"] . "',
'" . $content . "',
NOW(),
'" . $input_id . "',
@@ -215,16 +222,6 @@ function save_ticket($close = FALSE)
@mysqli_query($GLOBALS['mysql_con'], $query_insert_message);
}
update_notification($input_id, 'save');
// var_dump("test---");
make_notification($input_id,
isset($_POST["input_category"]) ? $_POST["input_category"] : null,
isset($_POST["input_subcategory"]) ? $_POST["input_subcategory"] : null,
isset($_POST["input_subsubcategory"]) ? $_POST["input_subsubcategory"] : null);
// insert_main_service_items_history($_POST['input_ticket_no'], $_POST['input_description'], $input_id, $_POST["input_service_item"]);
if ($close == TRUE) {
require_once("show_ticketcenter_listform.inc.php");
@@ -251,6 +248,7 @@ function save_ticket($close = FALSE)
$('#closeTicketOverlay, #showTicket').on('click', function() {
$('.ticket_overlay').remove();
});
$('.ticket_overlay').remove();
});
</script>
";
@@ -258,22 +256,6 @@ function save_ticket($close = FALSE)
}
}
function insert_main_service_items_history($ticketno, $ticket_description, $ticket_id, $service_item_id)
{
// Erstelle die Nachricht für die history_message
$history_message = "$ticketno $ticket_description wurde eröffnet.";
// Bereite das INSERT-Statement vor
$query_insert_main_service_item_history = "
INSERT INTO main_service_items_history (history_message, history_date, main_ticket_id, main_service_item_id)
VALUES ('$history_message', NOW(), '$ticket_id', '$service_item_id')
";
// Führe die Abfrage aus
@mysqli_query($GLOBALS['mysql_con'], $query_insert_main_service_item_history);
}
function send_message()
{
$ticket_id = $_POST["ticket_id"];
@@ -281,7 +263,7 @@ function send_message()
$ticket_message_sender = $GLOBALS['main_contact']['id'];
if (isset($_FILES['files']) && $_FILES['files']['error'] === UPLOAD_ERR_OK) {
$baseDir = realpath(__DIR__ . '/../../');
$baseDir = realpath(__DIR__ . '/../../../../');
$uploadDir = $baseDir . '/userdata/Tickets/' . $ticket_id . '/';
if (!file_exists($uploadDir)) {
mkdir($uploadDir, 0777, true);
@@ -337,7 +319,54 @@ function send_message()
// edit_ticket($ticket_id);
}
// Löscht einen ticket aus der Datenbank und zeigt anschließend das Listenformular an.
function close_ticket()
{
$id = (int)$_POST['input_id'];
if ($id <= 0) {
$_SESSION['save_status'] = "Fehler: Ungültige Ticket-ID.";
require_once("show_ticketcenter_listform.inc.php");
return;
}
$result = @mysqli_query($GLOBALS['mysql_con'], "SELECT sender_id, receiver_id FROM main_tickets WHERE id = $id LIMIT 1");
$ticket = @mysqli_fetch_assoc($result);
if (!$ticket) {
$_SESSION['save_status'] = "Fehler: Ticket nicht gefunden.";
require_once("show_ticketcenter_listform.inc.php");
return;
}
$contact_id = $GLOBALS['main_contact']['id'];
$mandant_id = $GLOBALS['main_contact']['master_mandant_id'];
$can_close = $ticket['sender_id'] == $contact_id
|| get_permission_state('all_tickets', $mandant_id, $contact_id) == 1;
if (!$can_close) {
$_SESSION['save_status'] = "Fehler: Keine Berechtigung zum Schließen dieses Tickets.";
edit_ticket($id);
return;
}
@mysqli_query($GLOBALS['mysql_con'], "UPDATE main_tickets SET
last_action_date = NOW(),
current_state = '4'
WHERE id = $id LIMIT 1");
@mysqli_query($GLOBALS['mysql_con'], "INSERT INTO main_tickets_messages(message, content, datetime, main_tickets_id, main_contact_id, type) VALUES(
'Geschlossen von',
'',
NOW(),
'$id',
'" . mysqli_real_escape_string($GLOBALS['mysql_con'], $contact_id) . "',
'history'
)");
update_notification($id, 'state');
edit_ticket($id);
}
function delete_ticket()
{
// Entschlüssle die ID, bevor du die Abfrage ausführst
@@ -367,7 +396,6 @@ function delete_ticket()
";
}
function save_new_ticket_receiver()
{
// Überprüfe, ob die POST-Daten vorhanden sind
@@ -447,27 +475,25 @@ function save_new_due_date() {
}
// Keine History hier; nur ändern, wenn sich der Wert unterscheidet
}
function save_category($silent = false)
{
// Überprüfe, ob die POST-Daten vorhanden sind
if (isset($_POST["input_id"]) && isset($_POST["input_category"])) {
// Hole die POST-Daten und bereinige sie mit mysqli_real_escape_string
$input_id = mysqli_real_escape_string($GLOBALS['mysql_con'], $_POST["input_id"]);
$input_category = mysqli_real_escape_string($GLOBALS['mysql_con'], isset($_POST["input_category"]) ? $_POST["input_category"] : 0);
$input_subcategory = mysqli_real_escape_string($GLOBALS['mysql_con'], isset($_POST["input_subcategory"]) ? $_POST["input_subcategory"] : 0);
$input_subsubcategory = mysqli_real_escape_string($GLOBALS['mysql_con'], isset($_POST["input_subsubcategory"]) ? $_POST["input_subsubcategory"] : 0);
$category = $_POST["input_category"];
$lastCategory = end($category);
// Aktuelle Werte laden
$qryCurrent = "SELECT main_ticket_category_id, main_ticket_subcategory_id, main_ticket_subsubcategory_id FROM main_tickets WHERE id = " . (int)$input_id . " LIMIT 1";
$qryCurrent = "SELECT main_ticket_category_id FROM main_tickets WHERE id = " . (int)$input_id . " LIMIT 1";
$resCurrent = @mysqli_query($GLOBALS['mysql_con'], $qryCurrent);
$rowCurrent = $resCurrent ? @mysqli_fetch_assoc($resCurrent) : null;
$changed = false;
if ($rowCurrent) {
$cur_cat = (string)$rowCurrent['main_ticket_category_id'];
$cur_sub = (string)$rowCurrent['main_ticket_subcategory_id'];
$cur_subsub = (string)$rowCurrent['main_ticket_subsubcategory_id'];
if ($cur_cat !== (string)$input_category || $cur_sub !== (string)$input_subcategory || $cur_subsub !== (string)$input_subsubcategory) {
if ($cur_cat !== (string)$lastCategory) {
$changed = true;
}
} else {
@@ -475,17 +501,17 @@ function save_category($silent = false)
}
if ($changed) {
$query = "UPDATE main_tickets SET main_ticket_category_id = ?, main_ticket_subcategory_id = ?, main_ticket_subsubcategory_id = ? WHERE id = ?";
$query = "UPDATE main_tickets SET main_ticket_category_id = ? WHERE id = ?";
$stmt = mysqli_prepare($GLOBALS['mysql_con'], $query);
if ($stmt) {
mysqli_stmt_bind_param($stmt, "iiii", $input_category, $input_subcategory, $input_subsubcategory, $input_id);
mysqli_stmt_bind_param($stmt, "ii", $lastCategory, $input_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);
}
// History-Eintrag
$query_insert_message = "INSERT INTO main_tickets_messages(message, content, datetime, main_tickets_id, main_contact_id, type) VALUES(
'Abteilung geändert',
'Kategorie geändert',
'',
NOW(),
'" . $input_id . "',
@@ -600,33 +626,6 @@ function save_ticket_supplieres()
edit_ticket($_POST["input_id"]);
}
function edit_ticket($_id = "")
{
if ((int) $_id > 0) {
$input_id = $_id;
}
if ($input_id <> '') {
$query = "SELECT main_tickets.*,main_tickets_category.description AS 'category_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' FROM main_tickets
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_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
WHERE main_tickets.id = '" . $input_id . "'";
// $query = "SELECT * FROM main_tickets WHERE id = '".$input_id."'";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
$ticket = @mysqli_fetch_array($result);
}
$query_update = "UPDATE main_tickets_notification SET viewed = 1 WHERE main_ticket_id = '" . $input_id . "' AND main_contact_id = '" . $GLOBALS['main_contact']['id'] . "'";
@mysqli_query($GLOBALS['mysql_con'], $query_update);
require_once("show_ticketcenter_cardform.inc.php");
}
function load_messages($ticket_id)
{
$query = "SELECT main_tickets_messages.*, main_contact.name FROM main_tickets_messages LEFT JOIN main_contact ON main_contact.id = main_tickets_messages.main_contact_id WHERE main_tickets_id = $ticket_id ORDER BY datetime";
@@ -672,61 +671,9 @@ function load_messages($ticket_id)
}
}
// Verschlüsselt eine ID, normalerweise zur Verwendung in URLs.
function encryptId($id)
{
$encryptedId = base64_encode($id . "EC1ibm38FI53cxmSnQUi");
return $encryptedId;
}
// Entschlüsselt eine zuvor verschlüsselte ID, um ihre ursprüngliche Form wiederherzustellen.
function decryptId($encryptedId)
{
$decryptedId = base64_decode($encryptedId);
$id = str_replace("EC1ibm38FI53cxmSnQUi", "", $decryptedId);
return $id;
}
function input_ticketnumber($ticket_no = "")
{
if ($ticket_no == "") {
// Aktuelles Jahr als zwei Ziffern
$current_year = date('y');
// Query, um das letzte Ticket des aktuellen Jahres zu finden
$query = "SELECT ticket_no FROM main_tickets WHERE ticket_no LIKE 'T$current_year-%' ORDER BY ticket_no DESC LIMIT 1";
$result = mysqli_query($GLOBALS['mysql_con'], $query);
// Initialisiere die Ticketnummer
$new_ticket_no = '';
// Wenn es bereits Tickets in diesem Jahr gibt
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
$last_ticket_no = $row['ticket_no'];
// Extrahiere die Nummer nach dem Bindestrich
$last_ticket_number = (int) substr($last_ticket_no, 6);
// Erhöhe die Nummer um 1
$new_ticket_number = $last_ticket_number + 1;
// Formatiere die neue Ticketnummer mit führenden Nullen (z.B. 0002)
$new_ticket_no = 'T' . $current_year . '-' . str_pad($new_ticket_number, 5, '0', STR_PAD_LEFT);
} else {
// Falls es noch keine Tickets in diesem Jahr gibt, starte bei 0001
$new_ticket_no = 'T' . $current_year . '-00001';
}
$ticket_no = $new_ticket_no;
}
return $ticket_no;
}
function update_ticket()
{
switch ($_POST['input_state']) {
switch ($_POST['input_main_tickets_status']) {
case '1':
$query_update = "UPDATE main_tickets SET
last_action_date = NOW(),
@@ -811,20 +758,18 @@ function update_notification($ticket_id, $type, $notif_message = "Neue Aktivitä
$contact = @mysqli_fetch_array($result);
if ($ticket['receiver_id'] == 0) {
$query_contact = "SELECT main_tickets.*,
COALESCE(main_tickets_subcategory.main_mandant_id, main_tickets_category.main_mandant_id) AS 'mandant_id',
$query_contact = "SELECT main_tickets.*,
main_tickets_category.main_mandant_id AS 'mandant_id',
main_mandant.mail_team AS 'mandant_email',
contact.email AS 'contact_email'
FROM main_tickets
LEFT JOIN main_tickets_category
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_mandant
ON main_mandant.id = COALESCE(main_tickets_subcategory.main_mandant_id, main_tickets_category.main_mandant_id)
LEFT JOIN main_mandant
ON main_mandant.id = main_tickets_category.main_mandant_id
LEFT JOIN main_contact AS contact
ON contact.id = COALESCE(main_tickets_subcategory.main_contact_id, main_tickets_category.main_contact_id)
AND COALESCE(main_tickets_subcategory.main_contact_id, main_tickets_category.main_contact_id) != 0
ON contact.id = main_tickets_category.main_contact_id
AND main_tickets_category.main_contact_id != 0
WHERE main_tickets.id = " . $ticket_id;
$result = @mysqli_query($GLOBALS['mysql_con'], $query_contact);
$mandant = @mysqli_fetch_array($result);
@@ -871,105 +816,76 @@ function update_notification($ticket_id, $type, $notif_message = "Neue Aktivitä
}
}
// function make_notification($id, $category_id = null, $subcategory_id = null, $subsubcategory_id = null){
// $choised_category_id = 0;
// if ($subsubcategory_id != null) {
// $choised_category_id = $subsubcategory_id;
// } elseif ($subcategory_id != null) {
// $choised_category_id = $subcategory_id;
// } elseif ($category_id != null) {
// $choised_category_id = $category_id;
// } else {
// return;
// }
// $choised_contacts = getContactsByCategory($choised_category_id);
// $departments = getDepartmentsByCategory($choised_category_id);
// $mandants = getMandantsByCategory($choised_category_id);
// $contacts = [];
// var_dump($departments);
// var_dump($mandants);
// if ($departments == null or implode(',', $departments) == "0") {
// $query = "SELECT * FROM main_contact_department WHERE main_mandant_id IN (" . implode(',', $mandants) . ")";
// var_dump($query);
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $departments = [];
// while ($row = mysqli_fetch_assoc($result)) {
// $contacts[] = $row['main_contact_id'];
// }
// var_dump($contacts);
// } else if ($mandants == null or implode(',', $mandants) == "0") {
// $query = "SELECT * FROM main_contact_department WHERE main_department_id IN (" . implode(',', $departments) . ")";
// var_dump($query);
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $mandants = [];
// while ($row = mysqli_fetch_assoc($result)) {
// $contacts[] = $row['main_contact_id'];
// }
// var_dump($contacts);
// } else if (($mandants == null or implode(',', $mandants) == "0") && ($departments == null or implode(',', $departments) == "0")) {
// // ----
// } else {
// $query = "SELECT * FROM main_contact_department WHERE main_mandant_id IN (" . implode(',', $mandants) . ") AND main_department_id IN (" . implode(',', $departments) . ")";
// var_dump($query);
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $contacts = [];
// while ($row = mysqli_fetch_assoc($result)) {
// $contacts[] = $row['main_contact_id'];
// }
// var_dump($contacts);
// }
// var_dump($choised_contacts);
// if ($choised_contacts != null) {
// $contacts = array_unique(array_merge($contacts, $choised_contacts));
// }
function get_ticket_status($status_id) {
// var_dump($contacts);
// }
$query = "SELECT description FROM main_tickets_status WHERE id = $status_id";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
$status = @mysqli_fetch_array($result);
return $status['description'];
}
function get_contact($contact_id) {
$query = "SELECT name, phone_no FROM main_contact WHERE id = $contact_id";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
$contact = @mysqli_fetch_array($result);
return $contact;
}
// function getDepartmentsByCategory($category_id) {
// $query = "SELECT * FROM main_tickets_category_department WHERE main_tickets_category_id = " . $category_id;
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $departments = [];
// if (mysqli_num_rows($result) == 0) {
// return null;
// }
// while ($row = mysqli_fetch_assoc($result)) {
// $departments[] = $row['main_department_id'];
// }
// return $departments;
// }
// DEPRIKATED: Funktion wird aktuell nicht mehr verwendet.
// Sollte die Funktion wieder benötigt werden, muss sie entsprechend angepasst werden, um die neuen Datenstrukturen zu berücksichtigen.
// function getMandantsByCategory($category_id) {
// $query = "SELECT * FROM main_tickets_category_mandant WHERE main_tickets_category_id = " . $category_id;
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $mandants = [];
// var_dump(mysqli_num_rows($result));
// if (mysqli_num_rows($result) == 0) {
// return null;
// }
// while ($row = mysqli_fetch_assoc($result)) {
// $mandants[] = $row['main_mandant_id'];
// }
// var_dump($mandants);
// return $mandants;
// }
function input_ticketnumber($ticket_no = "")
{
if ($ticket_no == "") {
// Aktuelles Jahr als zwei Ziffern
$current_year = date('y');
// Query, um das letzte Ticket des aktuellen Jahres zu finden
$query = "SELECT ticket_no FROM main_tickets WHERE ticket_no LIKE 'T$current_year-%' ORDER BY ticket_no DESC LIMIT 1";
$result = mysqli_query($GLOBALS['mysql_con'], $query);
// Initialisiere die Ticketnummer
$new_ticket_no = '';
// Wenn es bereits Tickets in diesem Jahr gibt
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
$last_ticket_no = $row['ticket_no'];
// Extrahiere die Nummer nach dem Bindestrich
$last_ticket_number = (int) substr($last_ticket_no, 6);
// Erhöhe die Nummer um 1
$new_ticket_number = $last_ticket_number + 1;
// Formatiere die neue Ticketnummer mit führenden Nullen (z.B. 0002)
$new_ticket_no = 'T' . $current_year . '-' . str_pad($new_ticket_number, 5, '0', STR_PAD_LEFT);
} else {
// Falls es noch keine Tickets in diesem Jahr gibt, starte bei 0001
$new_ticket_no = 'T' . $current_year . '-00001';
}
$ticket_no = $new_ticket_no;
}
return $ticket_no;
}
function insert_main_service_items_history($ticketno, $ticket_description, $ticket_id, $service_item_id)
{
// Erstelle die Nachricht für die history_message
$history_message = "$ticketno $ticket_description wurde eröffnet.";
// Bereite das INSERT-Statement vor
$query_insert_main_service_item_history = "
INSERT INTO main_service_items_history (history_message, history_date, main_ticket_id, main_service_item_id)
VALUES ('$history_message', NOW(), '$ticket_id', '$service_item_id')
";
// Führe die Abfrage aus
@mysqli_query($GLOBALS['mysql_con'], $query_insert_main_service_item_history);
}
// function getContactsByCategory($category_id) {
// $query = "SELECT * FROM main_tickets_category_contact WHERE main_tickets_category_id = " . $category_id;
// $result = mysqli_query($GLOBALS['mysql_con'], $query);
// $contacts = [];
// if (mysqli_num_rows($result) == 0) {
// return null;
// }
// while ($row = mysqli_fetch_assoc($result)) {
// $contacts[] = $row['main_contact_id'];
// }
// return $contacts;
// }
function make_notification($id, $category_id = null, $subcategory_id = null, $subsubcategory_id = null) {
$choised_category_id = $subsubcategory_id ?? $subcategory_id ?? $category_id;
@@ -1095,245 +1011,3 @@ function getContactsByCategory($category_id) {
}
?>
<script>
$(document).ready(function () {
// Hole die aktuelle URL
var currentUrl = window.location.href;
// Überprüfen, ob ?action= in der URL vorhanden ist
if (currentUrl.indexOf("?action=") !== -1) {
// Entferne den Teil ab ?action=, inkl. allem, was danach kommt
var newUrl = currentUrl.split("?action=")[0];
// Aktualisiere die URL ohne Neuladen der Seite
window.history.replaceState(null, null, newUrl);
}
});
document.addEventListener("DOMContentLoaded", function () {
// Initial load of category data
const categorySelect = document.getElementById('input_category');
if (categorySelect) {
let selectedId = categorySelect.value;
removeAjaxContent();
// Initial AJAX call
fetchCategoryData(selectedId);
// Add change event listener to category select
categorySelect.addEventListener('change', function() {
selectedId = this.value;
removeAjaxContent();
fetchCategoryData(selectedId);
getCategoryDescription();
});
// Initial description load
getCategoryDescription();
}
});
// Helper function to remove ajax content
function removeAjaxContent() {
const ajaxContents = document.querySelectorAll('.ajax-content');
ajaxContents.forEach(content => content.remove());
}
// Helper function to remove ajax subcontent
function removeAjaxSubContent() {
const ajaxSubContents = document.querySelectorAll('.ajax-subcontent');
ajaxSubContents.forEach(content => content.remove());
}
// Fetch category data via AJAX
function fetchCategoryData(categoryId) {
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_ajax.php',
type: 'POST',
data: { category_id: categoryId },
success: function (response) {
const categorySelect = document.getElementById('input_category');
const parentDiv = categorySelect.parentNode;
// Insert response after the parent div
const ajaxContent = document.createElement('div');
ajaxContent.className = 'ajax-content';
ajaxContent.innerHTML = response;
parentDiv.after(ajaxContent);
// Add event listener to subcategory select if it exists
const subcategorySelect = document.getElementById('input_subcategory');
if (subcategorySelect) {
subcategorySelect.addEventListener('change', function() {
getSubCategoryDescription();
getSubSubCategory();
});
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getCategoryDescription() {
const categorySelect = document.getElementById('input_category');
const selectedId = categorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".category_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'category_desc';
descDiv.innerHTML = "<h5>Kategoriebeschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("afterbegin", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubCategoryDescription() {
const subcategorySelect = document.getElementById('input_subcategory');
if (!subcategorySelect) return;
const selectedId = subcategorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".subcategory_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'subcategory_desc';
descDiv.style.marginTop = '20px';
descDiv.innerHTML = "<h5>Unterkategoriebeschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("beforeend", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubSubCategoryDescription() {
const subsubcategorySelect = document.getElementById('input_subsubcategory');
if (!subsubcategorySelect) return;
const selectedId = subsubcategorySelect.value;
// Remove existing description if it exists
const existingDesc = document.querySelector(".subsubcategory_desc");
if (existingDesc) {
existingDesc.remove();
}
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_category_desc_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const instructionDiv = document.querySelector(".ticket-instruction");
if (instructionDiv) {
const descDiv = document.createElement('div');
descDiv.className = 'subsubcategory_desc';
descDiv.style.marginTop = '20px';
descDiv.innerHTML = "<h5>Beschreibung</h5>" + response;
instructionDiv.insertAdjacentElement("beforeend", descDiv);
if (response.trim() === "") {
descDiv.style.display = 'none'; // Hide if no description
} else {
descDiv.style.display = 'block'; // Show if description exists
}
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
function getSubSubCategory() {
const subcategorySelect = document.getElementById('input_subcategory');
if (!subcategorySelect) return;
const selectedId = subcategorySelect.value;
removeAjaxSubContent();
$.ajax({
url: '/module/ticketcenter/show_ticketcenter_subcategory_ajax.php',
type: 'POST',
data: { category_id: selectedId },
success: function (response) {
const parentDiv = subcategorySelect.parentNode;
// Insert response after the parent div
const ajaxSubContent = document.createElement('div');
ajaxSubContent.className = 'ajax-subcontent';
ajaxSubContent.innerHTML = response;
parentDiv.after(ajaxSubContent);
// Add event listener to subsubcategory select if it exists
const subsubcategorySelect = document.getElementById('input_subsubcategory');
if (subsubcategorySelect) {
subsubcategorySelect.addEventListener('change', function() {
getSubSubCategoryDescription();
});
}
},
error: function (xhr, status, error) {
console.log('Error:', error);
}
});
}
// make fetch to server to get subsubcategory data based on subcategory id and insert it after subcategory select
// fetch('/module/ticketcenter/services/show_ticketcenter_ajax.php', {
// method: 'POST',
// headers: {
// 'Content-Type': 'application/x-www-form-urlencoded'
// },
// body: new URLSearchParams({ action: "get_tickets" })
// })
// .then(response => response.text())
// .then(data => {
// console.log(data);
// })
// .catch(error => {
// console.error('Error:', error);
// })
</script>

View File

@@ -1,10 +1,10 @@
<?php
session_start();
$currDir = __DIR__;
$rootDir = dirname(dirname($currDir));
$rootDir = dirname(dirname(dirname($currDir)));
$mysydeDir = $rootDir . '/mysyde';
require_once($rootDir . '/vendor/autoload.php');
require_once($rootDir . '/vendor/autoload.php');
require_once($rootDir . "/mysyde/frontend/frontend_functions.inc.php");
$envDir = $rootDir . '/config';
@@ -13,10 +13,10 @@ if (is_dir($envDir) && file_exists($envFilePath) && is_file($envFilePath) && is_
$dotenv = new \Dotenv\Dotenv($envDir);
$dotenv->load();
}
$common = $mysydeDir ."/common/common_functions.inc.php";
$common = $mysydeDir . "/common/common_functions.inc.php";
require_once($common);
$connEnv = (local_environment()) ? $mysydeDir."/dc.config.php" : $mysydeDir."/dc-server.config.php";
$connEnv = (local_environment()) ? $mysydeDir . "/dc.config.php" : $mysydeDir . "/dc-server.config.php";
require_once($connEnv);

View File

@@ -1,472 +1,141 @@
<?php
$formname = "form_ticket_card";
if (isset($_GET['service_item_no'])) {
$ticket['service_item_no'] = $_GET['service_item_no'];
function create_save_button($ticket, $formname)
{
if (isset($ticket["id"])) {
switch ($ticket['current_state']) {
case 2: // Offen
return button("save primary", "Ticket annehmen", $formname, "sendRequest('update_ticket', true)");
case 3: // In Bearbeitung
if ($ticket['sender_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
?>
<button type="button" class="close-ticket-btn" onclick="showCloseTicketModal()">Ticket schließen</button>
<div id="closeTicketModal" class="close-ticket-modal">
<div class="close-ticket-modal-content">
<h2>Ticket schließen</h2>
<p class="close-ticket-warning">Hinweis: Bitte laden Sie einen Arbeitschein oder eine Rechnung in den Chat hoch, bevor Sie das Ticket schließen.</p>
<div class="close-ticket-modal-buttons">
<button type="button" class="btn-cancel" onclick="closeModal()">Abbrechen</button>
<button data-formname="form_ticket_card" type="button" class="btn-confirm" onclick="dc.current_formname='form_ticket_card'; sendRequest('close', true); closeModal();">Ticket schließen</button>
</div>
</div>
</div>
<script>
function showCloseTicketModal() {
document.getElementById('closeTicketModal').style.display = 'block';
}
function closeModal() {
document.getElementById('closeTicketModal').style.display = 'none';
}
window.onclick = function(event) {
var modal = document.getElementById('closeTicketModal');
if (event.target == modal) modal.style.display = 'none';
}
</script>
<?php
}
break;
case 4: // Geschlossen
if ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || $ticket['sender_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
return button("save primary", "Wiedereröffnen", $formname, "sendRequest('update_ticket', true)");
}
break;
default: // Anderer Status
return button("save primary", "Ticket annehmen", $formname, "sendRequest('update_ticket', true)");
}
}
return "";
}
?>
<link rel="stylesheet" href="/module/ticketcenter/css/repair.css">
<link rel="stylesheet" href="/module/ticketcenter/css/repair.css?v=<?= filemtime(__DIR__ . "/../../css/repair.css") ?>">
<link rel="stylesheet" href="/module/ticketcenter/css/cardform.css?v=<?= filemtime(__DIR__ . "/../../css/cardform.css") ?>">
<script type="text/javascript"
src="/mysyde/admin/admin.js?t=<?= filemtime($_SERVER['DOCUMENT_ROOT'] . '/mysyde/admin/admin.js') ?>"></script>
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<form action="" id="<?= $formname ?>" name="<?= $formname ?>" method="post" enctype="multipart/form-data">
<section class="cardform_content">
<div class="container">
<div class="titlebar">
<?php if (isset($ticket["id"])): ?>
<div>
<a class="back" href="/intranet/de/ticketcenter/"><i class="fa-solid fa-arrow-left-long"></i></a>
<h1>Ticket <?= $ticket['ticket_no'] ?></h1>
</div>
<div>
<?php
// Definiere die Aktion basierend auf dem Ticketstatus
switch ($ticket['current_state']) {
case 2: // Offen
// if (get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
echo button("save primary", "Ticket annehmen", $formname, "sendRequest('update_ticket', true)");
// }
break;
case 3: // In Bearbeitung
if ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || $ticket['sender_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
echo button("save primary", "Ticket schließen", $formname, "sendRequest('update_ticket', true)");
}
break;
case 4: // Geschlossen
if ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || $ticket['sender_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
echo button("save primary", "Wiedereröffnen", $formname, "sendRequest('update_ticket', true)");
}
break;
default: // Anderer Status
echo button("save primary", "Ticket annehmen", $formname, "sendRequest('update_ticket', true)");
break;
}
?>
</div>
<?php else: ?>
<!-- <h1>Ticket erstellen</h1> -->
<?php endif; ?>
<div class="tickets_cardform">
<div class="cardform_header">
<div class="cardform_header_left">
<a class="back" href="/intranet/de/ticketcenter/"><i class="fa-solid fa-arrow-left-long"></i></a>
<h1>Ticket <?= $ticket['ticket_no'] ?></h1>
</div>
<?php
if (isset($ticket["id"])) {
?>
<script>
document.querySelector("body").classList.add("ticket_edit");
</script>
<div class="section_group">
<section class="cardform_section" tab-attribute="ticket" aria-current="true">
<div class="communication">
<div class="messages_scroll_container">
<div class="messages">
<?php load_messages($ticket["id"]); ?>
</div>
</div>
<?php
if ($ticket["current_state"] != 4) {
?>
<div class="communication_toolbar">
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="ticket_id" id="ticket_id" value="<?= $ticket["id"] ?>">
<div class="send_message_inputs">
<textarea placeholder="Nachricht schreiben..." type="text" name="send_message"
id="send_message"></textarea>
<?= button("send_message_button", '<i class="fa-solid fa-paper-plane" aria-hidden="true"></i>', $formname, "sendRequest('send_message', true)"); ?>
</div>
<div class="send_message_files">
<input type="file" id="files" name="files">
</div>
<div class="send_mail_checkbox">
<?= input("Soll die Nachricht eine E-Mail Benachrichtigung auslösen?", "input_send_email", "checkbox", $ticket['send_email']) ?>
</div>
</form>
</div>
<?php
}
?>
</div>
</section>
<aside>
<div class="card_ticket">
<div class="card_header">
<div class="card_title">
<h3><i class="fa-solid fa-circle-info"></i> Ticketstatus</h3>
</div>
<div class="plant_card_status">
<span id="green"><?= $ticket['state'] ?></span>
</div>
</div>
<fieldset>
<div class="info_labels">
<?php if (!empty($ticket['description'])): ?>
<label>Beschreibung
<div><?= $ticket['description'] ?></div>
</label>
<?php endif; ?>
<?php
if ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
?>
<div class="zusatzstatus">
<?php
if (isset($ticket["main_ticket_subsubcategory_id"]) and $ticket["main_ticket_subsubcategory_id"] > 0 ) {
$query = "SELECT * FROM main_tickets_category_process WHERE main_tickets_category_id = " . $ticket['main_ticket_subsubcategory_id'] . " LIMIT 1;";
} else if (isset($ticket["main_ticket_subcategory_id"]) and $ticket["main_ticket_subcategory_id"] > 0 ) {
$query = "SELECT * FROM main_tickets_category_process WHERE main_tickets_category_id = " . $ticket['main_ticket_subcategory_id'] . " LIMIT 1;";
} else {
$query = "SELECT * FROM main_tickets_category_process WHERE main_tickets_category_id = " . $ticket['main_ticket_category_id'] . " LIMIT 1;";
}
$result = mysqli_query($GLOBALS['mysql_con'], $query);
if (mysqli_num_rows($result) > 0) {
$row = mysqli_fetch_assoc($result);
$ticket['process_id'] = $row['main_tickets_process_id'];
$query = "SELECT main_tickets_status.id, main_tickets_status.description as 'name' FROM main_tickets_status JOIN main_tickets_process_status ON main_tickets_status.id = main_tickets_process_status.main_tickets_status_id where main_tickets_process_status.main_tickets_process_id = " . $ticket['process_id'] . " ORDER BY name ASC";
} else {
$ticket['process_id'] = 0;
$query = "SELECT id, description as 'name' FROM main_tickets_status ORDER BY name ASC";
}
?>
<?= input_select_from_sql("Aktueller Zusatzstatus", "input_main_tickets_status", $query, $ticket['individual_state']) ?>
<!-- <?= button("forward_ticket", "Zusatzstatus speichern", $formname, "sendRequest('save_new_ticket_individual_state', true)"); ?> -->
</div>
<!-- Tagify CSS und JS einbinden -->
<link rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@yaireo/tagify/dist/tagify.css">
<script src="https://cdn.jsdelivr.net/npm/@yaireo/tagify"></script>
<!-- <div class="ticket-supplier-input">
<div class="label">
<label for="input_ticket_supliers">Lieferanten</label>
</div>
<input name="input_ticket_supliers" id="input_ticket_supliers"
placeholder="Lieferanten auswählen">
</div> -->
<!-- Hidden Input, in dem die ausgewählten IDs gespeichert werden -->
<input type="hidden" name="supplier_ids" id="hidden_supplier_ids" value="">
<script>
document.addEventListener("DOMContentLoaded", function () {
var input = document.getElementById('input_ticket_supliers');
var hiddenInput = document.getElementById('hidden_supplier_ids');
// Tagify initialisieren
var tagify = new Tagify(input, {
tagTextProp: 'name', // Die ausgewählten Tags zeigen den Namen an
whitelist: <?= $supplier_list_json ?>,
enforceWhitelist: true, // Nur Werte aus der Whitelist zulassen
dropdown: {
enabled: 0, // Autocomplete: Schon nach 1 Zeichen wird das Dropdown angezeigt
closeOnSelect: false,
maxItems: 10,
searchKeys: ['name'] // Suche anhand des Namens
},
templates: {
dropdownItem: function (tagData) {
// Internen Attribute werden über this.getAttributes(tagData) gesetzt
return `<div ${this.getAttributes(tagData)} class="tagify__dropdown__item">${tagData.name}</div>`;
}
}
});
// Bereits verknüpfte Lieferanten als Initial-Tags hinzufügen
var supplierList = <?= $supplier_list_json ?>;
var linkedSupplierIds = <?= $linked_suppliers_json ?>;
var initialTags = supplierList.filter(function (item) {
return linkedSupplierIds.indexOf(parseInt(item.value)) !== -1;
});
tagify.addTags(initialTags);
// Bei jeder Änderung werden die ausgewählten IDs im Hidden Input gespeichert
tagify.on('change', function (e) {
var selectedIds = tagify.value.map(function (tag) {
return tag.value;
});
hiddenInput.value = selectedIds.join(',');
});
// Optional: Dropdown explizit öffnen, wenn etwas eingegeben wird
input.addEventListener("input", function () {
tagify.dropdown.show.call(tagify);
});
});
</script>
<?php
}
?>
<?php if (!empty($ticket['ticket_no'])): ?>
<label>Ticketnr.
<div><?= $ticket['ticket_no'] ?></div>
</label>
<?php endif; ?>
<?php if (!empty($ticket['service_item_no'])): ?>
<?php
$query_service_item = "SELECT service_item_no, description AS 'service_description' FROM main_service_items WHERE id = '" . $ticket['service_item_no'] . "'";
$result = mysqli_query($GLOBALS['mysql_con'], $query_service_item);
$row = mysqli_fetch_assoc($result)
?>
<label>Gerätenr.
<div><a target="_blank" class="link"
href="/intranet/de/geraetecenter/?action=edit&id=<?= encryptID($ticket['service_item_no']) ?>"><?= $row['service_item_no'] . ' - ' . $row['service_description'] ?></a>
</div>
</label>
<?php endif; ?>
<?php if (!empty($ticket['cost_center'])): ?>
<label>Kostenstelle
<div><?= $ticket['cost_center'] ?></div>
</label>
<?php endif; ?>
<?php
// Inline-Bearbeitung für Abteilung statt separatem Button/Modal
$canEditCategory = ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1);
if ($canEditCategory) {
$query = "SELECT id, description as 'name' FROM main_tickets_category WHERE parent_id = 0 ORDER BY sorting";
$selectedCategory = isset($ticket['main_ticket_category_id']) ? $ticket['main_ticket_category_id'] : (isset($ticket['category']) ? $ticket['category'] : null);
echo input_select_from_sql("Abteilung*", "input_category", $query, $selectedCategory);
} else if (!empty($ticket['category_description'])) { ?>
<label>Abteilung
<div><?= $ticket['category_description'] ?></div>
</label>
<?php } ?>
<?php if (!$canEditCategory && !empty($ticket['subcategory_description'])): ?>
<label>Kategorie
<div><?= $ticket['subcategory_description'] ?></div>
</label>
<?php endif; ?>
<?php if (!$canEditCategory && !empty($ticket['subsubcategory_description'])): ?>
<label>Unterkategorie
<div><?= $ticket['subsubcategory_description'] ?></div>
</label>
<?php endif; ?>
<!-- Kategorie wird nun direkt oben editierbar angezeigt; separater Bearbeiten-Button entfällt -->
<?php if (!empty($ticket['sender'])): ?>
<label>Ticketersteller
<div><?= $ticket['sender'] ?></div>
</label>
<?php endif; ?>
<?php if (!empty($ticket['receiver'])): ?>
<label>Ticketbearbeiter
<div><?= $ticket['receiver'] ?></div>
</label>
<?php endif; ?>
<?php
if ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
input("Zu erledigen bis", "input_due_date", "date", $ticket['due_date']);
// button("forward_ticket", "Datum speichern", $formname, "sendRequest('save_new_due_date', true)");
}
?>
<?php if (!empty($ticket['link'])): ?>
<label>Link
<div><a target="_blank" class="link" href="<?= $ticket['link'] ?>"
target="_blank"><?= $ticket['link'] ?></a></div>
</label>
<?php endif; ?>
<?php
$hasOrderLinks = false;
for ($i = 1; $i <= 10; $i++) {
if (!empty($ticket["order_link_$i"])) {
$hasOrderLinks = true;
break;
}
}
?>
<?php if ($hasOrderLinks): ?>
<label class="order_link_text_label">Bestell-Links
<?php for ($i = 1; $i <= 10; $i++): ?>
<?php if (!empty($ticket["order_link_$i"])): ?>
<div>
<?php if (!empty($ticket["order_link_amount_$i"])): ?>
<span class="order_link_amount">Anzahl:
<?= htmlspecialchars($ticket["order_link_amount_$i"]) ?>x </span>
<?php endif; ?>
<a target="_blank" class="order_link_text"
href="<?= htmlspecialchars($ticket["order_link_$i"]) ?>">
<?= htmlspecialchars($ticket["order_link_$i"]) ?>
</a>
</div>
<?php endif; ?>
<?php endfor; ?>
</label>
<?php endif; ?>
<?php if (isset($ticket["approval_by_manager"]) && $ticket["approval_by_manager"] == 1): ?>
<label>Freigabe durch Vorgesetzten vorhanden
<div>ja</div>
</label>
<?php endif; ?>
<?php
if ($ticket['current_state'] != 4 && ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1)) {
?>
<div class="ticket_weiterleiten">
<?php $query = "SELECT id, name as 'name' FROM main_contact ORDER BY name ASC"; ?>
<?= input_select_from_sql("Ticket weiterleiten an", "input_new_ticket_receiver", $query, $ticket['receiver_id']) ?>
<?= button("forward_ticket", "Ticket speichern", $formname, "sendRequest('save_forward_ticket', true)"); ?>
</div>
<?php
}
?>
</div>
<?php
input("ID", "input_id", "hidden", $ticket["id"]);
input("Status", "input_state", "hidden", $ticket["current_state"]);
?>
</fieldset>
</div>
</aside>
<div class="cardform_header_right">
<?= button("forward_ticket", "Ticket speichern", $formname, "sendRequest('save_forward_ticket', true)"); ?>
<?= create_save_button($ticket, $formname) ?>
</div>
</div>
<div class="cardform_body">
<div class="cardform_body_left">
<div class="body_left_line">
<h3>Alle verfügbaren Tickets</h3>
<button type="button" onclick="toggleSideboard('.cardform_body_left')"><i class="fa-regular fa-square-caret-left"></i></button>
</div>
<!-- Modal für Abteilungsbearbeitung entfernt: Inline-Select wird verwendet -->
<?php } else { ?>
<section class="cardform_section new_ticket">
<script>
document.querySelector("body").classList.add("new_ticket");
</script>
<fieldset>
<h1>Ticket erstellen</h1>
<?= input("ID", "input_id", "hidden", "") ?>
<div class="hide">
<?= input_ticketnumber(); ?>
<?php
require_once __DIR__ . '/components/show_open_tickets.php';
?>
</div>
<div class="cardform_body_middle">
<div class="communication">
<div class="messages_scroll_container">
<div class="messages">
<?php load_messages($ticket["id"]); ?>
</div>
</div>
<?php
if ($ticket["current_state"] != 4) {
?>
<div class="communication_toolbar">
<form action="" method="post" enctype="multipart/form-data">
<input type="hidden" name="ticket_id" id="ticket_id" value="<?= $ticket["id"] ?>">
<div class="send_message_inputs">
<textarea placeholder="Nachricht schreiben..." type="text" name="send_message"
id="send_message"></textarea>
<?= button("send_message_button", '<i class="fa-solid fa-paper-plane" aria-hidden="true"></i>', $formname, "sendRequest('send_message', true)"); ?>
</div>
<div class="send_message_files">
<input type="file" id="files" name="files">
</div>
<div class="send_mail_checkbox">
<?= input("Soll die Nachricht eine E-Mail Benachrichtigung auslösen?", "input_send_email", "checkbox", $ticket['send_email']) ?>
</div>
</form>
</div>
<?php
$ticket_description = [
'Markt Küche',
'Metzgerei',
'Obst + Gemüse',
'Bake Off',
'MoPro',
'TK',
'Getränke | Spirituosen',
'Drogerie | Non Food',
'Sortiment',
'Sonstiges'
];
?>
} else { ?>
<div class="communication_toolbar communication_toolbar--closed">
<p>Um eine Nachricht zu senden, öffnen Sie das Ticket erneut.</p>
</div>
<?php
input("Betreff*", "input_description", "text", $ticket['description'])
?>
<?php $query = "SELECT id, description as 'name' FROM main_tickets_category WHERE parent_id = 0 ORDER BY sorting"; ?>
<?= input_select_from_sql("Abteilung*", "input_category", $query, isset($_GET['category_id']) ? $_GET['category_id'] : null) ?>
<?php if (get_permission_state('connect_service_items', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) {
$query = "SELECT main_service_items.id, CONCAT(service_item_no, ' | ', description, ' | ', main_contact.name) as 'name' FROM main_service_items LEFT JOIN main_contact ON main_contact.id = main_service_items.main_contact_id";
} else {
$query = "SELECT id, CONCAT(service_item_no, ' | ', description) as 'name' FROM main_service_items WHERE main_contact_id = " . $GLOBALS['main_contact']['id'];
}
?>
<!-- <?php $query = "SELECT id, name as 'name' FROM main_contact ORDER BY name ASC"; ?>
<?= input_select_from_sql("Im Namen erstellen von", "input_new_ticket_sender", $query, $ticket['sender_id']) ?> -->
<?= input("Nachricht*", "input_message", "textarea", "", "512") ?>
<?= input("Datei hochladen", "input_image", "file", $ticket['image']) ?>
<?= button("create_ticket", "Ticket abschicken", $formname, "sendRequest('save', true)"); ?>
</fieldset>
<div class="ticket-instruction">
<? get_content("ticket_instruction", null, $IOCContainer); ?>
</div>
</section>
<?php
}
?>
<script>
// if (document.querySelector(".button_create_ticket")) {
// document.querySelector(".button_create_ticket").style.display = "none";
// setInterval(function() {
// const input_subsubcategory = document.getElementById('input_subsubcategory');
// if (input_subsubcategory) {
// if (input_subsubcategory.value) {
// document.querySelector(".button_create_ticket").style.display = "block";
// } else if (input_subsubcategory.value == "") {
// document.querySelector(".button_create_ticket").style.display = "none";
// }
// } else {
// document.querySelector(".button_create_ticket").style.display = "none";
// }
// }, 1000);
// }
</script>
</section>
}
?>
</div>
</div>
<div class="cardform_body_right">
<?php
require_once __DIR__ . '/components/ticketdetails.com.php';
?>
</div>
</div>
</div>
</div>
</form>
<script>
// Funktion zur Steuerung der Sichtbarkeit und Required-Status basierend auf der Auswahl
function showDivBasedOnSelect(selectId, optionTexts, targetClass, isRequired = false) {
// Alle Elemente der übergebenen Klasse standardmäßig ausblenden
$('.' + targetClass).hide().find('input, select, textarea').prop('required', false);
// Eventlistener für Änderung im Select
$('#' + selectId).on('change', function () {
var selectedText = $('#' + selectId + ' option:selected').text().toLowerCase().trim();
// Flag um zu prüfen, ob es einen Match gibt
let matchFound = false;
// Über alle übergebenen Optionstexte iterieren
optionTexts.forEach(function (optionText) {
var normalizedOptionText = optionText.toLowerCase().trim();
if (selectedText === normalizedOptionText) {
matchFound = true;
}
});
// Div anzeigen und "required" setzen, wenn ein Match gefunden wurde
if (matchFound) {
$('.' + targetClass).show();
// Falls isRequired aktiv ist, setze das Eingabefeld auf required
if (isRequired) {
$('.' + targetClass).find('input, select, textarea').prop('required', true);
}
} else {
// Div ausblenden und "required" entfernen, wenn kein Match
$('.' + targetClass).hide().find('input, select, textarea').prop('required', false);
}
});
function scrollToBottom() {
const chat = document.querySelector('.messages');
chat.scrollTop = chat.scrollHeight;
}
// Aufrufe der Funktion mit mehreren Optionen
// Felder anzeigen UND als Pflichtfeld markieren
showDivBasedOnSelect('input_category', ['Bestellung-Neuanschaffung', 'Bestellung-Ersatzbeschaffung'], 'input_approval_by_manager', true);
showDivBasedOnSelect('input_category', ['Bestellung-Neuanschaffung', 'Bestellung-Ersatzbeschaffung'], 'input_cost_center', false);
showDivBasedOnSelect('input_category', ['Bestellung-Neuanschaffung', 'Bestellung-Ersatzbeschaffung'], 'input_order_link_1', false);
showDivBasedOnSelect('input_category', ['Bestellung-Neuanschaffung', 'Bestellung-Ersatzbeschaffung'], 'input_order_link_amount_1', false);
// Felder nur anzeigen, NICHT required
showDivBasedOnSelect('input_category', ['Fehlermeldung', 'Sonstige'], 'input_link', false);
showDivBasedOnSelect('input_category', ['Fehlermeldung', 'Sonstige'], 'input_service_item', false);
document.addEventListener('DOMContentLoaded', function () {
scrollToBottom();
});
$('#input_new_ticket_receiver').select2();
$('#input_new_ticket_sender').select2();
@@ -486,12 +155,6 @@ if (isset($_GET['service_item_no'])) {
setRequiredField("input_category");
// // Zuerst alle Order-Link-Container und dazugehörigen Amount-Felder ab Index 2 ausblenden
// $('.input_order_link_2, .input_order_link_3, .input_order_link_4, .input_order_link_5, .input_order_link_6, .input_order_link_7, .input_order_link_8, .input_order_link_9, .input_order_link_10').hide();
// $('.input_order_link_amount_2, .input_order_link_amount_3, .input_order_link_amount_4, .input_order_link_amount_5, .input_order_link_amount_6, .input_order_link_amount_7, .input_order_link_amount_8, .input_order_link_amount_9, .input_order_link_amount_10').hide();
// Alle Order-Link-Container außer dem ersten initial ausblenden
$(".order_amount_link").not(":first").hide();
@@ -530,60 +193,28 @@ if (isset($_GET['service_item_no'])) {
});
// Preselect values only; rely on existing fetchCategoryData/getSubSubCategory to build inputs
(function() {
(function () {
var canEditCategory = <?php echo ($ticket['receiver_id'] == $GLOBALS['main_contact']['id'] || get_permission_state('all_tickets', $GLOBALS['main_contact']['master_mandant_id'], $GLOBALS['main_contact']['id']) == 1) ? 'true' : 'false'; ?>;
if (!canEditCategory) return;
var savedCat = <?=(int)($ticket['main_ticket_category_id'] ?? $ticket['category'] ?? 0)?>;
var savedSub = <?=(int)($ticket['main_ticket_subcategory_id'] ?? 0)?>;
var savedSubSub = <?=(int)($ticket['main_ticket_subsubcategory_id'] ?? 0)?>;
var savedCat = <?= (int) ($ticket['main_ticket_category_id'] ?? $ticket['category'] ?? 0) ?>;
function preselectChain() {
var catSelect = document.getElementById('input_category');
if (!catSelect || !savedCat || String(catSelect.value) !== String(savedCat)) return;
var tries = 0;
var t = setInterval(function() {
var sub = document.getElementById('input_subcategory');
if (sub) {
if (savedSub) {
sub.value = String(savedSub);
// Trigger both native and jQuery change to ensure listeners run
try { sub.dispatchEvent(new Event('change', { bubbles: true })); } catch(e) {}
if (window.jQuery) { jQuery(sub).trigger('change'); }
// If subsubcategory wasn't created shortly after, request it once
setTimeout(function() {
var subsubExisting = document.getElementById('input_subsubcategory');
if (!subsubExisting && typeof getSubSubCategory === 'function') {
try { getSubSubCategory(); } catch(e) {}
}
}, 250);
}
var tries2 = 0;
var t2 = setInterval(function() {
var subsub = document.getElementById('input_subsubcategory');
if (subsub) {
if (savedSubSub) {
subsub.value = String(savedSubSub);
if (window.jQuery) { jQuery(subsub).trigger('change'); }
}
clearInterval(t2);
}
if (++tries2 > 20) clearInterval(t2);
}, 100);
clearInterval(t);
}
if (++tries > 20) clearInterval(t);
}, 150);
}
// Try shortly after DOMContentLoaded handlers in main script
setTimeout(preselectChain, 300);
var catSelect = document.getElementById('input_category');
if (catSelect) {
catSelect.addEventListener('change', function() {
catSelect.addEventListener('change', function () {
setTimeout(preselectChain, 300);
});
}
})();
// if display smaller than 991px
if (window.innerWidth < 991) {
document.querySelector(".cardform_body_right").classList.toggle('is-closed');
}
</script>

View File

@@ -0,0 +1,153 @@
<?php
$formname = "form_ticket_create_card";
?>
<link rel="stylesheet" href="/module/ticketcenter/css/repair.css">
<link rel="stylesheet" href="/module/ticketcenter/css/create_cardform.css">
<script type="text/javascript"
src="/mysyde/admin/admin.js?t=<?= filemtime($_SERVER['DOCUMENT_ROOT'] . '/mysyde/admin/admin.js') ?>"></script>
<form action="" id="<?= $formname ?>" name="<?= $formname ?>" method="post" enctype="multipart/form-data" class="tickets_create_cardform">
<div class="create_cardform_header">
<div class="create_cardform_header_left">
<a class="back" href="/intranet/de/ticketcenter/"><i class="fa-solid fa-arrow-left-long"></i></a>
<h2>Neue Ticket erstellen</h2>
</div>
<div class="create_cardform_header_right">
<?=button("create_ticket", "Ticket abschicken", $formname, "sendRequest('save', true)");?>
</div>
</div>
<div class="create_cardform_body">
<div class="create_cardform_content">
<div class="create_cardform_content_left">
<?php
input("Betreff*", "input_description", "text", $ticket['description'], required: true);
$query = "SELECT id, description as 'name' FROM main_tickets_category WHERE parent_id = 0 ORDER BY sorting";
input_select_from_sql("Kategorie*", "input_category[0]", $query, isset($_GET['category_id']) ? $_GET['category_id'] : null);
input("Nachricht*", "input_message", "textarea", "", "512", required: true);
input("Adresse*", "input_address", "text", "", "512", required: true);
input("Standort / Etage / Raum*", "input_location", "text", "", "512", required: true);
input("Einrichtung*", "input_facility", "text", "", "512", required: true);
// input("Versicherungsfall", "input_insurance_case", "checkbox", "off");
input("Datei hochladen", "input_image", "file", $ticket['image']);
input("cost_center", "input_cost_center", "hidden", $GLOBALS["main_contact"]["cost_center"], "512");
?>
</div>
<div class="create_cardform_content_right">
</div>
</div>
</div>
</form>
<script>
const leftCol = document.querySelector(".create_cardform_content_left");
const firstSelect = document.querySelector('#input_category\\[0\\]');
const firstInputDiv = firstSelect.closest(".input");
const firstLabelDiv = firstInputDiv.previousElementSibling; // div.label
firstSelect.addEventListener("change", function () {
onCategoryChange(0, this.value);
});
function onCategoryChange(level, categoryId) {
removeCategoryLevelsDeeperThan(level);
if (!categoryId) return;
loadSubCategories(categoryId)
.then(subs => {
if (!Array.isArray(subs) || subs.length === 0) return;
addCategorySelect(level + 1, subs);
})
.catch(err => {
console.error("Failed to load subcategories:", err);
});
}
function loadSubCategories(categoryId) {
return fetch("/module/ticketcenter/services/ticketcenter.api.php", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
action: "getSubCategories",
category_id: categoryId
})
}).then(r => {
if (!r.ok) throw new Error("HTTP " + r.status);
return r.json();
});
}
function removeCategoryLevelsDeeperThan(level) {
const selects = leftCol.querySelectorAll('select[id^="input_category["]');
selects.forEach(sel => {
const selLevel = parseLevelFromId(sel.id);
if (selLevel > level) {
const inputDiv = sel.closest(".input");
const labelDiv = inputDiv?.previousElementSibling;
if (labelDiv && labelDiv.classList.contains("label")) labelDiv.remove();
if (inputDiv) inputDiv.remove();
}
});
}
function addCategorySelect(level, subCategories) {
const labelDiv = document.createElement("div");
labelDiv.className = "label";
const label = document.createElement("label");
label.setAttribute("for", `input_category[${level}]`);
label.textContent = "Kategorie*";
labelDiv.appendChild(label);
const inputDiv = document.createElement("div");
inputDiv.className = "input";
const select = document.createElement("select");
select.name = `input_category[${level}]`;
select.id = `input_category[${level}]`;
select.className = "select";
const placeholder = document.createElement("option");
placeholder.value = "";
placeholder.textContent = "— Bitte wählen —";
placeholder.selected = true;
select.appendChild(placeholder);
subCategories.forEach(item => {
const opt = document.createElement("option");
opt.value = item.id;
opt.textContent = item.description;
select.appendChild(opt);
});
select.addEventListener("change", function () {
onCategoryChange(level, this.value);
});
inputDiv.appendChild(select);
const allCategorySelects = leftCol.querySelectorAll('select[id^="input_category["]');
const lastSelect = allCategorySelects[allCategorySelects.length - 1];
const lastInputDiv = lastSelect.closest(".input");
lastInputDiv.insertAdjacentElement("afterend", inputDiv);
inputDiv.insertAdjacentElement("beforebegin", labelDiv);
}
function parseLevelFromId(id) {
const m = id.match(/input_category\[(\d+)\]/);
return m ? parseInt(m[1], 10) : -1;
}
</script>

View File

@@ -1,941 +0,0 @@
<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];
?>
<link rel="stylesheet" href="/module/ticketcenter/css/repair.css">
<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: false,
// 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>

View File

@@ -1,42 +0,0 @@
<?php
session_start();
$currDir = __DIR__;
$rootDir = dirname(dirname($currDir));
$mysydeDir = $rootDir . '/mysyde';
require_once($rootDir . '/vendor/autoload.php');
require_once($rootDir . "/mysyde/frontend/frontend_functions.inc.php");
$envDir = $rootDir . '/config';
$envFilePath = $envDir . '/.env';
if (is_dir($envDir) && file_exists($envFilePath) && is_file($envFilePath) && is_readable($envFilePath)) {
$dotenv = new \Dotenv\Dotenv($envDir);
$dotenv->load();
}
$common = $mysydeDir ."/common/common_functions.inc.php";
require_once($common);
$connEnv = (local_environment()) ? $mysydeDir."/dc.config.php" : $mysydeDir."/dc-server.config.php";
require_once($connEnv);
db_connect();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$category_id = $_POST['category_id'];
$query = "SELECT * FROM main_tickets_category WHERE parent_id = ".$category_id." ORDER BY sorting";
$result = @mysqli_query($GLOBALS['mysql_con'], $query);
if (mysqli_num_rows($result) <= 0) {
return;
}
echo "<div class='label'><label for='input_subsubcategory'>Genaue Beschreibung</label></div>";
echo "<div class='input'>";
echo "<select name='input_subsubcategory' id='input_subsubcategory' class='select' required>";
echo "<option value=''>Auswählen..</option>";
while($row = @mysqli_fetch_array($result)){
echo "<option value='".$row['id']."'>".$row['description']."</option>";
}
echo "</select>";
echo "</div>";
}