""" Ticket Schemas - ServiceManagerWeb Pydantic schemas para gestión de tickets y comentarios. """ from pydantic import BaseModel, ConfigDict, model_validator from typing import Optional, Literal from datetime import datetime class TicketCreate(BaseModel): """Schema para crear un ticket.""" subject: str description: str category_id: Optional[str] = None affected_system_id: Optional[str] = None priority: Literal["LOW", "MEDIUM", "HIGH", "URGENT"] = "MEDIUM" contact_email: Optional[str] = None contact_phone: Optional[str] = None @model_validator(mode="before") @classmethod def _accept_legacy_fields(cls, data): if not isinstance(data, dict): return data if "subject" not in data and "title" in data: data["subject"] = data["title"] if "affected_system_id" not in data and "system_id" in data: data["affected_system_id"] = data["system_id"] return data class TicketUpdate(BaseModel): """Schema para actualizar un ticket.""" subject: Optional[str] = None description: Optional[str] = None status: Optional[str] = None priority: Optional[str] = None assigned_to: Optional[str] = None class TicketResponse(BaseModel): """Schema de respuesta con todos los campos públicos del ticket.""" model_config = ConfigDict(from_attributes=True) id: str ticket_number: str subject: str title: str description: str status: str priority: str category_id: Optional[str] = None category_name: Optional[str] = None affected_system_id: Optional[str] = None system_id: Optional[str] = None affected_system_name: Optional[str] = None contact_email: Optional[str] = None contact_phone: Optional[str] = None created_by: str assigned_to: Optional[str] = None assigned_to_name: Optional[str] = None created_at: datetime updated_at: datetime sla_response_due: Optional[datetime] = None sla_resolution_due: Optional[datetime] = None first_response_at: Optional[datetime] = None resolved_at: Optional[datetime] = None class TicketCloseRequest(BaseModel): """Schema para cerrar un ticket con resolución opcional.""" resolution: Optional[str] = None class CommentCreate(BaseModel): """Schema para crear un comentario en un ticket.""" content: str is_internal: bool = False class CommentResponse(BaseModel): """Schema de respuesta de comentario.""" id: str ticket_id: str author_id: str author_name: str content: str is_internal: bool created_at: datetime updated_at: datetime model_config = ConfigDict(from_attributes=True)