diff --git a/README.md b/README.md index 33db73f..4c8ba4a 100644 --- a/README.md +++ b/README.md @@ -5,17 +5,16 @@ CAT – Chorwochenende-Planungs- und Buchungsanwendung. ## Inhalt - PHP-Anwendung aus `/var/www/html/cat` -- `cat_update_2026-09-19.sql`: idempotentes Datenbank-Update für die Zimmerplanung -- `cat_update_2026-09-19.zip`: separates Update-Paket der geänderten Webdateien +- `database/schema.sql`: idempotente, datenfreie Datenbankstruktur mit `CREATE ... IF NOT EXISTS` und kompatiblen `ALTER TABLE ... ADD COLUMN IF NOT EXISTS`-Migrationen ## Konfiguration Die produktiven Dateien `inc/db.inc.php` und `inc/mail.inc.php` sind aus Sicherheitsgründen nicht versioniert. Sie müssen auf dem Zielsystem separat konfiguriert werden. -## Datenbank-Update +## Datenbankstruktur ```text -mariadb cat < cat_update_2026-09-19.sql +mariadb < database/schema.sql ``` -Das Update legt die drei Zimmeranzahl-Einstellungen an, ohne vorhandene Daten zu überschreiben. +Die Datei legt Datenbank und Tabellen nur an, wenn sie noch nicht existieren. Für bereits vorhandene Tabellen werden fehlende Spalten mit `ALTER TABLE ... ADD COLUMN IF NOT EXISTS` ergänzt. Es werden keine Datensätze, Administratoren oder Preise angelegt. diff --git a/database/schema.sql b/database/schema.sql new file mode 100644 index 0000000..e55f787 --- /dev/null +++ b/database/schema.sql @@ -0,0 +1,86 @@ +-- CAT database schema +-- Schema only: this file creates and evolves structure, but inserts no data. +-- Safe to run repeatedly on MariaDB. + +CREATE DATABASE IF NOT EXISTS cat + CHARACTER SET utf8mb4 + COLLATE utf8mb4_unicode_ci; + +USE cat; + +CREATE TABLE IF NOT EXISTS participants ( + id VARCHAR(36) PRIMARY KEY, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL UNIQUE, + allergies TEXT NULL, + role VARCHAR(50) NULL CHECK (role IN ('Tagesgast', 'Dauergast')), + under_27 TINYINT(1) NOT NULL DEFAULT 0, + password_hash VARCHAR(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS bookings ( + id INT PRIMARY KEY AUTO_INCREMENT, + participant_id VARCHAR(36) NOT NULL, + type ENUM('Stay', 'Day') NOT NULL, + accommodation_type VARCHAR(50) NULL, + meal_preferences TEXT NULL, + roommate_requests TEXT NULL, + other_notes TEXT NULL, + is_paid TINYINT(1) NOT NULL DEFAULT 0, + total_price DECIMAL(10,2) NOT NULL DEFAULT 0.00, + CONSTRAINT fk_bookings_participant + FOREIGN KEY (participant_id) REFERENCES participants(id) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS admin_users ( + id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + username VARCHAR(80) NOT NULL UNIQUE, + email VARCHAR(255) NOT NULL, + password_hash VARCHAR(255) NOT NULL, + is_active TINYINT(1) NOT NULL DEFAULT 1, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +CREATE TABLE IF NOT EXISTS pricing_settings ( + id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + setting_key VARCHAR(80) NOT NULL UNIQUE, + price DECIMAL(10,2) NOT NULL DEFAULT 0.00, + updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; + +-- Compatibility migrations for installations whose tables already exist. +-- ADD COLUMN IF NOT EXISTS leaves existing columns and values untouched. +ALTER TABLE participants + ADD COLUMN IF NOT EXISTS name VARCHAR(255) NOT NULL, + ADD COLUMN IF NOT EXISTS email VARCHAR(255) NULL, + ADD COLUMN IF NOT EXISTS allergies TEXT NULL, + ADD COLUMN IF NOT EXISTS role VARCHAR(50) NULL, + ADD COLUMN IF NOT EXISTS under_27 TINYINT(1) NOT NULL DEFAULT 0, + ADD COLUMN IF NOT EXISTS password_hash VARCHAR(255) NULL; + +ALTER TABLE bookings + ADD COLUMN IF NOT EXISTS participant_id VARCHAR(36) NULL, + ADD COLUMN IF NOT EXISTS type ENUM('Stay', 'Day') NULL, + ADD COLUMN IF NOT EXISTS accommodation_type VARCHAR(50) NULL, + ADD COLUMN IF NOT EXISTS meal_preferences TEXT NULL, + ADD COLUMN IF NOT EXISTS roommate_requests TEXT NULL, + ADD COLUMN IF NOT EXISTS other_notes TEXT NULL, + ADD COLUMN IF NOT EXISTS is_paid TINYINT(1) NOT NULL DEFAULT 0, + ADD COLUMN IF NOT EXISTS total_price DECIMAL(10,2) NOT NULL DEFAULT 0.00; + +ALTER TABLE admin_users + ADD COLUMN IF NOT EXISTS username VARCHAR(80) NULL, + ADD COLUMN IF NOT EXISTS email VARCHAR(255) NULL, + ADD COLUMN IF NOT EXISTS password_hash VARCHAR(255) NULL, + ADD COLUMN IF NOT EXISTS is_active TINYINT(1) NOT NULL DEFAULT 1, + ADD COLUMN IF NOT EXISTS created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, + ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; + +ALTER TABLE pricing_settings + ADD COLUMN IF NOT EXISTS setting_key VARCHAR(80) NULL, + ADD COLUMN IF NOT EXISTS price DECIMAL(10,2) NOT NULL DEFAULT 0.00, + ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP; + +-- No participants, bookings, administrators, or pricing rows are inserted here. +-- Create the first administrator and configure prices through the application.