65 lines
2.8 KiB
SQL
65 lines
2.8 KiB
SQL
-- Public enquiries get their own table and lifecycle, separate from bookings.
|
|
-- A public submission lands here as `pending`. An admin then either:
|
|
-- approve → status=approved, a booking is created (copy) referencing this
|
|
-- enquiry via booking.enquiry_id (admin picks start/end + a client)
|
|
-- waitlist → waitlisted_at set (requires ≥1 date option); stays pending so it
|
|
-- can still be approved or declined later
|
|
-- declined → status=declined
|
|
--
|
|
-- `waitlisted_at` is a parallel timestamp on a pending row, NOT a status — a
|
|
-- waitlisted enquiry is still pending and can be approved or declined.
|
|
--
|
|
-- Dates live in `enquiry_date_option` (1-to-N, priority-ordered), NOT on the
|
|
-- enquiry row — a visitor can propose several date ranges in priority order
|
|
-- (E6.1). The enquiry has no single start/end of its own; reads that need a
|
|
-- "preferred" date pick the lowest-priority option.
|
|
|
|
CREATE TABLE IF NOT EXISTS enquiry (
|
|
enquiry_id TEXT PRIMARY KEY,
|
|
venue_id TEXT NOT NULL REFERENCES venue(venue_id),
|
|
-- Contact details from the public form. No client row exists yet — one is
|
|
-- selected or created on approval.
|
|
contact_name TEXT,
|
|
contact_email TEXT NOT NULL,
|
|
contact_phone TEXT,
|
|
website TEXT,
|
|
-- Event details.
|
|
event_name TEXT NOT NULL,
|
|
event_outline TEXT,
|
|
description TEXT,
|
|
expected_persons INTEGER,
|
|
half_house INTEGER NOT NULL DEFAULT 0,
|
|
notes TEXT,
|
|
privacy_accepted_at TEXT,
|
|
-- Lifecycle.
|
|
status TEXT NOT NULL DEFAULT 'pending', -- pending | approved | declined
|
|
waitlisted_at TEXT,
|
|
approved_at TEXT,
|
|
declined_at TEXT,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_enquiry_venue_status
|
|
ON enquiry (venue_id, status);
|
|
|
|
-- Prioritized date options for an enquiry (E6.1). `priority` is 0-based; 0 is
|
|
-- the visitor's first choice. Optional: an enquiry may have zero options.
|
|
CREATE TABLE IF NOT EXISTS enquiry_date_option (
|
|
option_id TEXT PRIMARY KEY,
|
|
enquiry_id TEXT NOT NULL REFERENCES enquiry(enquiry_id) ON DELETE CASCADE,
|
|
start_date TEXT NOT NULL,
|
|
end_date TEXT NOT NULL,
|
|
priority INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE INDEX IF NOT EXISTS idx_enquiry_date_option_enquiry
|
|
ON enquiry_date_option (enquiry_id, priority);
|
|
|
|
-- A booking may originate from an approved enquiry. NULL for admin-created
|
|
-- bookings. UNIQUE so an enquiry maps to at most one booking (SQLite allows
|
|
-- many NULLs in a unique index).
|
|
ALTER TABLE booking ADD COLUMN enquiry_id TEXT REFERENCES enquiry(enquiry_id);
|
|
CREATE UNIQUE INDEX IF NOT EXISTS idx_booking_enquiry
|
|
ON booking (enquiry_id);
|