85 lines
3.2 KiB
SQL
85 lines
3.2 KiB
SQL
-- Boat routes
|
|
CREATE TABLE app.boat_route (
|
|
route_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
origin TEXT NOT NULL,
|
|
destination TEXT NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Boats
|
|
CREATE TABLE app.boat (
|
|
boat_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name TEXT NOT NULL,
|
|
passenger_capacity INT NOT NULL,
|
|
cargo_capacity_kg NUMERIC,
|
|
is_active BOOLEAN NOT NULL DEFAULT true,
|
|
notes TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
-- Boat trips
|
|
CREATE TABLE app.boat_trip (
|
|
trip_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
boat_id UUID REFERENCES app.boat(boat_id),
|
|
route_id UUID NOT NULL REFERENCES app.boat_route(route_id),
|
|
scheduled_departure_at TIMESTAMPTZ NOT NULL,
|
|
scheduled_arrival_at TIMESTAMPTZ,
|
|
status app.boat_trip_status NOT NULL DEFAULT 'planned',
|
|
notes TEXT,
|
|
created_by_user_id UUID NOT NULL REFERENCES app."user"(user_id),
|
|
updated_by_user_id UUID REFERENCES app."user"(user_id),
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_boat_trip_status ON app.boat_trip(status);
|
|
CREATE INDEX idx_boat_trip_departure ON app.boat_trip(scheduled_departure_at);
|
|
|
|
-- Boat reservation requests (user intent)
|
|
CREATE TABLE app.boat_reservation_request (
|
|
request_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
trip_id UUID NOT NULL REFERENCES app.boat_trip(trip_id),
|
|
user_id UUID NOT NULL REFERENCES app."user"(user_id),
|
|
stay_id UUID REFERENCES app.stay(stay_id),
|
|
retreat_id UUID,
|
|
requested_seats INT NOT NULL DEFAULT 1,
|
|
cargo_notes TEXT,
|
|
special_requirements TEXT,
|
|
priority_reason TEXT,
|
|
status app.boat_reservation_status NOT NULL DEFAULT 'submitted',
|
|
reviewed_by_user_id UUID REFERENCES app."user"(user_id),
|
|
reviewed_at TIMESTAMPTZ,
|
|
review_notes TEXT,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
|
|
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
|
|
);
|
|
|
|
CREATE INDEX idx_boat_reservation_trip ON app.boat_reservation_request(trip_id);
|
|
CREATE INDEX idx_boat_reservation_user ON app.boat_reservation_request(user_id);
|
|
CREATE INDEX idx_boat_reservation_status ON app.boat_reservation_request(status);
|
|
|
|
-- Boat manifest entries (confirmed passengers)
|
|
CREATE TABLE app.boat_manifest_entry (
|
|
entry_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
trip_id UUID NOT NULL REFERENCES app.boat_trip(trip_id),
|
|
reservation_request_id UUID REFERENCES app.boat_reservation_request(request_id),
|
|
user_id UUID NOT NULL REFERENCES app."user"(user_id),
|
|
stay_id UUID REFERENCES app.stay(stay_id),
|
|
status app.boat_manifest_status NOT NULL DEFAULT 'confirmed',
|
|
confirmed_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_boat_manifest_trip ON app.boat_manifest_entry(trip_id);
|
|
|
|
SELECT app.enable_audit('boat_route', 'route_id');
|
|
SELECT app.enable_audit('boat', 'boat_id');
|
|
SELECT app.enable_audit('boat_trip', 'trip_id');
|
|
SELECT app.enable_audit('boat_reservation_request', 'request_id');
|
|
SELECT app.enable_audit('boat_manifest_entry', 'entry_id');
|