feat: add database migration for front-office tables

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-15 01:14:01 +00:00
parent 46b3301b02
commit ca7b816c0e
2 changed files with 173 additions and 0 deletions

View File

@@ -0,0 +1,172 @@
-- 001_front_office_tables.sql
-- Add status column to existing rooms table
ALTER TABLE rooms ADD COLUMN IF NOT EXISTS status VARCHAR(20) DEFAULT 'available';
ALTER TABLE rooms ADD COLUMN IF NOT EXISTS floor INTEGER DEFAULT 1;
-- Guests
CREATE TABLE IF NOT EXISTS guests (
id SERIAL PRIMARY KEY,
first_name VARCHAR(100) NOT NULL,
last_name VARCHAR(100) NOT NULL,
email VARCHAR(255),
phone VARCHAR(50),
id_type VARCHAR(50),
id_number VARCHAR(100),
nationality VARCHAR(100),
address TEXT,
notes TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- Reservations
CREATE TABLE IF NOT EXISTS reservations (
id SERIAL PRIMARY KEY,
room_id INTEGER NOT NULL,
guest_id INTEGER NOT NULL REFERENCES guests(id),
check_in DATE NOT NULL,
check_out DATE NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
channel VARCHAR(50) DEFAULT 'direct',
total_amount DECIMAL(12,2),
adults INTEGER DEFAULT 1,
children INTEGER DEFAULT 0,
notes TEXT,
created_by INTEGER,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_reservations_status ON reservations(status);
CREATE INDEX IF NOT EXISTS idx_reservations_dates ON reservations(check_in, check_out);
CREATE INDEX IF NOT EXISTS idx_reservations_room ON reservations(room_id);
-- Guest Stay History
CREATE TABLE IF NOT EXISTS guest_stays (
id SERIAL PRIMARY KEY,
guest_id INTEGER NOT NULL REFERENCES guests(id),
reservation_id INTEGER REFERENCES reservations(id),
room_id INTEGER NOT NULL,
check_in TIMESTAMP,
check_out TIMESTAMP,
total_charged DECIMAL(12,2),
rating INTEGER CHECK (rating >= 1 AND rating <= 5),
feedback TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- Room Status Audit Log
CREATE TABLE IF NOT EXISTS room_status_log (
id SERIAL PRIMARY KEY,
room_id INTEGER NOT NULL,
previous_status VARCHAR(20),
new_status VARCHAR(20),
changed_by INTEGER,
changed_at TIMESTAMP DEFAULT NOW()
);
-- Housekeeping Tasks
CREATE TABLE IF NOT EXISTS housekeeping_tasks (
id SERIAL PRIMARY KEY,
room_id INTEGER NOT NULL,
assigned_to INTEGER,
priority VARCHAR(10) DEFAULT 'normal',
type VARCHAR(20) NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
notes TEXT,
started_at TIMESTAMP,
completed_at TIMESTAMP,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_housekeeping_status ON housekeeping_tasks(status);
-- Menu Items (Room Service)
CREATE TABLE IF NOT EXISTS menu_items (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
name_es VARCHAR(200),
description TEXT,
description_es TEXT,
price DECIMAL(10,2) NOT NULL,
category VARCHAR(50),
available BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Room Service Orders
CREATE TABLE IF NOT EXISTS room_service_orders (
id SERIAL PRIMARY KEY,
room_id INTEGER NOT NULL,
guest_id INTEGER REFERENCES guests(id),
status VARCHAR(20) DEFAULT 'pending',
total DECIMAL(10,2),
notes TEXT,
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- Order Items
CREATE TABLE IF NOT EXISTS order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES room_service_orders(id) ON DELETE CASCADE,
menu_item_id INTEGER NOT NULL REFERENCES menu_items(id),
quantity INTEGER NOT NULL DEFAULT 1,
price DECIMAL(10,2) NOT NULL,
notes TEXT
);
-- Venues
CREATE TABLE IF NOT EXISTS venues (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
capacity INTEGER,
area_sqm DECIMAL(8,2),
price_per_hour DECIMAL(10,2),
amenities JSONB DEFAULT '[]',
description TEXT,
status VARCHAR(20) DEFAULT 'available',
created_at TIMESTAMP DEFAULT NOW()
);
-- Events
CREATE TABLE IF NOT EXISTS events (
id SERIAL PRIMARY KEY,
venue_id INTEGER NOT NULL REFERENCES venues(id),
name VARCHAR(200) NOT NULL,
organizer VARCHAR(200),
event_date DATE NOT NULL,
start_time TIME NOT NULL,
end_time TIME NOT NULL,
guest_count INTEGER,
status VARCHAR(20) DEFAULT 'confirmed',
notes TEXT,
total_amount DECIMAL(12,2),
created_at TIMESTAMP DEFAULT NOW()
);
-- Employee Schedules
CREATE TABLE IF NOT EXISTS employee_schedules (
id SERIAL PRIMARY KEY,
employee_id INTEGER NOT NULL,
schedule_date DATE NOT NULL,
shift_type VARCHAR(20) NOT NULL,
start_time TIME,
end_time TIME,
notes TEXT,
UNIQUE(employee_id, schedule_date)
);
-- Refresh Tokens (JWT)
CREATE TABLE IF NOT EXISTS refresh_tokens (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL,
token VARCHAR(500) NOT NULL,
expires_at TIMESTAMP NOT NULL,
revoked BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_token ON refresh_tokens(token);
CREATE INDEX IF NOT EXISTS idx_refresh_tokens_user ON refresh_tokens(user_id);