From 8cc6e128ba92616e3857504ce35dec4d599788f2 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Tue, 29 Jul 2025 11:44:29 +0000 Subject: [PATCH 01/33] improved cpeprov2 --- public/js/pages/Cpeprovisioning/Cpeprovisioning.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/js/pages/Cpeprovisioning/Cpeprovisioning.js b/public/js/pages/Cpeprovisioning/Cpeprovisioning.js index e5df7b1db..f3109a8fc 100644 --- a/public/js/pages/Cpeprovisioning/Cpeprovisioning.js +++ b/public/js/pages/Cpeprovisioning/Cpeprovisioning.js @@ -94,7 +94,7 @@ Vue.component('Cpeprovisioning', { - +
Versand
@@ -235,4 +235,4 @@ Vue.component('Cpeprovisioning', { mounted() { this.applyFilters(false); } -}); \ No newline at end of file +}); From 9f63b5640352d96efd63f4297632f92d2248631f Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Tue, 29 Jul 2025 15:24:03 +0200 Subject: [PATCH 02/33] =?UTF-8?q?Zeiterfassung=20*=20Anpassungen=20f=C3=BC?= =?UTF-8?q?r=20Conny=20Reports=20f=C3=BCr=20Jahres=C3=BCbersicht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Layout/default/TimerecordingReport/Index.php | 13 +- .../TimerecordingReportExport/Index.php | 47 ++++ .../TimerecordingReportController.php | 31 ++- .../TimerecordingReportExportController.php | 253 ++++++++++++++++++ public/js/pages/timerecordingReport/index.js | 2 +- 5 files changed, 333 insertions(+), 13 deletions(-) create mode 100644 Layout/default/TimerecordingReportExport/Index.php create mode 100644 application/TimerecordingReportExport/TimerecordingReportExportController.php diff --git a/Layout/default/TimerecordingReport/Index.php b/Layout/default/TimerecordingReport/Index.php index 085b5b7eb..1433d1fce 100644 --- a/Layout/default/TimerecordingReport/Index.php +++ b/Layout/default/TimerecordingReport/Index.php @@ -290,8 +290,6 @@ $years[time() - 31536000] = date('Y', time() - 31536000); - -
@@ -303,9 +301,12 @@ $years[time() - 31536000] = date('Y', time() - 31536000);
+ title="Kalendermonat" data-datatype="2"> +
@@ -322,7 +323,7 @@ $years[time() - 31536000] = date('Y', time() - 31536000);
diff --git a/Layout/default/TimerecordingReportExport/Index.php b/Layout/default/TimerecordingReportExport/Index.php new file mode 100644 index 000000000..5a36e5b43 --- /dev/null +++ b/Layout/default/TimerecordingReportExport/Index.php @@ -0,0 +1,47 @@ + + + + + +
+
+
+
+ +
+

Reports

+
+
+
+ + +
+
+ + +
+
+ +

Auswertungen Stichtag

+

Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und Gutstunden + zum Stichtag X

+
+
+ + +
+
+
+
+
+
+ + \ No newline at end of file diff --git a/application/TimerecordingReport/TimerecordingReportController.php b/application/TimerecordingReport/TimerecordingReportController.php index f494e4b17..456341adc 100644 --- a/application/TimerecordingReport/TimerecordingReportController.php +++ b/application/TimerecordingReport/TimerecordingReportController.php @@ -98,9 +98,8 @@ class TimerecordingReportController extends mfBaseController $workinghourshistory = TimerecordingEmployeeWorkingHourHistoryModel::getAll(); if ($workinghourshistory) { - $workingHoursHistory[2147483500] = $workingHours; foreach ($workinghourshistory as $workinghourhistory) { - $workingHoursHistory[$workinghourshistory->user_id][2147483500] = $workingHours; + $workingHoursHistory[$workinghourhistory->user_id][2147483500] = $workingHours[$workinghourhistory->user_id]; $whenddate = $workinghourhistory->enddate; $workinghourhistoryhours = json_decode($workinghourhistory->workinghours, true); foreach ($workinghourhistoryhours as $workinghourhistoryhour) { @@ -112,12 +111,8 @@ class TimerecordingReportController extends mfBaseController $workingHoursHistory[$workinghourhistory->user_id][$whenddate][$workinghourhistoryhour['day']] = $workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] + $whend - $whstart; } } -// echo $workinghourhistory->user_id."
"; } } -// var_dump($workingHoursHistory); -// die(); - foreach ($this->holidays as $holiday) { $holiDay[date('Y-m-d', $holiday->timestamp)] = $holiday->timestamp; @@ -182,6 +177,30 @@ class TimerecordingReportController extends mfBaseController } + + } else if ($datatype == 5) { + $firstdate = strtotime(date("Y-01-01", $datayear)); + $lastdate = strtotime(date("Y-12-31 23:59:59", $datayear)); + $daycount = date("t", $datamonth); + $lastdate = strtotime(date("Y-m-d", $lastdate) . ' 23:59:59'); + if ($calendar == "1") { + $lastdate = strtotime(" +3 years", $lastdate); + } + $searchArray = ['start' => $firstdate, 'end' => $lastdate]; + $timestamp = $firstdate; + + for ($i = 1; $i <= $daycount; $i++) { + $dDate = date('Y-m-d', $timestamp); + $dDay = date('w', $timestamp); + if (!$holiDay[$dDate]) { + //$mustSeconds = $mustSeconds + $workingHours[$dDay]; + } + + $timestamp = $timestamp + 86400; + } + + + } diff --git a/application/TimerecordingReportExport/TimerecordingReportExportController.php b/application/TimerecordingReportExport/TimerecordingReportExportController.php new file mode 100644 index 000000000..f4decabab --- /dev/null +++ b/application/TimerecordingReportExport/TimerecordingReportExportController.php @@ -0,0 +1,253 @@ +needlogin = true; + $me = new User(); + $me->loadMe(); + $this->me = $me; + $this->layout()->set("me", $me); + + if (!$me->is(["employee"])) { + $this->redirect("Dashboard"); + } + } + + protected function indexAction() + { + $this->layout()->setTemplate("TimerecordingReportExport/Index"); + } + + protected function exportdeadlineAction() + { + $timerecordingBillingsEmployees = TimerecordingBillingEmployeeModel::getAllOrderbyNameDate(); + $timerecordingemployees = TimerecordingEmployeeModel::getAll(); + $enddate = strtotime("01." . '12.2024'); + $enddate = strtotime("last day of this month", $enddate); + $enddate = strtotime("23:59:59", $enddate); + $holidays = []; + + $generateTimerecording=new TimerecordingController(); + $newtimerecordings=$generateTimerecording->getTimerecordingsApi(6, '1672527600', '1672527600', '1672527600', '1672527600', '1735685940', 25); + var_dump($newtimerecordings); + die(); + + + foreach ($timerecordingemployees as $timerecordingemployee) { + $holidays[$timerecordingemployee->user_id] = $this->getholidays($timerecordingemployee->user_id, $enddate); + } + + $spreadsheet = new Spreadsheet(); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setTitle('Monatsübersicht'); + + + $headers = [ + 'Monat', 'Mitarbeiter', 'LZ', 'NLZ', 'Urlaub', 'LZ + NLZ', + 'Sollst.', 'Sollabweichung', 'Mehrstunden', 'Gutstunden' + ]; + if ($this->me->superexpertEnabled()) { + $headers[] = 'Black P. St.'; + } + + $sheet->fromArray($headers, NULL, 'A1'); + + $sheet->getStyle('A1:' . $sheet->getHighestColumn() . '1')->getFont()->setBold(true); + + + $row = 2; + $oldEmployee_id = ""; + $bpadiff = 0; + $overtimediff = 0; + $plushoursdiff = 0; + foreach ($timerecordingBillingsEmployees as $timerecordingbillingsemployee) { + // Daten vorbereiten (Logik aus der View übernehmen) + $user = new User($timerecordingbillingsemployee->timerecordingEmployee->user->id); + $employee_number = (string)$user->getFlag('employee_number'); + + $nlz_text = ""; + if ($timerecordingbillingsemployee->nlz) { + $nlz_details = json_decode($timerecordingbillingsemployee->nlz, true); + foreach ($nlz_details as $key => $nlz_detail) { + if ($nlz_detail > 0) { + if ($nlz_detail < 100) { + $nlz_text .= $key . ": " . $nlz_detail . " Tag(e)\n"; + } else { + $nlz_text .= $key . ": " . round($nlz_detail / 3600, 2) . " Stunden\n"; + } + } + } + } + $nlz_text = rtrim($nlz_text, "\n"); // Letzten Zeilenumbruch entfernen + + if ($oldEmployee_id != $timerecordingbillingsemployee->timerecordingEmployee_id) { + $bpadiff = 0; + $overtimediff = 0; + $plushoursdiff = 0; + } + $bpadiff += $timerecordingbillingsemployee->transfer_bpahours; + $overtimediff += $timerecordingbillingsemployee->transfer_overtime; + $plushoursdiff += $timerecordingbillingsemployee->transfer_plushours; + + // Werte berechnen + $ishours = round($timerecordingbillingsemployee->ishours / 3600, 2); + $ishourssum = round($timerecordingbillingsemployee->ishourssum / 3600, 2); + $musthours = round($timerecordingbillingsemployee->musthours / 3600, 2); + $deviation = round(($timerecordingbillingsemployee->ishourssum - $timerecordingbillingsemployee->musthours) / 3600, 2); + $plushours_all = round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2); + $overtime_now = round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2); + $bpahours = round(($timerecordingbillingsemployee->timerecordingEmployee->bpahours + $bpadiff) / 3600, 2); + + // Zeile mit Daten füllen + $sheet->setCellValue('A' . $row, $timerecordingbillingsemployee->timerecordingBilling->month); + $sheet->setCellValue('B' . $row, "(" . $employee_number . ") " . $timerecordingbillingsemployee->timerecordingEmployee->user->name); + $sheet->setCellValue('C' . $row, $ishours); + $sheet->setCellValue('D' . $row, $nlz_text); + $sheet->setCellValue('E' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]); + $sheet->setCellValue('F' . $row, $ishourssum); + $sheet->setCellValue('G' . $row, $musthours); + $sheet->setCellValue('H' . $row, $deviation); + $sheet->setCellValue('I' . $row, $plushours_all); + $sheet->setCellValue('J' . $row, $overtime_now); + + if ($this->me->superexpertEnabled()) { + $sheet->setCellValue('K' . $row, $bpahours); + } + + $oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id; + $row++; + } + + // 5. Spalten formatieren und optimieren + // Zahlenformat für Stunden (2 Dezimalstellen) + $number_format_code = '#,##0.00'; + $sheet->getStyle('C2:C' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('F2:F' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('G2:G' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('H2:H' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('I2:I' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('J2:J' . $row)->getNumberFormat()->setFormatCode($number_format_code); + if ($this->me->superexpertEnabled()) { + $sheet->getStyle('K2:K' . $row)->getNumberFormat()->setFormatCode($number_format_code); + } + $sheet->getStyle('D2:D' . $row)->getAlignment()->setWrapText(true); + + foreach (range('A', $sheet->getHighestColumn()) as $columnID) { + $sheet->getColumnDimension($columnID)->setAutoSize(true); + } + $writer = new Xlsx($spreadsheet); + + $filename = 'Monatsuebersicht_' . date('Y-m-d') . '.xlsx'; + + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header('Content-Disposition: attachment;filename="' . $filename . '"'); + header('Cache-Control: max-age=0'); + + // Datei an den Browser senden + $writer->save('php://output'); + + exit(); + } + + protected function getholidays($userid, $enddate) + { + + $employee = TimerecordingEmployeeModel::search(['user_id' => $userid]); + + if ($employee) { + $employee = $employee[0]; + $holidays = $employee->holidays; + $holidays_now = $employee->holidays_now; + $holidays_timestamp = $employee->holidays_timestamp; + $workinghours = TimerecordingEmployeeWorkingHourModel::search(['user_id' => $userid]); + $realHolidays = TimerecordingHolidayModel::getAll(); + foreach ($realHolidays as $realHoliday) { + $realholiDay[date('Y-m-d', $realHoliday->timestamp)] = $realHoliday->timestamp; + } + if (!$holidays_timestamp) { + //$holidays_timestamp = $employee->startdate; + $holidays_timestamp = strtotime('2024-01-01 00:00:00'); + $holidays_now = $holidays; + } + $timerecordings = TimerecordingModel::search(['user_id' => $userid, 'start' => $holidays_timestamp, 'timerecordingCategory_id' => 3]); + $timerecordingscorrections = TimerecordingModel::search(['user_id' => $userid, 'start' => $holidays_timestamp, 'endsdate' => $enddate, 'days' => 1]); + foreach ($timerecordings as $timerecording) { + + if ($timerecording->end > $enddate) { + $timerecording->end = $enddate; + } + $daycounter = ($timerecording->end - $timerecording->start) / 86400; + $daycounter = intval(round($daycounter, 0, PHP_ROUND_HALF_DOWN)); + $daycounter = $daycounter * 86400; + if (is_int($daycounter)) { + for ($i = 86400; $i <= $daycounter; $i = $i + 86400) { + $holidayDays[date("Y-m-d", $timerecording->start + $i - 86400)] = 1; + } + } + } + + + foreach ($workinghours as $workinghour) { + + $whstart = strtotime(date('Y-m-d', time()) . " " . $workinghour->start . ":00"); + $whend = strtotime(date('Y-m-d', time()) . " " . $workinghour->end . ":00"); + if (!$workingHours[$workinghour->day]) { + $workingHours[$workinghour->day] = $whend - $whstart; + } else { + $workingHours[$workinghour->day] = $workingHours[$workinghour->day] + $whend - $whstart; + } + } + $workinghourshistory = TimerecordingEmployeeWorkingHourHistoryModel::search(['user_id' => $userid]); + if ($workinghourshistory) { + $workingHoursHistory[2147483500] = $workingHours; + foreach ($workinghourshistory as $workinghourhistory) { + $whenddate = $workinghourhistory->enddate; + $workinghourhistoryhours = json_decode($workinghourhistory->workinghours, true); + foreach ($workinghourhistoryhours as $workinghourhistoryhour) { + $whstart = strtotime(date('Y-m-d', time()) . " " . $workinghourhistoryhour['start'] . ":00"); + $whend = strtotime(date('Y-m-d', time()) . " " . $workinghourhistoryhour['end'] . ":00"); + if (!$workingHoursHistory[$whenddate][$workinghourhistoryhour['day']]) { + $workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] = $whend - $whstart; + } else { + $workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] = $workingHoursHistory[$whenddate][$workinghourhistoryhour['day']] + $whend - $whstart; + } + } + } + } + + //check if holiday is already in the list + foreach ($holidayDays as $key => $holidayDay) { + if ($workingHoursHistory) { + foreach ($workingHoursHistory as $whkey => $whdata) { + $whtimestamp = strtotime(date('Y-m-d 23:59:59', $whkey)); + $timestamp = strtotime($key); + if ($whtimestamp >= $timestamp) { + $workingHours = $whdata; + } + } + } + if (($realholiDay[$key])) { + + } else if ($workingHours[date('w', strtotime($key))]) { + $holidays_now--; + } + } + foreach ($timerecordingscorrections as $timerecordingscorrection) { + $holidays_now = $holidays_now + $timerecordingscorrection->days; + } + + } + + return $holidays_now; + } + + +} \ No newline at end of file diff --git a/public/js/pages/timerecordingReport/index.js b/public/js/pages/timerecordingReport/index.js index 6fcddcb54..2be23e320 100644 --- a/public/js/pages/timerecordingReport/index.js +++ b/public/js/pages/timerecordingReport/index.js @@ -567,7 +567,7 @@ $(document).ready(function () { $('#dynamictime-div').show(); $('#dataweek-col').hide(); $('#datayear-col').hide(); - } else if ($(this).data('datatype') == "3") { + } else if ($(this).data('datatype') == "3" || $(this).data('datatype') == "5") { $('#datayear-col').show(); $('#dynamictime-div').hide(); $('#datamonth-col').hide(); From 0f100ecca29dfb0784b7d27dfbd581838f020a8a Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Tue, 29 Jul 2025 17:53:20 +0200 Subject: [PATCH 03/33] =?UTF-8?q?Zeiterfassung=20*=20Anpassungen=20f=C3=BC?= =?UTF-8?q?r=20Conny=20Reports=20f=C3=BCr=20Stichtagauswertungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimerecordingReportExport/Index.php | 24 ++++-- Layout/default/menu.php | 1 + .../TimerecordingReportExportController.php | 86 ++++++++----------- 3 files changed, 53 insertions(+), 58 deletions(-) diff --git a/Layout/default/TimerecordingReportExport/Index.php b/Layout/default/TimerecordingReportExport/Index.php index 5a36e5b43..42919b1ac 100644 --- a/Layout/default/TimerecordingReportExport/Index.php +++ b/Layout/default/TimerecordingReportExport/Index.php @@ -29,16 +29,24 @@
+
"> +

Auswertungen Stichtag

+

Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und + Gutstunden + zum Stichtag X
+ Zur Zeit ist der Stichtag auf den letzten Tag des ausgewählten Monats gesetzt.
+

+
+ +
+ + +
-

Auswertungen Stichtag

-

Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und Gutstunden - zum Stichtag X

