From b1de4c08f0021ebb829cf363ea02448f3e1f93fd Mon Sep 17 00:00:00 2001 From: Bruno Eckhardt Date: Thu, 21 May 2026 12:57:29 +0200 Subject: [PATCH] new ai generated mvc logic --- WEBROOT/api/v2/schoolReports.php | 2 +- WEBROOT/config.php | 9 +- WEBROOT/index.php | 152 +++++---- WEBROOT/services/backend_request_chart.php | 105 ------ WEBROOT/services/backend_request_logs.php | 174 ---------- WEBROOT/services/berichte.php | 173 ---------- WEBROOT/services/berichte_arbeit_gen.php | 171 ---------- WEBROOT/services/domains.php | 112 ------ WEBROOT/services/logout.php | 6 - WEBROOT/services/personal_request_logs.php | 97 ------ WEBROOT/services/print_static.php | 77 ----- WEBROOT/services/public_request_chart.php | 176 ---------- WEBROOT/services/public_request_logs.php | 174 ---------- WEBROOT/services/services_control.php | 321 ------------------ WEBROOT/services/tabellen.php | 54 --- WEBROOT/services/weather_chart.php | 103 ------ .../src/MVC/Controller/AdminController.php | 248 ++++++++++++++ WEBROOT/src/MVC/Controller/LogController.php | 123 +++++++ .../src/MVC/Controller/ReportController.php | 161 +++++++++ .../src/MVC/Controller/ServiceController.php | 48 +++ WEBROOT/src/MVC/Controller/TestController.php | 83 +++++ WEBROOT/src/MVC/Core/Controller.php | 18 + WEBROOT/src/MVC/Core/View.php | 27 ++ WEBROOT/src/MVC/Layout/Layout.php | 30 ++ WEBROOT/src/MVC/Layout/Templates/main.php | 25 ++ .../{services => src/MVC/View}/api_tester.php | 289 ++-------------- WEBROOT/src/MVC/View/backend_chart.php | 72 ++++ WEBROOT/src/MVC/View/berichte.php | 115 +++++++ WEBROOT/src/MVC/View/berichte_arbeit_gen.php | 56 +++ .../{services => src/MVC/View}/data_info.php | 23 +- WEBROOT/src/MVC/View/domains.php | 26 ++ .../{services => src/MVC/View}/home_info.php | 38 +-- WEBROOT/{services => src/MVC/View}/links.php | 3 - WEBROOT/src/MVC/View/logs.php | 41 +++ WEBROOT/src/MVC/View/print_static.php | 57 ++++ WEBROOT/src/MVC/View/public_chart.php | 105 ++++++ WEBROOT/src/MVC/View/services_control.php | 193 +++++++++++ WEBROOT/src/MVC/View/tabellen.php | 40 +++ .../MVC/View}/user_control.php | 76 +---- .../MVC/View}/variablen_control.php | 28 +- WEBROOT/src/MVC/View/weather_chart.php | 45 +++ .../MVC/View}/zeiterfassung.php | 48 +-- WEBROOT/src/MVC/autoloader.php | 18 + 43 files changed, 1674 insertions(+), 2268 deletions(-) delete mode 100644 WEBROOT/services/backend_request_chart.php delete mode 100644 WEBROOT/services/backend_request_logs.php delete mode 100644 WEBROOT/services/berichte.php delete mode 100644 WEBROOT/services/berichte_arbeit_gen.php delete mode 100644 WEBROOT/services/domains.php delete mode 100644 WEBROOT/services/logout.php delete mode 100644 WEBROOT/services/personal_request_logs.php delete mode 100644 WEBROOT/services/print_static.php delete mode 100644 WEBROOT/services/public_request_chart.php delete mode 100644 WEBROOT/services/public_request_logs.php delete mode 100644 WEBROOT/services/services_control.php delete mode 100644 WEBROOT/services/tabellen.php delete mode 100644 WEBROOT/services/weather_chart.php create mode 100644 WEBROOT/src/MVC/Controller/AdminController.php create mode 100644 WEBROOT/src/MVC/Controller/LogController.php create mode 100644 WEBROOT/src/MVC/Controller/ReportController.php create mode 100644 WEBROOT/src/MVC/Controller/ServiceController.php create mode 100644 WEBROOT/src/MVC/Controller/TestController.php create mode 100644 WEBROOT/src/MVC/Core/Controller.php create mode 100644 WEBROOT/src/MVC/Core/View.php create mode 100644 WEBROOT/src/MVC/Layout/Layout.php create mode 100644 WEBROOT/src/MVC/Layout/Templates/main.php rename WEBROOT/{services => src/MVC/View}/api_tester.php (62%) create mode 100644 WEBROOT/src/MVC/View/backend_chart.php create mode 100644 WEBROOT/src/MVC/View/berichte.php create mode 100644 WEBROOT/src/MVC/View/berichte_arbeit_gen.php rename WEBROOT/{services => src/MVC/View}/data_info.php (80%) create mode 100644 WEBROOT/src/MVC/View/domains.php rename WEBROOT/{services => src/MVC/View}/home_info.php (76%) rename WEBROOT/{services => src/MVC/View}/links.php (96%) create mode 100644 WEBROOT/src/MVC/View/logs.php create mode 100644 WEBROOT/src/MVC/View/print_static.php create mode 100644 WEBROOT/src/MVC/View/public_chart.php create mode 100644 WEBROOT/src/MVC/View/services_control.php create mode 100644 WEBROOT/src/MVC/View/tabellen.php rename WEBROOT/{services => src/MVC/View}/user_control.php (63%) rename WEBROOT/{services => src/MVC/View}/variablen_control.php (61%) create mode 100644 WEBROOT/src/MVC/View/weather_chart.php rename WEBROOT/{services => src/MVC/View}/zeiterfassung.php (62%) create mode 100644 WEBROOT/src/MVC/autoloader.php diff --git a/WEBROOT/api/v2/schoolReports.php b/WEBROOT/api/v2/schoolReports.php index 6278515..82423a5 100644 --- a/WEBROOT/api/v2/schoolReports.php +++ b/WEBROOT/api/v2/schoolReports.php @@ -1,7 +1,7 @@ 'home_info', 1 => 'links', + 2 => 'tester', ), ), 'Ausbildung' => @@ -185,6 +186,12 @@ $services = array ( 'active' => true, 'adminOnly' => false, ), + 'tester' => + array ( + 'name' => 'TESTER', + 'active' => true, + 'adminOnly' => false, + ), ); $linkGroups = array ( @@ -375,4 +382,4 @@ $linkButtons = array ( 'adminOnly' => false, 'group' => 'tools', ), -); \ No newline at end of file +); diff --git a/WEBROOT/index.php b/WEBROOT/index.php index 480d1cc..edaf833 100644 --- a/WEBROOT/index.php +++ b/WEBROOT/index.php @@ -15,6 +15,8 @@ if (empty($_SESSION['user_logged_in'])) { exit; } +require_once __DIR__ . '/src/MVC/autoloader.php'; + include_once( __DIR__ . '/config.php'); include_once( __DIR__ . '/src/classes/getData.php'); include_once( __DIR__ . '/src/controller/apiController.php'); @@ -85,72 +87,100 @@ if ((new getSpecificData())->getWebsite() != "backend.blackpi.ipv64.net") { $title = "Backend"; } +// MVC Logic +$layout = new \MVC\Layout\Layout('main'); +$layout->setBlock('title', $title); + +// Header Block +ob_start(); ?> - - +Backend + + +setBlock('header', ob_get_clean()); - - - - <?= $title ?> - - +// Sidebar Block +ob_start(); +?> + $group): ?> + -
- Backend - - -
-
- + +setBlock('sidebar', ob_get_clean()); + +// Content Block +if ($selectedService) { + $controllers = [ + 'home_info' => \MVC\Controller\ServiceController::class, + 'links' => \MVC\Controller\ServiceController::class, + 'logout' => \MVC\Controller\ServiceController::class, + 'public_request_logs' => \MVC\Controller\LogController::class, + 'backend_request_logs' => \MVC\Controller\LogController::class, + 'personal_request_logs' => \MVC\Controller\LogController::class, + 'public_request_chart' => \MVC\Controller\LogController::class, + 'backend_request_chart' => \MVC\Controller\LogController::class, + 'user_control' => \MVC\Controller\AdminController::class, + 'services_control' => \MVC\Controller\AdminController::class, + 'variablen_control' => \MVC\Controller\AdminController::class, + 'data_info' => \MVC\Controller\AdminController::class, + 'tabellen' => \MVC\Controller\AdminController::class, + 'berichte' => \MVC\Controller\ReportController::class, + 'berichte_arbeit_gen' => \MVC\Controller\ReportController::class, + 'zeiterfassung' => \MVC\Controller\ReportController::class, + 'print_static' => \MVC\Controller\ReportController::class, + 'api_tester' => \MVC\Controller\TestController::class, + 'weather_chart' => \MVC\Controller\TestController::class, + 'domains' => \MVC\Controller\TestController::class, + 'tester' => \MVC\Controller\TesterController::class, + ]; + + $controllerClass = $controllers[$selectedService] ?? null; + + if ($controllerClass) { + $controller = new $controllerClass(); + $content = $controller->$selectedService(); + } else { + // Fallback to old services if not yet refactored + ob_start(); + include "services/$selectedService.php"; + $content = ob_get_clean(); + } + $layout->setBlock('content', $content); + logging(); +} else { + $layout->setBlock('content', "

