chore: perauset customer project

This commit is contained in:
e2e
2026-07-11 08:35:02 +02:00
commit 1b5783d507
293 changed files with 28412 additions and 0 deletions

80
sql/0009-retreats.sql Normal file
View File

@@ -0,0 +1,80 @@
-- ============================================================
-- Retreat enum types
-- ============================================================
CREATE TYPE app.retreat_status AS ENUM ('draft', 'published', 'active', 'completed', 'cancelled');
CREATE TYPE app.retreat_person_role AS ENUM ('participant', 'facilitator', 'assistant_facilitator', 'organizer', 'support_staff');
CREATE TYPE app.retreat_attendance_status AS ENUM ('invited', 'registered', 'confirmed', 'checked_in', 'cancelled');
-- ============================================================
-- Retreats
-- ============================================================
CREATE TABLE app.retreat (
retreat_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
slug TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
description TEXT,
start_at DATE NOT NULL,
end_at DATE NOT NULL,
status app.retreat_status NOT NULL DEFAULT 'draft',
capacity INT,
default_check_in_at TIMESTAMPTZ,
default_check_out_at TIMESTAMPTZ,
created_by_user_id UUID NOT NULL REFERENCES app."user"(user_id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_retreat_status ON app.retreat(status);
CREATE INDEX idx_retreat_dates ON app.retreat(start_at, end_at);
-- ============================================================
-- Retreat persons
-- ============================================================
CREATE TABLE app.retreat_person (
retreat_person_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
retreat_id UUID NOT NULL REFERENCES app.retreat(retreat_id) ON DELETE CASCADE,
user_id UUID REFERENCES app."user"(user_id),
stay_id UUID REFERENCES app.stay(stay_id),
full_name TEXT,
email TEXT,
phone TEXT,
role_type app.retreat_person_role NOT NULL DEFAULT 'participant',
attendance_status app.retreat_attendance_status NOT NULL DEFAULT 'registered',
arrival_override_at TIMESTAMPTZ,
departure_override_at TIMESTAMPTZ,
notes TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE(retreat_id, user_id)
);
CREATE INDEX idx_retreat_person_retreat ON app.retreat_person(retreat_id);
CREATE INDEX idx_retreat_person_user ON app.retreat_person(user_id);
-- ============================================================
-- Retreat schedule items
-- ============================================================
CREATE TABLE app.retreat_schedule_item (
item_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
retreat_id UUID NOT NULL REFERENCES app.retreat(retreat_id) ON DELETE CASCADE,
title TEXT NOT NULL,
description TEXT,
starts_at TIMESTAMPTZ NOT NULL,
ends_at TIMESTAMPTZ NOT NULL,
location TEXT,
lead_retreat_person_id UUID REFERENCES app.retreat_person(retreat_person_id),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_retreat_schedule_retreat ON app.retreat_schedule_item(retreat_id);
CREATE INDEX idx_retreat_schedule_times ON app.retreat_schedule_item(starts_at, ends_at);
-- Enable audit
SELECT app.enable_audit('retreat', 'retreat_id');
SELECT app.enable_audit('retreat_person', 'retreat_person_id');
SELECT app.enable_audit('retreat_schedule_item', 'item_id');