Files
dashboard/backend/src/database/migrations/039_create_shop.sql
Matthias Hochmeister 5032e1593b new features
2026-03-23 13:08:19 +01:00

85 lines
5.1 KiB
SQL

-- 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 $$;