prepare intranet for first Dokploy deployment

This commit is contained in:
2026-08-26 12:59:51 +02:00
parent 5cfe688bdc
commit 29dfb85fef
1321 changed files with 227234 additions and 0 deletions
File diff suppressed because it is too large Load Diff
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

@@ -0,0 +1,162 @@
<?php
/* Name: brandschutz_cron.php
Beschreibung: Monatlicher Cron-Job (am 1. des Monats) für Brandschutz-Schulungserinnerungen
Aufgaben:
1. Einen Monat vor Ablauf: Erste Erinnerungsmail an den Nutzer
2. Nach Ablauf der Frist: Monatliche Erinnerungsmail an den Nutzer
3. 4+ Monate nach Ablauf: Eskalation an Admins (aktive Systemnachricht + Mail)
Aufruf: php brandschutz_cron.php (via Cron: 0 8 1 * *)
*/
// Initialisierung
if (PHP_SAPI !== 'cli') {
http_response_code(403);
exit('Forbidden');
}
$_SERVER['DOCUMENT_ROOT'] = '/var/www/html';
$_SERVER['HTTP_HOST'] = getenv('INTRANET_FQDN') ?: 'localhost';
$pdo = require $_SERVER['DOCUMENT_ROOT'] . '/intranet_repo/general_files/ini/database.php';
require_once $_SERVER['DOCUMENT_ROOT'] . '/intranet_repo/general_files/ini/send_mail.php';
$today = date('Y-m-d');
$log = [];
// Alle Nutzer mit Brandschutz-Rolle laden
$sql = "SELECT ugi.user_id, ugi.first_name, ugi.last_name, ugi.mail,
bt.last_training_date, bt.reminder_count, bt.admin_reminder_count
FROM user_permissions up
INNER JOIN user_general_information ugi ON up.user_id = ugi.user_id
LEFT JOIN brandschutz_training bt ON ugi.user_id = bt.user_id
WHERE up.\"Brandschutz\" = 1";
$result = $pdo->query($sql);
$users = $result->fetchAll(PDO::FETCH_ASSOC);
foreach ($users as $bsUser) {
$userId = (int)$bsUser['user_id'];
$firstName = $bsUser['first_name'] ?? '';
$lastName = $bsUser['last_name'] ?? '';
$mail = $bsUser['mail'] ?? '';
$fullName = trim("{$firstName} {$lastName}");
if (empty($fullName)) $fullName = $mail;
$greeting = !empty($firstName) ? "Hallo {$firstName}" : "Hallo";
$lastTraining = $bsUser['last_training_date'];
$reminderCount = (int)($bsUser['reminder_count'] ?? 0);
$adminReminderCount = (int)($bsUser['admin_reminder_count'] ?? 0);
// Sicherstellen dass ein Tracking-Eintrag existiert
$stmtEnsure = $pdo->prepare("INSERT INTO brandschutz_training (user_id) VALUES (?) ON CONFLICT (user_id) DO NOTHING");
$stmtEnsure->execute([$userId]);
// Fälligkeit berechnen
if (empty($lastTraining)) {
// Nie geschult = sofort fällig
$dueDate = $today;
$daysUntilDue = -1; // Bereits fällig
$daysOverdue = 1;
} else {
$dueDate = date('Y-m-d', strtotime($lastTraining . ' +365 days'));
$daysUntilDue = (int)((strtotime($dueDate) - strtotime($today)) / 86400);
$daysOverdue = $daysUntilDue < 0 ? abs($daysUntilDue) : 0;
}
// Szenario 1: Einen Monat vor Ablauf (0-30 Tage verbleibend) - Erste Erinnerung
if ($daysUntilDue >= 0 && $daysUntilDue <= 30 && $reminderCount === 0) {
$dueDateFormatted = date('d.m.Y', strtotime($dueDate));
$subject = "Erinnerung: Brandschutzunterweisung bis {$dueDateFormatted} fällig";
$message = "{$greeting},\n\nIhre Brandschutzunterweisung läuft am {$dueDateFormatted} ab.\n\n";
$message .= "Die Schulung dauert nur etwa 20 Minuten und kann bequem vom Handy oder PC aus durchgeführt werden.\n\n";
$message .= "Bitte absolvieren Sie die Unterweisung innerhalb der nächsten zwei Monate über das Intranet.\n\n";
$message .= "Vielen Dank!";
$brandschutzUrl = "https://" . $_SERVER['HTTP_HOST'] . "/intranet_repo/projects/brandschutz/brandschutz.php";
send_intranet_mail($mail, $subject, $message, null, "intranet@nak-reinickendorf.de", "Zur Brandschutzunterweisung", $brandschutzUrl);
// Zähler erhöhen
$stmtUpdate = $pdo->prepare("UPDATE brandschutz_training SET reminder_count = reminder_count + 1 WHERE user_id = ?");
$stmtUpdate->execute([$userId]);
// Log in erledigte Nachrichten
$sysSubject = "Brandschutz-Erinnerung gesendet: {$fullName}";
$sysMessage = "Automatische Erinnerungsmail an {$fullName} ({$mail}) gesendet. Schulung fällig am {$dueDateFormatted}.";
$stmtLog = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, status, processed_at, created_at) VALUES ('system', 'System', ?, ?, ?, 'done', NOW(), NOW())");
$stmtLog->execute([$mail, $sysSubject, $sysMessage]);
$log[] = "Erste Erinnerung an {$fullName} gesendet (fällig am {$dueDateFormatted}).";
}
// Szenario 2: Frist überschritten - Monatliche Erinnerung an Nutzer
if ($daysOverdue > 0) {
$dueDateFormatted = !empty($lastTraining) ? date('d.m.Y', strtotime($dueDate)) : 'sofort';
$monthsOverdue = (int)ceil($daysOverdue / 30);
$subject = "Überfällig: Brandschutzunterweisung ({$daysOverdue} Tage)";
$message = "{$greeting},\n\nIhre Brandschutzunterweisung ist seit {$daysOverdue} Tagen überfällig";
if ($dueDateFormatted !== 'sofort') {
$message .= " (Frist war der {$dueDateFormatted})";
}
$message .= ".\n\nDie Schulung dauert nur etwa 20 Minuten und kann bequem vom Handy oder PC aus durchgeführt werden.\n\n";
$message .= "Bitte absolvieren Sie die Unterweisung umgehend über das Intranet.\n\n";
$message .= "Dies ist die {$reminderCount}. Erinnerung zu dieser Schulung.";
$brandschutzUrl = "https://" . $_SERVER['HTTP_HOST'] . "/intranet_repo/projects/brandschutz/brandschutz.php";
send_intranet_mail($mail, $subject, $message, null, "intranet@nak-reinickendorf.de", "Zur Brandschutzunterweisung", $brandschutzUrl);
// Zähler erhöhen
$stmtUpdate = $pdo->prepare("UPDATE brandschutz_training SET reminder_count = reminder_count + 1 WHERE user_id = ?");
$stmtUpdate->execute([$userId]);
// Log in erledigte Nachrichten
$sysSubject = "Brandschutz-Erinnerung gesendet: {$fullName} ({$daysOverdue} Tage überfällig)";
$sysMessage = "Automatische Erinnerungsmail (Nr. " . ($reminderCount + 1) . ") an {$fullName} ({$mail}) gesendet. Schulung seit {$daysOverdue} Tagen überfällig.";
$stmtLog = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, status, processed_at, created_at) VALUES ('system', 'System', ?, ?, ?, 'done', NOW(), NOW())");
$stmtLog->execute([$mail, $sysSubject, $sysMessage]);
$log[] = "Erinnerung Nr." . ($reminderCount + 1) . " an {$fullName} ({$daysOverdue} Tage überfällig).";
// Szenario 3: 4+ Monate überfällig - Eskalation an Brandschutzbeauftragte + Admins
if ($daysOverdue >= 120) {
$adminSubject = "ESKALATION: Brandschutzunterweisung überfällig – {$fullName}";
$adminMessage = "Die Brandschutzunterweisung von {$fullName} ({$mail}) ist seit {$daysOverdue} Tagen überfällig (mehr als 4 Monate).\n\n";
$adminMessage .= "Bitte erinnern Sie die Person persönlich an die ausstehende Schulung.\n\n";
$adminMessage .= "Bisherige Erinnerungsmails an den Nutzer: " . ($reminderCount + 1) . "\n";
$adminMessage .= "Bisherige Admin-Eskalationen: " . ($adminReminderCount + 1);
// Mail an Brandschutzbeauftragte
send_brandschutzbeauftragter_mail($pdo, $adminSubject, $adminMessage);
// Aktive (pending) Systemnachricht im Postfach
$dataJson = json_encode([
'action' => 'brandschutz_escalation',
'user_id' => $userId,
'user_name' => $fullName,
'days_overdue' => $daysOverdue
]);
$stmtAdmin = $pdo->prepare("INSERT INTO admin_messages (type, sender_name, sender_email, subject, message, status, created_at, data_json) VALUES ('system', 'System', ?, ?, ?, 'pending', NOW(), ?)");
$stmtAdmin->execute([$mail, $adminSubject, $adminMessage, $dataJson]);
// Admin-Zähler erhöhen
$stmtAdminCount = $pdo->prepare("UPDATE brandschutz_training SET admin_reminder_count = admin_reminder_count + 1 WHERE user_id = ?");
$stmtAdminCount->execute([$userId]);
$log[] = "ESKALATION an Brandschutzbeauftragte für {$fullName} ({$daysOverdue} Tage überfällig).";
}
}
}
$pdo = null;
// Ausgabe/Logging
$output = "Brandschutz-Cron ausgeführt am " . date('d.m.Y H:i:s') . "\n";
$output .= count($users) . " Nutzer mit Brandschutz-Rolle geprüft.\n";
if (!empty($log)) {
$output .= "\nAktionen:\n" . implode("\n", $log);
} else {
$output .= "\nKeine Aktionen erforderlich.";
}
echo $output . "\n";