70 lines
2.6 KiB
Python
70 lines
2.6 KiB
Python
from sqlalchemy import Column, Integer, String, Text, DateTime, ForeignKey, Enum
|
|
from sqlalchemy.orm import relationship
|
|
from datetime import datetime
|
|
import enum
|
|
from ..database import Base
|
|
|
|
|
|
class ReportType(str, enum.Enum):
|
|
NO_PASO = "NO_PASO"
|
|
RETRASO = "RETRASO"
|
|
ACUMULACION = "ACUMULACION"
|
|
OTRO = "OTRO"
|
|
|
|
|
|
class ReportStatus(str, enum.Enum):
|
|
PENDIENTE = "PENDIENTE"
|
|
EN_PROCESO = "EN_PROCESO"
|
|
RESUELTO = "RESUELTO"
|
|
CERRADO = "CERRADO"
|
|
|
|
|
|
class Report(Base):
|
|
__tablename__ = "reports"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
|
address_id = Column(Integer, ForeignKey("addresses.id"), nullable=False)
|
|
folio = Column(String, unique=True, index=True, nullable=False)
|
|
report_type = Column(String, nullable=False)
|
|
description = Column(Text, nullable=True)
|
|
status = Column(String, default=ReportStatus.PENDIENTE)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
|
|
|
|
user = relationship("User", back_populates="reports")
|
|
address = relationship("Address", back_populates="reports")
|
|
|
|
|
|
class ServiceRating(Base):
|
|
__tablename__ = "service_ratings"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
|
address_id = Column(Integer, ForeignKey("addresses.id"), nullable=False)
|
|
rating = Column(Integer, nullable=False) # 1-5
|
|
comment = Column(Text, nullable=True)
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
|
|
user = relationship("User", back_populates="ratings")
|
|
address = relationship("Address", back_populates="ratings")
|
|
|
|
|
|
class OperationalReport(Base):
|
|
"""Reportes generados por el personal operativo (empleados)."""
|
|
__tablename__ = "operational_reports"
|
|
|
|
id = Column(Integer, primary_key=True, index=True)
|
|
employee_id = Column(Integer, ForeignKey("users.id"), nullable=False)
|
|
folio = Column(String, unique=True, index=True, nullable=False)
|
|
category = Column(String, nullable=False)
|
|
# NO_ARRANQUE | FALLA_MECANICA | ACCIDENTE | OBSTACULO | TRAFICO |
|
|
# COMBUSTIBLE | CLIMA | OTRO
|
|
description = Column(Text, nullable=True)
|
|
severity = Column(String, default="MEDIA") # BAJA | MEDIA | ALTA
|
|
route_id = Column(String, nullable=True) # RUTA-XX (opcional)
|
|
truck_id = Column(Integer, nullable=True)
|
|
status = Column(String, default="REPORTADO") # REPORTADO | EN_ATENCION | RESUELTO
|
|
created_at = Column(DateTime, default=datetime.utcnow)
|
|
resolved_at = Column(DateTime, nullable=True)
|