-- Migration 039: Internal Shop system -- Tables for catalog items, member requests, request line items, and order linking. -- ═══════════════════════════════════════════════════════════════════════════ -- 1. Shop Artikel (Catalog Items) -- ═══════════════════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS shop_artikel ( id SERIAL PRIMARY KEY, bezeichnung TEXT NOT NULL, beschreibung TEXT, kategorie TEXT, bild_pfad TEXT, geschaetzter_preis NUMERIC(10,2), aktiv BOOLEAN NOT NULL DEFAULT TRUE, erstellt_von UUID REFERENCES users(id) ON DELETE SET NULL, erstellt_am TIMESTAMPTZ NOT NULL DEFAULT NOW(), aktualisiert_am TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_shop_artikel_kategorie ON shop_artikel(kategorie); CREATE INDEX IF NOT EXISTS idx_shop_artikel_aktiv ON shop_artikel(aktiv); -- ═══════════════════════════════════════════════════════════════════════════ -- 2. Shop Anfragen (Member Requests) -- ═══════════════════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS shop_anfragen ( id SERIAL PRIMARY KEY, anfrager_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, status TEXT NOT NULL DEFAULT 'offen' CHECK (status IN ('offen','genehmigt','abgelehnt','bestellt','erledigt')), notizen TEXT, admin_notizen TEXT, bearbeitet_von UUID REFERENCES users(id) ON DELETE SET NULL, erstellt_am TIMESTAMPTZ NOT NULL DEFAULT NOW(), aktualisiert_am TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_shop_anfragen_anfrager ON shop_anfragen(anfrager_id); CREATE INDEX IF NOT EXISTS idx_shop_anfragen_status ON shop_anfragen(status); -- ═══════════════════════════════════════════════════════════════════════════ -- 3. Shop Anfrage Positionen (Request Line Items) -- ═══════════════════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS shop_anfrage_positionen ( id SERIAL PRIMARY KEY, anfrage_id INT NOT NULL REFERENCES shop_anfragen(id) ON DELETE CASCADE, artikel_id INT REFERENCES shop_artikel(id) ON DELETE SET NULL, bezeichnung TEXT NOT NULL, menge NUMERIC NOT NULL DEFAULT 1, notizen TEXT, erstellt_am TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX IF NOT EXISTS idx_shop_anfrage_positionen_anfrage ON shop_anfrage_positionen(anfrage_id); -- ═══════════════════════════════════════════════════════════════════════════ -- 4. Shop Anfrage ↔ Bestellung Link -- ═══════════════════════════════════════════════════════════════════════════ CREATE TABLE IF NOT EXISTS shop_anfrage_bestellung ( anfrage_id INT NOT NULL REFERENCES shop_anfragen(id) ON DELETE CASCADE, bestellung_id INT NOT NULL REFERENCES bestellungen(id) ON DELETE CASCADE, PRIMARY KEY (anfrage_id, bestellung_id) ); -- ═══════════════════════════════════════════════════════════════════════════ -- 5. Auto-update triggers -- ═══════════════════════════════════════════════════════════════════════════ DO $$ BEGIN IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_shop_artikel_aktualisiert') THEN CREATE TRIGGER trg_shop_artikel_aktualisiert BEFORE UPDATE ON shop_artikel FOR EACH ROW EXECUTE FUNCTION update_aktualisiert_am(); END IF; IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_shop_anfragen_aktualisiert') THEN CREATE TRIGGER trg_shop_anfragen_aktualisiert BEFORE UPDATE ON shop_anfragen FOR EACH ROW EXECUTE FUNCTION update_aktualisiert_am(); END IF; END $$;