hospitality-expert
Expert-level hotel management, reservation systems, guest services, revenue management, and hospitality technology
What this skill does
# Hospitality Expert
Expert guidance for hotel management, reservation systems, property management systems (PMS), guest services, revenue management, and hospitality technology solutions.
## Core Concepts
### Hotel Management Systems
- Property Management System (PMS)
- Central Reservation System (CRS)
- Revenue Management System (RMS)
- Channel Manager
- Point of Sale (POS)
- Guest Relationship Management (GRM)
- Housekeeping management
### Technologies
- Mobile check-in/check-out
- Digital key systems
- Guest messaging platforms
- IoT for room automation
- AI chatbots for customer service
- Contactless payments
- Energy management systems
### Standards and Protocols
- HTNG (Hotel Technology Next Generation)
- OpenTravel Alliance standards
- PCI-DSS for payment security
- ADA compliance for accessibility
- Brand standards (if franchise)
- OTA integrations (Booking.com, Expedia)
## Property Management System
```python
from dataclasses import dataclass
from datetime import datetime, timedelta, date
from typing import List, Optional, Dict
from decimal import Decimal
from enum import Enum
class RoomType(Enum):
STANDARD = "standard"
DELUXE = "deluxe"
SUITE = "suite"
EXECUTIVE = "executive"
class RoomStatus(Enum):
VACANT_CLEAN = "vacant_clean"
VACANT_DIRTY = "vacant_dirty"
OCCUPIED_CLEAN = "occupied_clean"
OCCUPIED_DIRTY = "occupied_dirty"
OUT_OF_ORDER = "out_of_order"
OUT_OF_SERVICE = "out_of_service"
class ReservationStatus(Enum):
CONFIRMED = "confirmed"
CHECKED_IN = "checked_in"
CHECKED_OUT = "checked_out"
CANCELLED = "cancelled"
NO_SHOW = "no_show"
@dataclass
class Room:
"""Hotel room information"""
room_number: str
room_type: RoomType
floor: int
status: RoomStatus
base_rate: Decimal
features: List[str]
bed_type: str
max_occupancy: int
square_feet: int
is_smoking: bool
@dataclass
class Reservation:
"""Guest reservation"""
reservation_id: str
guest_name: str
guest_email: str
guest_phone: str
room_type: RoomType
check_in_date: date
check_out_date: date
num_adults: int
num_children: int
status: ReservationStatus
rate_per_night: Decimal
total_amount: Decimal
special_requests: str
created_at: datetime
booking_source: str # 'direct', 'ota', 'phone', etc.
assigned_room: Optional[str]
@dataclass
class Folio:
"""Guest folio (bill)"""
folio_id: str
reservation_id: str
room_number: str
guest_name: str
charges: List[Dict]
total_charges: Decimal
payments: List[Dict]
balance: Decimal
class PropertyManagementSystem:
"""Hotel property management system"""
def __init__(self):
self.rooms = {}
self.reservations = {}
self.folios = {}
self.guests = {}
def create_reservation(self, reservation_data: dict) -> Reservation:
"""Create new reservation"""
reservation_id = self._generate_reservation_id()
# Calculate total amount
check_in = reservation_data['check_in_date']
check_out = reservation_data['check_out_date']
num_nights = (check_out - check_in).days
rate_per_night = Decimal(str(reservation_data['rate_per_night']))
total_amount = rate_per_night * num_nights
reservation = Reservation(
reservation_id=reservation_id,
guest_name=reservation_data['guest_name'],
guest_email=reservation_data['guest_email'],
guest_phone=reservation_data['guest_phone'],
room_type=RoomType(reservation_data['room_type']),
check_in_date=check_in,
check_out_date=check_out,
num_adults=reservation_data['num_adults'],
num_children=reservation_data.get('num_children', 0),
status=ReservationStatus.CONFIRMED,
rate_per_night=rate_per_night,
total_amount=total_amount,
special_requests=reservation_data.get('special_requests', ''),
created_at=datetime.now(),
booking_source=reservation_data.get('booking_source', 'direct'),
assigned_room=None
)
self.reservations[reservation_id] = reservation
return reservation
def check_in_guest(self, reservation_id: str) -> dict:
"""Process guest check-in"""
reservation = self.reservations.get(reservation_id)
if not reservation:
return {'error': 'Reservation not found'}
# Find available room of requested type
available_room = self._find_available_room(
reservation.room_type,
reservation.check_in_date,
reservation.check_out_date
)
if not available_room:
return {'error': 'No rooms available of requested type'}
# Assign room
reservation.assigned_room = available_room.room_number
reservation.status = ReservationStatus.CHECKED_IN
# Update room status
available_room.status = RoomStatus.OCCUPIED_CLEAN
# Create folio
folio = self._create_folio(reservation, available_room)
return {
'reservation_id': reservation_id,
'room_number': available_room.room_number,
'guest_name': reservation.guest_name,
'check_in_time': datetime.now().isoformat(),
'check_out_date': reservation.check_out_date.isoformat(),
'folio_id': folio.folio_id
}
def check_out_guest(self, reservation_id: str) -> dict:
"""Process guest check-out"""
reservation = self.reservations.get(reservation_id)
if not reservation:
return {'error': 'Reservation not found'}
# Get folio
folio = next(
(f for f in self.folios.values() if f.reservation_id == reservation_id),
None
)
if not folio:
return {'error': 'Folio not found'}
# Check for outstanding balance
if folio.balance > 0:
return {
'error': 'Outstanding balance',
'balance_due': float(folio.balance)
}
# Update reservation status
reservation.status = ReservationStatus.CHECKED_OUT
# Update room status
if reservation.assigned_room:
room = self.rooms.get(reservation.assigned_room)
if room:
room.status = RoomStatus.VACANT_DIRTY
return {
'reservation_id': reservation_id,
'guest_name': reservation.guest_name,
'check_out_time': datetime.now().isoformat(),
'total_charges': float(folio.total_charges),
'folio_summary': {
'room_charges': float(folio.total_charges),
'payments_received': float(folio.total_charges - folio.balance)
}
}
def _find_available_room(self,
room_type: RoomType,
check_in: date,
check_out: date) -> Optional[Room]:
"""Find available room of specified type"""
for room in self.rooms.values():
if room.room_type != room_type:
continue
if room.status not in [RoomStatus.VACANT_CLEAN, RoomStatus.VACANT_DIRTY]:
continue
# Check if room is available for date range
if self._is_room_available(room.room_number, check_in, check_out):
return room
return None
def _is_room_available(self, room_number: str, check_in: date, check_out: date) -> bool:
"""Check if room is available for date range"""
for reservation in self.reservations.values():
if reservation.assigned_room != room_number:
continue
if reservation.status in [ReservationStatus.CANCELLED, ReservationStatus.NO_SHOW]:
continue
# Check for date overRelated in domains
aerospace-expert
IncludedExpert-level aerospace systems, flight management, maintenance tracking, aviation safety, and aerospace software
automotive-expert
IncludedExpert-level automotive systems, connected vehicles, fleet management, telematics, ADAS, and automotive software
real-estate-expert
IncludedExpert-level real estate systems, property management, MLS integration, CRM, virtual tours, and market analysis
manufacturing-expert
IncludedExpert-level manufacturing systems, Industry 4.0, production optimization, quality control, and smart factory solutions
retail-expert
IncludedExpert-level retail systems, POS, inventory management, e-commerce, customer analytics, and omnichannel retail
insurance-expert
IncludedExpert-level insurance systems, underwriting, claims processing, actuarial analysis, risk assessment, and insurtech solutions