Upload via GUI (290 Dateien)

This commit is contained in:
2026-10-23 17:22:17 +00:00
parent 2edb95aecc
commit 234099d0e7
10 changed files with 768 additions and 7 deletions
+103
View File
@@ -1227,6 +1227,109 @@ function run_migrations(PDO $pdo, bool $verbose = false): array
}
}
// Migration 0044: Antworten des digitalen Assistenten (zusätzlich zur Wissensdatenbank).
if (!isset($done['php_0044_assistant_answers'])) {
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 assistant_answers (
id $ai,
title VARCHAR(255) NOT NULL,
keywords TEXT NULL,
answer TEXT NOT NULL,
is_active TINYINT(1) NOT NULL DEFAULT 1,
hits INT NOT NULL DEFAULT 0,
created_at DATETIME NULL,
updated_at DATETIME NULL
)$eng");
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0044_assistant_answers']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0044_assistant_answers';
} catch (Throwable $e) {
$result['errors'][] = 'php_0044_assistant_answers: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0044_assistant_answers - ' . $e->getMessage();
}
}
// Migration 0045: Protokoll der Fragen an den digitalen Assistenten.
if (!isset($done['php_0045_assistant_log'])) {
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 assistant_log (
id $ai,
question VARCHAR(300) NOT NULL,
result VARCHAR(20) NOT NULL,
source VARCHAR(10) NULL,
matched_id INT NULL,
matched_title VARCHAR(255) NULL,
ticket_number VARCHAR(40) NULL,
created_at DATETIME NOT NULL
)$eng");
$pdo->exec('CREATE INDEX idx_assistant_log_created ON assistant_log (created_at)');
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0045_assistant_log']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0045_assistant_log';
} catch (Throwable $e) {
$result['errors'][] = 'php_0045_assistant_log: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0045_assistant_log - ' . $e->getMessage();
}
}
// Migration 0046: Wiedervorlage, Beobachter, Kundenerinnerung, Rückmeldung zu Antworten des Assistenten.
if (!isset($done['php_0046_ticket_extras'])) {
try {
$drv = $pdo->getAttribute(PDO::ATTR_DRIVER_NAME);
$has = function (string $table, string $col) use ($pdo): bool {
try { $pdo->query("SELECT $col FROM $table LIMIT 1"); return true; } catch (Throwable $e) { return false; }
};
if (!$has('tickets', 'snoozed_until')) $pdo->exec('ALTER TABLE tickets ADD COLUMN snoozed_until DATETIME NULL');
if (!$has('tickets', 'snoozed_by')) $pdo->exec('ALTER TABLE tickets ADD COLUMN snoozed_by INT NULL');
if (!$has('tickets', 'reminder_sent_at')) $pdo->exec('ALTER TABLE tickets ADD COLUMN reminder_sent_at DATETIME NULL');
$eng = $drv === 'sqlite' ? '' : ' ENGINE=InnoDB DEFAULT CHARSET=utf8mb4';
$pdo->exec("CREATE TABLE IF NOT EXISTS ticket_followers (
ticket_id INT NOT NULL,
staff_id INT NOT NULL,
created_at DATETIME NOT NULL,
PRIMARY KEY (ticket_id, staff_id)
)$eng");
if (!$has('assistant_log', 'helpful')) $pdo->exec('ALTER TABLE assistant_log ADD COLUMN helpful TINYINT NULL');
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0046_ticket_extras']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0046_ticket_extras';
} catch (Throwable $e) {
$result['errors'][] = 'php_0046_ticket_extras: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0046_ticket_extras - ' . $e->getMessage();
}
}
// Migration 0047: einmalige Anmelde-Adressen für die Übergabe von der App an die Weboberfläche.
if (!isset($done['php_0047_web_login_tokens'])) {
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 web_login_tokens (
id $ai,
staff_id INT NOT NULL,
token_hash VARCHAR(64) NOT NULL,
path VARCHAR(255) NOT NULL,
created_at DATETIME NOT NULL,
expires_at DATETIME NOT NULL,
used_at DATETIME NULL
)$eng");
$pdo->exec('CREATE UNIQUE INDEX idx_web_login_tokens_hash ON web_login_tokens (token_hash)');
$pdo->prepare('INSERT INTO schema_migrations (migration) VALUES (?)')->execute(['php_0047_web_login_tokens']);
$result['applied']++;
if ($verbose) $result['log'][] = ' [OK] php_0047_web_login_tokens';
} catch (Throwable $e) {
$result['errors'][] = 'php_0047_web_login_tokens: ' . $e->getMessage();
if ($verbose) $result['log'][] = ' [FAIL] php_0047_web_login_tokens - ' . $e->getMessage();
}
}
return $result;
}