feat: add database migration for front-office tables
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -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
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user