This commit is contained in:
Iliyan Angelov
2025-11-23 18:59:18 +02:00
parent be07802066
commit 627959f52b
1840 changed files with 236564 additions and 3475 deletions

View File

@@ -0,0 +1,68 @@
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])