Upload via GUI (335 Dateien)

This commit is contained in:
2026-10-24 20:14:51 +00:00
parent c3b6bd5dcd
commit 7ee6d97c63
8 changed files with 536 additions and 0 deletions
+108
View File
@@ -1330,6 +1330,114 @@ function run_migrations(PDO $pdo, bool $verbose = false): array
}
}
// Migration 0048: Zufriedenheitsabfrage (CSAT), Statusseite für Kunden und Ticket-Vorlagen.
if (!isset($done['php_0048_csat_status_templates'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$ai = $drv === 'sqlite' ? 'INTEGER PRIMARY KEY AUTOINCREMENT' : 'INT AUTO_INCREMENT PRIMARY KEY';
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS ticket_csat (
id $ai,
ticket_id INT NOT NULL,
token VARCHAR(64) NOT NULL,
staff_id INT NULL,
department_id INT NULL,
rating TINYINT NULL,
comment TEXT NULL,
sent_at DATETIME NOT NULL,
answered_at DATETIME NULL
)$eng");
$pdo->exec('CREATE UNIQUE INDEX idx_ticket_csat_ticket ON ticket_csat (ticket_id)');
$pdo->exec('CREATE UNIQUE INDEX idx_ticket_csat_token ON ticket_csat (token)');
$pdo->exec("CREATE TABLE IF NOT EXISTS status_components (
id $ai,
name VARCHAR(120) NOT NULL,
description VARCHAR(255) NULL,
status VARCHAR(20) NOT NULL DEFAULT 'operational',
sort_order INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL
)$eng");
$pdo->exec("CREATE TABLE IF NOT EXISTS status_incidents (
id $ai,
title VARCHAR(200) NOT NULL,
body TEXT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'investigating',
impact VARCHAR(20) NOT NULL DEFAULT 'minor',
component_id INT NULL,
created_by INT NULL,
created_at DATETIME NOT NULL,
updated_at DATETIME NOT NULL,
resolved_at DATETIME NULL
)$eng");
$pdo->exec('CREATE INDEX idx_status_incidents_created ON status_incidents (created_at)');
$pdo->exec("CREATE TABLE IF NOT EXISTS status_incident_updates (
id $ai,
incident_id INT NOT NULL,
status VARCHAR(20) NOT NULL,
body TEXT NULL,
created_by INT NULL,
created_at DATETIME NOT NULL
)$eng");
$pdo->exec('CREATE INDEX idx_status_incident_updates_incident ON status_incident_updates (incident_id)');
$pdo->exec("CREATE TABLE IF NOT EXISTS ticket_templates (
id $ai,
name VARCHAR(120) NOT NULL,
description VARCHAR(255) NULL,
subject VARCHAR(200) NOT NULL DEFAULT '',
body TEXT NULL,
department_id INT NULL,
help_topic_id INT NULL,
priority_id INT NULL,
is_public TINYINT NOT NULL DEFAULT 1,
is_active TINYINT NOT NULL DEFAULT 1,
sort_order INT NOT NULL DEFAULT 0,
created_at DATETIME NOT NULL
)$eng");
$defaults = ['csat_enabled' => '0', 'csat_delay_minutes' => '30', 'status_page_enabled' => '0', 'status_page_title' => 'Systemstatus'];
$chk = $pdo->prepare('SELECT COUNT(*) FROM settings WHERE setting_key = ?');
$ins = $pdo->prepare('INSERT INTO settings (setting_key, setting_value) VALUES (?,?)');
foreach ($defaults as $k => $v) {
$chk->execute([$k]);
if ((int) $chk->fetchColumn() === 0) $ins->execute([$k, $v]);
}
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0048_csat_status_templates']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0048_csat_status_templates';
} catch (Throwable $e) {
$result['errors'][] = 'php_0048_csat_status_templates: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0048_csat_status_templates - ' . $e->getMessage();
}
}
// Migration 0049: gesammelte, noch nicht übersetzte Texte (Sammelmodus der Mehrsprachigkeit).
if (!isset($done['php_0049_i18n_missing'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$ai = $drv === 'sqlite' ? 'INTEGER PRIMARY KEY AUTOINCREMENT' : 'INT AUTO_INCREMENT PRIMARY KEY';
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS i18n_missing (
id $ai,
text_hash CHAR(32) NOT NULL,
text VARCHAR(400) NOT NULL,
hits INT NOT NULL DEFAULT 1,
last_seen DATETIME NOT NULL
)$eng");
$pdo->exec('CREATE UNIQUE INDEX idx_i18n_missing_hash ON i18n_missing (text_hash)');
$chk = $pdo->prepare('SELECT COUNT(*) FROM settings WHERE setting_key = ?');
$ins = $pdo->prepare('INSERT INTO settings (setting_key, setting_value) VALUES (?,?)');
foreach (['default_language' => 'de', 'i18n_collect' => '0'] as $k => $v) {
$chk->execute([$k]);
if ((int) $chk->fetchColumn() === 0) $ins->execute([$k, $v]);
}
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0049_i18n_missing']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0049_i18n_missing';
} catch (Throwable $e) {
$result['errors'][] = 'php_0049_i18n_missing: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0049_i18n_missing - ' . $e->getMessage();
}
}
return $result;
}