Reorganize into monorepo layout, move mitarbeiter-app to legacy reference

Consolidates the previously separate omsorgapp and omsorgCore repos
(each had their own nested .git with GitHub history) plus the old
root-level website/mitarbeiter-app into a single monorepo, matching
the structure already documented in the root CLAUDE.md. Also moves
the PHP employee app aside as omsorgWeb/mitarbeiter-app-legacy/ to
serve as a template for a ground-up rewrite.

Fixes .gitignore in the same pass: the config-secrets/uploads/data
patterns were unanchored (relative to repo root, not depth-agnostic),
so they silently stopped matching once the app moved under omsorgWeb/.
Patterns are now **/-prefixed and cover both mitarbeiter-app and
mitarbeiter-app-legacy, keeping DB/SMTP credentials and uploaded
employee documents out of version control.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Felix Kemmler
2026-08-07 14:21:37 +02:00
co-authored by Claude Sonnet 5
parent 8beb0fcf52
commit b6c1389c55
355 changed files with 24348 additions and 361 deletions
@@ -0,0 +1 @@
Require all denied
@@ -0,0 +1,145 @@
<?php
return [
'description' => 'Initial schema',
'up' => [
"CREATE TABLE IF NOT EXISTS users (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(255) NOT NULL UNIQUE,
name VARCHAR(255) NOT NULL,
role VARCHAR(32) NOT NULL DEFAULT 'user',
password_hash VARCHAR(255) NOT NULL,
active TINYINT(1) NOT NULL DEFAULT 1,
created_at VARCHAR(32) NOT NULL,
email VARCHAR(255) NOT NULL DEFAULT '',
telefon VARCHAR(64) NOT NULL DEFAULT ''
)",
"CREATE TABLE IF NOT EXISTS requests_urlaubsantrag (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL,
von VARCHAR(32) NOT NULL DEFAULT '',
bis VARCHAR(32) NOT NULL DEFAULT '',
vertretung VARCHAR(255) NOT NULL DEFAULT '',
nachricht TEXT NOT NULL
)",
"CREATE TABLE IF NOT EXISTS requests_abwesenheitsantrag (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL,
von VARCHAR(32) NOT NULL DEFAULT '',
bis VARCHAR(32) NOT NULL DEFAULT '',
grund VARCHAR(64) NOT NULL DEFAULT '',
vertretung VARCHAR(255) NOT NULL DEFAULT '',
nachricht TEXT NOT NULL
)",
"CREATE TABLE IF NOT EXISTS requests_benefitsantrag (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL,
benefit VARCHAR(64) NOT NULL DEFAULT '',
nachricht TEXT NOT NULL
)",
"CREATE TABLE IF NOT EXISTS requests_werben (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL,
name VARCHAR(255) NOT NULL DEFAULT '',
email VARCHAR(255) NOT NULL DEFAULT '',
qualifikation VARCHAR(64) NOT NULL DEFAULT '',
nachricht TEXT NOT NULL
)",
"CREATE TABLE IF NOT EXISTS dienstplan (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
date VARCHAR(16) NOT NULL,
schicht VARCHAR(16) NOT NULL,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL,
UNIQUE KEY uq_user_date (user_id, date)
)",
"CREATE TABLE IF NOT EXISTS downloads (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
filename VARCHAR(255) NOT NULL,
original_name VARCHAR(255) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS fortbildung_materials (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
description TEXT NOT NULL,
filename VARCHAR(255) NOT NULL,
original_name VARCHAR(255) NOT NULL,
sort_order INT NOT NULL DEFAULT 0,
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS requests_fortbildungsantrag (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
anliegen TEXT NOT NULL,
thema TEXT NOT NULL,
nachricht TEXT NOT NULL,
filename VARCHAR(255) NOT NULL DEFAULT '',
original_name VARCHAR(255) NOT NULL DEFAULT '',
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS requests_stundennachweis (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'pending',
admin_note TEXT NOT NULL,
monat VARCHAR(16) NOT NULL,
filename VARCHAR(255) NOT NULL DEFAULT '',
original_name VARCHAR(255) NOT NULL DEFAULT '',
created_at VARCHAR(32) NOT NULL,
updated_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS einsatzbewertungen (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
einsatzort VARCHAR(255) NOT NULL,
von VARCHAR(32) NOT NULL,
bis VARCHAR(32) NOT NULL,
bewertung TINYINT NOT NULL,
wieder TINYINT(1) NOT NULL DEFAULT 0,
feedback TEXT NOT NULL,
created_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS dokumente (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
kategorie VARCHAR(255) NOT NULL DEFAULT 'Sonstiges',
beschreibung TEXT NOT NULL,
filename VARCHAR(255) NOT NULL,
original_name VARCHAR(255) NOT NULL,
filesize INT NOT NULL DEFAULT 0,
created_at VARCHAR(32) NOT NULL
)",
"CREATE TABLE IF NOT EXISTS news (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
text TEXT NOT NULL,
date VARCHAR(16) NOT NULL,
created_at VARCHAR(32) NOT NULL
)",
],
];
@@ -0,0 +1,7 @@
<?php
return [
'description' => 'Add avatar column to users',
'up' => [
'ALTER TABLE users ADD COLUMN avatar VARCHAR(255) DEFAULT NULL',
],
];
@@ -0,0 +1,14 @@
<?php
return [
'description' => 'Einsatzanweisung table',
'up' => [
"CREATE TABLE IF NOT EXISTS einsatzanweisung (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL UNIQUE,
filename VARCHAR(255) NOT NULL DEFAULT '',
original_name VARCHAR(255) NOT NULL DEFAULT '',
ort VARCHAR(255) NOT NULL DEFAULT '',
uploaded_at VARCHAR(32) NOT NULL DEFAULT ''
)",
],
];
@@ -0,0 +1,13 @@
<?php
return [
'description' => 'Login attempts table for IP-based rate limiting',
'up' => [
"CREATE TABLE IF NOT EXISTS login_attempts (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ip VARCHAR(45) NOT NULL DEFAULT '',
username VARCHAR(190) NOT NULL DEFAULT '',
attempted_at VARCHAR(32) NOT NULL DEFAULT ''
)",
"CREATE INDEX idx_login_attempts_ip_time ON login_attempts (ip, attempted_at)",
],
];
@@ -0,0 +1,8 @@
<?php
return [
'description' => 'Add filename/original_name to requests_urlaubsantrag',
'up' => [
"ALTER TABLE requests_urlaubsantrag ADD COLUMN filename VARCHAR(255) NOT NULL DEFAULT ''",
"ALTER TABLE requests_urlaubsantrag ADD COLUMN original_name VARCHAR(255) NOT NULL DEFAULT ''",
],
];
@@ -0,0 +1,15 @@
<?php
// Additiv: fügt Spalten hinzu, die migrate-users-to-core.php befüllt, um jede lokale users-Zeile
// (Fremdschlüssel-Ziel für dienstplan/requests_*/dokumente/einsatzanweisung/einsatzbewertungen) auf
// die neue omsorgCore-Identität abzubilden. Die Tabelle `users` bleibt danach bestehen, wird aber zum
// reinen Lesecache (Name/E-Mail/Telefon/Avatar/Aktiv-Status) für die noch nicht migrierten Seiten -
// omsorgCore ist die Quelle der Wahrheit, siehe lib/auth.php. `password_hash` wird erst am Ende von
// migrate-users-to-core.php gelöscht (destruktiv, deshalb nicht Teil dieser automatisch laufenden
// Migration - erst NACHDEM alle User erfolgreich nach omsorgCore übernommen wurden).
return [
'description' => 'Add omsorgCore identity mapping columns to users (prep for migrate-users-to-core.php)',
'up' => [
'ALTER TABLE users ADD COLUMN omsorgcore_user_id CHAR(36) DEFAULT NULL',
'ALTER TABLE users ADD COLUMN omsorgcore_employee_id CHAR(36) DEFAULT NULL',
],
];