131 lines
5.6 KiB
PL/PgSQL
131 lines
5.6 KiB
PL/PgSQL
-- 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();
|