Merge pull request 'Timzone' (#59) from dev into main
Reviewed-on: #59
This commit was merged in pull request #59.
This commit is contained in:
@@ -1453,9 +1453,9 @@ require_once __DIR__ . '/includes/header.php';
|
||||
</p>
|
||||
</div>
|
||||
<div class="flex items-center space-x-2 flex-shrink-0">
|
||||
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border border-emerald-500/20">
|
||||
<span class="inline-flex items-center px-2.5 py-1 rounded-full text-xs font-semibold bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border border-emerald-500/20" title="Tijdzone: Europe/Amsterdam (UTC+2 in zomertijd / UTC+1 in wintertijd)">
|
||||
<span class="w-1.5 h-1.5 rounded-full bg-emerald-500 mr-1.5 animate-pulse"></span>
|
||||
Live Audit Logging Actief
|
||||
Live Audit Logging Actief • NL Tijd
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -1464,7 +1464,7 @@ require_once __DIR__ . '/includes/header.php';
|
||||
<table class="w-full text-left text-xs text-slate-600 dark:text-slate-300">
|
||||
<thead>
|
||||
<tr class="border-b border-slate-200 dark:border-slate-800 text-[11px] font-bold uppercase tracking-wider text-slate-400 dark:text-slate-500">
|
||||
<th class="py-3 px-3">Tijdstip</th>
|
||||
<th class="py-3 px-3">Tijdstip (NL)</th>
|
||||
<th class="py-3 px-3">Gebruiker / Doel</th>
|
||||
<th class="py-3 px-3">Actie</th>
|
||||
<th class="py-3 px-3">IP-adres</th>
|
||||
|
||||
+21
-1
@@ -32,6 +32,7 @@ function get_db_connection(): PDO {
|
||||
");
|
||||
}
|
||||
|
||||
$tzOffset = date('P'); // Dynamische offset conform Europe/Amsterdam (+02:00 in zomertijd, +01:00 in wintertijd)
|
||||
$options = [
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
||||
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
||||
@@ -41,6 +42,9 @@ function get_db_connection(): PDO {
|
||||
if (defined('PDO::MYSQL_ATTR_MULTI_STATEMENTS')) {
|
||||
$options[PDO::MYSQL_ATTR_MULTI_STATEMENTS] = true;
|
||||
}
|
||||
if (defined('PDO::MYSQL_ATTR_INIT_COMMAND')) {
|
||||
$options[PDO::MYSQL_ATTR_INIT_COMMAND] = "SET time_zone = '{$tzOffset}'";
|
||||
}
|
||||
|
||||
$dsnWithDb = sprintf(
|
||||
'mysql:host=%s;port=%s;dbname=%s;charset=%s',
|
||||
@@ -53,6 +57,8 @@ function get_db_connection(): PDO {
|
||||
// 2. CHECK: Bestaat de database al?
|
||||
try {
|
||||
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
||||
// Garandeer dat MariaDB sessietijd 1-op-1 synchroon loopt met PHP tijd (Europe/Amsterdam)
|
||||
$pdo->exec("SET time_zone = '{$tzOffset}'");
|
||||
ensure_tables_exist($pdo);
|
||||
return $pdo;
|
||||
|
||||
@@ -70,6 +76,7 @@ function get_db_connection(): PDO {
|
||||
));
|
||||
|
||||
$pdo = new PDO($dsnWithDb, DB_USER, DB_PASS, $options);
|
||||
$pdo->exec("SET time_zone = '{$tzOffset}'");
|
||||
ensure_tables_exist($pdo);
|
||||
return $pdo;
|
||||
|
||||
@@ -228,8 +235,21 @@ function ensure_tables_exist(PDO $pdo): void {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Zorg dat eerdere audit logs die in UTC (+00:00) zijn weggeschreven worden gesynchroniseerd naar Europe/Amsterdam (+2 uur)
|
||||
try {
|
||||
$stmtCheck = $pdo->query("SELECT setting_value FROM system_settings WHERE setting_key = 'audit_logs_tz_fixed' LIMIT 1");
|
||||
$fixed = $stmtCheck ? $stmtCheck->fetchColumn() : null;
|
||||
if (!$fixed) {
|
||||
// Pas bestaande audit logs eenmalig aan zodat de weergave klopt met de lokale tijd
|
||||
$pdo->exec("UPDATE audit_logs SET created_at = DATE_ADD(created_at, INTERVAL 2 HOUR)");
|
||||
$pdo->prepare("
|
||||
INSERT INTO system_settings (setting_key, setting_value, created_at, updated_at)
|
||||
VALUES ('audit_logs_tz_fixed', '1', NOW(), NOW())
|
||||
ON DUPLICATE KEY UPDATE setting_value = '1', updated_at = NOW()
|
||||
")->execute();
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
// Stil negeren indien tabellen nog in opbouw zijn
|
||||
// Stil negeren indien system_settings tabel nog niet bestaat
|
||||
}
|
||||
} catch (Throwable $e) {
|
||||
error_log("Fout bij controleren tabellen: " . $e->getMessage());
|
||||
|
||||
+4
-2
@@ -112,9 +112,10 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = ''
|
||||
$statusNormalized = 'SUCCESS';
|
||||
}
|
||||
|
||||
$createdAt = date('Y-m-d H:i:s');
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO audit_logs (user_id, user_email, action, resource_type, resource_id, details, ip_address, user_agent, status, created_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NOW())
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
");
|
||||
$stmt->execute([
|
||||
$userId ?: null,
|
||||
@@ -125,7 +126,8 @@ function fociz_log_audit(?int $userId, string $action, string $resourceType = ''
|
||||
$detailsJson,
|
||||
$ip,
|
||||
$ua,
|
||||
$statusNormalized
|
||||
$statusNormalized,
|
||||
$createdAt
|
||||
]);
|
||||
} catch (Throwable $e) {
|
||||
// Audit log mag NOOIT de applicatiewerking breken
|
||||
|
||||
Reference in New Issue
Block a user