v1.8.0: Sistema funcional con filtros optimizados y UI mejorada

Mejoras en Módulo de Tickets:
- Implementado sistema de filtros funcional por estado y prioridad
- Tabla compacta estilo auditoría (50% más espacio visible)
- Backend actualizado: parámetros 'status' y 'priority' con validación
- Interfaz más limpia con labels reducidos y 2 columnas de filtros
- Eliminación de columna SLA duplicada en tabla

Correcciones Backend:
- Endpoint /v1/tickets/: filtros 'status' y 'priority' funcionan correctamente
- Endpoint /v1/sla/violations: timezone UTC y eager loading con selectinload
- Endpoint /v1/client-profile/: generación explícita de UUID
- Migración fix_client_profiles_timestamps aplicada

Mejoras UI Frontend:
- Tabla tickets: encabezados uppercase text-xs, celdas px-3 py-2
- Toggle de estado activo/inactivo en gestión de tenants (tabla + modal)
- Badges más compactos con rounded-full
- Botones de acciones con separador visual y transiciones
- Filtros con URLSearchParams para construcción correcta de queries

Arquitectura:
- SQLAlchemy: eager loading para evitar N+1 queries
- Timezone handling: datetime.now(timezone.utc) para comparaciones
- Svelte reactivity: keyed loops y spread operator para forzar updates
- API client: endpoint con query string completo

Estado del sistema: Totalmente funcional para producción MVP
This commit is contained in:
2026-02-17 12:43:06 -07:00
parent cc1e964c3a
commit e6440395ea
8 changed files with 245 additions and 1633 deletions

View File

@@ -240,14 +240,19 @@ async def create_ticket(
async def get_tickets(
skip: int = 0,
limit: int = 100,
status_filter: Optional[str] = None,
status: Optional[str] = None,
priority: Optional[str] = None,
db: AsyncSession = Depends(get_db),
current_user: User = Depends(get_current_user)
):
"""
Obtener tickets
Obtener tickets con filtros opcionales
Roles ADMIN/SUPPORT_MANAGER/AGENT: Ven todos los tickets del tenant
Roles CLIENT_USER/CLIENT_ADMIN: Solo ven sus propios tickets
Filtros disponibles:
- status: NEW, IN_PROGRESS, WAITING_CUSTOMER, RESOLVED, CLOSED, REOPENED
- priority: LOW, MEDIUM, HIGH, URGENT
"""
# Construir query base filtrado por tenant
query = select(Ticket).where(
@@ -258,14 +263,26 @@ async def get_tickets(
if current_user.role in ["CLIENT_USER", "CLIENT_ADMIN"]:
query = query.where(Ticket.created_by == current_user.id)
if status_filter:
# Filtro por estado
if status:
try:
status_enum = TicketStatus[status_filter.upper()]
status_enum = TicketStatus[status.upper()]
query = query.where(Ticket.status == status_enum)
except KeyError:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Invalid status: {status_filter}"
detail=f"Invalid status: {status}. Valid values: NEW, IN_PROGRESS, WAITING_CUSTOMER, RESOLVED, CLOSED, REOPENED"
)
# Filtro por prioridad
if priority:
try:
priority_enum = TicketPriority[priority.upper()]
query = query.where(Ticket.priority == priority_enum)
except KeyError:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Invalid priority: {priority}. Valid values: LOW, MEDIUM, HIGH, URGENT"
)
query = query.order_by(Ticket.created_at.desc()).offset(skip).limit(limit)