Files
awo-hamburg-intranet/module/knowledgecenter_update/Installation/Installation.php
Moritz Weinmann 743476f64a Module tasks + knowledgecenter_update aus Kundenprojekt übernehmen (bereinigt)
Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt:

Knowledgecenter:
- Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten
- Files-Gallery-Lizenzschlüssel entfernt (config.php)
- Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur,
  nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss),
  Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge
- 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …)

Tasks:
- Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments)
- Task-Definitionen und Verlinkungen geleert
- Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 09:20:02 +02:00

444 lines
19 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
function echoSuccess($message)
{
echo "<div style='background-color:#e6ffed;color:#267b3c;padding:15px;
border:1px solid #b2dfdb;border-radius:5px;margin:20px;
font-family:sans-serif;'>✅ $message</div>";
}
function echoError($message)
{
echo "<div style='background-color:#ffe6e6;color:#a33;padding:15px;
border:1px solid #f5c2c2;border-radius:5px;margin:20px;
font-family:sans-serif;'>❌ $message</div>";
}
// Beispielhafte DB-Verbindung (nur Dummy für Kontext)
if (!isset($GLOBALS['mysql_con'])) {
echoError("Keine Datenbankverbindung gefunden.");
exit;
}
// Tabellen-Erstellung
function create_tables()
{
$allSuccess = true;
$queries = [
// Tabellenname => SQL
"knowledgecenter_posts" => "CREATE TABLE IF NOT EXISTS knowledgecenter_posts (
id INT AUTO_INCREMENT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
modified_by VARCHAR(255) COMMENT 'Name des Main Contact',
preview_inline TINYINT(1) NOT NULL DEFAULT 1 COMMENT '0 = keine Inline-Vorschau, 1 = Inline-Vorschau',
background_color VARCHAR(9) NOT NULL DEFAULT '#FFFFFF',
text_color VARCHAR(9) NOT NULL DEFAULT '#000000'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_contacts" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
main_contact_id INT NOT NULL,
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_mandant" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_mandant (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
mandant_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_department" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_department (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
department_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_files" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_files (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
description VARCHAR(255),
path VARCHAR(500),
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_role" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_role (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
role_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_versions" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_versions (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
version_number INT NOT NULL,
language_id INT NOT NULL,
title VARCHAR(255),
image VARCHAR(255),
teaser TEXT,
content LONGTEXT,
author_id INT,
state TINYINT DEFAULT 1,
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP,
valid_from DATETIME NULL,
valid_until DATETIME NULL,
background_color VARCHAR(9) NOT NULL DEFAULT '#FFFFFF',
text_color VARCHAR(9) NOT NULL DEFAULT '#000000',
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_version_contacts" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_version_contacts (
id INT AUTO_INCREMENT PRIMARY KEY,
version_id INT NOT NULL,
contact_id INT NOT NULL,
FOREIGN KEY (version_id) REFERENCES knowledgecenter_post_versions(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_categories_update" => "CREATE TABLE IF NOT EXISTS knowledgecenter_categories_update (
id INT AUTO_INCREMENT PRIMARY KEY,
sorting INT DEFAULT 0,
state TINYINT DEFAULT 1,
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
modified_by VARCHAR(255) COMMENT 'Name des Main Contact',
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_translations" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_translations (
id INT AUTO_INCREMENT PRIMARY KEY,
category_id INT NOT NULL,
language_id INT NOT NULL,
title VARCHAR(255) NOT NULL,
image VARCHAR(255),
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_post" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_post (
id INT AUTO_INCREMENT PRIMARY KEY,
category_id INT NOT NULL,
post_id INT NOT NULL,
FOREIGN KEY (category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_mandant" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_mandant (
id INT AUTO_INCREMENT PRIMARY KEY,
category_id INT NOT NULL,
mandant_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_department" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_department (
id INT AUTO_INCREMENT PRIMARY KEY,
category_id INT NOT NULL,
department_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_role" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_role (
id INT AUTO_INCREMENT PRIMARY KEY,
category_id INT NOT NULL,
role_id INT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_post_comments" => "CREATE TABLE IF NOT EXISTS knowledgecenter_post_comments (
id INT AUTO_INCREMENT PRIMARY KEY,
post_id INT NOT NULL,
parent_id INT DEFAULT NULL,
text TEXT NOT NULL,
author_id INT NOT NULL COMMENT 'main_contact_id',
modified_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (post_id) REFERENCES knowledgecenter_posts(id) ON DELETE CASCADE,
FOREIGN KEY (parent_id) REFERENCES knowledgecenter_post_comments(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;",
"knowledgecenter_category_links" => "CREATE TABLE IF NOT EXISTS knowledgecenter_category_links (
id INT AUTO_INCREMENT PRIMARY KEY,
parent_category_id INT NOT NULL,
child_category_id INT NOT NULL,
sorting INT DEFAULT 0,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (parent_category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE,
FOREIGN KEY (child_category_id) REFERENCES knowledgecenter_categories_update(id)
ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;"
];
foreach ($queries as $name => $sql) {
if (mysqli_query($GLOBALS['mysql_con'], $sql)) {
echoSuccess("Tabelle <strong>$name</strong> wurde erfolgreich erstellt (oder existierte bereits).");
} else {
echoError("Fehler beim Erstellen der Tabelle <strong>$name</strong>: " . mysqli_error($GLOBALS['mysql_con']));
$allSuccess = false;
}
}
return $allSuccess;
}
// Ausführen der Tabellen-Erstellung
if (create_tables()) {
echoSuccess("✅ Alle Tabellen erfolgreich erstellt!");
} else {
echoError("❌ Es gab Fehler beim Erstellen einzelner Tabellen.");
}
// Jetzt die zusätzlichen Indexe mittels ALTER TABLE setzen
$indexQueries = [
// knowledgecenter_posts
"ALTER TABLE knowledgecenter_posts ADD INDEX idx_created_at (created_at);",
"ALTER TABLE knowledgecenter_posts ADD INDEX idx_modified_at (modified_at);",
"ALTER TABLE knowledgecenter_posts ADD INDEX idx_modified_by (modified_by);",
// knowledgecenter_post_contacts
"ALTER TABLE knowledgecenter_post_contacts ADD INDEX idx_post_id (post_id);",
"ALTER TABLE knowledgecenter_post_contacts ADD INDEX idx_main_contact_id (main_contact_id);",
// knowledgecenter_post_mandant
"ALTER TABLE knowledgecenter_post_mandant ADD INDEX idx_post_mandant (post_id, mandant_id);",
// knowledgecenter_post_department
"ALTER TABLE knowledgecenter_post_department ADD INDEX idx_post_department (post_id, department_id);",
// knowledgecenter_post_files
"ALTER TABLE knowledgecenter_post_files ADD INDEX idx_post_id (post_id);",
// knowledgecenter_post_role
"ALTER TABLE knowledgecenter_post_role ADD INDEX idx_post_role (post_id, role_id);",
// knowledgecenter_post_versions
"ALTER TABLE knowledgecenter_post_versions ADD INDEX idx_post_id (post_id);",
"ALTER TABLE knowledgecenter_post_versions ADD INDEX idx_post_language (post_id, language_id);",
// knowledgecenter_post_version_contacts
"ALTER TABLE knowledgecenter_post_version_contacts ADD INDEX idx_version_contact (version_id, contact_id);",
// knowledgecenter_categories_update
"ALTER TABLE knowledgecenter_categories_update ADD INDEX idx_state_sorting (state, sorting);",
"ALTER TABLE knowledgecenter_categories_update ADD INDEX idx_modified_at (modified_at);",
"ALTER TABLE knowledgecenter_categories_update ADD INDEX idx_modified_by (modified_by);",
// knowledgecenter_category_translations
"ALTER TABLE knowledgecenter_category_translations ADD INDEX idx_category_language (category_id, language_id);",
// knowledgecenter_category_post
"ALTER TABLE knowledgecenter_category_post ADD INDEX idx_category_post (category_id, post_id);",
// knowledgecenter_category_mandant
"ALTER TABLE knowledgecenter_category_mandant ADD INDEX idx_category_mandant (category_id, mandant_id);",
// knowledgecenter_category_department
"ALTER TABLE knowledgecenter_category_department ADD INDEX idx_category_department (category_id, department_id);",
// knowledgecenter_category_role
"ALTER TABLE knowledgecenter_category_role ADD INDEX idx_category_role (category_id, role_id);",
// knowledgecenter_post_comments
"ALTER TABLE knowledgecenter_post_comments ADD INDEX idx_post_id (post_id);",
"ALTER TABLE knowledgecenter_post_comments ADD INDEX idx_parent_id (parent_id);",
// knowledgecenter_category_links
"ALTER TABLE knowledgecenter_category_links ADD INDEX idx_parent_child (parent_category_id, child_category_id);"
];
foreach ($indexQueries as $query) {
if (mysqli_query($GLOBALS['mysql_con'], $query)) {
echoSuccess("Index erfolgreich erstellt: " . htmlspecialchars($query));
} else {
echoError("Fehler beim Erstellen des Index: " . mysqli_error($GLOBALS['mysql_con']) . " - Query: " . htmlspecialchars($query));
}
}
// Überprüfen, ob die Spalte "post_id" in der Tabelle "main_certificate" existiert
$checkQuery = "SHOW COLUMNS FROM main_certificate LIKE 'post_id'";
$checkResult = mysqli_query($GLOBALS['mysql_con'], $checkQuery);
if ($checkResult && mysqli_num_rows($checkResult) == 0) {
// Spalte existiert nicht hinzufügen
$alterQuery = "ALTER TABLE main_certificate ADD COLUMN post_id INT NOT NULL"; // oder NULL, je nach Anforderung
if (mysqli_query($GLOBALS['mysql_con'], $alterQuery)) {
echoSuccess("Spalte 'post_id' in Tabelle main_certificate erfolgreich hinzugefügt.");
} else {
echoError("Fehler beim Hinzufügen der Spalte 'post_id': " . mysqli_error($GLOBALS['mysql_con']));
}
} else {
echoSuccess("Spalte 'post_id' existiert bereits in main_certificate.");
}
// Array mit den Permissions, die hinzugefügt werden sollen
$permissions = [
[
'description' => 'Darf Wiki Modul installieren',
'code' => 'install_admin_kc',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Inhalte importieren',
'code' => 'import_admin_kc',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitragsliste sehen',
'code' => 'view_admin_kc_post_list',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Kategorie Admin Listen Items löschen',
'code' => 'delete_admin_kc_category_item',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Kategorie Admin Liste sehen',
'code' => 'view_admin_kc_category_list',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Kategorien erstellen',
'code' => 'create_admin_kc_category',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Kategorien bearbeiten',
'code' => 'edit_admin_kc_category',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf neuen Wiki Beitrag erstellen',
'code' => 'create_admin_kc_post',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitragsversion ändern',
'code' => 'edit_admin_kc_post_version',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf neue Wiki Beitragsversion erstellen',
'code' => 'create_admin_kc_post_version',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitragsversion löschen',
'code' => 'delete_admin_kc_post_version',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitragsdateien löschen',
'code' => 'delete_admin_kc_post_file',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitragsdateien hinzufügen',
'code' => 'add_admin_kc_post_file',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitrags Ansprechpartner verwalten',
'code' => 'manage_admin_kc_post_contacts',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitrags Einstellungen sehen',
'code' => 'view_admin_kc_post_settings',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
],
[
'description' => 'Darf Wiki Beitrags Einstellungen speichern',
'code' => 'save_admin_kc_post_settings',
'short_text' => '',
'only_main_mandant' => 1,
'default_active' => 0
]
];
// Iteriere über das Array und füge jede Permission ein:
foreach ($permissions as $perm) {
// Stelle sicher, dass Zeichenketten richtig escaped werden:
$description = mysqli_real_escape_string($GLOBALS['mysql_con'], $perm['description']);
$code = mysqli_real_escape_string($GLOBALS['mysql_con'], $perm['code']);
$short_text = mysqli_real_escape_string($GLOBALS['mysql_con'], $perm['short_text']);
$only_main_mandant = (int) $perm['only_main_mandant'];
$default_active = (int) $perm['default_active'];
// Zuerst prüfen, ob eine Permission mit diesem Code bereits existiert.
$checkSql = "SELECT id FROM main_permission WHERE code = '$code' LIMIT 1";
$checkResult = mysqli_query($GLOBALS['mysql_con'], $checkSql);
if ($checkResult && mysqli_num_rows($checkResult) > 0) {
// Falls vorhanden, kannst Du eine Erfolgsmeldung anzeigen oder den Eintrag überspringen.
echoSuccess("Permission '$description' existiert bereits.");
continue; // Weitere Verarbeitung überspringen.
}
// Falls nicht vorhanden, führe das INSERT aus:
$insertSql = "INSERT INTO `main_permission` (`id`, `description`, `code`, `short_text`, `only_main_mandant`, `default_active`)
VALUES (NULL, '$description', '$code', '$short_text', '$only_main_mandant', '$default_active')";
if (mysqli_query($GLOBALS['mysql_con'], $insertSql)) {
echoSuccess("Permission '$description' wurde erfolgreich hinzugefügt.");
} else {
echoError("Fehler beim Hinzufügen der Permission '$description': " . mysqli_error($GLOBALS['mysql_con']));
}
}
?>