Files
Hotel-Booking/Backend/src/models/workflow.py
Iliyan Angelov 627959f52b updates
2025-11-23 18:59:18 +02:00

128 lines
5.8 KiB
Python

from sqlalchemy import Column, Integer, String, DateTime, Boolean, Text, Enum, ForeignKey, JSON
from sqlalchemy.orm import relationship
from datetime import datetime
import enum
from ..config.database import Base
class WorkflowType(str, enum.Enum):
pre_arrival = 'pre_arrival'
room_preparation = 'room_preparation'
maintenance = 'maintenance'
guest_communication = 'guest_communication'
follow_up = 'follow_up'
custom = 'custom'
class WorkflowStatus(str, enum.Enum):
active = 'active'
inactive = 'inactive'
archived = 'archived'
class WorkflowTrigger(str, enum.Enum):
booking_created = 'booking_created'
booking_confirmed = 'booking_confirmed'
check_in = 'check_in'
check_out = 'check_out'
maintenance_request = 'maintenance_request'
guest_message = 'guest_message'
manual = 'manual'
scheduled = 'scheduled'
class Workflow(Base):
__tablename__ = 'workflows'
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
name = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
workflow_type = Column(Enum(WorkflowType), nullable=False)
status = Column(Enum(WorkflowStatus), nullable=False, default=WorkflowStatus.active)
trigger = Column(Enum(WorkflowTrigger), nullable=False)
trigger_config = Column(JSON, nullable=True) # Configuration for trigger (e.g., time before check-in)
steps = Column(JSON, nullable=False) # Array of workflow steps
sla_hours = Column(Integer, nullable=True) # SLA in hours for workflow completion
is_active = Column(Boolean, nullable=False, default=True)
created_by = Column(Integer, ForeignKey('users.id'), nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
creator = relationship('User', foreign_keys=[created_by])
workflow_instances = relationship('WorkflowInstance', back_populates='workflow', cascade='all, delete-orphan')
class WorkflowInstance(Base):
__tablename__ = 'workflow_instances'
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
workflow_id = Column(Integer, ForeignKey('workflows.id'), nullable=False)
booking_id = Column(Integer, ForeignKey('bookings.id'), nullable=True)
room_id = Column(Integer, ForeignKey('rooms.id'), nullable=True)
user_id = Column(Integer, ForeignKey('users.id'), nullable=True) # Guest user
status = Column(String(50), nullable=False, default='pending') # pending, in_progress, completed, cancelled
started_at = Column(DateTime, default=datetime.utcnow, nullable=False)
completed_at = Column(DateTime, nullable=True)
due_date = Column(DateTime, nullable=True)
meta_data = Column(JSON, nullable=True) # Additional context data
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
workflow = relationship('Workflow', back_populates='workflow_instances')
booking = relationship('Booking')
room = relationship('Room')
user = relationship('User', foreign_keys=[user_id])
tasks = relationship('Task', back_populates='workflow_instance', cascade='all, delete-orphan')
class TaskStatus(str, enum.Enum):
pending = 'pending'
assigned = 'assigned'
in_progress = 'in_progress'
completed = 'completed'
cancelled = 'cancelled'
overdue = 'overdue'
class TaskPriority(str, enum.Enum):
low = 'low'
medium = 'medium'
high = 'high'
urgent = 'urgent'
class Task(Base):
__tablename__ = 'tasks'
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
title = Column(String(255), nullable=False)
description = Column(Text, nullable=True)
task_type = Column(String(100), nullable=False) # e.g., 'room_cleaning', 'maintenance', 'guest_communication'
status = Column(Enum(TaskStatus), nullable=False, default=TaskStatus.pending)
priority = Column(Enum(TaskPriority), nullable=False, default=TaskPriority.medium)
workflow_instance_id = Column(Integer, ForeignKey('workflow_instances.id'), nullable=True)
booking_id = Column(Integer, ForeignKey('bookings.id'), nullable=True)
room_id = Column(Integer, ForeignKey('rooms.id'), nullable=True)
assigned_to = Column(Integer, ForeignKey('users.id'), nullable=True)
created_by = Column(Integer, ForeignKey('users.id'), nullable=False)
due_date = Column(DateTime, nullable=True)
completed_at = Column(DateTime, nullable=True)
estimated_duration_minutes = Column(Integer, nullable=True)
actual_duration_minutes = Column(Integer, nullable=True)
notes = Column(Text, nullable=True)
meta_data = Column(JSON, nullable=True) # Additional task-specific data
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
workflow_instance = relationship('WorkflowInstance', back_populates='tasks')
booking = relationship('Booking')
room = relationship('Room')
assignee = relationship('User', foreign_keys=[assigned_to])
creator_user = relationship('User', foreign_keys=[created_by])
task_comments = relationship('TaskComment', back_populates='task', cascade='all, delete-orphan')
class TaskComment(Base):
__tablename__ = 'task_comments'
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
task_id = Column(Integer, ForeignKey('tasks.id'), nullable=False)
user_id = Column(Integer, ForeignKey('users.id'), nullable=False)
comment = Column(Text, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
task = relationship('Task', back_populates='task_comments')
user = relationship('User')