Kein aktiver Service verfügbar.

"); +} + +echo $layout->render(); \ No newline at end of file diff --git a/WEBROOT/services/backend_request_chart.php b/WEBROOT/services/backend_request_chart.php deleted file mode 100644 index c657c04..0000000 --- a/WEBROOT/services/backend_request_chart.php +++ /dev/null @@ -1,105 +0,0 @@ -query($sql); - -$labels = []; -$data = []; - -if ($result->num_rows > 0) { - while($row = $result->fetch_assoc()) { - $labels[] = $row['tag']; - $data[] = (int)$row['anzahl']; - } -} - -$conn->close(); -?> - - - - - - - Logs Chart - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WEBROOT/services/backend_request_logs.php b/WEBROOT/services/backend_request_logs.php deleted file mode 100644 index 4ec5f1f..0000000 --- a/WEBROOT/services/backend_request_logs.php +++ /dev/null @@ -1,174 +0,0 @@ -getWhitelistedIPs(); -$devips_sql = "'" . implode("','", $devips) . "'"; - -// Filter -$filter = $_GET['filter'] ?? 'today'; -$customQuery = $_POST['custom_query'] ?? ''; -$useCustom = false; - -// Custom Query Schutz -if ($customQuery) { - $forbidden = ['DELETE', 'UPDATE', 'INSERT', 'DROP', 'ALTER', 'TRUNCATE']; - $upper = strtoupper($customQuery); - - foreach ($forbidden as $bad) { - if (strpos($upper, $bad) !== false) { - echo "Gefährliche Query blockiert ($bad)"; - return; - } - } - - if (stripos(trim($customQuery), "SELECT") !== 0) { - echo "Nur SELECT erlaubt"; - return; - } - - $sql = $customQuery; - $useCustom = true; -} - -// Standard Queries -if (!$useCustom) { - switch ($filter) { - case 'today': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE DATE(FIRST_REQUEST) = CURDATE() - AND (WEBSITE = 'backend.blackpi.ipv64.net') - AND CLIENT_IP NOT IN ($devips_sql) - ORDER BY FIRST_REQUEST DESC - "; - break; - - case 'counterperip': - $sql = " - SELECT CLIENT_IP, LAND, USER_AGENT, SUM(counter) AS gesamt_counter - FROM logs - WHERE (WEBSITE = 'backend.blackpi.ipv64.net') - AND CLIENT_IP NOT IN ($devips_sql) - GROUP BY CLIENT_IP - ORDER BY gesamt_counter DESC - "; - break; - - case 'node1': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node1' - AND (WEBSITE = 'backend.blackpi.ipv64.net') - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node2': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node2' - AND (WEBSITE = 'backend.blackpi.ipv64.net') - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node3': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node3' - AND (WEBSITE = 'backend.blackpi.ipv64.net') - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node4': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node4' - AND (WEBSITE = 'backend.blackpi.ipv64.net') - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - default: - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE (WEBSITE = 'backend.blackpi.ipv64.net') - AND CLIENT_IP NOT IN ($devips_sql) - ORDER BY FIRST_REQUEST DESC - "; - } -} -?> - -

📊 Logs

- -
- - - -
- - - -
- -query($sql)) { - // echo "
$sql
"; - - while ($row = $erg->fetch_object()) { - $daten[] = $row; - } -} -?> - - -Keine Daten gefunden - - -
- - - $_): ?> - - - - - - - - - - - -
-
- - \ No newline at end of file diff --git a/WEBROOT/services/berichte.php b/WEBROOT/services/berichte.php deleted file mode 100644 index 1f80fe2..0000000 --- a/WEBROOT/services/berichte.php +++ /dev/null @@ -1,173 +0,0 @@ - - - - - - - - - - - - -
-
-

- 📊 Berichtte-Vorschau: - - -

- - 0 && is_array($displayData[0])): ?> -
- - - - - - - - - - - - $cell): ?> - - - - - -
-
- -
-
- Keine tabellarischen Daten gefunden.
- Struktur: -
-
- -
-
- - - \ No newline at end of file diff --git a/WEBROOT/services/berichte_arbeit_gen.php b/WEBROOT/services/berichte_arbeit_gen.php deleted file mode 100644 index 8746474..0000000 --- a/WEBROOT/services/berichte_arbeit_gen.php +++ /dev/null @@ -1,171 +0,0 @@ -Zugriff verweigert.

