"""데이터 모델 정의"""
from datetime import datetime
from typing import Optional, Literal
from pydantic import BaseModel, Field
# 플랫폼 타입
Platform = Literal["airbnb", "spacecloud", "naver", "yanolja", "kakao"]
class Reservation(BaseModel):
"""예약 정보 모델"""
id: str = Field(description="예약 고유 ID")
platform: Platform = Field(description="예약 플랫폼")
customer_name: str = Field(description="고객 이름")
customer_phone: Optional[str] = Field(default=None, description="고객 연락처")
start_time: datetime = Field(description="예약 시작 시간")
end_time: datetime = Field(description="예약 종료 시간")
price: float = Field(description="예약 금액")
status: Literal["confirmed", "pending", "cancelled", "noshow"] = Field(
default="confirmed", description="예약 상태"
)
notes: Optional[str] = Field(default=None, description="메모")
created_at: datetime = Field(default_factory=datetime.now, description="생성 시간")
def is_overlapping(self, other: "Reservation") -> bool:
"""다른 예약과 시간이 겹치는지 확인"""
return (
self.start_time < other.end_time and
self.end_time > other.start_time
)
class Customer(BaseModel):
"""고객 정보 모델"""
phone: str = Field(description="고객 연락처")
name: str = Field(description="고객 이름")
is_blacklisted: bool = Field(default=False, description="블랙리스트 여부")
noshow_count: int = Field(default=0, description="노쇼 횟수")
total_reservations: int = Field(default=0, description="총 예약 횟수")
notes: Optional[str] = Field(default=None, description="메모")
class PlatformConfig(BaseModel):
"""플랫폼 설정 모델"""
platform: Platform = Field(description="플랫폼 이름")
ical_url: Optional[str] = Field(default=None, description="iCal URL")
fee_rate: float = Field(default=0.0, description="수수료율 (0~1)")
enabled: bool = Field(default=True, description="활성화 여부")
class RevenueData(BaseModel):
"""매출 데이터 모델"""
platform: Platform
total_amount: float
reservation_count: int
fee_amount: float
net_amount: float