69 lines
2.9 KiB
Python
69 lines
2.9 KiB
Python
from sqlalchemy import Column, Integer, String, Text, Enum, ForeignKey, DateTime, Boolean, JSON, Numeric
|
|
from sqlalchemy.orm import relationship
|
|
from datetime import datetime
|
|
import enum
|
|
from ..config.database import Base
|
|
|
|
class InspectionType(str, enum.Enum):
|
|
pre_checkin = 'pre_checkin'
|
|
post_checkout = 'post_checkout'
|
|
routine = 'routine'
|
|
maintenance = 'maintenance'
|
|
damage = 'damage'
|
|
|
|
class InspectionStatus(str, enum.Enum):
|
|
pending = 'pending'
|
|
in_progress = 'in_progress'
|
|
completed = 'completed'
|
|
failed = 'failed'
|
|
cancelled = 'cancelled'
|
|
|
|
class RoomInspection(Base):
|
|
__tablename__ = 'room_inspections'
|
|
|
|
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
|
|
room_id = Column(Integer, ForeignKey('rooms.id'), nullable=False, index=True)
|
|
booking_id = Column(Integer, ForeignKey('bookings.id'), nullable=True, index=True)
|
|
|
|
inspection_type = Column(Enum(InspectionType), nullable=False)
|
|
status = Column(Enum(InspectionStatus), nullable=False, default=InspectionStatus.pending)
|
|
|
|
# Scheduling
|
|
scheduled_at = Column(DateTime, nullable=False, index=True)
|
|
started_at = Column(DateTime, nullable=True)
|
|
completed_at = Column(DateTime, nullable=True)
|
|
|
|
# Assignment
|
|
inspected_by = Column(Integer, ForeignKey('users.id'), nullable=True)
|
|
created_by = Column(Integer, ForeignKey('users.id'), nullable=True)
|
|
|
|
# Checklist
|
|
checklist_template_id = Column(Integer, nullable=True) # Reference to checklist template
|
|
checklist_items = Column(JSON, nullable=False) # Array of {category: string, item: string, status: string, notes: string, photos: string[]}
|
|
# status can be: 'pass', 'fail', 'needs_attention', 'not_applicable'
|
|
|
|
# Overall assessment
|
|
overall_score = Column(Numeric(3, 2), nullable=True) # 0-5 rating
|
|
overall_notes = Column(Text, nullable=True)
|
|
issues_found = Column(JSON, nullable=True) # Array of {severity: string, description: string, photo: string}
|
|
# severity can be: 'critical', 'major', 'minor', 'cosmetic'
|
|
|
|
# Photos
|
|
photos = Column(JSON, nullable=True) # Array of photo URLs
|
|
|
|
# Follow-up
|
|
requires_followup = Column(Boolean, nullable=False, default=False)
|
|
followup_notes = Column(Text, nullable=True)
|
|
maintenance_request_id = Column(Integer, ForeignKey('room_maintenance.id'), nullable=True)
|
|
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
|
|
|
|
# Relationships
|
|
room = relationship('Room', back_populates='inspections')
|
|
booking = relationship('Booking')
|
|
inspector = relationship('User', foreign_keys=[inspected_by])
|
|
creator = relationship('User', foreign_keys=[created_by])
|
|
maintenance_request = relationship('RoomMaintenance', foreign_keys=[maintenance_request_id])
|
|
|