"; - exit; -} - -$conn = db_connect(); - -$conn->query("SET @row := 0"); - -$wochenQuery = " -SELECT MIN(DATUM) AS start_date, - MAX(DATUM) AS end_date -FROM ( - SELECT DATUM, - DATE_SUB(DATUM, INTERVAL (@row := @row + 1) DAY) AS grp - FROM Firmenberichte - ORDER BY DATUM -) AS t -GROUP BY grp -ORDER BY start_date; -"; - -$resultWochen = $conn->query($wochenQuery); - -$wochenArray = []; -while($row = $resultWochen->fetch_assoc()){ - $wochenArray[] = $row; -} - -// Standard-Datenbereich: letzte 5 Tage -$startDate = $_POST['start_date'] ?? date('Y-m-d', strtotime('-5 days')); -$endDate = $_POST['end_date'] ?? date('Y-m-d'); - -$berichteQuery = "SELECT `DATUM`, `PROZESS_1`, `PROZESS_2`, `PROZESS_3`, `PROZESS_4` - FROM Firmenberichte - WHERE `DATUM` BETWEEN ? AND ?"; - -$stmt = $conn->prepare($berichteQuery); -$stmt->bind_param("ss", $startDate, $endDate); -$stmt->execute(); -$result = $stmt->get_result(); - -$berichteArray = []; -while($row = $result->fetch_assoc()){ - $berichteArray[] = $row; -} - -$stmt->close(); -$conn->close(); - -// PDF-Generierung -function generatePDF($berichteArray) { - $Einzelstunden = "2"; - $Gesamtstunden = "8"; - $data = [ - 'Text1' => '', // Nr - 'Text2' => $berichteArray[0]['DATUM'] ?? '', - 'Text3' => end($berichteArray)['DATUM'] ?? '', - 'Text4' => 'Eckhardt', - 'Text5' => 'Bruno Renato', - 'Text6' => '1', - ]; - - $fieldIndex = 7; - foreach ($berichteArray as $bericht) { - for ($i = 1; $i <= 4; $i++) { - $data["Text$fieldIndex"] = $bericht["PROZESS_$i"] ?? ''; - $fieldIndex++; - $data["Text$fieldIndex"] = $Einzelstunden; - $fieldIndex++; - } - $data["Text$fieldIndex"] = $Gesamtstunden; - $fieldIndex++; - } - - $fdfFields = array_map(function($field, $value){ - $value = str_replace(['(', ')'], ['\(', '\)'], $value); - return "<< /T ($field) /V ($value) >>"; - }, array_keys($data), $data); - - $fdf = "%FDF-1.2\n1 0 obj\n<<\n/FDF << /Fields [\n" . - implode("\n", $fdfFields) . - "\n] >> >>\nendobj\ntrailer\n<< /Root 1 0 R >>\n%%EOF"; - - $fdfFile = tempnam(sys_get_temp_dir(), 'fdf_') . '.fdf'; - file_put_contents($fdfFile, $fdf); - - $inputPdf = (new getSpecificData())->getDocumentRoot() . '/templates/ausbildungsnachweis.pdf'; - ConsoleLog((new getSpecificData())->getDocumentRoot() . '/templates/ausbildungsnachweis.pdf'); - $outputPdf = (new getSpecificData())->getDocumentRoot() . '/static/ausbildungsnachweis_' . $berichteArray[0]['DATUM'] . '-' . end($berichteArray)['DATUM'] . '.pdf'; - - exec("pdftk $inputPdf fill_form $fdfFile output $outputPdf flatten"); - - unlink($fdfFile); - - return $outputPdf; -} - -// Handle PDF generation -$pdfFile = null; -if (isset($_POST['generate_pdf']) && count($berichteArray) > 0) { - $pdfFile = generatePDF($berichteArray); -} -?> - -
-

Ausbildungsberichte PDF erstellen

- -
- - - - - - - -
- - -
- erfolgreich erstellt! -
- -
- Keine Berichte im gewählten Zeitraum gefunden. -
- - -
-

Verfügbare Wochenabschnitte:

-
    - getDocumentRoot() . '/static/'; - foreach($wochenArray as $woche): - $pdfName = 'ausbildungsnachweis_' . $woche['start_date'] . '-' . $woche['end_date'] . '.pdf'; - $pdfPath = $outputDir . $pdfName; - $exists = file_exists($pdfPath); - ?> -
  • - bis - - - (PDF vorhanden) - - Download - - - - - (noch keine PDF) -
    - - - - -
    - - -
  • - -
-
- - - - -
\ No newline at end of file diff --git a/WEBROOT/services/domains.php b/WEBROOT/services/domains.php deleted file mode 100644 index b3a9509..0000000 --- a/WEBROOT/services/domains.php +++ /dev/null @@ -1,112 +0,0 @@ - - - -

- Domain Verwaltung -

- - -
- -
- - - -
- - - -
- - "> - - - - "> - -
- - - - - -
- -
- - - - - - -
- -

Neu

- - - - - - - -
- - -
\ No newline at end of file diff --git a/WEBROOT/services/logout.php b/WEBROOT/services/logout.php deleted file mode 100644 index ddaae81..0000000 --- a/WEBROOT/services/logout.php +++ /dev/null @@ -1,6 +0,0 @@ -getWhitelistedIPs(); -$devips_sql = "'" . implode("','", $devips) . "'"; - -// Filter & Custom Query -$customQuery = $_POST['custom_query'] ?? ''; -$sql = ''; -$useCustom = false; - -// Custom Query Schutz -if ($customQuery) { - $forbidden = ['DELETE', 'UPDATE', 'INSERT', 'DROP', 'ALTER', 'TRUNCATE']; - $upper = strtoupper($customQuery); - - foreach ($forbidden as $bad) { - if (strpos($upper, $bad) !== false) { - echo "Gefährliche Query blockiert ($bad)"; - return; - } - } - - if (stripos(trim($customQuery), "SELECT") !== 0) { - echo "Nur SELECT erlaubt"; - return; - } - - $sql = $customQuery; - $useCustom = true; -} - -// Standard Query (falls kein Custom Query) -if (!$useCustom) { - // Einfache Standard-Query für Logs ohne Dev-IPs - $sql = " - SELECT WEBSITE, REQUEST_URL, FIRST_REQUEST, COUNTER - FROM logs - WHERE CLIENT_IP = '" . (new getSpecificData())->getClientIP() . "' - ORDER BY FIRST_REQUEST DESC - "; -} - -if (isset($_POST['delete_logs'])) { - DatabaseDelete( - "logs", - "CLIENT_IP = ?", - (new getSpecificData())->getClientIP() - ); - header("Location: " . (new getSpecificData())->getReferer()); - exit; -} - -?> - -

📊 Logs

