From ca7b816c0e50c474770e6bf8ea706618e4864f6c Mon Sep 17 00:00:00 2001 From: ialcarazsalazar Date: Sun, 15 Feb 2026 01:14:01 +0000 Subject: [PATCH] feat: add database migration for front-office tables Co-Authored-By: Claude Opus 4.6 --- .gitignore | 1 + .../db/migrations/001_front_office_tables.sql | 172 ++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql diff --git a/.gitignore b/.gitignore index 9f510fe..1588357 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ Thumbs.db # Base de datos local *.sql !scripts bd/**/*.sql +!backend/hotel_hacienda/src/db/migrations/*.sql # Archivos de respaldo *.bak diff --git a/backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql b/backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql new file mode 100644 index 0000000..587dd3d --- /dev/null +++ b/backend/hotel_hacienda/src/db/migrations/001_front_office_tables.sql @@ -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);