Files
CRM-Hotel/docs/plans/2026-02-15-hotel-front-office-design.md
ialcarazsalazar d9d0f66cf1 Add front-office system design document
Comprehensive design for hotel front-office modules including
room dashboard, reservations, guests, housekeeping, room service,
events/venues, employee scheduling, and reports/analytics.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-15 01:02:51 +00:00

455 lines
14 KiB
Markdown

# Hotel Front-Office System Design
**Date**: 2026-02-15
**Status**: Approved
**Approach**: Module-by-module sequential build (Approach A)
## Decisions
| Decision | Choice |
|---|---|
| Scope | All front-office modules |
| UI Style | Dark theme with gold accents (#d4a574) |
| Bookings | Channel manager ready (data model supports it, APIs deferred) |
| Multi-tenant | Deferred - single-hotel system first |
| Auth | Upgrade to JWT with route protection |
| Language | Bilingual Spanish/English (react-i18next) |
## Build Order
1. Foundation (JWT, i18n, dark theme, DB schema)
2. Room Dashboard & Status Management
3. Reservations Module
4. Guest Management
5. Housekeeping
6. Room Service
7. Events & Venues
8. Employee Scheduling
9. Reports & Analytics
---
## 1. Foundation Layer
### 1.1 JWT Authentication
- Add `jsonwebtoken` and `bcryptjs` packages to backend
- Create `authMiddleware.js` verifying JWT on all `/api/*` routes except `/api/auth/login` and `/api/auth/refresh`
- Access token: 15min expiry, stored in memory (frontend)
- Refresh token: 7 days, httpOnly cookie
- `POST /api/auth/refresh` endpoint
- Frontend Axios interceptor: attach token, auto-refresh on 401
- Update `AuthContext` for token lifecycle
- DB: `refresh_tokens` table (token, user_id, expires_at, revoked)
### 1.2 Internationalization
- Packages: `react-i18next`, `i18next`, `i18next-browser-languagedetector`
- Locale files: `/frontend/src/locales/es.json`, `/frontend/src/locales/en.json`
- Replace `LenguageContext` with i18next provider
- Language switcher component in navbar
- New modules use translation keys from start
- Existing modules migrated incrementally
### 1.3 Dark Theme Design System
CSS custom properties in `theme.css`:
- Background: `#0a0a0a` (main), `#1a1a1a` (cards), `#2a2a2a` (elevated)
- Accent: `#d4a574` (gold) for primary actions
- Text: `#ffffff` (primary), `#a0a0a0` (secondary)
- Status: green (available), blue (occupied), yellow (cleaning), red (maintenance)
- Success: `#22c55e`, Warning: `#eab308`, Error: `#ef4444`, Info: `#3b82f6`
- All new components built with these tokens via Tailwind
### 1.4 Database Schema
```sql
-- Guest Management
CREATE TABLE 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 reservations (
id SERIAL PRIMARY KEY,
room_id INTEGER REFERENCES rooms(id),
guest_id INTEGER REFERENCES guests(id),
check_in DATE NOT NULL,
check_out DATE NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
channel VARCHAR(50),
total_amount DECIMAL(12,2),
adults INTEGER DEFAULT 1,
children INTEGER DEFAULT 0,
notes TEXT,
created_by INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT NOW(),
updated_at TIMESTAMP DEFAULT NOW()
);
-- status: pending, confirmed, checked_in, checked_out, cancelled
-- channel: direct, booking, expedia, airbnb, other
-- Guest Stay History
CREATE TABLE guest_stays (
id SERIAL PRIMARY KEY,
guest_id INTEGER REFERENCES guests(id),
reservation_id INTEGER REFERENCES reservations(id),
room_id INTEGER REFERENCES rooms(id),
check_in TIMESTAMP,
check_out TIMESTAMP,
total_charged DECIMAL(12,2),
rating INTEGER,
feedback TEXT,
created_at TIMESTAMP DEFAULT NOW()
);
-- Room Status Audit Log
CREATE TABLE room_status_log (
id SERIAL PRIMARY KEY,
room_id INTEGER REFERENCES rooms(id),
previous_status VARCHAR(20),
new_status VARCHAR(20),
changed_by INTEGER REFERENCES users(id),
changed_at TIMESTAMP DEFAULT NOW()
);
-- Housekeeping Tasks
CREATE TABLE housekeeping_tasks (
id SERIAL PRIMARY KEY,
room_id INTEGER REFERENCES rooms(id),
assigned_to INTEGER REFERENCES employees(id),
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()
);
-- priority: high, normal, low
-- type: checkout, maintenance, deep_clean, turndown
-- status: pending, in_progress, completed
-- Menu Items (Room Service)
CREATE TABLE menu_items (
id SERIAL PRIMARY KEY,
name VARCHAR(200) NOT NULL,
description TEXT,
price DECIMAL(10,2) NOT NULL,
category VARCHAR(50),
available BOOLEAN DEFAULT TRUE,
image_url VARCHAR(500),
created_at TIMESTAMP DEFAULT NOW()
);
-- Room Service Orders
CREATE TABLE room_service_orders (
id SERIAL PRIMARY KEY,
room_id INTEGER REFERENCES rooms(id),
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()
);
-- status: pending, preparing, delivering, delivered, cancelled
-- Order Items
CREATE TABLE order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER REFERENCES room_service_orders(id),
menu_item_id INTEGER REFERENCES menu_items(id),
quantity INTEGER NOT NULL DEFAULT 1,
price DECIMAL(10,2) NOT NULL,
notes TEXT
);
-- Venues
CREATE TABLE 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 events (
id SERIAL PRIMARY KEY,
venue_id INTEGER 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 employee_schedules (
id SERIAL PRIMARY KEY,
employee_id INTEGER REFERENCES employees(id),
schedule_date DATE NOT NULL,
shift_type VARCHAR(20) NOT NULL,
start_time TIME,
end_time TIME,
notes TEXT,
UNIQUE(employee_id, schedule_date)
);
-- shift_type: morning (7-15), afternoon (15-23), night (23-7), off
-- Refresh Tokens (JWT Auth)
CREATE TABLE refresh_tokens (
id SERIAL PRIMARY KEY,
user_id INTEGER REFERENCES users(id),
token VARCHAR(500) NOT NULL,
expires_at TIMESTAMP NOT NULL,
revoked BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
);
```
Add `status` column to existing `rooms` table:
```sql
ALTER TABLE rooms ADD COLUMN status VARCHAR(20) DEFAULT 'available';
-- status: available, occupied, cleaning, maintenance
```
---
## 2. Room Dashboard & Status Management
### API Endpoints
- `GET /api/rooms/status` - All rooms with current status, guest info, floor
- `PUT /api/rooms/:id/status` - Update room status (cascading side effects)
- `GET /api/dashboard/kpis` - Occupancy %, available count, check-ins, check-outs, revenue (today)
- `GET /api/dashboard/weekly-revenue` - Last 7 days revenue data
### UI Components
- `RoomDashboard.jsx` - Main page with KPI bar and floor grid
- `RoomGrid.jsx` - Color-coded room cards organized by floor
- `RoomDetailModal.jsx` - Room detail popup (guest, amenities, reservation)
- `KPIBar.jsx` - Top bar with 4-5 metric cards
- `WeeklyRevenueChart.jsx` - Bar chart component
- `ArrivalsDepaturesList.jsx` - Today's arrivals/departures
### Business Logic
- Room status cascade: check-out -> "cleaning", housekeeping done -> "available", check-in -> "occupied"
- KPIs calculated from rooms and reservations tables
- Floor data derived from room properties
---
## 3. Reservations Module
### API Endpoints
- `GET /api/reservations` - List with filters (status, dates, search)
- `POST /api/reservations` - Create (validates room availability)
- `PUT /api/reservations/:id` - Update details
- `PUT /api/reservations/:id/status` - Status transition with validation
- `GET /api/reservations/availability` - Room availability for date range
### UI Components
- `Reservations.jsx` - Main page with card grid
- `ReservationCard.jsx` - Individual reservation card
- `NewReservation.jsx` - Creation form
- `ReservationFilters.jsx` - Status/date/search filters
### State Machine
```
pending -> confirmed -> checked_in -> checked_out
pending -> cancelled
confirmed -> cancelled
```
### Business Rules
- No double-booking (check availability before creating)
- Check-in: updates room status to "occupied", creates guest_stay record
- Check-out: updates room status to "cleaning", creates housekeeping task, closes guest_stay
- Channel field: direct, booking, expedia, airbnb, other (for future integration)
---
## 4. Guest Management
### API Endpoints
- `GET /api/guests` - List with search and pagination
- `POST /api/guests` - Create guest profile
- `PUT /api/guests/:id` - Update guest
- `GET /api/guests/:id` - Guest details with current stay
- `GET /api/guests/:id/stays` - Stay history
### UI Components
- `Guests.jsx` - Guest directory with search
- `GuestCard.jsx` - Guest card (avatar, contact, current room)
- `GuestDetail.jsx` - Full profile with stay history
- `NewGuest.jsx` - Guest creation form (also embedded in reservation form)
---
## 5. Housekeeping
### API Endpoints
- `GET /api/housekeeping/tasks` - Tasks with filters (status, priority, staff)
- `POST /api/housekeeping/tasks` - Create task
- `PUT /api/housekeeping/tasks/:id` - Update (assign, start, complete)
- `GET /api/housekeeping/staff` - Available housekeeping employees with status
### UI Components
- `Housekeeping.jsx` - Two-column layout (pending + in-progress)
- `TaskCard.jsx` - Task card (room, type, priority, staff, actions)
- `StaffPanel.jsx` - Staff availability sidebar
### Automation
- Auto-create task on room check-out (type: "checkout", priority: "high")
- Task completion sets room to "available"
- Staff filtered from employees table by housekeeping department
---
## 6. Room Service
### API Endpoints
- `GET /api/room-service/orders` - Active and recent orders
- `POST /api/room-service/orders` - Create order
- `PUT /api/room-service/orders/:id/status` - Update order status
- `GET /api/room-service/menu` - Menu items
- `POST /api/room-service/menu` - Add menu item
- `PUT /api/room-service/menu/:id` - Update/toggle availability
### UI Components
- `RoomServiceOrders.jsx` - Active orders panel
- `OrderCard.jsx` - Order details (room, items, status, total, time)
- `MenuManager.jsx` - Menu item management
- `NewOrder.jsx` - Create order form
### Order Flow
```
pending -> preparing -> delivering -> delivered
pending -> cancelled
```
---
## 7. Events & Venues
### API Endpoints
- `GET /api/venues` - List all venues
- `POST /api/venues` - Create venue
- `PUT /api/venues/:id` - Update venue
- `GET /api/events` - List events (date filters)
- `POST /api/events` - Create event (validate venue availability)
- `PUT /api/events/:id` - Update event
### UI Components
- `Venues.jsx` - Venue cards with availability
- `VenueCard.jsx` - Venue details (capacity, area, price, amenities)
- `Events.jsx` - Event listing and calendar
- `NewEvent.jsx` - Event creation form
---
## 8. Employee Scheduling
### API Endpoints
- `GET /api/schedules` - Schedules by date range and department
- `POST /api/schedules` - Create/update bulk schedule entries
- `GET /api/schedules/employee/:id` - Individual schedule
### UI Components
- `Schedules.jsx` - Weekly grid view
- `ShiftCell.jsx` - Individual cell (click to edit)
- `ScheduleFilters.jsx` - Department/employee filter
### Shift Types
- Morning: 7:00 - 15:00 (yellow)
- Afternoon: 15:00 - 23:00 (blue)
- Night: 23:00 - 7:00 (purple)
- Off: (gray)
---
## 9. Reports & Analytics
### API Endpoints
- `GET /api/reports/occupancy` - Occupancy rate by period
- `GET /api/reports/revenue` - Revenue by room type and period
- `GET /api/reports/booking-sources` - Distribution by channel
- `GET /api/reports/satisfaction` - Guest satisfaction (from guest_stays ratings)
### UI Components
- `OperationalReports.jsx` - Main reports page
- `PeriodSelector.jsx` - Week/Month/Quarter/Year toggle
- `OccupancyChart.jsx` - Trend line chart
- `RevenueByTypeChart.jsx` - Bar chart by room type
- `BookingSourcesPie.jsx` - Pie chart of booking channels
- `SatisfactionCard.jsx` - Rating display
---
## Frontend Route Structure (New)
All under `/app`:
```
/app/room-dashboard - Room status dashboard
/app/reservations - Reservations list
/app/reservations/new - New reservation
/app/reservations/:id - Reservation detail
/app/guests - Guest directory
/app/guests/:id - Guest detail
/app/housekeeping - Housekeeping tasks
/app/room-service - Room service orders
/app/room-service/menu - Menu management
/app/venues - Venues list
/app/events - Events list
/app/events/new - New event
/app/schedules - Employee scheduling
/app/operational-reports - Reports & analytics
```
## Sidebar Navigation Update
Add new section to sidebar:
```
Operations (existing)
├── Dashboard (existing)
├── Room Dashboard (NEW)
├── Reservations (NEW)
├── Guests (NEW)
Services (NEW section)
├── Housekeeping (NEW)
├── Room Service (NEW)
├── Events & Venues (NEW)
Staff (existing section, renamed)
├── Employees (existing)
├── Contracts (existing)
├── Schedules (NEW)
├── Payroll (existing)
Reports (existing)
├── Financial Reports (existing)
├── Operational Reports (NEW)
```