-
-
- -
-
+
diff --git a/Layout/default/menu.php b/Layout/default/menu.php index fd2dd7619..36e4c4a43 100644 --- a/Layout/default/menu.php +++ b/Layout/default/menu.php @@ -44,6 +44,7 @@
  • "> Freigaben
  • "> Auswertung/Korrektur
  • "> Verrechnung
  • +
  • "> Reports
  • "> Buchungsarten
  • "> Feiertage
  • "> Personaladministration
  • diff --git a/application/TimerecordingReportExport/TimerecordingReportExportController.php b/application/TimerecordingReportExport/TimerecordingReportExportController.php index f4decabab..ffb55b610 100644 --- a/application/TimerecordingReportExport/TimerecordingReportExportController.php +++ b/application/TimerecordingReportExport/TimerecordingReportExportController.php @@ -28,17 +28,28 @@ class TimerecordingReportExportController extends mfBaseController protected function exportdeadlineAction() { + $r = $this->request; + $month=$r->date; + if (!$month) { + $month = date('Y-m-d'); + } + $timerecordingBillings = TimerecordingBillingModel::getAll(); + foreach ($timerecordingBillings as $value) { + $timerecordingBilling[$value->month] = $value; + } $timerecordingBillingsEmployees = TimerecordingBillingEmployeeModel::getAllOrderbyNameDate(); + + $timerecordingemployees = TimerecordingEmployeeModel::getAll(); - $enddate = strtotime("01." . '12.2024'); + $enddate = strtotime($month); $enddate = strtotime("last day of this month", $enddate); $enddate = strtotime("23:59:59", $enddate); $holidays = []; - $generateTimerecording=new TimerecordingController(); - $newtimerecordings=$generateTimerecording->getTimerecordingsApi(6, '1672527600', '1672527600', '1672527600', '1672527600', '1735685940', 25); - var_dump($newtimerecordings); - die(); +// $generateTimerecording=new TimerecordingController(); +// $newtimerecordings=$generateTimerecording->getTimerecordingsApi(6, '1672527600', '1672527600', '1672527600', '1672527600', '1735685940', 25); +// var_dump($newtimerecordings); +// die(); foreach ($timerecordingemployees as $timerecordingemployee) { @@ -51,8 +62,7 @@ class TimerecordingReportExportController extends mfBaseController $headers = [ - 'Monat', 'Mitarbeiter', 'LZ', 'NLZ', 'Urlaub', 'LZ + NLZ', - 'Sollst.', 'Sollabweichung', 'Mehrstunden', 'Gutstunden' + 'Stichtag', 'Pers. Nr.', 'Mitarbeiter', 'Urlaub', 'Mehrstunden', 'Gutstunden' ]; if ($this->me->superexpertEnabled()) { $headers[] = 'Black P. St.'; @@ -68,67 +78,43 @@ class TimerecordingReportExportController extends mfBaseController $bpadiff = 0; $overtimediff = 0; $plushoursdiff = 0; + + foreach ($timerecordingBillingsEmployees as $timerecordingbillingsemployee) { // Daten vorbereiten (Logik aus der View übernehmen) $user = new User($timerecordingbillingsemployee->timerecordingEmployee->user->id); $employee_number = (string)$user->getFlag('employee_number'); - $nlz_text = ""; - if ($timerecordingbillingsemployee->nlz) { - $nlz_details = json_decode($timerecordingbillingsemployee->nlz, true); - foreach ($nlz_details as $key => $nlz_detail) { - if ($nlz_detail > 0) { - if ($nlz_detail < 100) { - $nlz_text .= $key . ": " . $nlz_detail . " Tag(e)\n"; - } else { - $nlz_text .= $key . ": " . round($nlz_detail / 3600, 2) . " Stunden\n"; - } - } - } - } - $nlz_text = rtrim($nlz_text, "\n"); // Letzten Zeilenumbruch entfernen if ($oldEmployee_id != $timerecordingbillingsemployee->timerecordingEmployee_id) { $bpadiff = 0; $overtimediff = 0; $plushoursdiff = 0; } - $bpadiff += $timerecordingbillingsemployee->transfer_bpahours; - $overtimediff += $timerecordingbillingsemployee->transfer_overtime; - $plushoursdiff += $timerecordingbillingsemployee->transfer_plushours; + $bpadiff = $bpadiff + $timerecordingbillingsemployee->transfer_bpahours; + $overtimediff = $overtimediff + $timerecordingbillingsemployee->transfer_overtime; + $plushoursdiff = $plushoursdiff + $timerecordingbillingsemployee->transfer_plushours; - // Werte berechnen - $ishours = round($timerecordingbillingsemployee->ishours / 3600, 2); - $ishourssum = round($timerecordingbillingsemployee->ishourssum / 3600, 2); - $musthours = round($timerecordingbillingsemployee->musthours / 3600, 2); - $deviation = round(($timerecordingbillingsemployee->ishourssum - $timerecordingbillingsemployee->musthours) / 3600, 2); - $plushours_all = round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2); - $overtime_now = round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2); - $bpahours = round(($timerecordingbillingsemployee->timerecordingEmployee->bpahours + $bpadiff) / 3600, 2); - - // Zeile mit Daten füllen - $sheet->setCellValue('A' . $row, $timerecordingbillingsemployee->timerecordingBilling->month); - $sheet->setCellValue('B' . $row, "(" . $employee_number . ") " . $timerecordingbillingsemployee->timerecordingEmployee->user->name); - $sheet->setCellValue('C' . $row, $ishours); - $sheet->setCellValue('D' . $row, $nlz_text); - $sheet->setCellValue('E' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]); - $sheet->setCellValue('F' . $row, $ishourssum); - $sheet->setCellValue('G' . $row, $musthours); - $sheet->setCellValue('H' . $row, $deviation); - $sheet->setCellValue('I' . $row, $plushours_all); - $sheet->setCellValue('J' . $row, $overtime_now); - - if ($this->me->superexpertEnabled()) { - $sheet->setCellValue('K' . $row, $bpahours); + if ($timerecordingbillingsemployee->timerecordingBilling->month != date("m.Y",$enddate)) { + $oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id; + continue; } + $sheet->setCellValue('A' . $row, date("d.m.Y",$enddate). " "); + $sheet->setCellValue('B' . $row, $employee_number); + $sheet->setCellValue('C' . $row, $timerecordingbillingsemployee->timerecordingEmployee->user->name); + $sheet->setCellValue('D' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]); + $sheet->setCellValue('E' . $row, number_format(round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2), "2", ",", ".")); + $sheet->setCellValue('F' . $row, number_format(round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2), "2", ",", ".")); + $oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id; $row++; } - // 5. Spalten formatieren und optimieren - // Zahlenformat für Stunden (2 Dezimalstellen) $number_format_code = '#,##0.00'; + + + $sheet->getStyle('A2:A' . $row)->getNumberFormat()->setFormatCode('@'); $sheet->getStyle('C2:C' . $row)->getNumberFormat()->setFormatCode($number_format_code); $sheet->getStyle('F2:F' . $row)->getNumberFormat()->setFormatCode($number_format_code); $sheet->getStyle('G2:G' . $row)->getNumberFormat()->setFormatCode($number_format_code); @@ -145,7 +131,7 @@ class TimerecordingReportExportController extends mfBaseController } $writer = new Xlsx($spreadsheet); - $filename = 'Monatsuebersicht_' . date('Y-m-d') . '.xlsx'; + $filename = 'Monatsuebersicht_' . date('Y-m-d',$enddate) . '.xlsx'; header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); header('Content-Disposition: attachment;filename="' . $filename . '"'); From 3705789df40e68b6bba96cfca81239de08be4c56 Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Tue, 29 Jul 2025 18:09:36 +0200 Subject: [PATCH 04/33] =?UTF-8?q?Zeiterfassung=20*=20Anpassungen=20f=C3=BC?= =?UTF-8?q?r=20Conny=20Reports=20f=C3=BCr=20Stichtagauswertungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Layout/default/TimerecordingReportExport/Index.php | 9 ++++++++- .../TimerecordingReportExportController.php | 5 +++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Layout/default/TimerecordingReportExport/Index.php b/Layout/default/TimerecordingReportExport/Index.php index 42919b1ac..fc211e2db 100644 --- a/Layout/default/TimerecordingReportExport/Index.php +++ b/Layout/default/TimerecordingReportExport/Index.php @@ -5,6 +5,12 @@ type="text/css"/>
    @@ -36,7 +42,8 @@

    Hier wird eine XLS Auswertung pro Mitarbeiter generiert mit Urlaub, Mehrstunden und Gutstunden zum Stichtag X
    - Zur Zeit ist der Stichtag auf den letzten Tag des ausgewählten Monats gesetzt.
    + Zur Zeit ist der Stichtag auf den + letzten Tag des ausgewählten Monats gesetzt.

    diff --git a/application/TimerecordingReportExport/TimerecordingReportExportController.php b/application/TimerecordingReportExport/TimerecordingReportExportController.php index ffb55b610..254c619ed 100644 --- a/application/TimerecordingReportExport/TimerecordingReportExportController.php +++ b/application/TimerecordingReportExport/TimerecordingReportExportController.php @@ -104,8 +104,8 @@ class TimerecordingReportExportController extends mfBaseController $sheet->setCellValue('B' . $row, $employee_number); $sheet->setCellValue('C' . $row, $timerecordingbillingsemployee->timerecordingEmployee->user->name); $sheet->setCellValue('D' . $row, $holidays[$timerecordingbillingsemployee->timerecordingEmployee->user_id]); - $sheet->setCellValue('E' . $row, number_format(round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2), "2", ",", ".")); - $sheet->setCellValue('F' . $row, number_format(round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2), "2", ",", ".")); + $sheet->setCellValue('E' . $row, round(($timerecordingbillingsemployee->plushours_all + $timerecordingbillingsemployee->transfer_plushours) / 3600, 2)); + $sheet->setCellValue('F' . $row, round(($timerecordingbillingsemployee->timerecordingEmployee->overtime_now + $overtimediff) / 3600, 2)); $oldEmployee_id = $timerecordingbillingsemployee->timerecordingEmployee_id; $row++; @@ -116,6 +116,7 @@ class TimerecordingReportExportController extends mfBaseController $sheet->getStyle('A2:A' . $row)->getNumberFormat()->setFormatCode('@'); $sheet->getStyle('C2:C' . $row)->getNumberFormat()->setFormatCode($number_format_code); + $sheet->getStyle('E2:E' . $row)->getNumberFormat()->setFormatCode($number_format_code); $sheet->getStyle('F2:F' . $row)->getNumberFormat()->setFormatCode($number_format_code); $sheet->getStyle('G2:G' . $row)->getNumberFormat()->setFormatCode($number_format_code); $sheet->getStyle('H2:H' . $row)->getNumberFormat()->setFormatCode($number_format_code); From 25c4ac552f020512e75d1ecfade1e28b8a4274b8 Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Tue, 29 Jul 2025 19:04:35 +0200 Subject: [PATCH 05/33] =?UTF-8?q?Zeiterfassung=20*=20Anpassungen=20f=C3=BC?= =?UTF-8?q?r=20Conny=20Reports=20f=C3=BCr=20Stichtagauswertungen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Layout/default/TimerecordingReportExport/Index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Layout/default/TimerecordingReportExport/Index.php b/Layout/default/TimerecordingReportExport/Index.php index fc211e2db..efafb5338 100644 --- a/Layout/default/TimerecordingReportExport/Index.php +++ b/Layout/default/TimerecordingReportExport/Index.php @@ -48,7 +48,7 @@
    - +
    From a38dc07892b563899659dbb3ced6a4b065e60f4d Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Wed, 30 Jul 2025 11:22:24 +0000 Subject: [PATCH 06/33] Update Index.php --- Layout/default/Preorder/Index.php | 33 +++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/Layout/default/Preorder/Index.php b/Layout/default/Preorder/Index.php index 57e0f2a3e..f2b3ac72f 100644 --- a/Layout/default/Preorder/Index.php +++ b/Layout/default/Preorder/Index.php @@ -519,7 +519,7 @@ $pagination_entity_name = "Vorbestellungen"; } } - $requiredFlagIds = [3, 4, 5]; + $requiredFlagIds = [1, 3, 4, 5]; $allFlagsChecked = true; foreach ($requiredFlagIds as $flagId) { @@ -545,7 +545,19 @@ $pagination_entity_name = "Vorbestellungen"; type, "preorder")?>
    ucode?> - status->code?> - status->name?> + status->code?> - status->name?> + [3,4]]) as $flag): ?> +
    id, $preorder->statusflags) && $preorder->statusflags[$flag->id]->value && $preorder->statusflags[$flag->id]->value->value) ? "checked='checked'" : ""?> + /> + + + building_id): ?> building->street?>
    building->zip?> building->city?> adb_hausnummer_id): ?> @@ -576,8 +588,8 @@ $pagination_entity_name = "Vorbestellungen"; partner_id) ? $preorder->partner->getCompanyOrName() : ""?> -
    - +
    + create)?>
    @@ -1026,7 +1038,7 @@ $pagination_entity_name = "Vorbestellungen"; } } - $("input.preorder-statusflag").change((e) => { + $("input.preorder-statusflag, input.preorder-statusflag-main").change((e) => { var elem = e.target; var preorder_id = $(elem).data("preorder_id"); var flag_id = $(elem).data("flag_id"); @@ -1060,6 +1072,15 @@ $pagination_entity_name = "Vorbestellungen"; }, 2000, textelem); } + // find all inputs with this data-preorder_id="21969" and data-flag_id="3" and set the text to the new value + // always with their own fields and then select / unselect the checkbox + $("input.preorder-statusflag[data-preorder_id='" + this.preorder_id + "'][data-flag_id='" + this.flag_id + "']").each(function() { + if(value) { + $(this).prop("checked", true); + } else { + $(this).prop("checked", false); + } + }); }, error: function () { @@ -1711,4 +1732,4 @@ $pagination_entity_name = "Vorbestellungen"; campaignSelect.trigger("change"); }); - \ No newline at end of file + From 26768252f02f85c4c1fabb9770dcb01cd07b0e29 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Wed, 30 Jul 2025 11:22:46 +0000 Subject: [PATCH 07/33] Update PreorderStatusflagModel.php --- application/PreorderStatusflag/PreorderStatusflagModel.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/application/PreorderStatusflag/PreorderStatusflagModel.php b/application/PreorderStatusflag/PreorderStatusflagModel.php index c315694b0..dfb47a1f8 100644 --- a/application/PreorderStatusflag/PreorderStatusflagModel.php +++ b/application/PreorderStatusflag/PreorderStatusflagModel.php @@ -120,6 +120,13 @@ class PreorderStatusflagModel { } } + if (array_key_exists("ids", $filter)) { + $ids = $filter['ids']; + if (is_array($ids) && count($ids)) { + $where .= " AND PreorderStatusflag.id IN (" . implode(',', $ids) . ")"; + } + } + if (array_key_exists("create_by", $filter)) { $create_by = $filter['create_by']; if (is_numeric($create_by)) { From b3030884c5171a43329bfb5907ed51204938148d Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Mon, 4 Aug 2025 10:35:04 +0200 Subject: [PATCH 08/33] Pops * Bugfix Dokustand Datumsanzeige hat das Datum nicht richtig angezeigt --- Layout/default/Pop/Detail.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Layout/default/Pop/Detail.php b/Layout/default/Pop/Detail.php index cf3846f48..9656f7e32 100644 --- a/Layout/default/Pop/Detail.php +++ b/Layout/default/Pop/Detail.php @@ -181,7 +181,7 @@ if (!empty(trim($pops->vlan_ipv6))) Dokustand | Status - doku_date) ? date("d.m.Y") : '-' ?>|state) ? $stateArray[$pops->state] : '-' ?> + doku_date) ? date("d.m.Y",$pops->doku_date) : '-' ?>|state) ? $stateArray[$pops->state] : '-' ?> Fotospeicherort From 073ce045b95e5838e5c8e93f5308fd02646d3d84 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Mon, 4 Aug 2025 12:15:21 +0200 Subject: [PATCH 09/33] improved performance of vue modules --- Layout/default/VueViews/Vue.php | 6 - Layout/default/footer.php | 4 + Layout/default/vueHeader.php | 120 +++---- .../WarehouseShippingNoteController.php | 1 - composer.json | 3 +- .../assets/images/the-tool-logo-top.max.png | Bin 0 -> 10046 bytes public/assets/images/the-tool-logo-top.png | Bin 10046 -> 2556 bytes public/cssbundler.php | 53 +++ .../vue/tt-components/css/tt-table.css | 2 +- .../vue/tt-components/tt-autocomplete.js | 324 ++++++++---------- public/plugins/vue/tt-components/tt-button.js | 59 ++-- .../vue/tt-components/tt-datepicker.js | 178 ++++------ public/plugins/vue/tt-components/tt-table.js | 12 +- 13 files changed, 365 insertions(+), 397 deletions(-) create mode 100644 public/assets/images/the-tool-logo-top.max.png create mode 100644 public/cssbundler.php diff --git a/Layout/default/VueViews/Vue.php b/Layout/default/VueViews/Vue.php index 23f7bd02e..c6bab7c16 100644 --- a/Layout/default/VueViews/Vue.php +++ b/Layout/default/VueViews/Vue.php @@ -19,12 +19,6 @@ if (is_dir($vueViewPath)) { $additionalCSS = [ ...$additionalCSS, - 'plugins/daterangepicker/daterangepicker.css', - 'plugins/vue/tt-components/css/tt-table.css', - 'plugins/vue/tt-components/css/tt-tooltip.css', - 'plugins/vue/tt-components/css/tt-loader.css', - 'plugins/vue/tt-components/css/tt-file-gallery.css', - 'plugins/vue/tt-components/css/tt-position-manager.css', ]; /** diff --git a/Layout/default/footer.php b/Layout/default/footer.php index 2fa965d51..1ccb6c055 100644 --- a/Layout/default/footer.php +++ b/Layout/default/footer.php @@ -22,6 +22,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + +
    - - +
    - - -
    -
    +
    +
    \ No newline at end of file diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteController.php b/application/WarehouseShippingNote/WarehouseShippingNoteController.php index 7af7302a1..19009f358 100644 --- a/application/WarehouseShippingNote/WarehouseShippingNoteController.php +++ b/application/WarehouseShippingNote/WarehouseShippingNoteController.php @@ -30,7 +30,6 @@ class WarehouseShippingNoteController extends TTCrud { protected array $defaultOrder = ['key' => 'create', 'order' => 'DESC']; protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true]; - protected array $additionalJS = ['js/pages/WarehouseArticle/WarehouseArticleModal.js']; protected array $additionalHead = ['']; protected array $infoMessages = ['create' => 'Lieferschein wurde erstellt.', diff --git a/composer.json b/composer.json index 32e59f052..151670a4a 100644 --- a/composer.json +++ b/composer.json @@ -9,6 +9,7 @@ "phpseclib/phpseclib": "^3.0", "stomp-php/stomp-php": "^5", "phpmailer/phpmailer": "^6.9", - "pear2/net_routeros": "dev-develop@dev" + "pear2/net_routeros": "dev-develop@dev", + "matthiasmullie/minify": "^1.3" } } diff --git a/public/assets/images/the-tool-logo-top.max.png b/public/assets/images/the-tool-logo-top.max.png new file mode 100644 index 0000000000000000000000000000000000000000..a2d33a43381c9609c23cb082734c18a2f6c82e64 GIT binary patch literal 10046 zcmV-EC&Ac>P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>DCeukoK~#8N?VWj? zTt&6VHGn7z1lbY@E(km@AwVDjM0SY~kli2UKjXs~6EZWI>6ytt!~34*^w?cpx9{!lyLQ*_^Z9*x=H6OPEvJ@SRi{1? z20r@eqjkHxyLW{XySln=h12-^HMk76!o~1M@L}G4m)~)4hk+>76X$g6QYJ8DfXckG%qYmS4*@azaUmcRGqcT`75$9Dbw{hN}P>u698ae>0w zih{aVDs>bj{5L4*<0;%h8f8Oc<;s;ClI~rk(!-0%+q>cOaG{wuHLwM~1RsUh!-?eW z{`A<}G)w-*3Nmu z$k#L^{Y&}1zO%D)d(D>S0WI}TWPq%ITQes~qPX`;%dMiu3jHK|DwG`pR{5HgG7R5E zv#GH` z62HT7vsY(#_hI}!0bT)RQFjKiT2@a{EgON0)zNA zpa3t$e=Un;XKOH#fU))0h-11DXPA7MJiCSTpG+kmLwuWR)RBO^{*=rYh*x@a$#dBz z6xlGEv@Ii^OJrE8B4i&VY@(Ua0DPd{jfS)~`;wuHEMa?+%wG^i<`ec%WRb5@)_CjS zTzCUK3=Y-k62<%Pzb_vfc1NDG$j_(vjbc?_(tRijn#jB{G>`yUEq|pbVZJ0&Wx^cF ziYwvCR(aVHZ;i`F;y*#X*A3D!NWz0vDXI@=GDJI%Fo#R{8dYi`!!=|+9C>A7IPBi# z0hDoTjVgO!Y%4oKZ3(lIOq|9T_%rG~6cFZtwz#~A`{&hbU6AoI;XQ7KUkj0G9=w$N z+)0DaBxF=Tg+7wBJZ4L0EhMZ(`h3(WHUh(xRgobm(**hAndD*xGJ)P$*X#; z8d6Xcn5<`1)pL1p3KihsuzJ)qLCTu6T>`_}OLjl`w3!BWxE~YsfIO}#}5Dq`SMi$NBpbQmedBCKKf z5v97LAs4?w0C~F}c{85;t!JmfEap02(IC?WgbVZqhf1>eop;`eWfDqe2VT*qMc+rg zSwR7Qjsm>j=GTv;`G>ITMbKu1_WW1Fn$}au=LMaeoqKC==>fvYxn--+#iY_csa_%n z@r^R$_aX{%w0bK8GH*e~*K$TfhGC~l>!?9F1O$0L0@k{p?@h|Lqdz-%vCD3Y@6kNV^2qWfU ztU?;hgn~$+(8X6fVVv35*O%$l@3ca8T#&!l8u=ZFl;h=zD+xjbGUb!jAr`}-Q`DO% z$BxKZm2%+zwiPQ@M818#*+E{*M$M{sEl@s}C8{I{A?J*(!W9!migS{_n;E|s3zKyD zOo)utY}aqW{e)C><4pp3Y1wi=%P0q5Qcf3Y5b=Y^gKkJ$Ol4YEy+sOS3cPqp53&!f z%rO3zlZ;k3CJBE5{?hkJu?e7`gC91_#E+Dh^|4J4h=sO|?9? z61UGXBy(FuQUDp+QWodi%Bccnon$W!A|7F+oy+~v z^4!J;!#?2U5FV(1axSNuEh@99xAARoB*JPAOf89Or5WW2x}os5C`U(EclR$X?@Zp0 za;&dWIHVK|x8$yqYLw(blq8;`%m`QQk=q|2T&PBkkzs#Y65k9W?q8rBt8+a)|Fpd~ zI7N&TXcP`92W1<0KCC=Vy+#Wvdo4yA?#5pzoB0T9B+3!QV8Yud$3La_fEDK-g!z;h zebXo$G6Kr(46`gN@J$-lcx*NkSuJLN?yvWRp{!$2nS)vr`Ku@gy~l_A{S)I|F{h{c z5ROAdP#*%H-NEhiVKvkhK_s;rj+=$Q-8GoNkV!L%yBPn0#+}6R8|^uSf3mp|66Rdo zZl%#UWDwNFL6l)NHUkE>8$}9Q^Lk8=ian)KB(CDt4KbL2TZt$5%6E77&rpgFRXJAi z%&YfUvUcs-;Tn}gh9M0oN)l*|3wH}~AE|Z9JgD4t8?VN{%w=vs+2jg^vAw;$2X%IK z9?4koJpP|TVrnr;)~3qQ!Qa0(-WBtkniPiy0OdIZ2Kwwzy^GvlLLRd1n+Vf$Axtj! zyCUUiD|@dbgD%!2I5ZGwXvI!)kYV^TdXac6%~08@THTC_46S~OVysdHS;@1Xnr@Vj zNbjfOJ2V(5-$0khQg1I(FVRBg5kxr26d(cSzgof7{B2znBvW2v_~!OkH8AKIR)4>il*gYjLk zgyyb~RtC0F6(&)T<OlF6 zy{(e^V3K-zhdNIN2(TA|JZTCR0)K*16jsa&G&d#ASrNk}o(}0m&&LJO6UfQEP+};|ZrC{H<^r zf6EpD*;XQk=@xf=Yz91dyhPE{~LAlC@q6C)6?Xje#y2av;LG2 zH^-~<>_H}5RQl4%mJFpV%8_Sx_y56GXZ_GYK;<7@Qg`gUL7it4B%t^vskcys!j~&6 zQK-Art3#7RcKT9hD()AgzC5SSvk5gIwnP*3?+uA|wlk)jq+T5yWd7^775+^|D%rli zf<$~z5<{2y4~tS1^Dnqt;!X)V6hM9OUA*q??cG+LXA@%Ih=lyoq7cPw$IZ_*(ea!d zb4WcHQOJ$EWlB*@dYJ>%d3HhXG2fyT#r$hgqFfNDp2j&9^xQCL7uVIk0Q=cr`dySNhSe>>)&J#)@nmR zR_Hq$Z`5EMniw>ow^-`N08yYNncaDTf*fCxAlceptRR&ww=WX~)1Vxh6x0FV>k~RU zIzF$?vjq}o-ZJ!`MG7LHb}Ly<6rQO;IW#HgA&xfcL>Z}P*&B}2?a3;7+3mVr-Q9mz z1^Ju#&LrLIT*CR32I zB)iN1+qOw}Hob{K`M+w^hZ0iPZdRw+Kwn?qj<$ppNP-T6uiM_)h}&B=Xon^Qb>MNc zP8iJA!ZH=w)2u1)7Rtn1x<%W28*wY=0)}Yt4owEi-p>N)9CexvpageW5|JnGZWlNF zJrtIGWxtDA7fe#`_EzWV z2EvXtg)ibPbv6KoTtBe5vl6#*SDmwX(qxb=N4EM-d96Ad0M8CL z+*BkPFXC3d=ZaOX9JKgS|l#e6s+o)HECIRJstx*rkNZmU@ou?D@ z1{>Q17b3i@e+*KmC18xXIc@@9{7G1sO3x!71o(R-t;g>C?#%Bnu>h&TIy4X{+i%(G zLNTcWV$UGGE%O5#Ac z(+yzZN_;6p1`tZ*0fWDp%4 z9h=a|`Sv2X8KYj(11h)m(i5I9QYRImU$bVL{-Yo=J&i&-CCMNty9;e)YVaX-o*p2S zb-@p9epa1$LRxfjXY(H+r=TS6vv9^BR!k_n#YS0{5k(rIUXlkDZ4g3Px344UJ?hK~ z{C*NQciQ|$&7PhfcMp38L4B#Tr72ITQ|df<^!N8~XcJO-l{&M6q17=KKd})d*+)fj z$Or=VBCWVf$MpyZGsF#(QT2*^SJyg=tywuj#mi~P_4kZZEi@K~M4gp@=UbvYf%jk) zh(GzvcU5O+=hyfh!tidRRjXDF}g#IMdo4uq(5 ze70;AUA|oL{3XMkA5T~Bz99T{aPPZC+F->El@94dz+U8Bb)F0m!t=T;8Gfm=0m%Iy zHn(1^<#VijdM5MkwT0)wR{U(D-W@W6AiW6h-$-=#1VVWBAS7Trbv6Jh?gX1#55CAe zV}12n6=aJGaRvTLhFf?2TLysw`0ml7kxlMCLn@Z%9Hh6m_e<(*03_&kn_CZ#Q*Ska z9?Z|K(f~=vMe5BVL!c4fgtGISi@aKELt8g04Vlo~GMhy_pJBSQQ4(EmqEN=IY+-xw z`|8ahW1t~C&r+Txq%It*&f^6dEcc;Xg=%kaFY7^gzSMN*!B8qJ;mkC`wUP{cUcESE z49p)lra@h3E7t;fKO1-PA9twKN{jNSvphcd;DZfp?rbF7P=-8&6LhcFtLnuegP{C^ z45trO=ka0n>eZeG8|eCWRA+gJrrX?E+1q=XdaDbBb$wab7NSURsF&2?z4zW*ANlq` z&Qoa#Z{hE!`THe)=L@?&{`)B?ce6}{quy<@8@goCn7r|`p%uRYLL!uPhgMS> zD_5?pw6U>-6!tmltu7GG&9?9@oU2|^0rGWFXJ_Z$B0uy!C}a{p3u&Mx(~FOZy;39u z(tW0x4QU|4{ zJX3lqjlQ8EjUr{{c@3a)k~)tEMCdgUF55$e@IlTM7kHm~s~S{*b@Bg#5ner<&iM62 zS(wr&LVcw}YDqtu}V4P-T|4dA5(uZ3TW) zy;cSMdD`l#hg7Vk@Fuu>y}b&J#TJBP9iGNP;(nH%Ycmz6VIa#1q|Ng(Cn4$HSDi-> zBD4-=5VGuSFqKNK_w_w^U&O_0*RCC@-UES(cQF3q7_Q79u9Ir%Rit9#KhPp(#C!qy zlid;?0jPU2WVNL?Ps;5Qbs9a0a92|RAwo`7Cnb>2k2d!eC<^7f$Rp!w5`Hpn<4}%b zie2Eqy$Wumg^O%5UM-PDOd&PYHFvTP(3aLB#&^U)cFtM^5G}PXzR@H2UajT9DKbQ( zFiRG}q{5LQhY(*HDqY21MHGk%d8@@=(wwX!HVjCUr>!;0DBhhD6uR}xL3?|<^;0SD z9y8qrC2=hwfnrNb!jLh%m&NxaxeOWQ6yzSF6q;-~O_``A7aykALV69Lp4?$cV}Wm~ zvv|O;=@E+%Kc=^^8u8*?t-VMVIfI_>B=YF1C{5L?;s&Kvya7(60vtt{NAvfo@J3ke zNzD=>+XA?S7E$Iwnkrqb(W=hk0U3LlMF`>H>ZAnHvrxblzcj?aS1r%dNa-Q3^IPPT zo{9!Zu9FaDsc9ZYncSqoWg4;yhM~(MXVZf zEgfmP(iV0lk_YKA-B~5bFIh(LyltRB(s+S-i3bQah)Bz}8}saSQ3`eD`+YiUQt4i2 zsIt9^V+HQg(5sxG;?xZq1K)Go2IW4LVd_0Ipq|Njqd;b#64{eR#P^wk2x-Ogx6_j8 zz85k^Nt9zQ8S@``VFN(!$CF+Ke{uIJ*Qf}gKpH5*tZMB^8Zz~s35ewqV`1F{wWw~--Le*p@L z2zr&sZ$~1Iz!#>XP^rG4U-pnu#z8M%lA{X;sMq9x5XD9k-tNlfmUriJ9sK>XqUXM( z)xTK6qk?Zsn6gFwMbnLq_>-0Ov-yo}k{MR7!en}X4Kgwi&o|9@y+|J3qTW&m@=7*) z2HFWtxhx;ymCOE|E?ggA4$+1^hRX|dU!X4int%|Pb9qa_`R6l zb9pwN4BJOCO`Rr&T6-1Ju^_BrU?u2Q@Sw8IP;aRMHA#GuxehhawtDUVChwC2`O-Pe}8|&oK2u`wzj0vi=MY}g$?AYW?f{6 zdP^M0EjHK!-G)r#G%XDyiZUS7ehByni-L3@^smf>6iDJC zhte=Qai5`JbUJQF7oY9h0aKA^B%XtCi$kY)3$;Xy35OU?XmKR&R-cIp!CT zp-kwtrq$eQm zX*QV*ws!UOd`G>72O{4Z?F=G7J^Y(RLF8-J+wkFc-+i~C4J^y2-lDvyNXp_i^%glO z`=Hm;$<=g;lo9!HkVPJo(y)hbv7Ht~j($ddnva6`l|?~hnDx4xzff@+8sx)kX1>@+ zp3IA6{A@rfJY`?;E{!6}hQ&lc+Mb%5kMC)_B2H9qv4glh&vtZq7y_vabgk>5 zc|orN2$OHqi>%5kNO$*di=JPpqBS(g^WBTm?8nw>4s=xu6wvd+RU2_1enkuj;(y$f zr$Di1tj@v%0bA|o#>79tHsjf1ls5c?rVP?BQPJKo(q4&AL@^hU^XVvSHHP(GMUKQQ zz!SgcwtV^es?NdzlbLM@xR!e|!s1WqLFDVzFO27*T(g#Tkj`t2bXTMd%hYRVKshe9 z#pOkm`f~M}2$11PQzm7LItdSCPCZscWJP@z878N;WEW+vc5nX|n!U(tZEbDwnW0Yz z)edc-zS1C(PJ0asnA5k$6;946;|HK;uJUoI#S zJGj-J_LE*@HNPdj2;qdk$df{l&T8j>vX!T<6MYPk#8`t|>gl&_$mGKsL}H-cTF;o1 zCv((EIH2{Y*5peIL$V38XV0!U4wlTv-M4XH&Cu<=uI}#Qm2^q4jCC8zvbYW8)xO2) z4oWJ@EpoI}g9!}EeRKQLB$V2(nm% zzo1GY+fP>TTXHUhI8WB#8W!4`*JQAp$|95eGpY2x=NrgNIc;|?47wO-@&OGhQFti` z>HC2?sUNb@%od3!dwOd6?v2pWli0&7=O1uiaxR3-m@nHhG`NOEUtix2q_>`ZZ!%PV zg#41Vl|yNq_7?K@VWJfLiUQU;N0f3{D!XS@+(dya)*(D~=P`9sKM3puTO>B(_BmR) znm#XTPv!O1!Q@*czIZ((PyCnJ@NGoM7b-LDDPm#^gC@Kb1lD|SWf=%etbE%dv2m<= zs|gf*;4wCdw{3M)yKEF%c3!IMI+sx-A{vHjkp&@e#(p%SE9wGBZuZxb7f|r888`Metpuz>c z|00z8+K4aEHfj>T2)8nsEbB?AJo{;I4GlRfk~eN)q(5#-9Z6%)P2I4r`Xg(2Ta<_- zsQshs)Jt6;voE)VZKZB~IM(v+NAyM;XpjvJChgmkXYpyqh1Pv%;C*d z2{6zX4I(YO&%73pC^?;Ijl<;o@4x?P6hS_HK5V`dMbjV~9^{!UcWpi>P+9p-?tEK28`%W^u=~mx7R{@UAc* zl4`CzlTCx4Q?FG)S|fV`JU>een`c#MdC%qcha&~ZKn#qSD9f|BE5p= z%|*yurqmSnR3??tn3K#XXp{y?&mi+O7`Zi+xZ$NB)P<4iBpeW6&>ML2M6e6V@W4uf zpEJxbd^ihl6~kvD`CW^@P}XW3vH>pzk+mar5)PxyPIwP zedzlgo3LfSQkl6N;v26{92y*63c~Yn@B0u75Cpo&7MTxa4dtrN&d$AL?~p9)@%N^L zH5y({Wv%7B!7{=sxxn8GYL(EuVygui_Eski2Qk^tP_iiu>iK~>W*zyEKjGgWLuHmb z{>matfK~0I!M)h=dZoy}^dbvG?`Bg1D#f0XUgl`Y-Nc#_R8WxczsO0eM8!&UV;l)y zAU%?ce2bQjd#K=^>NdIv_Dr|=1RE|E*fL!1b&zi zS*)bcYhD2*vv!8&FmZ+q`P4~6fwT=Jzn+E*N%u)qiuLqW(|~lB-5AWXk{uYKgA9*z zzs~@P_wIT%pKwOOlD%bQ*mG$+#}F3Y{n*HKVR!U&df(V?ph^Qsv(1)*d;yIPGJd17 zdL2ZGia!kNzPOH#4jF!w^dwZGsf~P|y{D(=>!h(@A^u_h4tE_Og^&+Rq}8^2V2V14 z4l*nuqPVtK%hr)lw^S3}u2hnegH|ZbGxSgmYsOT}{*cDoi_-i3MphK&oz^SjNb|+& zBwA>OM{3BL#5_lj70Gr7h8uEOXvw`Bq-Sd6H=8C5^7LTR`tN%nySg5whuN3LAvI^o z!vJZsUKv5T$99inVgJ;1rVwF}%6hZx?$xLw0Tn}TJ~cNtP9a^Xy7)e9NFzZ0%G{** zFx*U(<-|sqkC8U3HGG~gpuvrQyAfKsKLUhhKwu69b%+KXImocGo{;!2)z=LTMgiNA zUh}SxWu*UB?Nu`O<%{x^BNH=?H04Q}u25(3Lo}0&6&qTCcjOv;1^*KWC-!aCdJd)d zE{RquPvWLC;{pxDm@bPQTgpSMFt+GtX;cy zMA~{6lzB^J^RyL4os4I4UMBSh1p}b0blLUSnJ28(1eH z)4#2+nhKMeSJGgS!)onLBFV;jy#p_%$%8p9xxN2 zz>9Y-znpZ>mLy335Gc2b1vXwz{>gcGxjgemD(!jvKc2tGQjz!O?~%IgXBdBPAzwn} zqX2olF&r$Fogwy?G^E?$?kl(%j^9zzu=2ND={%0%-m(0BG8Dy>-maq69pYMq@+Nvu zNkc&tf=nG4YEd}*>#L>(c`}GR8AED!8P%R1{N_;Sd(cSUH-S&txjZt@_vj zpe$mnZ%^{&3i4-mA)nGlWSkFoSFs(!1eM@ZlEIqM3tC!Qns%7w2N@2LM`CPa5=@K2 zJOqcThz?PJ3?8^NlWsb)Yn2-fy2D~G^6eBjiNB}9S`OP)O^J)S%Kk`JLPK@y%AgmjvNf z&iII-!L!AhjYj7X2gr0eiC8F%@NBs{1crPZkhLgTJeKV-{6AO}O}}gbN*_5mI23?#6z*Pk+ua=;OfbYcL=|MLK5}qyD1af>zM>!~O4Hxg)=p?PkiG40gq#_ UxA%qfF#rGn07*qoM6N<$g3f&iT>t<8 literal 0 HcmV?d00001 diff --git a/public/assets/images/the-tool-logo-top.png b/public/assets/images/the-tool-logo-top.png index a2d33a43381c9609c23cb082734c18a2f6c82e64..4a6cb311758d289cbcec88e7078cb98f73aac043 100644 GIT binary patch delta 2538 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 UxA%qfF#rGn07*qoM6N<$g3f&iT>t<8 diff --git a/public/cssbundler.php b/public/cssbundler.php new file mode 100644 index 000000000..1fcea1f65 --- /dev/null +++ b/public/cssbundler.php @@ -0,0 +1,53 @@ +add($file); + } else { + // Handle missing files gracefully + header("HTTP/1.1 404 Not Found"); + echo "/* File not found: $file */"; + exit; + } + } + + // Return the minified content + return $minifier->minify(); +} + +// Define the array of CSS files to be combined and minified +$cssFiles = [ + 'plugins/daterangepicker/daterangepicker.css', + 'assets/css/bootstrap.min.css', + 'assets/css/app.min.css', + 'plugins/notification/notify.min.css', + 'assets/css/thetool.css', + 'plugins/vue/tt-components/css/tt-table.css', + 'plugins/vue/tt-components/css/tt-tooltip.css', + 'plugins/vue/tt-components/css/tt-loader.css', + 'plugins/vue/tt-components/css/tt-file-gallery.css', + 'plugins/vue/tt-components/css/tt-position-manager.css', +]; + +// Output the combined and minified CSS +echo combineAndMinifyCSS($cssFiles); + +?> \ No newline at end of file diff --git a/public/plugins/vue/tt-components/css/tt-table.css b/public/plugins/vue/tt-components/css/tt-table.css index d52c9e9a9..8598c2012 100644 --- a/public/plugins/vue/tt-components/css/tt-table.css +++ b/public/plugins/vue/tt-components/css/tt-table.css @@ -13,7 +13,7 @@ right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.1); - background-image: url(data:image/gif;base64,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); + background-image: url(/assets/images/loader-big.gif); background-position: center; background-repeat: no-repeat; background-size: 50px 50px; diff --git a/public/plugins/vue/tt-components/tt-autocomplete.js b/public/plugins/vue/tt-components/tt-autocomplete.js index 291b77531..b77297973 100644 --- a/public/plugins/vue/tt-components/tt-autocomplete.js +++ b/public/plugins/vue/tt-components/tt-autocomplete.js @@ -1,211 +1,181 @@ -//TODO: if autocomplete is focus and the input has not a single character still show "Bitte mindestens 3 Zeichen eingeben" -//TODO: fix the fetchSuggestions function to not show a loading spinner when the input gets cleared -//TODO: fix so we can use arrow keys to navigate the suggestions -// TODO: Implement giving the option without the need of an API || need to use computed property to filter the items -// TODO: Fix the weirdness with timeout and selecting the suggestion - Vue.component('tt-autocomplete', { template: ` -
    + + +
    + + + + + +
    +
    + `, props: { - value: {type: [String, Number]}, - label: {type: String, required: false}, - apiUrl: String, - placeholder: {type: String, default: ''}, - items: {type: Array, default: () => []}, - sm: {type: Boolean, default: true}, - row: {type: Boolean, default: false}, - returnText: {type: Boolean, default: false}, - emitDisplayValue: {type: Boolean, default: false}, + value: {type: [String, Number]}, + label: {type: String, required: false}, + apiUrl: String, + placeholder: {type: String, default: ''}, + items: {type: Array, default: () => []}, + sm: {type: Boolean, default: true}, + row: {type: Boolean, default: false}, + returnText: {type: Boolean, default: false}, caseInsensitive: {type: Boolean, default: false}, - }, data() { + }, + data() { return { - window, - displayingItems: [], - oldDisplayValue: '', - displayValue: '', - isLoading: false, - showSuggestions: false, - cursor: -1, + displayValue: '', + displayingItems: [], + isLoading: false, + showSuggestions: false, fetchSuggestionsDebounceTimer: null, - disableIDFetch: false + disableValueWatcher: false, + cursor: -1, }; }, - async mounted() { - this.updateDisplayValue().then(); + watch: { + value: { + handler(newValue) { + if (this.disableValueWatcher) return; + this.updateDisplayValue(newValue); + }, + immediate: true + }, + apiUrl: { + handler: 'fetchSuggestions', + immediate: true + }, }, methods: { - setOldDisplayValue(newValue, oldValue) { - if (this.emitDisplayValue && newValue && typeof this.value !== 'number') { - this.$emit('displayValue', newValue); - } - this.oldDisplayValue = oldValue; - }, - async updateDisplayValue(newValue, oldValue) { - if (this.disableIDFetch) { - this.disableIDFetch = false; + async updateDisplayValue(id) { + if (!id) { + this.displayValue = ''; return; } - if (newValue) { - this.$emit('input', newValue); - this.value = newValue; - } - if (oldValue && !newValue) { - this.$emit('input', ''); - this.displayValue = ''; + if (this.returnText && isNaN(id)) { + this.displayValue = id; + return; } - - if (this.value && this.apiUrl) { - if (this.returnText && isNaN(this.value)) { - this.displayValue = this.value; - return; - } - const response = await axios.get(`${this.apiUrl}${this.apiUrl.includes('?') ? '&' : '?'}autocomplete=1&searchedID=${this.value}`); - this.displayValue = response.data[0].text; - } else if (this.value) { - const selectedItem = this.caseInsensitive ? - this.items.find(item => item.value.toLowerCase() === this.value.toLowerCase()) : this.items.find(item => item.value === this.value) - ; - this.displayValue = selectedItem ? selectedItem.text : this.displayValue; + if (this.apiUrl) { + const response = await axios.get(`${this.apiUrl}${this.apiUrl.includes('?') ? '&' : '?'}autocomplete=1&searchedID=${id}`); + if (response.data[0]) this.displayValue = response.data[0].text; } else { - if (this.returnText === false && !(typeof this.value === 'undefined' || this.value === '')) this.$emit('input', ''); - this.displayValue = this.displayValue.replace(this.oldDisplayValue, ''); + const selectedItem = this.items.find(item => + this.caseInsensitive ? String(item.value).toLowerCase() === String(id).toLowerCase() : item.value === id + ); + if (selectedItem) this.displayValue = selectedItem.text; } }, - onInput(event) { - this.displayValue = event.target.value; + onInput() { if (this.returnText) this.$emit('input', this.displayValue); this.fetchSuggestions(); - }, onFocus() { + }, + onFocus() { this.showSuggestions = true; - }, onBlur() { - setTimeout(() => { - this.showSuggestions = false; - }, 200); - }, fetchSuggestions() { - this.$set(this, 'displayingItems', []); - if (this.displayValue.length < 3) return; - - if (!this.apiUrl) { - - const isNegated = this.displayValue.startsWith('!'); - const substrings = (isNegated ? this.displayValue.slice(1) : this.displayValue).split(' ').map(s => s.toLowerCase()); - this.displayingItems = this.items.filter(item => { - let substringMatch = true; - for (var k = 0, klen = substrings.length; k < klen; ++k) { - if (!item.text.toLowerCase().includes(substrings[k])) { - substringMatch = false; - break; - } - } - return (isNegated && !substringMatch) || (!isNegated && substringMatch); - }) - - return + this.fetchSuggestions(); + }, + onBlur() { + setTimeout(() => this.showSuggestions = false, 200); + }, + fetchSuggestions() { + clearTimeout(this.fetchSuggestionsDebounceTimer); + if (this.displayValue.length < 3) { + this.displayingItems = []; + this.isLoading = false; + return; } - this.isLoading = true; - clearTimeout(this.fetchSuggestionsDebounceTimer); - this.fetchSuggestionsDebounceTimer = setTimeout(() => { - setTimeout(async () => { - if (this.displayValue.length < 3) { - this.displayingItems = []; - this.isLoading = false; - return; - } + this.isLoading = true; + this.cursor = -1; - const response = await axios.get(`${this.apiUrl}${this.apiUrl.includes('?') ? '&' : '?'}autocomplete=1&q=${encodeURIComponent(this.displayValue)}`); - if (response.data?.status === 'error') { - this.displayingItems = []; - } else { - this.displayingItems = response.data - if (response.data.length === 1 && response.data[0].text === this.displayValue) this.selectSuggestion(response.data[0]); - } + if (!this.apiUrl) { + const searchTerms = this.displayValue.toLowerCase().split(' ').filter(s => s); + this.displayingItems = this.items.filter(item => { + const itemText = item.text.toLowerCase(); + return searchTerms.every(term => itemText.includes(term)); + }); this.isLoading = false; + return; + } - this.fetchSuggestionsDebounceTimer = null; - }, 100); - }, 300); // Adjust the 300ms debounce time as needed - }, selectSuggestion(item) { - this.disableIDFetch = true; - this.$emit('input', item.value); + axios.get(`${this.apiUrl}${this.apiUrl.includes('?') ? '&' : '?'}autocomplete=1&q=${encodeURIComponent(this.displayValue)}`) + .then(response => { + this.displayingItems = response.data?.status === 'error' ? [] : response.data; + if (this.displayingItems.length === 1 && this.displayingItems[0].text === this.displayValue) { + this.selectSuggestion(this.displayingItems[0]); + } + }) + .finally(() => this.isLoading = false); + }, 300); + }, + selectSuggestion(item) { + this.disableValueWatcher = true; this.displayValue = item.text; + this.$emit('input', item.value); this.showSuggestions = false; - }, clear() { + this.$nextTick(() => this.disableValueWatcher = false); + }, + selectOnEnter() { + if (this.cursor >= 0 && this.displayingItems[this.cursor]) + this.selectSuggestion(this.displayingItems[this.cursor]); + }, + navigate(direction) { + const itemCount = this.displayingItems.slice(0, 10).length; + if (!itemCount) return; + this.cursor = (this.cursor + direction + itemCount) % itemCount; + }, + clear() { this.displayValue = ''; this.$emit('input', ''); + this.displayingItems = []; } - }, - watch: { - displayValue: {handler: 'setOldDisplayValue', immediate: true}, - value: {handler: 'updateDisplayValue', immediate: true}, - apiUrl: {handler: 'fetchSuggestions', immediate: true}, } -}); +}); \ No newline at end of file diff --git a/public/plugins/vue/tt-components/tt-button.js b/public/plugins/vue/tt-components/tt-button.js index c88220236..a3e15848b 100644 --- a/public/plugins/vue/tt-components/tt-button.js +++ b/public/plugins/vue/tt-components/tt-button.js @@ -1,25 +1,18 @@ -// noinspection JSCheckFunctionSignatures Vue.component('tt-button', { //language=Vue template: ` - - - - - + + + + `, props: { sm: {type: Boolean, default: false}, @@ -32,26 +25,20 @@ Vue.component('tt-button', { }, computed: { buttonClasses() { - const classes = { - 'btn-sm': this.sm, - 'btn-loading': this.loading - } - - if (this.additionalClass) { - this.additionalClass.split(' ').forEach(className => { - classes[className] = true - }) - } - - return classes + const classes = []; + if (this.sm) classes.push('btn-sm'); + if (this.loading) classes.push('btn-loading'); + if (this.additionalClass) classes.push(...this.additionalClass.split(' ')); + return classes; } }, methods: { handleClick(event) { - if (this.loading) return event.preventDefault(); - if (typeof this.confirmText === 'string' && !confirm(this.confirmText)) return event.preventDefault(); - - this.$emit('click', event) + if (this.loading || (this.confirmText && !confirm(this.confirmText))) { + event.preventDefault(); + return; + } + this.$emit('click', event); } } -}) +}); \ No newline at end of file diff --git a/public/plugins/vue/tt-components/tt-datepicker.js b/public/plugins/vue/tt-components/tt-datepicker.js index 1feafd0b4..736af899a 100644 --- a/public/plugins/vue/tt-components/tt-datepicker.js +++ b/public/plugins/vue/tt-components/tt-datepicker.js @@ -12,141 +12,111 @@ Vue.component('tt-date-picker', { dateRange: { type: Boolean, default: true }, }, template: ` -
    - - - - {{ hint }} -
    - `, +
    + + + + {{ hint }} +
    + `, data() { return { - inputValue: '', isInitialized: false, moment: window.moment, locale: { - // ... (keep your existing locale object) + format: 'DD.MM.YYYY HH:mm', + separator: ' - ', + applyLabel: 'Übernehmen', + cancelLabel: 'Abbrechen', + fromLabel: 'Von', + toLabel: 'Bis', + customRangeLabel: 'Benutzerdef.', + weekLabel: 'W', + daysOfWeek: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'], + monthNames: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'], + firstDay: 1 }, } }, - mounted() { - this.isInitialized = true; - const datePickerOptions = { - autoUpdateInput: true, + async mounted() { + const loadScript = (src, check) => new Promise((resolve, reject) => { + if (check()) return resolve(); + const script = document.createElement('script'); + script.src = src; + script.onload = resolve; + script.onerror = () => reject(new Error(`Failed to load script: ${src}`)); + document.head.appendChild(script); + }); + + await loadScript('/js/jquery.min.js', () => typeof jQuery !== 'undefined'); + await loadScript('/plugins/daterangepicker/daterangepicker.js', () => typeof $?.fn?.daterangepicker !== 'undefined'); + + const pickerOptions = { + autoUpdateInput: false, singleDatePicker: !this.dateRange, timePicker: true, timePicker24Hour: true, locale: this.locale, + startDate: this.dateRange ? (this.value?.from ? this.moment.unix(this.value.from) : this.moment()) : (this.value ? this.moment.unix(this.value) : this.moment()), + endDate: this.dateRange ? (this.value?.to ? this.moment.unix(this.value.to) : this.moment()) : (this.value ? this.moment.unix(this.value) : this.moment()), }; - if (this.dateRange) { - datePickerOptions.startDate = this.value?.from ? this.moment.unix(this.value.from) : undefined; - datePickerOptions.endDate = this.value?.to ? this.moment.unix(this.value.to) : undefined; - } else { - datePickerOptions.startDate = this.value ? this.moment.unix(this.value) : undefined; - } + const $input = $(this.$refs.input); + $input.daterangepicker(pickerOptions); + this.updateInputValue(this.value); - $(this.$refs.input).daterangepicker(datePickerOptions); - - const _this = this; - $(this.$refs.input).on('apply.daterangepicker', function (ev, picker) { - if (_this.dateRange) { - _this.$emit('input', { - from: picker.startDate.unix(), - to: picker.endDate.unix() - }); - $(_this.$refs.input).val(picker.startDate.format(_this.locale.format) + _this.locale.separator + picker.endDate.format(_this.locale.format)); - } else { - _this.$emit('input', picker.startDate.unix()); - $(_this.$refs.input).val(picker.startDate.format(_this.locale.format)); - } + $input.on('apply.daterangepicker', (ev, picker) => { + const val = this.dateRange + ? { from: picker.startDate.unix(), to: picker.endDate.unix() } + : picker.startDate.unix(); + this.$emit('input', val); + this.updateInputValue(val); }); - function checkIfAppliedElseClear() { - if (_this.dateRange) { - if (_this.value && _this.value.from && _this.value.to) return; - } else { - if (_this.value) return; - } - $(_this.$refs.input).val(''); - } + $input.on('cancel.daterangepicker', () => { + this.$emit('input', undefined); + this.updateInputValue(undefined); + }); - function clearIfCancelled() { - _this.$emit('input', _this.dateRange ? {from: null, to: null} : null); - $(_this.$refs.input).val(''); - } - - $(this.$refs.input).on('cancel.daterangepicker', clearIfCancelled); - $(this.$refs.input).on('hide.daterangepicker', checkIfAppliedElseClear.bind(this)); - - // Clear input field if value is not set - if (_this.dateRange) { - if (!this.value || this.value.from === null || this.value.to === null) { - $(_this.$refs.input).val(''); - } - } else { - if (!this.value) { - $(_this.$refs.input).val(''); - } - } - - // Add click event listener to the document - document.addEventListener('click', this.handleOutsideClick); + this.isInitialized = true; }, methods: { - handleOutsideClick(event) { - const datepicker = document.querySelector('.daterangepicker'); - const input = this.$refs.input; - - if (datepicker && !datepicker.contains(event.target) && event.target !== input) { - if (input.parentElement.tagName.toLowerCase() === 'div' && input.parentElement.classList.contains('form-group')) { - return; - } - $(this.$refs.input).data('daterangepicker').hide(); + updateInputValue(val) { + const $input = $(this.$refs.input); + if (this.dateRange) { + if (val?.from && val?.to) { + const from = this.moment.unix(val.from).format(this.locale.format); + const to = this.moment.unix(val.to).format(this.locale.format); + $input.val(from + this.locale.separator + to); + } else $input.val(''); + } else { + if (val) $input.val(this.moment.unix(val).format(this.locale.format)); + else $input.val(''); } }, - setStartDate(date) { - $(this.$refs.input).data('daterangepicker').setStartDate(date); - } + setStartDate: (date) => $(this.$refs.input).data('daterangepicker').setStartDate(date) }, watch: { - value: function (newVal) { + value(newVal) { if (!this.isInitialized) return; + this.updateInputValue(newVal); + const datePicker = $(this.$refs.input).data('daterangepicker'); if (this.dateRange) { - if (!newVal || newVal.from === null || newVal.to === null) { - $(this.$refs.input).val(''); - } else { - datePicker.setStartDate(this.moment.unix(newVal.from)); - datePicker.setEndDate(this.moment.unix(newVal.to)); - } + datePicker.setStartDate(newVal?.from ? this.moment.unix(newVal.from) : this.moment()); + datePicker.setEndDate(newVal?.to ? this.moment.unix(newVal.to) : this.moment()); } else { - if (!newVal) { - $(this.$refs.input).val(''); - } else { - datePicker.setStartDate(this.moment.unix(newVal)); - datePicker.setEndDate(this.moment.unix(newVal)); - } + const date = newVal ? this.moment.unix(newVal) : this.moment(); + datePicker.setStartDate(date); + datePicker.setEndDate(date); } } }, beforeDestroy() { - $(this.$refs.input).off('apply.daterangepicker'); - document.removeEventListener('click', this.handleOutsideClick); + const picker = $(this.$refs.input).data('daterangepicker'); + if (picker) picker.remove(); }, -}) +}); \ No newline at end of file diff --git a/public/plugins/vue/tt-components/tt-table.js b/public/plugins/vue/tt-components/tt-table.js index 40ee7d451..ecfede3fe 100644 --- a/public/plugins/vue/tt-components/tt-table.js +++ b/public/plugins/vue/tt-components/tt-table.js @@ -201,9 +201,9 @@ Vue.component('tt-table', { .isValid() ? moment.unix(row[key]).format('DD.MM.YYYY HH:mm') : moment(row[key]) .format('DD.MM.YYYY HH:mm')) : '' }} - - - + {{ autoCompleteData[key] && autoCompleteData[key][row[key]] ? autoCompleteData[key][row[key]]['title'] : row[key] }} @@ -236,9 +236,9 @@ Vue.component('tt-table', { }} {{ columns[key].filterOptions.find(option => option.value.toString() === row[key].toString())?.text }} {{ window.moment(row[key] * 1000).format('DD.MM.YYYY HH:mm:ss') }} - - - + {{ autoCompleteData[key] && autoCompleteData[key][row[key]] ? autoCompleteData[key][row[key]]['title'] : row[key] }} From 79acacb27401582ed3cff88dc6a47d4282e030c6 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Mon, 4 Aug 2025 12:19:49 +0200 Subject: [PATCH 10/33] improved performance of vue modules --- public/bundler.php | 1 - 1 file changed, 1 deletion(-) diff --git a/public/bundler.php b/public/bundler.php index ba195ce24..081e7c041 100644 --- a/public/bundler.php +++ b/public/bundler.php @@ -29,7 +29,6 @@ $jsFiles = [ "plugins/axios/axios.min.js", "plugins/axios/axios.inject.js", "plugins/moment/moment.min.js", - "plugins/daterangepicker/daterangepicker.js", "plugins/vue/" . (isset($_GET['VUE_DEBUG']) || $_SERVER['HTTP_HOST'] === "localhost" ? "vue.js" : "vue.min.js"), "plugins/vue/tt-components/tt-button.js", "plugins/vue/tt-components/tt-card.js", From 03258bb1a90e1b03c340e67cb8f2aeb686d3ccf6 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Mon, 4 Aug 2025 12:23:33 +0200 Subject: [PATCH 11/33] improved performance of vue modules --- Layout/default/footer.php | 4 +-- Layout/default/vueHeader.php | 2 +- .../WarehouseShippingNoteController.php | 3 -- public/index.php | 35 ++++++++++++------- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/Layout/default/footer.php b/Layout/default/footer.php index 1ccb6c055..d937f845c 100644 --- a/Layout/default/footer.php +++ b/Layout/default/footer.php @@ -15,10 +15,8 @@ - - is("employee")): ?> - + - + diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteController.php b/application/WarehouseShippingNote/WarehouseShippingNoteController.php index 19009f358..c95cd762b 100644 --- a/application/WarehouseShippingNote/WarehouseShippingNoteController.php +++ b/application/WarehouseShippingNote/WarehouseShippingNoteController.php @@ -28,10 +28,7 @@ class WarehouseShippingNoteController extends TTCrud { ['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],]; protected array $defaultOrder = ['key' => 'create', 'order' => 'DESC']; - protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true]; - protected array $additionalHead = ['']; - protected array $infoMessages = ['create' => 'Lieferschein wurde erstellt.', 'update' => 'Lieferschein wurde aktualisiert', 'delete' => 'Lieferschein wurde gelöscht', diff --git a/public/index.php b/public/index.php index 2a565f805..2d0040714 100755 --- a/public/index.php +++ b/public/index.php @@ -4,18 +4,27 @@ */ // phpinfo(); exit; define('mfUI',"web"); +// set max mem to 4GB +ini_set('memory_limit', '4096M'); + +//display errors +ini_set('display_errors', 1); +ini_set('display_startup_errors', 1); +ini_set('html_errors', 1); + + if(file_exists("../config/config.php")) { - require("../config/config.php"); + require("../config/config.php"); } else { - die("CANNOT FIND CONFIGFILE!\n\nThis is a serious error. You should not run your mvcfronk application without a configfile. Not proceeding."); + die("CANNOT FIND CONFIGFILE!\n\nThis is a serious error. You should not run your mvcfronk application without a configfile. Not proceeding."); } if(defined('MFLOCALE_TIME')) { - setlocale(LC_TIME, MFLOCALE_TIME); + setlocale(LC_TIME, MFLOCALE_TIME); } if(defined('MFLOCALE_MONETARY')) { - setlocale(LC_MONETARY, MFLOCALE_MONETARY); + setlocale(LC_MONETARY, MFLOCALE_MONETARY); } /* disabled because of issues with saving float values to mysql if(defined('MFLOCALE_NUMERIC')) { @@ -36,14 +45,14 @@ $app=new mfRouter($request); if(defined("MFVALUECACHE_DEBUG") && MFVALUECACHE_DEBUG) { - $i = 0; - $cache = mfValuecache::singleton()->getCache(); - echo "
    \n";
    -    echo "mfValuecache keys total: ".count($cache)."\n";
    -    foreach($cache as $key => $value) {
    -        echo "\t$i => $key (". gettype($value).")\n";
    -        $i++;
    -    }
    +  $i = 0;
    +  $cache = mfValuecache::singleton()->getCache();
    +  echo "
    \n";
    +  echo "mfValuecache keys total: ".count($cache)."\n";
    +  foreach($cache as $key => $value) {
    +    echo "\t$i => $key (". gettype($value).")\n";
    +    $i++;
    +  }
     
    -    echo "
    "; + echo "
    "; } From ea0a463ec36d5d8a89c84b78e68b6819373631a7 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Mon, 4 Aug 2025 10:24:34 +0000 Subject: [PATCH 12/33] reverted index.php --- public/index.php | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/public/index.php b/public/index.php index 2d0040714..2a565f805 100755 --- a/public/index.php +++ b/public/index.php @@ -4,27 +4,18 @@ */ // phpinfo(); exit; define('mfUI',"web"); -// set max mem to 4GB -ini_set('memory_limit', '4096M'); - -//display errors -ini_set('display_errors', 1); -ini_set('display_startup_errors', 1); -ini_set('html_errors', 1); - - if(file_exists("../config/config.php")) { - require("../config/config.php"); + require("../config/config.php"); } else { - die("CANNOT FIND CONFIGFILE!\n\nThis is a serious error. You should not run your mvcfronk application without a configfile. Not proceeding."); + die("CANNOT FIND CONFIGFILE!\n\nThis is a serious error. You should not run your mvcfronk application without a configfile. Not proceeding."); } if(defined('MFLOCALE_TIME')) { - setlocale(LC_TIME, MFLOCALE_TIME); + setlocale(LC_TIME, MFLOCALE_TIME); } if(defined('MFLOCALE_MONETARY')) { - setlocale(LC_MONETARY, MFLOCALE_MONETARY); + setlocale(LC_MONETARY, MFLOCALE_MONETARY); } /* disabled because of issues with saving float values to mysql if(defined('MFLOCALE_NUMERIC')) { @@ -45,14 +36,14 @@ $app=new mfRouter($request); if(defined("MFVALUECACHE_DEBUG") && MFVALUECACHE_DEBUG) { - $i = 0; - $cache = mfValuecache::singleton()->getCache(); - echo "
    \n";
    -  echo "mfValuecache keys total: ".count($cache)."\n";
    -  foreach($cache as $key => $value) {
    -    echo "\t$i => $key (". gettype($value).")\n";
    -    $i++;
    -  }
    +    $i = 0;
    +    $cache = mfValuecache::singleton()->getCache();
    +    echo "
    \n";
    +    echo "mfValuecache keys total: ".count($cache)."\n";
    +    foreach($cache as $key => $value) {
    +        echo "\t$i => $key (". gettype($value).")\n";
    +        $i++;
    +    }
     
    -  echo "
    "; + echo "
    "; } From 738f34f6675fcb4df81b00ed35db7ff24e864be2 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Mon, 4 Aug 2025 10:26:05 +0000 Subject: [PATCH 13/33] added baseurl variable to vueHeader.php --- Layout/default/vueHeader.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Layout/default/vueHeader.php b/Layout/default/vueHeader.php index 8884920e1..1e39cf6cb 100644 --- a/Layout/default/vueHeader.php +++ b/Layout/default/vueHeader.php @@ -31,6 +31,7 @@ endif; ?> + + + + + + +
    + + + + + \ No newline at end of file diff --git a/Layout/default/footer.php b/Layout/default/footer.php index d937f845c..730bee028 100644 --- a/Layout/default/footer.php +++ b/Layout/default/footer.php @@ -15,7 +15,7 @@ - is("employee")): ?> + is("employee") && !isset($_SESSION[MFAPPNAME . '_warehouse_login_override'])): ?> diff --git a/application/Address/AddressController.php b/application/Address/AddressController.php index cec2e41c0..655c708e1 100644 --- a/application/Address/AddressController.php +++ b/application/Address/AddressController.php @@ -4,13 +4,36 @@ class AddressController extends mfBaseController { private $filter; protected function init() { - $this->needlogin = true; - $me = new User(); - $me->loadMe(); - $this->me = $me; - $this->layout()->set("me", $me); + $user = null; + $overrideKey = MFAPPNAME . '_warehouse_login_override'; + $timestampKey = MFAPPNAME . '_warehouse_login_override_timestamp'; - if (!$me->is(["Admin", "salespartner"])) { + $overrideId = $_SESSION[$overrideKey] ?? null; + $timestamp = $_SESSION[$timestampKey] ?? null; + + if (is_numeric($overrideId) && $timestamp && (time() - $timestamp) < 600) { + $potentialUser = new User($overrideId); + if ($potentialUser->id && $potentialUser->address_id == 1) { + $user = $potentialUser; + } else { + unset($_SESSION[$overrideKey], $_SESSION[$timestampKey]); + $this->redirect('WarehouseShippingNote'); + return; + } + } elseif ($overrideId) { + unset($_SESSION[$overrideKey], $_SESSION[$timestampKey]); + } + + if (!$user) { + $this->needlogin = true; + $user = new User(); + $user->loadMe(); + } + + $this->me = $user; + $this->layout()->set("me", $this->me); + + if (!$this->me->is(["Admin", "salespartner"])) { $this->redirect("Dashboard"); } } diff --git a/application/User/UserModel.php b/application/User/UserModel.php index fe408da62..c170185f8 100644 --- a/application/User/UserModel.php +++ b/application/User/UserModel.php @@ -125,6 +125,8 @@ class UserModel $where .= " AND WorkerPermission.employee = 'true'"; } } + if (isset($filter['active'])) + $where .= " AND Worker.active = " . (int)$filter['active']; //var_dump($filter, $where);exit; return $where; diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteController.php b/application/WarehouseShippingNote/WarehouseShippingNoteController.php index c95cd762b..8f9e179fe 100644 --- a/application/WarehouseShippingNote/WarehouseShippingNoteController.php +++ b/application/WarehouseShippingNote/WarehouseShippingNoteController.php @@ -28,7 +28,7 @@ class WarehouseShippingNoteController extends TTCrud { ['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],]; protected array $defaultOrder = ['key' => 'create', 'order' => 'DESC']; - protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true]; + protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true, 'HIDE_MENU' => false]; protected array $infoMessages = ['create' => 'Lieferschein wurde erstellt.', 'update' => 'Lieferschein wurde aktualisiert', 'delete' => 'Lieferschein wurde gelöscht', @@ -37,6 +37,7 @@ class WarehouseShippingNoteController extends TTCrud { protected function prepareCrudConfig() { if (!$this->user->can('WarehouseAdmin')) $this->additionalJSVariables['WAREHOUSE_ADMIN'] = false; + if (isset($_SESSION[MFAPPNAME . '_warehouse_login_override']) && is_numeric($_SESSION[MFAPPNAME . '_warehouse_login_override'])) $this->additionalJSVariables['HIDE_MENU'] = true; } protected function beforeCreate($postData): bool { diff --git a/lib/TTCrud/TTCrud.php b/lib/TTCrud/TTCrud.php index 35e84ba11..d0cb5077d 100644 --- a/lib/TTCrud/TTCrud.php +++ b/lib/TTCrud/TTCrud.php @@ -27,21 +27,26 @@ class TTCrud extends mfBaseController { } protected function init() { - $this->needlogin = true; - $me = new User(); - $me->loadMe(); - $this->user = $me; - $this->layout()->set('me', $me); + $className = get_class($this); - if (isset($this->permissionCheck) && !$me->can($this->permissionCheck)) { - $this->redirect("Dashboard"); - } else if (!$me->can($this->permissionCheck) && !$me->is(["Admin"])) { - $this->redirect("Dashboard"); + if (defined('TT_WAREHOUSE_LOGIN_OVERRIDE') && is_array(TT_WAREHOUSE_LOGIN_OVERRIDE) + && in_array($className, TT_WAREHOUSE_LOGIN_OVERRIDE) && !mfLoginController::isLoggedIn()) + $this->user = $this->loginOverride(); + else { + $this->needlogin = true; + $this->user = new User(); + $this->user->loadMe(); } + $this->layout()->set('me', $this->user); - $c = get_class($this); - foreach ([str_replace('Controller', 'Model', $c), str_replace('Controller', '', $c)] as $m) - if (class_exists($m)) { + if (method_exists($this, 'permissionsCheckOverride')) + $this->permissionsCheckOverride(); + else if (!$this->user->is(["Admin"])) + $this->redirect("Dashboard"); + + + foreach ([str_replace('Controller', 'Model', $className), str_replace('Controller', '', $className)] as $m) { + if (class_exists($m)) $this->model = new $m(); break; } @@ -52,6 +57,37 @@ class TTCrud extends mfBaseController { if (method_exists($this, 'afterInit')) $this->afterInit(); } + protected function loginOverride() { + $allowedIPs = ['193.105.204.200', '91.227.230.253', '193.105.204.195', '172.18.0.1']; + if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) $this->redirect('Dashboard'); + + if (isset($_POST['wantedUserId']) && is_numeric($_POST['wantedUserId'])) { + $user = new User($_POST['wantedUserId']); + if ($user->id && $user->address_id == 1) { + $_SESSION[MFAPPNAME . '_warehouse_login_override'] = $user->id; + $_SESSION[MFAPPNAME . '_warehouse_login_override_timestamp'] = time(); + $this->redirect('WarehouseShippingNote'); + } + $this->redirect('Dashboard'); + } + + $sessionUserId = $_SESSION[MFAPPNAME . '_warehouse_login_override'] ?? null; + $sessionTimestamp = $_SESSION[MFAPPNAME . '_warehouse_login_override_timestamp'] ?? 0; + + if (is_numeric($sessionUserId) && (time() - $sessionTimestamp <= 300)) { + $user = new User($sessionUserId); + if ($user->id && $user->address_id == 1) return $user; + $this->redirect('WarehouseShippingNote'); + } + + $users = UserModel::search(['employee' => true, 'active' => true]); + $userOptions = array_map(fn($user) => ['value' => (int)$user->id, 'text' => $user->name], $users); + + $this->layout()->set('userOptions', $userOptions); + $this->layout()->setTemplate("VueViews/WarehouseLoginOverride"); + echo $this->layout()->render(); + exit; + } /** * Returns the checkArray for the CRUD component. * @return array diff --git a/lib/mvcfronk/mfLogin/mfLoginController.php b/lib/mvcfronk/mfLogin/mfLoginController.php index 0813cc6e1..350821302 100644 --- a/lib/mvcfronk/mfLogin/mfLoginController.php +++ b/lib/mvcfronk/mfLogin/mfLoginController.php @@ -128,7 +128,7 @@ class mfLoginController extends mfBaseController UserToken::checkToken(); - if ($_SESSION[MFAPPNAME . '_username'] && $_SESSION[MFAPPNAME . '_ip']) { + if (isset($_SESSION[MFAPPNAME . '_username']) && $_SESSION[MFAPPNAME . '_username'] && $_SESSION[MFAPPNAME . '_ip']) { $username = $_SESSION[MFAPPNAME . '_username']; $ip = $_SERVER['REMOTE_ADDR']; $sid = session_id(); diff --git a/public/assets/images/xinon-sm-192.png b/public/assets/images/xinon-sm-192.png new file mode 100644 index 0000000000000000000000000000000000000000..70805c62eb8c345c8759358ab3eb8dc7f07d4404 GIT binary patch literal 24406 zcmcFqWltT>)4dm$i^C6hcXxM};_mKFfs4Dl7I!O@;_mM5?oeEc^Ys5Ao)@!|NjBNd zBy)B%b54|sk~9(m9s&RWK$4Y_Q2pn7|7UP8|5nvad)R*t=%y+y2B@7TIQthsS&1r& z0s!?1i0>xQ|6+J&867tO0D16#227(z#s>flFJvV|)xR5Fc11KeXn9=mdh+pZ`Z^|~ z$_4_^pwUISAb@1q){w_-f0$M-{I@g=KDZx*=QOr7wytWgp4>KuGjkeH#b6|)(q)oG z&W?Ru*DHH=xR3d)F4nc@HCj*3YwBlo?WS2r2-yA1rdd~Xee;J^FgceRl`C~>|2gJL zuE6Xk&LtR?h3>L-fbIHUx6Ub+JdIl&v-26A^u zV!9i;%POolQ%0(fPK@k~)QOK|D$(VfvoteLOv^}xflTNY<$%{aQF)YYLwj5%#j4Wg zH@)&eix4K*YHN|6>}27~)r^+;vd(3~s(LN0dOM$YRd4`PWtR*6SO3h6woz_cadm$2 zt77n!Ox|t$50x~clQ|6o+dAi|ox1qhVCv7ixO2ual;Y$@aw)?_4e-JM8A<|QK08%@ zdn{%an2@Q3LWMbaw?G4-Ve+sxmVWM=^ReJu?$?DiQ7aYF?%?eKYs>r0obKz%se3>X zk-kP@@)hkWc120S8bLxghxtikZ#e=WRdFQZ++*B^Ll-YLh)&dIKQ*1^$6+Lfj0k(H z;;pAhoPQJzWdkktvGJ}N?8P^tTU9hG8@wlqVsu?KG>n1`kzKn6D{?g#oe? zw>3WM#KRJNt!3X*$7o^0GY4WL(qtlC0cX7pr4Xhn$gf}zzf@S>yTmlii$dYbMv+lg0W|Ac?dccGQKl;hwQ}8~JoXEV-Qg0b30Rt{!%iP2Ak3z;I~N*vhc;UeDm}P5zM7#mk%> zGn^}WUJgOb@L;_)fuB<&au+qsloh?S)_5w0eHv$2I7cPwIJB+SLaxMt4G8+8z)Xb6 zn8~5oH4qyYIlFy(M-rWNzhQ zlMgx82cc|Yx*XP-@;sTERMm-B16TVoipXj7kw!HN3v{tW)he|#a}wwV?TsOW&i?R` z)BJ-H&+_Rb5YA5l3wj+m9c+8;9rW%bIRVbRwj7l*CCnpo=z+#nCfmyk+pd-PTOVHA_~>9Ed|*9a%!JL7b3STxtZH{s;q zxSokmzY}>puXPA3NJ1JHHh3D-Z7FY26yjl0MC-7a=3e`tQj8;+#W~mzI8W~%9N8Uq z0$gmeQ3p;d;E!(IwW+%wf6=dj$0ao?i=_oa_zvR>6FBTvMxI4`YT;Cy zxr)W#KBCFa#~+G^wr~`Gi!~YRoR1%t9ZE@GDZhz;$`79i-q~?`BM!fWix0O-gYzi3 zPzbi3($;CelDJ@>KNAV&`M?+uJ-ye zqH1H=ca8IFLkybN;VB%d7Qa_d2}sys{f(BZaZgO`FSJ;jK8m#s$36o43X8M-p13%R z7MAjkAE-I+1HL)Vxcr?`VfTOH4kv+B(Y8_+x`OaX4YJHS7fV+blpE0QN}#%=32qxh(4XdsvI=P)-|?Z})})@J*p z$uEbYzSL&T4GA3CKb2gIUP2Gx9Oy^R zQ=+#27Dp8#DG)c(KW+4q$}3-}91*jp3+0<_(0m<#b~QC8>?NNg&=lF5M;*9{;iLNz zQPg(#GqNE+Ui+ zS;$2Yn2%Oz4xsj0hvNSILs;blk4sI7Th8Nmu}deKH|js+t|tzi;zRKfQ^gUIsEU-itpH zDHKA?7KxJRrKO(Vl6q=QY=@eiB6~9Y;^Xs&~r55CU>v)kgjObtc z4(&HPhg-(KnKb(26waNE#|CtqEv-o}V`H8(YD|0B_#3+*g3BLwpkXI+?aG05yN6hI z;f1|#h-#(;tI{!U%9ryV@j1rTm&^aCj7Ich`{{g`9K}&)7s6ccRPdGYt?UdRJ9HOP z$(7!({MwzQ$p0R6;XdX=kfav$djHIa#bu1SORr*QA}pK20Jkb{C#8< zj541Oum)g}(2=4KTgDG<#W2V89Zpz4&8Ql*R?6A%wQi8jou}i2y)b3L)-(`RCH#5H zN^5j6!!oI`1{|O~WXr3?Fp%sG;r$45%J(PgLIP3DQpXbw=7%BTR5O|ttB+dinr$Mt zxQ?Qht}4ZP=)ah8coYqWb{}tOR-d${M;*2yfdJ1;j>T($6C4kSB1mfL@R-sV@V6U< zi5I-zjJ|P`NlUqr42aN{%OD-gbS<+$A;H%6*1h4(I%ae_OjY)Cn9(}JL3ry;*N-c+ z+_7{=WcJ|FFxqq*SI&@i=@>u7RQ9l|RB%sn9Jmh>bx0V*)zu_k&w4D%2Z8m4o4i*~ zs)9#`k3PC-n#*ewb{scxX25e7X0`%vjr|YS#99)<0nUlsJS)nBj!w zRKoCwq*+7NX^dhy6B?`UQpzwv8;Cw5TOmj#@qZnr!Pkt=vA!1q zf!cu*z}UdJ2@#mWqqe5kVw}7exkhZKsO{lO)w`kcxjvKmEp5T_sSe8z$<4ftr5!t& zww@o1uPmY$um-k8L173-PWwcdzgBah%v)(G=%*`iv>}5Oytl0A8lzlR(+a57s4Sps z+2%~ZPyhjxESbM_qAeNkAk*pXz~;&AXe&Y;TvaJ*KkfQCNkZB3PKKVfL{ZitIc`VQ zI~r+fKmzIYq85h`)<@PwaloN?_KQ=rRo9IN>l~@5Bo0cd&RxEA!J&zJ_v{?G8|!^+ z%dqJ|+_{72oI4zBT(KyJLI7Q;92KjGI?C=j-Quwua7w@AJoOFYmNOCgEkS9N?{JI4 zJT*V24xu0dELZ#jilRbKE8dj*E3I|q5TS*0$QnFko%d$@FzwGt6^>##VqjjBx3nvA z@xzsL+K)aQ<=u%b*r|H@TrcnLE-~Q@>(?Eop(uXf`el}0oQ=)+aUY7w%;q|%c`;!V zzx=1-*=gfO$C&~{Hc9sUjGC{{m|22AyWdJkng|oN&uB5d^2d*TH0sUdZ_Op#`9mrw z;W8IVRt&MJ;ugQpNyJ_bu^TEa$VPAo5@D2K9l~au<@3@;+BP;vK0hzwQO8s zO9%WzmYt^`2fWO~mxWidiyvTxgk-9fBs84DacU0>2`lCN*t61}gxfS_Tg_zUb)#>N z4m>`pLWylJmHA9;u|UG%Q@HOpr{`4&A~~WZ+T7a#t=~XQs_L)?Y_;oEfmX^CL8(^SGe;fR%N{xA}c4nKCOcP*5tjZ@m!YA*M z)cL!x-i<5fzwY=!EQ>10;s3~v4KY62xQEC3kX&BU>Y`bvux4MLKg1tkkqS(;(#(%= z?Fkc}&JrXKCU+u9$#>JujNXEY*cn_o3>%n5Ev)|Yj9`_ilxpPXaqn7lWN1KT=LYe? zw&{0|{$P(T!K_R-llaXZmCWR4%L6DR5XLf3>;Hp?KTi79=GJBz(;`Xm;%u*Ih|k^t zn@d=70d2-fhc&-Vo<#Vx{5tNj!$ou$%sPpRp z=@HnKSWT9j{2MUg2MQ#lN}o=O69s!wF4(4J_%A>W*#3c!6@X!F!$CP~{+3k7jC@pY z8ac9hBI&(;H3QXz0}3-WXW#WxAv&s1kIUWCs<+0IFg%cQaXNQ_G*e?!>n<10@w4GT z*~W<(&>H+RS8e7~^(ab)!D->dcDXig9W-u?D6hOk+Kp znmR8aNLnu=S%0;+U!N)$BFW4KI982B+k~R{i4s#ny|5>7cGM(7+@OlK@E9sW^9;lI z`*8EwK<_(}r<#?up&Z;lv;9Yhfm$wiQa4_YAn8iBkiEySm|%TJVw*rzt&mR5ccaX& zJrr@7mC56*p+L~hh1XCQecNWX47+xk)5Ag(MAQJZcXE(0dwiP{`Wt1<;4cSXPFaFm zMPHptKUkY11#$cUZBuA_eOw|;S7yrK7X3{JuPk1no&c%_K7(e*r10Bx*`Zv9lvwOx ziq}47I%;m-I9FaThI4T7MYs&bDv(bU&NpuBkyMiUFTD1oT*G7(2Rp^T!O%d~%MeYV z9IJbvJy{8d$fVX=uId>}qu1&kXG!58lnYHk14ihh;9EM-Rl1T;jUCq1@=At)$DLxB zu1DHk$dEXSXbvz<-6KhJG<9?>b@2REbtdl%VWwIwl24f>x-hBk!8rGQ0_g4dzJEG1~X<#gY9CX`}boZ->8n_MmM%c5~)V25T&h8vh zuwYMbl4inpnJAyJtSA%x>tK|^j7v;RL>7Stkpmv9uYtntEVHaT>k8+aadRH3wtpI&iafU&VCk_ecFm3|{?l9Ya<}s%`MqV^IQ16751aZ?@wJZ|65sR zrr;mff|2$@zWmMU`#Xfc_03?e5K~MR+8j0(R-BbXg9%jS?p+APj`~6!x|FBMV-i; zg>s$omSwORBmxi1JXT(bzu%}&dh`%B;OEbkJ#XwY$ToN$-#K^U4YtDO1CMuST27xi zSOFTM0qz2@SmUB&Nn^J%xKb7C)Q5gfnY1%LK}v?}<3VNd$+Hak;31j}w(qG-*cE7e zjl5T$c~}DjUyAm`pBI@rvjE|~#fz~;&FjeHXsW2Cd@1|9_*J2DyoBoT*4Raz;6)@m zQf!?&;FWxf_9Q+{Xb98lU z4Yfaaog~eqrO)V!koPVHBo1iU)cF~54m@l$^mO<*cdj52(K1Rz-R4!Pq{aRvPMpB= zl5iJvg{t;=dRGP65YWVy1j!v~SJ@C}fL&+Dw@~Vs_&P(6dsz+$mD3Nsede@WR}PR- zR>JwO5j3NanYa6!@Ls=UDch^#IbG*rg(EZtuRmlizgw#MAj0fo_RY*>FYsQN@bvZ) z_}Xb8gH4s|cbdW4^Z9p9_oE2rFZa30Hg5L(!w6_Zq`ElFbKA-)5GN7XLMOPe*K#7l z>W0EO|MD>n;mOs|Js{yR6mlf0p$*$@tHZ*Oag{O;lzcqhh6prz?Zc{5=V&A)vX5*a z{J1@lKG^Lj4%j8E7xeR+oIGAR@f3lcC4we38oM(THZrlV+r)F(&nKS-i$eSn*Cw?g zX0K6E{P5MJLi#gfw6)UmCGXR#o@xsoT4UYp*!~=UE{euGyATI^N zKu}{42$0j_y6z+e@1rzZ8X9cql7+}YKj*$>Z=%-fc}ZU{S{2p1`cB5y>D}F;-;4X+ zpP-cs6W70DU@3|>jokdjat~x{7rB)R>4K%VyleAjv9}&tM2P;QV)F+ZrgN{#PTc?5 zxT5tif`FAaj|y)*5xiq#W@{u3K5Eie!^oH~&1k+Khw#DAK6~>cQa|s#!89$zjVDaq zxNlz7eUACQH&N%U8$`^ez?5306OWrvyrubfN4JPsXckQe20V6XLh<8?6>_kU@>t{5q~y3=@Q${$CMG7&oQ@`?T95 ztx)z8RStJo4kVDcXvip!`|09%5Pq`K<~m(OuazmbtW;*%{+f+UZ^jS*385lt2{4a4 z#nPhqy*w0*SOAJs3*^^rjj%q%iI ztClL04`$sRy~(r{HJUxn$7Np(s0q7UODPi`k3Rt!1In3M&=Eha?ZzEFuA{bZ6GooK zm`Cmqt`Dfcl?!t`7sCMd`0Vpv3SOVjL~{k)RSiCVCiRqMq(QuDTUk17GGW}S?dh5GQbGu`BI@ZyJC#NE4MJ2%f| zoSgV^6FV5W^k4F^jGgCEkmE$f)FlSRyH6UH z+4E61eyrT1Ivch7p;M;qLY*a3$CH6|-AGqwSm}lTlsEAY=#8RCjqLQ(5C_ZVHQ}Cr zBUdPr&`V^$Nxqhh{Iq0qCK}R!VeWr)IIPiZ1T@fEH6?)k{Jv}U%ZcfF2F;hmxYEp^ zkTtQr`hk~5ssmM9F(h=|OodGM5{g{@kk4iM`6(zIcBrNW} z=ktdUly@QIzulN|r5nX_{8_KGn;IE4>lbAkH>2fTMJu)d*R=+9kL3vX0V8L$mKiUX zq!HuJWYThQDN{3LsSEaK3L<;wQkr`|*&oC(BIeRZ{EfNn%&6i1A7sdWJnd#$R%r+t zmtel6j+Zf#S5KCwN$uS4UW0poN1XSu&P5ADjM8rs99%|1fKb|55&Hhrn;}pOH?u}} zsFVDXzbHvLtTb_A$sEPnMZFWFK~p6R^8kSc&KJ07ClXnhi(clD2+QKu#}4bC+s8)c z{BCzb8%sUX#ZoR`At*z8Kba-pHmS*%uT`iMsdDW-6}3f!o2tsMwdaHiw>>W~*jvf> z)r3Q#jS2ID3@qDal-TQV(nssU=!uoH1#Ps61WQaQT+_@0w>_*?O_!`a4vVIG$ik(C z&k%VCoWvOZb{+Koi`JIO@1!I`F6Fbr57I z7$Q#!Gxl)WgM_S@ljM|HTa&?+;*bnd7TU1}$I@2OiE+Oy2G?+n5M_1bNpMEB(!VxO z^CSD(t|i=#U|qiF7@2KQ0&+;0b}?@^#7FRi`arMG5>O|B>b#U--0dP#zuk9VMEUpWx5)Qu}gn)rHC=F zLwq@Fnl;{ZujaLCYUITzo$NVoEhOc+rySR=>D~{ycz##pK&~=7KrQZ@1M zd#EAe-34r_HOTdr4ma;TQK_VEF2Q)2T!!x+I47@cG)mA*lcf^oO=m4wQr@~mmUSFu z=DmT`D-E!!d$<;PJlV$6bMd}=0(#5jSyx$(MCZ8-)ocF%OWP~GcU zBzoN;0FF`}Z$D1+U&ZW+zf@~%g`GcZTHBj(Q}Bfomgh6fzMo&%uKVp<65iD&^iQYk zdg^=h;don1!X^5Uks#_|{ld|qJZV;OV*OYo@Zj^NVh)Yzr^>oqPV|aCHB3EoHY93H zQp(Z|`oZU%WGb~Q{A?KXHH@RsNpXC9qQ3q~GJ6+_k!uh%2wAq+v{8|mD5!L_`t@XVrrhcj;RK z8c;ltwP1TvWe&`9#GMgSCq9?-YcS1GMNW^eArv6Y`{^dEPDq;+uJ-b}9PIy_wtpfL z1mQ>(1NfLSoItrPuZ!Ia5{}w_SFB(3b&O3Aq)l9HcqnQ9Ps{S5`{hrel{Ho?Z8&UG zUp81L6g+7?0k@7v;xPCw0vq_;O%54zyL)#i*Goc8mzsAvYR3wXooOd4LT z-j9>%TS)Odoj4kq{Ka)hswT`A!tTG}VgDH6a;5OO$~2?^x=I+nTOptJC&%0JWzSzv zJi3s>`KWN~Vq>(rVq^b@h^0ZVvz6HrG?DHjqtyw#EVJ+~_2-LOv9XXon}j{8K^Mho z1xv|j?qx-+fB9ZMuH!!!A6*VlSxXC;175phaLPSf zplo$w>`+C6rE}ggmph#3`@^=m8~t!|0HIr#UQv$+mu}ooYqo>@H^;$a1Jyo-gb8s! ziM%9_Qo~km4KFp~`uQ+^(BtBO*_Rim zv?Q)ajYiG~^GEvV4cqU{RA*0lE@6GfLB^^2MX%p~b>aPFCywFy@Pa_!p*kSy>>arV z!5?;#z`_Mm3-=8o+Sve%>q~={jk5{|0_5tiAdE$%Az;D15c621=Wd+4>sH3vhFB6v z_>ijRs0AQ>#|=7cFEs`UUgT3196=nhxq3YmMA}#oke__|f-gpE>#^RS)jIuaE!VxQ zW~O7v2D(012Rl$}%K^M!eHH5B`+Mvi=Q7>?Tgt@XQN5s-xc&5pqymwznmfX?PEuYx zN;^>$lUz(6yxEGA!iepG1#4!TDATMwCjy>G52cRfuk=6?3Uwxx>F;1DsfeHisZ5sB zdQHT0-J&vx-{|+@I>r<&*MmHI(3${>To^Kj^WebwJ`yrO7(yR)eiUCI*X`u`k(Iw# zs*EpBOpJ;7-eEJ{+oNd*o%#HjusUU1)y}48M%^#>R*LgV&o;!Q0}GydJsd`_%~lM~ zLM*#IMOM!t>5pPntmnV%8pRK(-yk?E7aRwlR%1-<&U4Z3ov;pG{xxwk7igL}%s8L% zO5qaeRB(f);fr$DQ}P0v3Q$&aa%jCnf%O=?#Uw@`w@v#rMx9Lxj5P;yi{+K96^cv? z`V9E7D#Nr-ReWfdAeAC=tW3|oKl;d4YzXsdtOKvfzd<-QB5;SCS_qggVO$N`q#d?| z%*4&btYuxxoBtR_+Ze3$kRToMJn|_V|7k4WqQcwU&F?WDw)!Tk5bbISufRp?aqNCqj`0z}zEIAxv(~Qbp(% zT^+B5tqT{MJYZ2PYE+f^VgODK#%)eqhO%nQvv5*u`)87Y4Rb+OPoe)r0CmZl$@w_W zq+Oc9cPo%?25*4mo5yk8X;G7q)$~?S>;9V7@cJQtvG7}SWIZ+<_mI;gU@zUdI&sdb zLG!5Eo#h4s5iVK4w1d4pd2WyXWv^ImSB+?3xHlX&lms)9^4o9HFx!3{$?5&qg&?I6 zxSStB3WoZ5NRm+6v@oTHaZpy8KuK9??ou`4fEdM4y%3kSI);#23p{mP;&z&$`EHGx zZZnL@9@%_fSrE!cR)83IwOfFX(2+tNt0wAO4^8UdZccMhEpi?Tfsm&pL(4Xf;3uWp zTc(sYOz#CcIAwBg5DnG@^?aq+f@HF_l@>;*AaJIpN;{8jI;>R--Jq>S{J+4AsGJ6+ zcOuHzM&{H;eT+Or65v5yGfjPxmF{6E!v&OxZwnbzBk26j&pitv0Wr zo81m_s=RW8T$s(T8*R4imzUx6TXJ{G(Y78&!T0eX^x04^hulFE5`a#kT|Xn%S)vMr zjzC0O)j)4b&c!LM;Sl`y$(G3D3y^sw!stc?57*%@z5erk*E#W|MOok+GD(ssFCc?- zV5+>;xd92@-@ULLkbjq}{c8NHQqkE+T92?&@w(5eir6Wcw3DZ-%xc0siDUibEsLog zc=)H8pXC7K5{JL&$Y(DEZ!kknWHLPcf$Ec?<-r^Th!+kKyHW=Bc-x}=Au!a0%k{=X zTs77-o{%Aep=3%8q(&B)Ie~!RZN@B*KHJ2QskjDx@ z=|&C@`!dDpEE$qxxgF639(!p)bhrKlo-7mf_oigASSdIJdl_cPB;IDQmuB+sQY&Or zAfW2Q8hG~}^9wBwdC>E+K#iv`$)DHha?a{5nrBDenV^+hHe-y7*Fm!p@A;R3 z7t6K?pOqPW1@wkG>W2dx#SV+)Yl>73E|TDP47U ziGV(79>X1wc8Mh!z%m6Za=qcLU8H@A9pan&W(Vh4dd3x3At4eX=UGOOj^sDEAGk^! zXClpmldy{8kiWbhbeOi1p?slTtXlMvYy2dD9Xt#pn)*mNDqFJW?u>9ASzqGf z5f&(w6Xv$jH>LK-R|CI_9$&I=I8GUXJ(Y3wn(#fW2$mH24c6_ffD%{A!1%&sF$(nA zh%$^8wZg>d5=5|03=~DO{+tCC!LIVk96uXoubR#?75o9wOS8R6Da7HdnPNB6g&?%I zMt~(4GEZFKuPhgWOUhrY+7|QYBc3Nft`f-75O>Nf0IwXzDf-2XS;pjBXyze+b z3ckkK9vNlO=L8Sw3V-N(yc7oHE^c?aU*2OibUHM{I>r4>bp5i9mdFHbUIDywswD%a z2v5ZTyDw04NH*CsgkvDQwPyNj3^o0crsN-jw4MhC;kx6*r=+QUD-{DK z!t0*s3oIGGcRO;Oj+xZeEx*eWdfa4^^AW`Br8VWj&PuW2ZF_ zFjDF{{eQyzRVF)jS~Pa^Rd+;v3!?gA)=QQSIEb3}#)1jOiKzv^0ABTbrP_a>1m@_D zxu}lrCu7)N0&X*8mPyy{7=rg}^lV_LkK`7RpBW|ewaf=cT`8bC?~6-;pN}5Rga=B@^RbsLO~lq@uDN={%*e* z17}^-it=HqP`Z8e!U!QgyPCy=}(PvJ^km*UT?zt1H_8|h&vuc;6XddPP27ot? zdj{6i-(mVjPOv{?fD2*byaFU@GkDuaI#HGxlzrcwc{~8r52LPfwoHss-h7mX5z#7= zyHW1f6MzvY=f_-5%xZ?^PtO(}(>1E01D`A0kd1)whX6#~#p)I{viu zU>#|))^O-$FOetdaf9;nB)*#_U5|UvSguy3`n@KqL`2ds z=!Yy!cA49*B+U424g=8Ae^3=As)SzqSzE^Agr;LY%Daidb9iC;y3mpWiN#?&X9nGgCuyXAir-+~zZ z-#-V~&~F6n6Ulx^C8s8vBDCIcOr)gn^m=XU>PPO@A>SkCVJ? z7&7{=6_U4{NU{pNqrHSVC78VZG72K{n<^}mR?Y|ouI>Mx6?2D~AoDS3+{a}Tm6t>&E}*(WjC&@5-#91f(dwNZH! z@58|)-PWMkR`bChqyN4T%Z>|Q$#(H;d^r-nY&BTFP+%N1-h)Jw{$%sX#pW?m#8&!u z_#c2&?@esguYfoICnVO)03*<_A^mWw?m!;kmrQV-ln(m(R7Szd9*;4!y=1sNkYumQ zEs+9WA24|-Gm%}Ta{TM{T-VYaKR1|w|In2!t}{n(K8DqMVS?@e@1|3{LHM>3_vM3I zioi#Uqs$1?>_Dwgn5pip|16m$Fd9SwNoB)-Yyr5A)P6Pwt8>7(E<23D(weQMAf8sT(cdnLThYH|*LYe^9aD?@=gMQ+Cm0~hX% zMcskO;ya@g7(09Fgprh2r_l>>Xd!M-^qUKEf-f}f#sC7OA|H~^)=<~?n3WT=cZg^X zaEct-o-ngNw|3{7Hdw$Au}Ecdz{?lf|GLDF*ujVFe#Lf!(0K920u@4#3xzwUQ4^ru z0=?3h*b4S!xvuYHpjN?>c!91YWLb2=I9ihoCnx%2WqWI;&V4ztK_ofDQikRZ>I{@m z39a#Ck8PUx+dYvDAwNv*KZp3)d*T=nYtCF|uSSjfIhJjPpC{|JiMrYFV0XyLzgtPX zWyvK8BT0dGweAzB0oY84TCOqUOHPS=C61&dyTPpb6gX!@rBHNkSZKYBh$KMw?Q?~{ z6##wE!}nvWaId+nV~jV9fG-_f!MEz|Dc+u^dR|YncgM2?v%67xGt1Y#o*kWkd6r)X zNLh(m4&Sa>4V~YF&E<5{g=4%!b!2X$b6R5P!{qfjrQ#)ayOJF1 zc|lS~ENmOE$V{W?dC!xRjmS9bUW)n_d1B;Zwh+VAFK~$8!?27$6V*mf>tC0S~SU!(* z+xh@AA1Hk({H?g>u8vi^1N$eH<4K-VAg2M3K{5;=k_R9L9gb11S=96}m3a+jHoX8& zwXZ{^Xnyq82EmTH$F_2SVKdt{*gvL;M8Hugxy;?_sg5WS=sHy36IjJT_D1%%`|=QN z%_KeyO$i0p-eywG{>2!mhr0lHpXxc?H$#x}ySRPshqt}MLOMkr-U@Spca5=XYH5NB)y|3Fvi z$RRv)MIFYH#qA&U7T2fPtdBe!ypGbXvyh!}Wh2YeLW&%x>HCsUkt)Ed97_PWUq>CE z_Y6MYt?X~MX~=8(sr(G*G{E_nW0kpKP3GowqG+>)>_@Etrj-*3U;>~|xcykm4T$N8 z8VDH*5f@-P$byAvG_pm)LYrGdn|({BQ7if1E^f`(k*S`_Y%f*5C@rIEFcGBRU$QkQ zmUDgLdo+f_FXggVH))zi*6nU#suidBr+w^$=coo+wF<64L~5zeWQuUG+u3&o2R})n zSu1lSVGLLfc!|$`gl{F7mf@VI-ke39I_DIJP%6Mk6q4< zwF0>(RCS=#kES|Ab-32R{F=D>Nc57)P+=b;pqqPTard=$W|)|r$f(CUX}2>YQ$Kbs z-q;EswPvo+5v4V^43eO%5RAW4IWLxj^NiU?M|hy`HyW0TA_DEQ=2ZU)9mZ1hN(AT4 z;4YK0BtdB3ZZ-JwWM1zb8|2U}^@b7bF}rPKLRrdQ(B<7F(q90SDb*rWiG18v4BTHN z@EZ{x+Tu3qucWTcIsTEf5fy)ar}w(T5tVEL3V60tfQ;RZ;T@f7C9U0Xthy@{>)t;< z(|ehI{qi1!hL8oIKqiv1sGS7pD6?oSG*TO@LrT;Fegy7!bJ8jui)c&Bilf*lVa@o$ zhIPR&C*fbBsV=r?=L%koI4pBeu^M<*iZhA-)0#0Z?R^QY#V!vsH$s5f%QSl^60YCs zo98GSY##VAI0gCI&3$UvAZ}K0H>q1rt}OuhshkYa{G`B5Xymc9I^pBoG`5)*x>?N8%DFAc3O3FO z$A--m-_-7%(DfP`uWm#hum3e`eOSsQ{*>q7zKWVk+9;lN?9L{NdTIpz3GRl7{@#^l zo%7~1SoHq+*nw05J|gX#p@x1eFBX}ydbpLM8Z+ORt4`~GVTmR)NSi8+mRARjL*&%_ zcdDX3USWU-d{M<_W#5xo)kCqG-4igEd12T|t~EPC=S^dayG^(E5rFBsw5|bjXHWc- zQN=k)JKff&_0%r<#k5h{{jW&BRZ#lSJ0?tQj?(v$nv(mX9>Lm#Vyp^?}TmQjM%saVMrz zW|FW`;$B|C@`+J)q&-x`%sap9aVS;!6X_B*JB9TW;fB6t$ob`hm9vwb56s+NHlpDB z?>+HbUz#$p&wp<2{rVb5cf{iQK0EYNtT!$c0J)lKHTxG#r;5iEA(|=@a`N};8)E_G zDWb@j>h!U9mJCrwH)x(N@?xBBmw9w!G-nsg&vSClaeH4xN2W}Iiz%8L?R{4K&~IfR zw^bS41@l#al2I|YEceTg3opiK#nxHAk?T6~o4wSIa<`pNqlD8HZT7mpld+O_(~EQ(08VlJ~o4kyCWLdBmmIj%ty z@OhbZjSy#J#Eu^_C5hXYK^Fh@Q!|uUrslNf?Au%(N8p^O{>JIhm~S`n2;LWJ{i|S* zzn;uqybO@bx(UBfn3T%T9yK;T6t$uA!y33OOsz!FxVL4a5YVs3SupnyY~n`hhlF zFIY0~w12F}zn9*O1RvE3_w&Q)skp6seZ@MN3e9*{qxZ&9{!QkDe9E2T`<9b0RKDS@z!jHuSpk-w zC*74K%wEzXOY6q)#^oJbg`RvV0md=cC`UD!4MM5dK&3Ned<%rt6D<{A*j~#($bC$< z(L1XNV9fqg%&sX-vRV#5Z>ll^lU90^;WI+?>L1N;8M<XXRE80?2tbzF@VUK0GLwT(V>@NWu;cEo2V)m?hN;j zJtB=j7VRnV|EAz2uwwuP(wY{%?8}rYxcU~TLO;^pYl`iti$23rSHk~&5u$F}x4HPv z758)^z*K<*Y%gX;Trw{&Tzr}Ue^D{1*#xD=_P>%=AICU(AFdBG{zg~k%V8Vik1=j2 zcwRqV{pQKxBz{mnxfWo}p zFTQbGQbs@)-GGb1;(s9>jZIbL9@H{F9tz#N#l}no?(c|EM)6Y6GZ!@`FJX(j9*Z+K zJ1N^w{GWb#g->7Ke<--`NEX_ng1AJG>Us#{hMdMCmj3j3T0NU!Yb>JY*TJ0J83A?C zTy_^g&k*^@;-NsPy2BXjeL^@{QE0#e#gD9PxOxQ3QMo!xT}vb9qinfwlS>A&TpItuEE3(N+NIH0#-M5V@FSs@Ws>WBX55ison}mHgMCwvw1-#5ACKV`D2`2yD}y;3o>&4={X=MOU%-t`;W} z$y6^Wuli>zusrBQt*{V690F1W4Th(e{)q8PyR49YLC$~Zo%Y53&Ni7{2yh|-$~*{8 zT|w24E5Z<0-$XfMlWmeBnFu@JlY>0^21Bd~5Kg_1PGZXvH(41fGPNbINgFn)gW(8) zH&$4h4{znA&vNA84nPkn-Pjj7ke)LV&NE6PDx70oO>mzB0SYKGn?{xjYKVITbz_KE z{(M<5?o8k*PW>UMHSIo5G(qO45m|&p5!nS&ZQ9lXenKdDRAX=@PAM{Ydkz@?0Cxo5 zm|6P$rclidp)t|=zh2IQD+=%X`a=yMLxaqKGzbC;!_du_?oKHg>5vYkyF)-gN=mv! zx&?-A1|(#VF6kQb&+k1v>v;wDtaaA9XWw)8{^V>Et-T9NxXP9cTrb%mM}6>7?!Ne` zCuP)jc7i)`!3~|x39Zb&KFb$LPkWW7Sv{`%HU-!uUsx9J+O^L;*Yu_9xy~Y0Wp0aT zc)NbrHd$6-Q?bAH?eJF+%m3co_6&iqzDT02pPUQ#CZM<@LmiA zTLs0(aV95Pfy{8yxVwnINe&r2MhvcM=PnQKO~yS7nu#Zkl)0$#+4U}D=}jwH)9d%u z%?)XRazArXQEVhyd!~#hUj5mGG&Zx34U|Zk;I(i+)ZW=&0egJ*+^oLeltEu^c-*1W zJ~;QwtgR%8TVyNel*x@gXgol`I-)D;3qcwFQ@z~)j@cO@iSygGwI7EA!~e#0zWT&= zeV|XHTJeAe^)#Ap1KDT^*YJJx{Oxd>S->0}~C z4&A?;GKv_sH2`H*lv%gs+<;HFOEC_u2>%_*20I|8M+!qS2#MqjI^DjN-x=s;|LlRJ z$vtI7rTsW$ksC((Z^{`?U8LmOb|R{r2DC||ykFD&a6WoPT}45^PiRqp1Tb%!pS z#R#1hgXtb`qtcf2xHql@S;=xO_w2Tej7{ROPC~&;?XM%Ux-g=Zr`SVCLZSf((RFH< zh?T3^_;S@6ff$7B5VK;6C1l+Y_uCK7l)<0I)~b#}_4U3k!q1d)dS0$--PCq%F0>By zexD07aXRc6L2Vh7B3~{O&yN)Wy0@Px(-z3~m&vruAGP+bSAP81@4^**b4rwq{N16{ z>*Zjl;{g-IxvkCwO;(t+YCXK^`L@pKNmuzG_9QM)587IvT!wushU_HC#4l2lY#RRa zM@zsu^5l-!=GFx7Xfhsli90U`UTZ{zLwl$$arKFWjGGP2^TX=gMWnnH@sAC0l1O>j zzh+AO9n7!&j8W0~SEst#A#s*5pO9wMP8K5zSi1?5yF-ri(J z`x45a2_<;l6LVWjAEs42C;t)f&c;TiW4p^`ylsRm@EO}HfSIMSgqGIjlIOcg zf3kYADre8LZUDpMzEEvb>p)G~1S2Z3+0g12;tvn9a<^mPTwbi89g|k?_6BfO!xGcD zzp&-LS?K&>Lb_A6*iJdnI0%3@p2ww>aYPa*F?=wxN)WfpyUL5fbhkY4U=3_o_-|A``TnO!^7fxT(f0b^MdC`;0X`=Tv^N$#< zh@N)>N77rOP*ieo6oX8c6&>#hRC7okv@#wL4s#}vS5otFqV`=LcBSmO!qY_|MGFG& zjtabQvKD8!L{R}nY=53MJQOQd^pyn1Y?Aqzj}@4Y_m*yK3Xw-wu zkdZ+!c7Vh^<&47j6gE?)U_&k}fK;JOAi7rh*d>i@12D2$28h9ib+$(M=)3{?QmdJk zff`*2kdz1yS+yDIVA(Hhiw8=bLw@!bG8*gdG$xXl zcrhs>lv-v@BWb5d#;P#=l(eSyGtRL65=&Zvyrf6(A0B0aP9QP!cdR?y11`JzRoHp) zheIFwEIuL0rN5|2+}XAWp(-a zLxxSQbc%{Nn9nr(K^rITcv?3RlRL5Q8a5xb3BMIIJUs`+8Pc~qA2}_Jvdj-J&YZif z1D%!D3Sln74ks=pLFN{U%)HhV3RzN4K`(n?wqV<0R(WhrIrl>>b{tTUyqz7z5Y73* z4rYM$1Gb|MgL4=WvSw;IDb}53ZU9A6k<-+lHt~sw^m%T+CKrt7?G_Uhw|=HG22^A_2l%)4f($_H2aO@K?LyA zN0k}+$B2e9!a9)DORn@X+NvHq$S)1ckLwk6r;{3R|4==yA$jF(Nwr-iXpsF@BsgMo z{gHZIB`>I52+ltrF05i8^(bN>B9l*~W^bztE)z-;^p9Gcy! zE`KZnfm8r+D)+h{^|QES(bX<!&wd^9WLM8Vbs=II^1jB-Stq~DM{sGXTRi3`8cdG4&$7m zd`8G;d*j-_D;^%oJv860LyOPQj4ZR{r~Ay3ezx^Cr9gtyODo&46+Ng9!2!&_WfGgd}!xh)FIA8Pn4`& z>rF`>uS6|)E0S^s^9k^!OoOb=hvjSDM{LQmr0*!js`qRjZU6bPy5 zfWF%OB0UwVF6w*<80sAY8|?^7i8mM8@I0HVTzv9;#pfx=9Pa+T)POrU;a?CJmUrc; zpNCOP;oQa0`K&$&{Xp+Nso0;O)%kqW!jD>!K>VN^FB^!GpG&CuMx-f-5`e7RzhbWF zMFXCRedm5(OzO+H1c+dRbVY3m8EDoxZqzK(=@SkkrzRtsUQG&2zM8iXx{8TnrjOfN zrm?jDY7kc+vJ>#TlHJSw&V`S-LwqeM&O#eq>i(A3E#K|s^NpW^wM1_}jE`5-i?p*1 zwF+&BaO$?ssClF9R>My1$!o!{o=`l_k!8fVCMy0cqO80DgPn_Yh z>vXot?PByt0g_7Nx-OO)J**7HwZ4q{-cBlgaShmTBoSc!TV<2hS5NVZ{pRj4p$04~ z_!T|_&8CbZ?qm~qYhdK8aMUGJyY%(M^;P4d!GOzuhnnjU`}*_g-W9NonIvB!msJ6) z5fYn+wChxrBq8MTr#5>{Wn9?30+_btSyJp$)p*!G&IF>wp2R!LS5M~Od2W#Q+aKck zF|W#yF-@K#)XN1DXDu1DcfV8QgtcR|dF}j)x9mWqZ>m)|cuj@vW9#TEv2zhxkAdzOF z%tt#rB`iFAFw9fFy5yshf=<@))8AX91lgZ5LB!lDz@DD}^;JUOT%W^+NQWLdr*q1% z3->lHE6P-w@xqgpM`SPOpFp=B{iI5jYI)%93QPDOlrw?PHt5<@OW$rN8_A(({iv!+ zm3T6kg@Na>!K%gGB71kaGj{~{xjYLnTv)i#^Jp`b?DZAV-pwCSpuA>$5S@B|H9sYE zRu+|F9tG^$5ZLgi5GVlD?kSq$L^0O0=rdqu z^sUYmOe4j5R`&t$@4O@$WbXS7;7M)@h=JOjl!o|b&Nll-m(L)8NLf*gba*D(5WW!DSyu@qOt2BVbvo2Aig=Im`RqZ|>ON_C**tE5k^hMGBF=hyR z*@{dlx7A7aObQT9q1YRe|Km?2N77Q)UY=j>x6i5mLaPn<0#o+Qpm)uuDLZ+03Xtw9 zsDR%fubEn&{COAzkX6jsrRcQ^x0Vg= zGA}wnt1nrTNbY)55BsV|`|j%D?xzu8y5?7wcj#RVOF*ZnYzKNh#mTKhnfAUF3sdCN zG>@WQgjSB<_JFrRoW$uPlTHSn(+@`W0|_RLhZg#~&$)ZaFkvgVre`u!&xBTyyRKE( zVr<}8L$q(F(356_nskWfI&+VUJ7bl$ew(3|wOPNk&Au*)DqafHK*yh|?bhT1%saS0 zJm#vl-UQi5^}-SABs?y{x9;yHjxgFY^~%pNs6CE5V~HdGYRxsS@31DKj$EyvL7fP5 zJ8;Yf#>zK;o|~EZKI8pGA>+d<18hw?y9G&eYt_qH2^Xg)7oqrmKe@6XW5QNRak!(wC#WOc{5y1w#g$0Hb)JhcRBAsN{)j$}uo% zM!9WM`h;sMAuSHL(A&K#QUp^vmIYQvsv`>O2XY`<-D>kVz?LTf6y-efWAlGOnLWwb zrs=5-D%dsP$UuWgX`OcRr71FS7Vbs`{k??;8w#9)>wR=})gW1yEdERc1?axmIQQr~ z*!OIQ0;?+e`x}xv5#NKt+xOmKu}DTvQ{d{_76dXFE0RF0k1EMz6!Iv9rzaJ_tFS^9 z;;#o=lL29R(3?=Dq8kZU`*&QfI7Uu9*qsKIdO;tu6l%pIw|wl4 z!a%Vi)q6l;yi+-OR)u7o(D>*hZE)a{if10tC7?oQWEEUXEru#T`>@Rt)q=IY!kv-bbePcQBfh&;J*M zai%tnMx+vbaowBB%}7K%sb-%YacH)$Q(U}VV~Qhx1`>4TW9w(hb)!?G3khVBxrKZF zVw@Mh!Z?rJn+H0MPWrK@cNUA|=mILwg^?$H1!g=52o}MvvSD)jg4CbnnZE=b;|B>u z_^#WLB9k`bivA?JpNA2XH!{dSACgbsw?Y0@najg>-4}`d-Uz7Qt5#R_R~?;P&h!@$ z@B(b@tX@BHIV9I8V2=j;(vp4h-FCn-;A`oL98wVlS5FtZ1tUMF@NqVX@H7DPwr|)F zy!k>zZ;sb$68t{+YdbjSjKkR|+`VB^FEq22wXj*x51d3nWK$FW@GG)V^2|P1{(vpm z_ICNs#L>&FTpXdIYvfcdT}`m;MT4g!_%(~UHoQ63hU!ojn6l*$nZO1>FfPmLbGfdgIpy!(J5yxxld;U(E7^-Afjk@R8Dfn@LgjouMeA(jB{Np+KlpCuz-S!=bt z!-E{@#5H}PFWMYY+mR#>)4n8^_HZgrnU51xzh|&Ekfe*>tQi6xQ9aD-{(aRFKX`1- zRWIQ{r8eUC@TMkC0;Q^#E%9AVx$sjxw=F!P9zL6{O5qIC1spvvjfZvX-4~qH(&ndM zMY;HcaZL&Bhc=a~DVvKs_iOBKo-%;fXNBIY{wEe^GAGLwW^q4MKEL@5P|q<+7@w|! z&fiz-Po(Vqe(f5Z;b$*(NMFm(sj;U-%mwUOO-TLv&C7Np?oo|8QvG>way?iZt#pcL zEOm{=>zzIzK4>}nOISokQ%4qxkKT+#(Z0TWG-=Lt`Ngh)f-D-ojXgO`EcD%4CymW} zoqLm4$>v0IaWN`xEqmhf+^%${^ERkQ!k@*rw?YLJ`ya6sWe|CItT ze_40fDCw`IufFVXuZzbYQ`QWGCW~NIahf|j)^T}%(*OeQa!flVemn)H^Z%f#mQXm@ z=i?gJ=wCC9L({$Zv?rW9jE_cO#VE0$l`C4lknX%CM{i{OqGp>vq}q9(?K#M|*u) z{Uo(GH}5|D*Kpz7-!QuL&z=CaNH*y!l~w~Qtpb+#T&|--HQI(o?DOl>2|U;n7}Gj` zIPTIJTJRZILdOd8SS?X`Kl*g2Z_60DpV>e1#qm3t3&4e3i!U_;$$ER~qlytD>)ky# z#ckkpgDT5UnNL0YNIiIgv}zHh`AUl@C?sU5vU%l+`>4RDy`~4 z9_925MP^m{10OTu35`$C*Ba=|4|wS$@h2e1`lhAKe+t+#CwpO}(SIqy2A^+~Mq8n( zzlk_YjY7s;JEvC?A1)()E%AnI+p+o^c-XAab)aeJ8_A?J^z$UNp2!rMR{7+&nC-Y! zof3x);;OR=C#3+iE-{g5(;EZZO7BFI!N7#SyIthnhbqTc8xq6eFI+z11eyTUMhOO6 zZ@SFOaSj9ah?)T}W8SrR9^g|9_e-Od)bdc$?oguY}D4lLc<`#p>GQ%mqUMO!U$)O$e7ut+#a?NrXN>0-KnJ*#{?${uqZ9WZ-qi7LR1I*{fMIOzgly{ z+d351`YnBq;rGb-UBD7Cxu(pD;;gNB~R(Jborj4x#@5z99EAvhvMK7%17i_&84@H6J4GJG|{P z6|55W(#fZTCo1bmua1{zzdpnk=Q!|igW%Gn->jWAg6)AZVnp&rP!Mv-gao>fMv12$ z?L@^T@22-7`smR)MYd-ZWSDdln2NJ`;_8~V#~8n}uY$cro=~*)^%$eHkJxpB6Y8_U zG<|Z(*phYGn@%JvGD#Ya=X-i2u72d|NhSrZp}bpV2LE< zeSMQ$&B%91!$!)EI_(wkf9K=z#8qRHldn(ZG)n++QIz*5RD*bYT*!1Am*}Si9ip3h zHKx4jo#un@H40M6o5wmYkXY6A~*#@_`xR)XUOl8;TL#g^Y>0t ziP_I!s_kng!WxY;*nu&Av(Bu^ofqinF>5Cm?d6!*E^YdRb;h42#RAhi^dC&6%LnfL zBdwnwIT6m5T1VP}Fh~eoOaR2{@qbO6$F9dTJU;TxSh>A`kZQF-WzTe{%dl9LN{*hV zy|;mTO92XJGVdeZYj0fMi=Xm4fD+irHYxuv!`0xAY`OEa3@1O?`{89LieA9-X_>E~K zV@@_F5LjJZ^BPT@y(msjX(s?xro8kdbyjq752xk9;1XQOw@Thd;GQBl`SuW$Zb}Wo zkYcJpIgxRq+$}E+elzSx2AW9eNIrsU^iBI@ zMvownNhT0suEg>yUIQGXJj($6zqQr6LH5S6`j{=U;{OP*|4e57B|Ebh3A%ctw)QCaT#0f5(!yB$ms`u!a-&^lH*^O>4}_@nqjR%pthK=s1>$@Pd4G`BGVcM!7qmLZzuj9q$yjU^{>q8c z-xwg>?@F|tAaJ>3c4XFHO_lzMEf8v&322X~U&iKd7KZGs!Tw_Tel!03qQ3PP&x=Y` zgAfsbpzJ?I!P(?~9uqp_VkOt}I?IJsT3rw(1w!9bcr?C&4kbyN+ ziKqT7(g(*n<{aDn8URu6Je3met3sZ>AH0e^AJB8FR2#23Elaq1!Hc=_VzcBWZpW$n znb=ZB$4emWE@CgMa7nCylDo^tz3$18*P%XwO2_cyviw)g7X%jUCKMuKHU$yGaf+TH zhUyHXWsZ4igAB?{IH?KQilOgqZTfkrdNoH?O^5c1G4}Uy9x3sx;k8_$5~cxix3p7v ztzsmm?BK!X_Pv;!UrhHsmoUX HXA$y$k+~G- literal 0 HcmV?d00001 diff --git a/public/assets/images/xinon-sm-512.png b/public/assets/images/xinon-sm-512.png new file mode 100644 index 0000000000000000000000000000000000000000..c853b3060f88128508b42e66c828266eb1e1d0d6 GIT binary patch literal 131714 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 { + event.waitUntil( + caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache)) + ); +}); + +self.addEventListener('fetch', event => { + event.respondWith( + caches.match(event.request).then(response => response || fetch(event.request)) + ); +}); + +self.addEventListener('activate', event => { + const cacheWhitelist = [CACHE_NAME]; + event.waitUntil( + caches.keys().then(cacheNames => Promise.all( + cacheNames + .filter(cacheName => !cacheWhitelist.includes(cacheName)) + .map(cacheName => caches.delete(cacheName)) + )) + ); +}); \ No newline at end of file From ff5aedd4b43951abb40a92f5cb91368132717205 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Tue, 5 Aug 2025 12:02:19 +0000 Subject: [PATCH 19/33] Added TPR IP to be able to test --- lib/TTCrud/TTCrud.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/TTCrud/TTCrud.php b/lib/TTCrud/TTCrud.php index d0cb5077d..9365f0b8f 100644 --- a/lib/TTCrud/TTCrud.php +++ b/lib/TTCrud/TTCrud.php @@ -58,7 +58,7 @@ class TTCrud extends mfBaseController { } protected function loginOverride() { - $allowedIPs = ['193.105.204.200', '91.227.230.253', '193.105.204.195', '172.18.0.1']; + $allowedIPs = ['193.105.204.200', '91.227.230.253', '193.105.204.195', '172.18.0.1', '46.151.204.50']; if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) $this->redirect('Dashboard'); if (isset($_POST['wantedUserId']) && is_numeric($_POST['wantedUserId'])) { From ff84d142e9d566bf212bffef4ff322128f38438d Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Tue, 5 Aug 2025 12:06:10 +0000 Subject: [PATCH 20/33] Changed orientation of shipping note App --- public/assets/pwa/shipping-note-tablet-manifest.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/public/assets/pwa/shipping-note-tablet-manifest.json b/public/assets/pwa/shipping-note-tablet-manifest.json index ae6727cbe..07e3aec5f 100644 --- a/public/assets/pwa/shipping-note-tablet-manifest.json +++ b/public/assets/pwa/shipping-note-tablet-manifest.json @@ -2,11 +2,11 @@ "name": "Lieferscheine", "short_name": "Lieferscheine", "description": "XINON Lieferscheine App", - "start_url": ".", + "start_url": "https://thetool.xinon.at/WarehouseShippingNote", "display": "standalone", "background_color": "#f1f5f9", "theme_color": "#0055FF", - "orientation": "portrait-primary", + "orientation": "landscape-primary", "icons": [ { "src": "/assets/images/xinon-sm-192.png", @@ -19,4 +19,4 @@ "sizes": "512x512" } ] -} \ No newline at end of file +} From 4b9f1f530acfa95809090f41afe3b9c122683883 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Tue, 5 Aug 2025 12:13:45 +0000 Subject: [PATCH 21/33] changed height of container for tablet-app --- Layout/default/VueViews/WarehouseLoginOverride.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Layout/default/VueViews/WarehouseLoginOverride.php b/Layout/default/VueViews/WarehouseLoginOverride.php index 9453342b8..1e625b766 100644 --- a/Layout/default/VueViews/WarehouseLoginOverride.php +++ b/Layout/default/VueViews/WarehouseLoginOverride.php @@ -90,7 +90,7 @@
    -
    +
    +
    + +
    + "/> +
    +
    superexpertEnabled()): ?>
    diff --git a/Layout/default/TimerecordingEmployee/Index.php b/Layout/default/TimerecordingEmployee/Index.php index bc10e5c39..d97df6a72 100644 --- a/Layout/default/TimerecordingEmployee/Index.php +++ b/Layout/default/TimerecordingEmployee/Index.php @@ -56,6 +56,7 @@ $type[3] = "Lehrling"; Aktiv Mitarbeiter Geburtstag + SV-Nummer Vertragsart ZE Start ZE Ende @@ -80,6 +81,7 @@ $type[3] = "Lehrling"; + superexpertEnabled()): ?> @@ -127,6 +129,9 @@ $type[3] = "Lehrling"; name ?> id]['birthday']) ? date("d.m.Y", $timerecordingemployees[$timerecordinguser->id]['birthday']) : "-" ?> + id]['insurance_number']) ?: "-" ?> + id]['type']] ?> id]['startdate']) ? date("d.m.Y", $timerecordingemployees[$timerecordinguser->id]['startdate']) : "-" ?> @@ -164,11 +169,11 @@ $type[3] = "Lehrling"; src="datatables/DataTables-2x/datatables.min.js?"> diff --git a/application/UserPasswordReset/UserPasswordResetController.php b/application/UserPasswordReset/UserPasswordResetController.php new file mode 100644 index 000000000..974e85a11 --- /dev/null +++ b/application/UserPasswordReset/UserPasswordResetController.php @@ -0,0 +1,108 @@ +layout()->setTemplate("UserPasswordReset/forgot-password"); + } + + protected function sendResetLinkAction($request) + { + $username = $this->db()->escape($request['Username']); + $res = $this->db()->select(MFUSERTABLE, "*", "username='$username' OR email='$username'"); + + if ($this->db()->num_rows($res)) { + $user = $this->db()->fetch_object($res); + $token = bin2hex(random_bytes(32)); + $expires = time() + 3600; + + $this->db()->update(MFUSERTABLE, array( + 'password_reset_token' => $token, + 'password_reset_expires' => $expires + ), "id=" . (int)$user->id); + + $resetLink = "https://".MFAPPNAME.".xinon.at/UserPasswordReset/resetPassword?token=" . $token; + + $email = new Emailnotification(); + $email->setTo($user->email); + $email->setFrom('noreply@xinon.at','XINON No-Reply'); + $email->setSubject("Passwort zurücksetzen für " . MFAPPNAME_FULL); + + $textBody = "Hallo " . $user->username . ",\n\n" . + "Klicke auf den folgenden Link, um dein Passwort zurückzusetzen. Der Link ist eine Stunde gültig.\n\n" . + $resetLink . "\n\n" . + "Wenn du diese Anfrage nicht gestellt hast, ignoriere diese E-Mail.\n"; + + $htmlBody = "

    Passwort zurücksetzen

    " . + "

    Hallo " . $user->username . ",

    " . + "

    Klicke auf den folgenden Link, um dein Passwort zurückzusetzen. Der Link ist eine Stunde gültig.

    " . + '

    Passwort jetzt zurücksetzen

    ' . + "

    Wenn du diese Anfrage nicht gestellt hast, ignoriere diese E-Mail bitte.

    "; + + $email->setBody($textBody); + $email->setHtmlBody($htmlBody); + $email->send(); + } + $this->layout()->setTemplate("UserPasswordReset/forgot-password-sent"); + } + + protected function resetPasswordAction($request) + { + if (empty($request['token'])) { + self::redirect("mfLogin", "index"); + return; + } + + $token = $this->db()->escape($request['token']); + $res = $this->db()->select(MFUSERTABLE, "*", "password_reset_token='$token' AND password_reset_expires > " . time()); + + if (!$this->db()->num_rows($res)) { + $this->layout()->setTemplate("mfLogin/Index"); + return; + } + + $this->layout()->set("token", $token); + $this->layout()->setTemplate("UserPasswordReset/reset-password"); + } + + protected function updatePasswordAction($request) + { + $token = $this->db()->escape($request['token']); + $password = $request['Password']; + $password_confirm = $request['Password_confirm']; + + if (empty($token) || empty($password) || $password !== $password_confirm) { + $error="Passwörter stimmen nicht überein oder die Anfrage ist ungültig."; + $this->layout()->set("error",$error,); + + $this->layout()->set("token", $token); + $this->layout()->setTemplate("UserPasswordReset/reset-password"); + return; + } + + $res = $this->db()->select(MFUSERTABLE, "*", "password_reset_token='$token' AND password_reset_expires > " . time()); + + if (!$this->db()->num_rows($res)) { + $this->layout()->setTemplate("mfLogin/Index"); + return; + } + + $user = $this->db()->fetch_object($res); + $new_hash = mfLoginController::generatePasswordHash($password); + + $this->db()->update(MFUSERTABLE, array( + 'password' => $new_hash, + 'password_reset_token' => NULL, + 'password_reset_expires' => NULL + ), "id=" . (int)$user->id); + + $this->layout()->setFlash("Dein Passwort wurde erfolgreich geändert. Du kannst dich jetzt einloggen.", "success"); + self::redirect("mfLogin", "index"); + } +} \ No newline at end of file diff --git a/db/migrations/20250805145608_worker_add_password_reset.php b/db/migrations/20250805145608_worker_add_password_reset.php new file mode 100644 index 000000000..3c2a8b156 --- /dev/null +++ b/db/migrations/20250805145608_worker_add_password_reset.php @@ -0,0 +1,33 @@ +getEnvironment() == "thetool") { + $table = $this->table("Worker"); + $table->addColumn("password_reset_token", "string", ["null" => true, "after" => "twofactorrequired"]); + $table->addColumn("password_reset_expires", "integer", ["null" => true, "default" => null, "after" => "password_reset_token"]); + $table->update(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } + + public function down(): void + { + if($this->getEnvironment() == "thetool") { + $this->table("Worker")->removeColumn("password_reset_token")->save(); + $this->table("Worker")->removeColumn("password_reset_expires")->save(); + } + + if($this->getEnvironment() == "addressdb") { + + } + } +} From 7823a6d8cdd373665e2931a3b2f11da6af89c668 Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Tue, 5 Aug 2025 19:37:04 +0200 Subject: [PATCH 29/33] Login Passwort reset * Passwort Reset Funktion implementiert --- Layout/default/UserPasswordReset/forgot-password-sent.php | 2 +- Layout/default/UserPasswordReset/forgot-password.php | 2 +- application/UserPasswordReset/UserPasswordResetController.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Layout/default/UserPasswordReset/forgot-password-sent.php b/Layout/default/UserPasswordReset/forgot-password-sent.php index 984847279..10e192579 100644 --- a/Layout/default/UserPasswordReset/forgot-password-sent.php +++ b/Layout/default/UserPasswordReset/forgot-password-sent.php @@ -31,7 +31,7 @@ Wenn ein Konto mit diesem Benutzernamen oder dieser E-Mail existiert, wurde ein Link zum Zurücksetzen des Passworts gesendet.

    - ">Zurück zum Login + ">Zurück zum Login

    diff --git a/Layout/default/UserPasswordReset/forgot-password.php b/Layout/default/UserPasswordReset/forgot-password.php index 41ad09c2e..6a7897091 100644 --- a/Layout/default/UserPasswordReset/forgot-password.php +++ b/Layout/default/UserPasswordReset/forgot-password.php @@ -39,7 +39,7 @@

    - ">Zurück zum Login + ">Zurück zum Login

    diff --git a/application/UserPasswordReset/UserPasswordResetController.php b/application/UserPasswordReset/UserPasswordResetController.php index 974e85a11..8e2f18bf8 100644 --- a/application/UserPasswordReset/UserPasswordResetController.php +++ b/application/UserPasswordReset/UserPasswordResetController.php @@ -103,6 +103,6 @@ class UserPasswordResetController extends mfBaseController ), "id=" . (int)$user->id); $this->layout()->setFlash("Dein Passwort wurde erfolgreich geändert. Du kannst dich jetzt einloggen.", "success"); - self::redirect("mfLogin", "index"); + self::redirect("/"); } } \ No newline at end of file From ab6b14efd16a8e5d4c9e87b1340c25247bfb7f82 Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Wed, 6 Aug 2025 09:38:05 +0200 Subject: [PATCH 30/33] improved warehouse module --- lib/TTCrud/TTCrud.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/TTCrud/TTCrud.php b/lib/TTCrud/TTCrud.php index 0fba0af34..d16b0ff14 100644 --- a/lib/TTCrud/TTCrud.php +++ b/lib/TTCrud/TTCrud.php @@ -45,8 +45,9 @@ class TTCrud extends mfBaseController { $this->redirect("Dashboard"); - foreach ([str_replace('Controller', 'Model', $className), str_replace('Controller', '', $className)] as $m) { - if (class_exists($m)) + $c = get_class($this); + foreach ([str_replace('Controller', 'Model', $c), str_replace('Controller', '', $c)] as $m) + if (class_exists($m)) { $this->model = new $m(); break; } From 46f7195a37308fea706abc49c857af00dc81f5bc Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Wed, 6 Aug 2025 14:22:48 +0200 Subject: [PATCH 31/33] Login Passwort reset * Passwort Reset Funktion implementiert --- Layout/default/Device/Detail.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Layout/default/Device/Detail.php b/Layout/default/Device/Detail.php index 608c6fdda..9c43f60b4 100644 --- a/Layout/default/Device/Detail.php +++ b/Layout/default/Device/Detail.php @@ -477,8 +477,8 @@ foreach ($devicesall as $deviceall) {

    OLT/ONT Informationen

    -
    -

    Serviceports von +

    Serviceports von @@ -825,7 +825,7 @@ foreach ($devicesall as $deviceall) { if (data.success == false) { $('#olt-body').text('Keine OLT/ONT Daten verfügbar'); } else { - + $('#service-ports-h4').show(); $('#olt-body').append(`
    From edf1d879d39d08191e00f490357b57a14294c4ea Mon Sep 17 00:00:00 2001 From: Daniel Spitzer Date: Wed, 6 Aug 2025 21:34:05 +0200 Subject: [PATCH 32/33] =?UTF-8?q?Kalender=20Update=20*=20Script=20f=C3=BCr?= =?UTF-8?q?=20automatische=20Gruppenzuweisung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/calendar/create_calendar_rights.php | 88 +++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 scripts/calendar/create_calendar_rights.php diff --git a/scripts/calendar/create_calendar_rights.php b/scripts/calendar/create_calendar_rights.php new file mode 100644 index 000000000..c6d9b235c --- /dev/null +++ b/scripts/calendar/create_calendar_rights.php @@ -0,0 +1,88 @@ +id); +define("INTERNAL_USER_USERNAME", $me->username); + +$calendar = CalendarModel::search(array("checkSubscriptions" => 1)); +$adminUser = array(89, 173, 167, 8, 6, 9, 5, 123); + + +$addcalendararray = array(38, 39); + +foreach ($calendar as $cal) { + $data = []; + $update = 0; + $allCalendarUser = $allCalendar; + unset($newrights); + if (in_array($cal->user_id, $adminUser)) { + $admin = 1; + } else { + $admin = 0; + } + $insert = 1; + $rights = json_decode($cal->rights, true); + $groups = json_decode($cal->groups, true); + foreach ($addcalendararray as $addcal) { + + + foreach ($rights as $key => $right) { + if ($key == $addcal) { + $insert = 0; + + break; + } + } + + + if ($insert == 1) { + if ($admin == 1) { + $rights[$addcal] = "all"; + } else { + $rights[$addcal] = "read"; + } + + + foreach ($groups as $key => $group) { + if ($group['name'] == "Persönlich") { + $count = count($groups[$key]['calendars']); + + $groups[$key]['calendars'][$count]['calendar_id'] = $addcal; + $groups[$key]['calendars'][$count]['checked'] = 0; + $groups[$key]['calendars'][$count]['origin'] = 1; + break; + } + } + + } + + + } +// echo $insert; +// var_dump($groups); + if (!$groups) { + echo $cal->user_id; + } + if ($insert == 1) { + if ($groups) { + $data['groups'] = json_encode($groups, JSON_UNESCAPED_UNICODE); + } + $data['rights'] = json_encode($rights, JSON_UNESCAPED_UNICODE); +// var_dump(json_encode($groups, JSON_UNESCAPED_UNICODE)); +// var_dump(json_encode($rights, JSON_UNESCAPED_UNICODE)); + $cal->update($data); + echo "save" . $cal->id . "\n"; + $cal->save(); + } + + +} \ No newline at end of file From 448ed9cf151db098dc9c5e8e4988829954211dcb Mon Sep 17 00:00:00 2001 From: Luca Haid Date: Thu, 7 Aug 2025 13:28:29 +0200 Subject: [PATCH 33/33] updated vodia identity --- Layout/default/footer.php | 2 +- Layout/default/topbar.php | 39 --- public/assets/css/thetool.css | 51 ++-- public/assets/js/xinon-vodia-identity.js | 374 +++++++++++++++-------- 4 files changed, 268 insertions(+), 198 deletions(-) diff --git a/Layout/default/footer.php b/Layout/default/footer.php index 730bee028..f90a93c75 100644 --- a/Layout/default/footer.php +++ b/Layout/default/footer.php @@ -16,7 +16,7 @@ is("employee") && !isset($_SESSION[MFAPPNAME . '_warehouse_login_override'])): ?> - +
    OLT