- -query($sql)) { - while ($row = $erg->fetch_object()) { - $daten[] = $row; - } -} -?> - - -Keine Daten gefunden - - -
- getIsAdmin()): ?> -
- -
- - - - $_): ?> - - - - - - - - - - - -
-
- - \ No newline at end of file diff --git a/WEBROOT/services/print_static.php b/WEBROOT/services/print_static.php deleted file mode 100644 index 280b165..0000000 --- a/WEBROOT/services/print_static.php +++ /dev/null @@ -1,77 +0,0 @@ -Alle Dateien drucken'; - -echo ''; -?> - - - - \ No newline at end of file diff --git a/WEBROOT/services/public_request_chart.php b/WEBROOT/services/public_request_chart.php deleted file mode 100644 index 5680cc2..0000000 --- a/WEBROOT/services/public_request_chart.php +++ /dev/null @@ -1,176 +0,0 @@ -query($sql_total); - -$totalDataAssoc = []; -$allLabels = []; - -if ($result_total->num_rows > 0) { - while($row = $result_total->fetch_assoc()) { - $date = $row['tag']; - $totalDataAssoc[$date] = (int)$row['anzahl']; - $allLabels[] = $date; - } -} - -// Nodes -$nodes = ['node1','node2','node3','node4']; -$nodeDataAssoc = []; - -foreach ($nodes as $node) { - $sql = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs WHERE SERVER_IP = '$node' GROUP BY DATE(FIRST_REQUEST)"; - $result = $conn->query($sql); - - $data = []; - if ($result->num_rows > 0) { - while($row = $result->fetch_assoc()) { - $date = $row['tag']; - $data[$date] = (int)$row['anzahl']; - if (!in_array($date, $allLabels)) { - $allLabels[] = $date; - } - } - } - $nodeDataAssoc[$node] = $data; -} - -// Alle Labels chronologisch sortieren -sort($allLabels); - -// Finales Array: Gesamt + Nodes -$finalTotalData = []; -$finalNodeData = []; - -foreach ($allLabels as $label) { - $finalTotalData[] = isset($totalDataAssoc[$label]) ? $totalDataAssoc[$label] : 0; - - foreach ($nodes as $node) { - if (!isset($finalNodeData[$node])) $finalNodeData[$node] = []; - $finalNodeData[$node][] = isset($nodeDataAssoc[$node][$label]) ? $nodeDataAssoc[$node][$label] : 0; - } -} - -$conn->close(); -?> - - - - - - - Logs Chart - - - - - - - - - - - - - \ No newline at end of file diff --git a/WEBROOT/services/public_request_logs.php b/WEBROOT/services/public_request_logs.php deleted file mode 100644 index 20887cd..0000000 --- a/WEBROOT/services/public_request_logs.php +++ /dev/null @@ -1,174 +0,0 @@ -getWhitelistedIPs(); -$devips_sql = "'" . implode("','", $devips) . "'"; - -// Filter -$filter = $_GET['filter'] ?? 'today'; -$customQuery = $_POST['custom_query'] ?? ''; -$useCustom = false; - -// Custom Query Schutz -if ($customQuery) { - $forbidden = ['DELETE', 'UPDATE', 'INSERT', 'DROP', 'ALTER', 'TRUNCATE']; - $upper = strtoupper($customQuery); - - foreach ($forbidden as $bad) { - if (strpos($upper, $bad) !== false) { - echo "Gefährliche Query blockiert ($bad)"; - return; - } - } - - if (stripos(trim($customQuery), "SELECT") !== 0) { - echo "Nur SELECT erlaubt"; - return; - } - - $sql = $customQuery; - $useCustom = true; -} - -// Standard Queries -if (!$useCustom) { - switch ($filter) { - case 'today': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE CLIENT_IP NOT IN ($devips_sql) - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - AND DATE(FIRST_REQUEST) = CURDATE() - ORDER BY FIRST_REQUEST DESC - "; - break; - - case 'counterperip': - $sql = " - SELECT CLIENT_IP, LAND, USER_AGENT, SUM(counter) AS gesamt_counter - FROM logs - WHERE CLIENT_IP NOT IN ($devips_sql) - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - GROUP BY CLIENT_IP - ORDER BY gesamt_counter DESC - "; - break; - - case 'node1': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node1' - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node2': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node2' - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node3': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node3' - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - case 'node4': - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE `SERVER_IP` = 'node4' - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - ORDER BY `FIRST_REQUEST` DESC - "; - break; - - default: - $sql = " - SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` - FROM logs - WHERE CLIENT_IP NOT IN ($devips_sql) - AND (WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL) - ORDER BY FIRST_REQUEST DESC - "; -} -} -?> - -

📊 Logs

- -
- - - -
- - - -
- -query($sql)) { - // echo "
$sql
"; - - while ($row = $erg->fetch_object()) { - $daten[] = $row; - } -} -?> - - -Keine Daten gefunden - - -
- - - $_): ?> - - - - - - - - - - - -
-
- - \ No newline at end of file diff --git a/WEBROOT/services/services_control.php b/WEBROOT/services/services_control.php deleted file mode 100644 index 1466d41..0000000 --- a/WEBROOT/services/services_control.php +++ /dev/null @@ -1,321 +0,0 @@ -getReferer()); - exit; -} - -if (isset($_POST['save']) && ($_SESSION['logged_in'] ?? false)) { - copy($configFile, $backupDir . '/config_' . date('Y-m-d_H-i-s') . '.php'); - - $newServices = []; - $serviceToGroupMapping = []; - if(isset($_POST['services'])){ - foreach ($_POST['services'] as $id => $s) { - $finalId = !empty($s['new_id']) ? trim($s['new_id']) : $id; - if (empty($finalId)) continue; - $newServices[$finalId] = [ - 'name' => $s['name'], - 'active' => isset($s['active']), - 'adminOnly' => isset($s['adminOnly']) - ]; - if(!empty($s['targetGroup'])) { - $serviceToGroupMapping[$s['targetGroup']][] = $finalId; - } - } - (new RightsController())->RightsHandler($s['name']); - } - - $newServiceGroups = []; - if(isset($_POST['serviceGroups'])){ - foreach ($_POST['serviceGroups'] as $id => $groupData) { - $finalId = !empty($groupData['new_id']) ? trim($groupData['new_id']) : $id; - if (empty($finalId)) continue; - $currentServices = $serviceToGroupMapping[$finalId] ?? ($serviceGroups[$id]['services'] ?? []); - $newServiceGroups[$finalId] = [ - 'label' => $groupData['label'], - 'defaultOpen' => isset($groupData['defaultOpen']), - 'services' => array_values(array_unique($currentServices)) - ]; - } - } - - $newLinkGroups = []; - if(isset($_POST['linkGroups'])){ - foreach ($_POST['linkGroups'] as $id => $lg) { - $finalId = !empty($lg['new_id']) ? trim($lg['new_id']) : $id; - if (empty($finalId)) continue; - $newLinkGroups[$finalId] = [ - 'label' => $lg['label'], - 'color' => $lg['color'], - 'defaultOpen' => isset($lg['defaultOpen']) - ]; - } - } - - $newLinkButtons = []; - if(isset($_POST['linkButtons'])){ - foreach ($_POST['linkButtons'] as $btn) { - if (empty($btn['label'])) continue; - $newLinkButtons[] = [ - 'label' => $btn['label'], - 'url' => $btn['url'], - 'newTab' => isset($btn['newTab']), - 'adminOnly' => isset($btn['adminOnly']), - 'group' => $btn['group'] - ]; - } - } - - $content = " - - - - - - Admin Site Control - - - - -
- - - -
-

Seitenverwaltung

-
- -
-
- -
- - -

📦 Sidebar Gruppen - -

-
- $group): ?> -
- ID: - - -
- -
- - -

🖥 Sidebar Services - -

-
- $s): ?> -
- Datei: .php - - - - - | - -
- -
- - -

🎨 Dashboard Kategorien - -

-
- $lg): ?> -
- ID: - - - - -
- -
- - -

🔘 Dashboard Kacheln - -

-
- $btn): ?> -
- - - - -
- - | - -
-
- -
- -
- -
- -
-
- -
- - - - - - \ No newline at end of file diff --git a/WEBROOT/services/tabellen.php b/WEBROOT/services/tabellen.php deleted file mode 100644 index e42708b..0000000 --- a/WEBROOT/services/tabellen.php +++ /dev/null @@ -1,54 +0,0 @@ - - -

Datenbank Struktur

- -
- - - - -
- -"; - echo ""; - echo " - - - - - - - "; - - foreach ($structure as $column) { - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - echo ""; - } - - echo "
FieldTypeNullKeyDefaultExtra
" . ($column['Field']) . "" . ($column['Type']) . "" . ($column['Null']) . "" . ($column['Key']) . "" . ($column['Default']) . "" . ($column['Extra']) . "
"; - echo "
"; -} -?> \ No newline at end of file diff --git a/WEBROOT/services/weather_chart.php b/WEBROOT/services/weather_chart.php deleted file mode 100644 index b8a3c54..0000000 --- a/WEBROOT/services/weather_chart.php +++ /dev/null @@ -1,103 +0,0 @@ -query($sql); - -$labels = []; -$data = []; - -if ($result->num_rows > 0) { - while($row = $result->fetch_assoc()) { - $labels[] = $row['ZEIT']; - $data[] = (float)$row['AKTUELL']; - } -} - -$conn->close(); -?> - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/WEBROOT/src/MVC/Controller/AdminController.php b/WEBROOT/src/MVC/Controller/AdminController.php new file mode 100644 index 0000000..78a9e3a --- /dev/null +++ b/WEBROOT/src/MVC/Controller/AdminController.php @@ -0,0 +1,248 @@ +setUser( + $_POST['name'], + $_POST['nachname'], + $_POST['email'], + $_POST['passwort'], + $_POST['rolle'], + $_POST['admin'] ?? 0, + $_POST['home_ip'] + ); + header("Location: " . $specificData->getReferer()); + exit; + } + + if (isset($_POST['delete_user']) && $isAdmin) { + $userCtrl = new \UserController(); + $userCtrl->DeleteUser( + $_POST['delete_name'], + $_POST['delete_nachname'], + $_POST['delete_email'] + ); + header("Location: " . $specificData->getReferer()); + exit; + } + + if (isset($_POST['password'])) { + if (isset($superuser['admin']['password']) && $_POST['password'] === $superuser['admin']['password']) { + $_SESSION['logged_in'] = true; + } else { + $error = "Falsches Passwort!"; + } + } + + if (isset($_POST['logout'])) { + unset($_SESSION['logged_in']); + header("Location: " . $specificData->getReferer()); + exit; + } + } + + // Data Fetching + if ($isAdmin) { + $users = \DatabaseShow("Benutzer", "NAME, NACHNAME, EMAIL, ROLLE, ADMIN, HOME_IP"); + } else { + $users = \DatabaseShow( + "Benutzer", + "NAME, NACHNAME, EMAIL, ROLLE, ADMIN, HOME_IP", + "NAME = ?", + $specificData->getUsername() + ); + } + + return $this->render('user_control', [ + 'users' => $users, + 'isAdmin' => $isAdmin, + 'error' => $error ?? null, + 'loggedIn' => $_SESSION['logged_in'] ?? false + ]); + } + + public function services_control() { + global $isAdmin, $superuser, $serviceGroups, $services, $linkGroups, $linkButtons; + if (!$isAdmin) return "Access Denied"; + + $configFile = 'config.php'; + $backupDir = 'config_backups'; + + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST['password'])) { + if (isset($superuser['admin']['password']) && $_POST['password'] === $superuser['admin']['password']) { + $_SESSION['logged_in'] = true; + } else { + $error = "Falsches Passwort!"; + } + } + + if (isset($_POST['logout'])) { + unset($_SESSION['logged_in']); + header("Location: " . (new \getSpecificData())->getReferer()); + exit; + } + + if (isset($_POST['save']) && ($_SESSION['logged_in'] ?? false)) { + if (!is_dir($backupDir)) mkdir($backupDir, 0755, true); + copy($configFile, $backupDir . '/config_' . date('Y-m-d_H-i-s') . '.php'); + + $newServices = []; + $serviceToGroupMapping = []; + if(isset($_POST['services'])){ + foreach ($_POST['services'] as $id => $s) { + $finalId = !empty($s['new_id']) ? trim($s['new_id']) : $id; + if (empty($finalId)) continue; + $newServices[$finalId] = [ + 'name' => $s['name'], + 'active' => isset($s['active']), + 'adminOnly' => isset($s['adminOnly']) + ]; + if(!empty($s['targetGroup'])) { + $serviceToGroupMapping[$s['targetGroup']][] = $finalId; + } + } + (new \RightsController())->RightsHandler($s['name']); + } + + $newServiceGroups = []; + if(isset($_POST['serviceGroups'])){ + foreach ($_POST['serviceGroups'] as $id => $groupData) { + $finalId = !empty($groupData['new_id']) ? trim($groupData['new_id']) : $id; + if (empty($finalId)) continue; + $currentServices = $serviceToGroupMapping[$finalId] ?? ($serviceGroups[$id]['services'] ?? []); + $newServiceGroups[$finalId] = [ + 'label' => $groupData['label'], + 'defaultOpen' => isset($groupData['defaultOpen']), + 'services' => array_values(array_unique($currentServices)) + ]; + } + } + + $newLinkGroups = []; + if(isset($_POST['linkGroups'])){ + foreach ($_POST['linkGroups'] as $id => $lg) { + $finalId = !empty($lg['new_id']) ? trim($lg['new_id']) : $id; + if (empty($finalId)) continue; + $newLinkGroups[$finalId] = [ + 'label' => $lg['label'], + 'color' => $lg['color'], + 'defaultOpen' => isset($lg['defaultOpen']) + ]; + } + } + + $newLinkButtons = []; + if(isset($_POST['linkButtons'])){ + foreach ($_POST['linkButtons'] as $btn) { + if (empty($btn['label'])) continue; + $newLinkButtons[] = [ + 'label' => $btn['label'], + 'url' => $btn['url'], + 'newTab' => isset($btn['newTab']), + 'adminOnly' => isset($btn['adminOnly']), + 'group' => $btn['group'] + ]; + } + } + + $content = "getReferer()); + exit; + } + } + } + + $message = $_SESSION['status_message'] ?? null; + unset($_SESSION['status_message']); + + return $this->render('services_control', [ + 'serviceGroups' => $serviceGroups, + 'services' => $services, + 'linkGroups' => $linkGroups, + 'linkButtons' => $linkButtons, + 'loggedIn' => $_SESSION['logged_in'] ?? false, + 'error' => $error ?? null, + 'message' => $message + ]); + } + + public function variablen_control() { + global $isAdmin; + if (!$isAdmin) return "Access Denied"; + + if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['toggle_variable'])) { + $name = $_POST['variablenname']; + $current = (new \getSpecificData())->getLoggingStatus($name)[0]['WERT']; + $newValue = ($current === "ON") ? "OFF" : "ON"; + + \DatabaseUpdate("Variablen", "WERT = ?", "VARIABLENNAME = ?", $newValue, $name); + header("Location: " . (new \getSpecificData())->getReferer()); + exit; + } + + $variablen = \DatabaseShow("Variablen", "VARIABLENNAME, WERT, ANZEIGENAME"); + return $this->render('variablen_control', ['variablen' => $variablen]); + } + + public function data_info() { + global $isAdmin; + if (!$isAdmin) return "Access Denied"; + + $data = new \getSpecificData(); + $allData = $data->getAllData(); + + $groupedData = []; + foreach ($allData as $key => $value) { + if (strpos($key, ' - ') !== false) { + [$group, $field] = explode(' - ', $key, 2); + } else { + $group = 'Other'; + $field = $key; + } + $groupedData[$group][$field] = $value; + } + + return $this->render('data_info', ['groupedData' => $groupedData]); + } + + public function tabellen() { + global $isAdmin; + if (!$isAdmin) return "Access Denied"; + + $tables = \DatabaseShowTables(); + $selectedTable = $_GET['table'] ?? null; + $structure = []; + + if ($selectedTable && in_array($selectedTable, $tables)) { + $structure = \DatabaseShowTableStructure($selectedTable); + } + + return $this->render('tabellen', [ + 'tables' => $tables, + 'selectedTable' => $selectedTable, + 'structure' => $structure + ]); + } +} diff --git a/WEBROOT/src/MVC/Controller/LogController.php b/WEBROOT/src/MVC/Controller/LogController.php new file mode 100644 index 0000000..09dd328 --- /dev/null +++ b/WEBROOT/src/MVC/Controller/LogController.php @@ -0,0 +1,123 @@ +getWhitelistedIPs(); + return "'" . implode("','", $devips) . "'"; + } + + protected function handleLogs($websiteFilter, $serviceName) { + $conn = \db_connect(); + $devips_sql = $this->getDevIpsSql(); + $filter = $_GET['filter'] ?? 'today'; + + switch ($filter) { + case 'today': + $sql = "SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` FROM logs WHERE DATE(FIRST_REQUEST) = CURDATE() AND $websiteFilter AND CLIENT_IP NOT IN ($devips_sql) ORDER BY FIRST_REQUEST DESC"; + break; + case 'counterperip': + $sql = "SELECT CLIENT_IP, LAND, USER_AGENT, SUM(counter) AS gesamt_counter FROM logs WHERE $websiteFilter AND CLIENT_IP NOT IN ($devips_sql) GROUP BY CLIENT_IP ORDER BY gesamt_counter DESC"; + break; + case 'node1': + case 'node2': + case 'node3': + case 'node4': + $node = $filter; + $sql = "SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` FROM logs WHERE `SERVER_IP` = '$node' AND $websiteFilter ORDER BY `FIRST_REQUEST` DESC"; + break; + default: + $sql = "SELECT `CLIENT_IP`, `LAND`, `REQUEST_URL`, `COUNTER`, `FIRST_REQUEST`, `WEBSITE` FROM logs WHERE $websiteFilter AND CLIENT_IP NOT IN ($devips_sql) ORDER BY FIRST_REQUEST DESC"; + } + + $daten = []; + if ($erg = $conn->query($sql)) { + while ($row = $erg->fetch_assoc()) { + $daten[] = $row; + } + } + + return $this->render('logs', [ + 'daten' => $daten, + 'filter' => $filter, + 'serviceName' => $serviceName + ]); + } + + public function public_request_logs() { + return $this->handleLogs("(WEBSITE != 'backend.blackpi.ipv64.net' OR WEBSITE IS NULL)", 'public_request_logs'); + } + + public function backend_request_logs() { + return $this->handleLogs("(WEBSITE = 'backend.blackpi.ipv64.net')", 'backend_request_logs'); + } + + public function personal_request_logs() { + return $this->handleLogs("1=1", 'personal_request_logs'); + } + + public function public_request_chart() { + $conn = \db_connect(); + $sql_total = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs GROUP BY DATE(FIRST_REQUEST) ORDER BY DATE(FIRST_REQUEST)"; + $result_total = $conn->query($sql_total); + + $totalDataAssoc = []; + $allLabels = []; + while($row = $result_total->fetch_assoc()) { + $date = $row['tag']; + $totalDataAssoc[$date] = (int)$row['anzahl']; + $allLabels[] = $date; + } + + $nodes = ['node1','node2','node3','node4']; + $nodeDataAssoc = []; + foreach ($nodes as $node) { + $sql = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs WHERE SERVER_IP = '$node' GROUP BY DATE(FIRST_REQUEST)"; + $result = $conn->query($sql); + $data = []; + while($row = $result->fetch_assoc()) { + $date = $row['tag']; + $data[$date] = (int)$row['anzahl']; + if (!in_array($date, $allLabels)) $allLabels[] = $date; + } + $nodeDataAssoc[$node] = $data; + } + sort($allLabels); + + $finalTotalData = []; + $finalNodeData = []; + foreach ($allLabels as $label) { + $finalTotalData[] = $totalDataAssoc[$label] ?? 0; + foreach ($nodes as $node) { + $finalNodeData[$node][] = $nodeDataAssoc[$node][$label] ?? 0; + } + } + + return $this->render('public_chart', [ + 'allLabels' => $allLabels, + 'finalTotalData' => $finalTotalData, + 'finalNodeData' => $finalNodeData + ]); + } + + public function backend_request_chart() { + $conn = \db_connect(); + $sql = "SELECT DATE(FIRST_REQUEST) as tag, COUNT(*) as anzahl FROM logs WHERE WEBSITE = 'backend.blackpi.ipv64.net' GROUP BY DATE(FIRST_REQUEST) ORDER BY DATE(FIRST_REQUEST)"; + $result = $conn->query($sql); + + $labels = []; + $data = []; + while($row = $result->fetch_assoc()) { + $labels[] = $row['tag']; + $data[] = (int)$row['anzahl']; + } + + return $this->render('backend_chart', [ + 'labels' => $labels, + 'data' => $data + ]); + } +} diff --git a/WEBROOT/src/MVC/Controller/ReportController.php b/WEBROOT/src/MVC/Controller/ReportController.php new file mode 100644 index 0000000..86c1ec8 --- /dev/null +++ b/WEBROOT/src/MVC/Controller/ReportController.php @@ -0,0 +1,161 @@ +render('berichte', [ + 'mode' => $mode, + 'displayData' => $displayData, + 'count' => $count, + 'selectedService' => $_GET['service'] ?? 'berichte' + ]); + } + + public function berichte_arbeit_gen() { + if (empty($_SESSION['user_logged_in'])) return "Access Denied"; + + $conn = \db_connect(); + $conn->query("SET @row := 0"); + + $wochenQuery = " + SELECT MIN(DATUM) AS start_date, MAX(DATUM) AS end_date + FROM ( + SELECT DATUM, DATE_SUB(DATUM, INTERVAL (@row := @row + 1) DAY) AS grp + FROM Firmenberichte + ORDER BY DATUM + ) AS t + GROUP BY grp + ORDER BY start_date; + "; + + $resultWochen = $conn->query($wochenQuery); + $wochenArray = []; + while($row = $resultWochen->fetch_assoc()) $wochenArray[] = $row; + + $startDate = $_POST['start_date'] ?? date('Y-m-d', strtotime('-5 days')); + $endDate = $_POST['end_date'] ?? date('Y-m-d'); + + $berichteQuery = "SELECT `DATUM`, `PROZESS_1`, `PROZESS_2`, `PROZESS_3`, `PROZESS_4` FROM Firmenberichte WHERE `DATUM` BETWEEN ? AND ?"; + $stmt = $conn->prepare($berichteQuery); + $stmt->bind_param("ss", $startDate, $endDate); + $stmt->execute(); + $result = $stmt->get_result(); + $berichteArray = []; + while($row = $result->fetch_assoc()) $berichteArray[] = $row; + $stmt->close(); + $conn->close(); + + $pdfFile = null; + if (isset($_POST['generate_pdf']) && count($berichteArray) > 0) { + $pdfFile = $this->generatePDF($berichteArray); + } + + return $this->render('berichte_arbeit_gen', [ + 'startDate' => $startDate, + 'endDate' => $endDate, + 'wochenArray' => $wochenArray, + 'pdfFile' => $pdfFile, + 'berichteArray' => $berichteArray + ]); + } + + protected function generatePDF($berichteArray) { + $Einzelstunden = "2"; + $Gesamtstunden = "8"; + $data = [ + 'Text1' => '', // Nr + 'Text2' => $berichteArray[0]['DATUM'] ?? '', + 'Text3' => end($berichteArray)['DATUM'] ?? '', + 'Text4' => 'Eckhardt', + 'Text5' => 'Bruno Renato', + 'Text6' => '1', + ]; + + $fieldIndex = 7; + foreach ($berichteArray as $bericht) { + for ($i = 1; $i <= 4; $i++) { + $data["Text$fieldIndex"] = $bericht["PROZESS_$i"] ?? ''; + $fieldIndex++; + $data["Text$fieldIndex"] = $Einzelstunden; + $fieldIndex++; + } + $data["Text$fieldIndex"] = $Gesamtstunden; + $fieldIndex++; + } + + $fdfFields = array_map(function($field, $value){ + $value = str_replace(['(', ')'], ['\(', '\)'], $value); + return "<< /T ($field) /V ($value) >>"; + }, array_keys($data), $data); + + $fdf = "%FDF-1.2\n1 0 obj\n<<\n/FDF << /Fields [\n" . implode("\n", $fdfFields) . "\n] >> >>\nendobj\ntrailer\n<< /Root 1 0 R >>\n%%EOF"; + + $fdfFile = tempnam(sys_get_temp_dir(), 'fdf_') . '.fdf'; + file_put_contents($fdfFile, $fdf); + + $specificData = new \getSpecificData(); + $inputPdf = $specificData->getDocumentRoot() . '/templates/ausbildungsnachweis.pdf'; + $outputPdf = $specificData->getDocumentRoot() . '/static/ausbildungsnachweis_' . $berichteArray[0]['DATUM'] . '-' . end($berichteArray)['DATUM'] . '.pdf'; + + exec("pdftk $inputPdf fill_form $fdfFile output $outputPdf flatten"); + unlink($fdfFile); + + return $outputPdf; + } + + public function zeiterfassung() { + $conn = \db_connect(); + + if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['add_overtime'])) { + $datum = $_POST['ot_date']; + $minuten = intval($_POST['ot_minutes']); + $grund = $conn->real_escape_string($_POST['ot_reason']); + \DatabaseInsert("Ueberstunden", "DATUM, MINUTEN, GRUND", $datum, $minuten, $grund); + \redirectToWebsite((new \getSpecificData())->getReferer()); + exit; + } + + $minuten_berichte = 0; + $res1 = $conn->query("SELECT SUM(OVERTIME) AS summe FROM Firmenberichte"); + if ($row = $res1->fetch_object()) $minuten_berichte = intval($row->summe); + + $minuten_abbau = 0; + $res2 = $conn->query("SELECT SUM(MINUTEN) AS summe FROM Ueberstunden WHERE GRUND = 'Abbau'"); + if ($row = $res2->fetch_object()) $minuten_abbau = intval($row->summe); + + $minuten_aufbau = 0; + $res3 = $conn->query("SELECT SUM(MINUTEN) AS summe FROM Ueberstunden WHERE GRUND = 'Aufbau'"); + if ($row = $res3->fetch_object()) $minuten_aufbau = intval($row->summe); + + $gesamt_minuten = $minuten_berichte - $minuten_abbau + $minuten_aufbau; + $conn->close(); + + return $this->render('zeiterfassung', [ + 'gesamt_minuten' => $gesamt_minuten, + 'username' => $_SESSION['username'] + ]); + } + + public function print_static() { + $dir = (new \getSpecificData())->getDocumentRoot() . "/static"; + $files = is_dir($dir) ? array_diff(scandir($dir), ['.', '..']) : []; + + return $this->render('print_static', ['files' => $files]); + } +} diff --git a/WEBROOT/src/MVC/Controller/ServiceController.php b/WEBROOT/src/MVC/Controller/ServiceController.php new file mode 100644 index 0000000..9337ecb --- /dev/null +++ b/WEBROOT/src/MVC/Controller/ServiceController.php @@ -0,0 +1,48 @@ +render('home_info', [ + 'username' => $username, + 'is_superuser' => $is_superuser, + 'is_admin' => $is_admin, + 'db_res' => $db_res + ]); + } + + public function links() { + global $linkButtons, $linkGroups, $isAdmin; + + return $this->render('links', [ + 'linkButtons' => $linkButtons, + 'linkGroups' => $linkGroups, + 'isAdmin' => $isAdmin + ]); + } + + public function logout() { + session_destroy(); + header('Location: login.php'); + exit; + } + + // Placeholder for other services + public function __call($name, $arguments) { + return "Service $name logic not implemented yet in Controller."; + } +} diff --git a/WEBROOT/src/MVC/Controller/TestController.php b/WEBROOT/src/MVC/Controller/TestController.php new file mode 100644 index 0000000..347421b --- /dev/null +++ b/WEBROOT/src/MVC/Controller/TestController.php @@ -0,0 +1,83 @@ +isFile() || $file->getExtension() !== 'php') continue; + $relativePath = str_replace($apiDir . DIRECTORY_SEPARATOR, '', $file->getPathname()); + $relativePath = str_replace('\\', '/', $relativePath); + $apiOptions[] = 'api/' . $relativePath; + } + } + sort($apiOptions); + + return $this->render('api_tester', [ + 'apiOptions' => $apiOptions, + 'defaultToken' => "15a437d128c918633e57dc7d18118a073b807644f21731ed5a7ebcf3eca9e242" + ]); + } + + public function weather_chart() { + $conn = \db_connect(); + $sql = "SELECT ZEIT, AKTUELL FROM Wetter"; + $result = $conn->query($sql); + + $labels = []; + $data = []; + if ($result->num_rows > 0) { + while($row = $result->fetch_assoc()) { + $labels[] = $row['ZEIT']; + $data[] = (float)$row['AKTUELL']; + } + } + $conn->close(); + + return $this->render('weather_chart', [ + 'labels' => $labels, + 'data' => $data + ]); + } + + public function domains() { + $statusMsg = ""; + + if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (isset($_POST["add_domain"])) { + $subdomain = trim($_POST["subdomain"]); + if ($subdomain != "") { + \DatabaseInsert("Domains", "SUBDOMAIN", $subdomain); + $statusMsg = "Domain wurde hinzugefügt."; + } + } + if (isset($_POST["delete_domain"])) { + $id = intval($_POST["id"]); + \DatabaseDelete("Domains", "ID = ?", $id); + $statusMsg = "Domain wurde gelöscht."; + } + if (isset($_POST["save_domain"])) { + $id = intval($_POST["id"]); + $subdomain = trim($_POST["subdomain"]); + \DatabaseUpdate("Domains", "SUBDOMAIN = ?", "ID = ?", $subdomain, $id); + $statusMsg = "Domain wurde gespeichert."; + } + } + + $domains = \DatabaseShow("Domains", "*"); + return $this->render('domains', [ + 'domains' => $domains, + 'statusMsg' => $statusMsg + ]); + } +} diff --git a/WEBROOT/src/MVC/Core/Controller.php b/WEBROOT/src/MVC/Core/Controller.php new file mode 100644 index 0000000..0f6809b --- /dev/null +++ b/WEBROOT/src/MVC/Core/Controller.php @@ -0,0 +1,18 @@ +view = new View(__DIR__ . '/../View'); + } + + protected function render($template, $data = []) { + foreach ($data as $key => $value) { + $this->view->assign($key, $value); + } + return $this->view->render($template); + } +} diff --git a/WEBROOT/src/MVC/Core/View.php b/WEBROOT/src/MVC/Core/View.php new file mode 100644 index 0000000..5b45389 --- /dev/null +++ b/WEBROOT/src/MVC/Core/View.php @@ -0,0 +1,27 @@ +viewPath = $viewPath; + } + + public function assign($key, $value) { + $this->data[$key] = $value; + } + + public function render($template) { + extract($this->data); + $file = $this->viewPath . '/' . $template . '.php'; + if (file_exists($file)) { + ob_start(); + include $file; + return ob_get_clean(); + } + return "View $template not found at $file"; + } +} diff --git a/WEBROOT/src/MVC/Layout/Layout.php b/WEBROOT/src/MVC/Layout/Layout.php new file mode 100644 index 0000000..074b904 --- /dev/null +++ b/WEBROOT/src/MVC/Layout/Layout.php @@ -0,0 +1,30 @@ +template = $template; + } + + public function setBlock($name, $content) { + $this->blocks[$name] = $content; + } + + public function getBlock($name) { + return $this->blocks[$name] ?? ''; + } + + public function render() { + $layoutFile = __DIR__ . '/Templates/' . $this->template . '.php'; + if (file_exists($layoutFile)) { + ob_start(); + include $layoutFile; + return ob_get_clean(); + } + return "Layout template {$this->template} not found."; + } +} diff --git a/WEBROOT/src/MVC/Layout/Templates/main.php b/WEBROOT/src/MVC/Layout/Templates/main.php new file mode 100644 index 0000000..bda14c6 --- /dev/null +++ b/WEBROOT/src/MVC/Layout/Templates/main.php @@ -0,0 +1,25 @@ + + + + + + <?= $this->getBlock('title') ?> + + getBlock('head') ?> + + +
+ getBlock('header') ?> +
+
+ +
+ getBlock('content') ?> +
+
+ + getBlock('scripts') ?> + + diff --git a/WEBROOT/services/api_tester.php b/WEBROOT/src/MVC/View/api_tester.php similarity index 62% rename from WEBROOT/services/api_tester.php rename to WEBROOT/src/MVC/View/api_tester.php index 212c743..3f771b6 100644 --- a/WEBROOT/services/api_tester.php +++ b/WEBROOT/src/MVC/View/api_tester.php @@ -1,60 +1,4 @@ -isFile()) { - continue; - } - - if ($file->getExtension() !== 'php') { - continue; - } - - // relativen Pfad erzeugen - $relativePath = str_replace( - $apiDir . DIRECTORY_SEPARATOR, - '', - $file->getPathname() - ); - - // Windows kompatibel - $relativePath = str_replace('\\', '/', $relativePath); - - $apiOptions[] = 'api/' . $relativePath; - } -} - -// sortieren -sort($apiOptions); - -// Standard Token -$defaultToken = "15a437d128c918633e57dc7d18118a073b807644f21731ed5a7ebcf3eca9e242"; -?> -
-

🛠️ API Tester

-
-
-
-
-
-
-
-
-
- -
- - -
-
-
- - - - - + +
-
- - - - - + +
- -
- - - - - + +
-
- -
- Bereit für Anfragen. -
- +
Bereit für Anfragen.
-
\ No newline at end of file + diff --git a/WEBROOT/src/MVC/View/backend_chart.php b/WEBROOT/src/MVC/View/backend_chart.php new file mode 100644 index 0000000..e11ee92 --- /dev/null +++ b/WEBROOT/src/MVC/View/backend_chart.php @@ -0,0 +1,72 @@ + + + + + + \ No newline at end of file diff --git a/WEBROOT/src/MVC/View/berichte.php b/WEBROOT/src/MVC/View/berichte.php new file mode 100644 index 0000000..a3390c2 --- /dev/null +++ b/WEBROOT/src/MVC/View/berichte.php @@ -0,0 +1,115 @@ + + +

+ 📊 Berichtte-Vorschau: + +
+ + + + + + + +
+

+ + 0 && is_array($displayData[0])): ?> +
+ + + + + + + + + + + + $cell): ?> + + + + + +
+
+ +
+
+ Keine tabellarischen Daten gefunden. +
+
+ diff --git a/WEBROOT/src/MVC/View/berichte_arbeit_gen.php b/WEBROOT/src/MVC/View/berichte_arbeit_gen.php new file mode 100644 index 0000000..66eb9f4 --- /dev/null +++ b/WEBROOT/src/MVC/View/berichte_arbeit_gen.php @@ -0,0 +1,56 @@ +
+

Ausbildungsberichte PDF erstellen

+ +
+ + + + + + + +
+ + +
+ erfolgreich erstellt! +
+ +
+ Keine Berichte im gewählten Zeitraum gefunden. +
+ + +
+

Verfügbare Wochenabschnitte:

+
    + getDocumentRoot() . '/static/' . $pdfName; + $exists = file_exists($pdfPath); + ?> +
  • + bis + + + (PDF vorhanden) + + Download + + + (noch keine PDF) +
    + + + +
    + +
  • + +
+
+ +
diff --git a/WEBROOT/services/data_info.php b/WEBROOT/src/MVC/View/data_info.php similarity index 80% rename from WEBROOT/services/data_info.php rename to WEBROOT/src/MVC/View/data_info.php index cad2b50..fe4e562 100644 --- a/WEBROOT/services/data_info.php +++ b/WEBROOT/src/MVC/View/data_info.php @@ -1,20 +1,3 @@ -getAllData(); - -// Daten nach Gruppen sortieren -$groupedData = []; -foreach ($allData as $key => $value) { - if (strpos($key, ' - ') !== false) { - [$group, $field] = explode(' - ', $key, 2); - } else { - $group = 'Other'; - $field = $key; - } - $groupedData[$group][$field] = $value; -} -?> -

System & Client Info

$fields): ?> @@ -36,7 +19,6 @@ foreach ($allData as $key => $value) { - - \ No newline at end of file + diff --git a/WEBROOT/src/MVC/View/domains.php b/WEBROOT/src/MVC/View/domains.php new file mode 100644 index 0000000..cec1753 --- /dev/null +++ b/WEBROOT/src/MVC/View/domains.php @@ -0,0 +1,26 @@ +

Domain Verwaltung

+ + +
+ + +
+ +
+ "> + + "> +
+ + +
+
+ + +
+

Neu

+ + + +
+
diff --git a/WEBROOT/services/home_info.php b/WEBROOT/src/MVC/View/home_info.php similarity index 76% rename from WEBROOT/services/home_info.php rename to WEBROOT/src/MVC/View/home_info.php index 39dc69b..cadc3bc 100644 --- a/WEBROOT/services/home_info.php +++ b/WEBROOT/src/MVC/View/home_info.php @@ -1,17 +1,3 @@ - -
@@ -40,17 +26,17 @@ $db_res = DatabaseShow(

🛡️ Status & Rechte

diff --git a/WEBROOT/services/links.php b/WEBROOT/src/MVC/View/links.php similarity index 96% rename from WEBROOT/services/links.php rename to WEBROOT/src/MVC/View/links.php index 2d7e5d4..d79ffc4 100644 --- a/WEBROOT/services/links.php +++ b/WEBROOT/src/MVC/View/links.php @@ -10,14 +10,11 @@ if (!isset($linkGroups) || !is_array($linkGroups)) { } ?> - - diff --git a/WEBROOT/src/MVC/View/weather_chart.php b/WEBROOT/src/MVC/View/weather_chart.php new file mode 100644 index 0000000..e4dc0f0 --- /dev/null +++ b/WEBROOT/src/MVC/View/weather_chart.php @@ -0,0 +1,45 @@ + + + + + + diff --git a/WEBROOT/services/zeiterfassung.php b/WEBROOT/src/MVC/View/zeiterfassung.php similarity index 62% rename from WEBROOT/services/zeiterfassung.php rename to WEBROOT/src/MVC/View/zeiterfassung.php index e64f9b9..8170346 100644 --- a/WEBROOT/services/zeiterfassung.php +++ b/WEBROOT/src/MVC/View/zeiterfassung.php @@ -1,45 +1,3 @@ -real_escape_string($_POST['ot_reason']); - - DatabaseInsert( - "Ueberstunden", - "DATUM, MINUTEN, GRUND", - $datum, - $minuten, - $grund - ); - - redirectToWebsite((new getSpecificData())->getReferer()); - exit; -} - -// --- Gesamtsumme berechnen --- -$minuten_berichte = 0; -$res1 = $conn->query("SELECT SUM(OVERTIME) AS summe FROM Firmenberichte"); -if ($row = $res1->fetch_object()) { $minuten_berichte = intval($row->summe); } - -$minuten_abbau = 0; -$res2 = $conn->query("SELECT SUM(MINUTEN) AS summe FROM Ueberstunden WHERE GRUND = 'Abbau'"); -if ($row = $res2->fetch_object()) { $minuten_abbau = intval($row->summe); } - -$minuten_aufbau = 0; -$res2 = $conn->query("SELECT SUM(MINUTEN) AS summe FROM Ueberstunden WHERE GRUND = 'Aufbau'"); -if ($row = $res2->fetch_object()) { $minuten_aufbau = intval($row->summe); } - -$gesamt_minuten = $minuten_berichte - $minuten_abbau + $minuten_aufbau; -?> -
@@ -50,7 +8,7 @@ $gesamt_minuten = $minuten_berichte - $minuten_abbau + $minuten_aufbau; h min
- +
@@ -65,9 +23,7 @@ $gesamt_minuten = $minuten_berichte - $minuten_abbau + $minuten_aufbau;
-