Compare commits

...
2 Commits
Author SHA1 Message Date
RaineSchroeder c536cf5753 Merge remote README update 2026-09-19 23:32:29 +00:00
RaineSchroeder db31fecdee Add idempotent schema-only database definition 2026-09-19 23:32:03 +00:00
2 changed files with 90 additions and 4 deletions
+4 -4
View File
@@ -5,16 +5,16 @@ CAT Chorwochenende-Planungs- und Buchungsanwendung.
## Inhalt
- PHP-Anwendung aus `/var/www/html/cat`
- `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.
+86
View File
@@ -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.