-- VIP Coordinator Database Schema -- Create VIPs table CREATE TABLE IF NOT EXISTS vips ( id VARCHAR(255) PRIMARY KEY, name VARCHAR(255) NOT NULL, organization VARCHAR(255) NOT NULL, department VARCHAR(255) DEFAULT 'Office of Development', transport_mode VARCHAR(50) NOT NULL CHECK (transport_mode IN ('flight', 'self-driving')), expected_arrival TIMESTAMP, needs_airport_pickup BOOLEAN DEFAULT false, needs_venue_transport BOOLEAN DEFAULT true, notes TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create flights table (for VIPs with flight transport) CREATE TABLE IF NOT EXISTS flights ( id SERIAL PRIMARY KEY, vip_id VARCHAR(255) REFERENCES vips(id) ON DELETE CASCADE, flight_number VARCHAR(50) NOT NULL, flight_date DATE NOT NULL, segment INTEGER NOT NULL, departure_airport VARCHAR(10), arrival_airport VARCHAR(10), scheduled_departure TIMESTAMP, scheduled_arrival TIMESTAMP, actual_departure TIMESTAMP, actual_arrival TIMESTAMP, status VARCHAR(50), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create drivers table CREATE TABLE IF NOT EXISTS drivers ( id VARCHAR(255) PRIMARY KEY, name VARCHAR(255) NOT NULL, phone VARCHAR(50) NOT NULL, department VARCHAR(255) DEFAULT 'Office of Development', user_id VARCHAR(255) REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create schedule_events table CREATE TABLE IF NOT EXISTS schedule_events ( id VARCHAR(255) PRIMARY KEY, vip_id VARCHAR(255) REFERENCES vips(id) ON DELETE CASCADE, title VARCHAR(255) NOT NULL, location VARCHAR(255) NOT NULL, start_time TIMESTAMP NOT NULL, end_time TIMESTAMP NOT NULL, description TEXT, assigned_driver_id VARCHAR(255) REFERENCES drivers(id) ON DELETE SET NULL, status VARCHAR(50) DEFAULT 'scheduled' CHECK (status IN ('scheduled', 'in-progress', 'completed', 'cancelled')), event_type VARCHAR(50) NOT NULL CHECK (event_type IN ('transport', 'meeting', 'event', 'meal', 'accommodation')), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create users table for authentication CREATE TABLE IF NOT EXISTS users ( id VARCHAR(255) PRIMARY KEY, google_id VARCHAR(255) UNIQUE NOT NULL, email VARCHAR(255) UNIQUE NOT NULL, name VARCHAR(255) NOT NULL, role VARCHAR(50) NOT NULL CHECK (role IN ('driver', 'coordinator', 'administrator')), profile_picture_url TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, last_login TIMESTAMP, is_active BOOLEAN DEFAULT true, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create system_setup table for tracking initial setup CREATE TABLE IF NOT EXISTS system_setup ( id SERIAL PRIMARY KEY, setup_completed BOOLEAN DEFAULT false, first_admin_created BOOLEAN DEFAULT false, setup_date TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create admin_settings table CREATE TABLE IF NOT EXISTS admin_settings ( id SERIAL PRIMARY KEY, setting_key VARCHAR(255) UNIQUE NOT NULL, setting_value TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Create indexes for better performance CREATE INDEX IF NOT EXISTS idx_vips_transport_mode ON vips(transport_mode); CREATE INDEX IF NOT EXISTS idx_flights_vip_id ON flights(vip_id); CREATE INDEX IF NOT EXISTS idx_flights_date ON flights(flight_date); CREATE INDEX IF NOT EXISTS idx_schedule_events_vip_id ON schedule_events(vip_id); CREATE INDEX IF NOT EXISTS idx_schedule_events_driver_id ON schedule_events(assigned_driver_id); CREATE INDEX IF NOT EXISTS idx_schedule_events_start_time ON schedule_events(start_time); CREATE INDEX IF NOT EXISTS idx_schedule_events_status ON schedule_events(status); CREATE INDEX IF NOT EXISTS idx_users_google_id ON users(google_id); CREATE INDEX IF NOT EXISTS idx_users_email ON users(email); CREATE INDEX IF NOT EXISTS idx_users_role ON users(role); CREATE INDEX IF NOT EXISTS idx_drivers_user_id ON drivers(user_id); -- Create updated_at trigger function CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = CURRENT_TIMESTAMP; RETURN NEW; END; $$ language 'plpgsql'; -- Create triggers for updated_at (drop if exists first) DROP TRIGGER IF EXISTS update_vips_updated_at ON vips; DROP TRIGGER IF EXISTS update_flights_updated_at ON flights; DROP TRIGGER IF EXISTS update_drivers_updated_at ON drivers; DROP TRIGGER IF EXISTS update_schedule_events_updated_at ON schedule_events; DROP TRIGGER IF EXISTS update_users_updated_at ON users; DROP TRIGGER IF EXISTS update_admin_settings_updated_at ON admin_settings; CREATE TRIGGER update_vips_updated_at BEFORE UPDATE ON vips FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_flights_updated_at BEFORE UPDATE ON flights FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_drivers_updated_at BEFORE UPDATE ON drivers FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_schedule_events_updated_at BEFORE UPDATE ON schedule_events FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_users_updated_at BEFORE UPDATE ON users FOR EACH ROW EXECUTE FUNCTION update_updated_at_column(); CREATE TRIGGER update_admin_settings_updated_at BEFORE UPDATE ON admin_settings FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();