85 lines
5.1 KiB
SQL
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 $$;
|