'use client'; import { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Card, CardContent } from '@horux/shared-ui'; import { Header } from '@/components/layouts/header'; import { DespachoSubnav } from '@/components/despachos/despacho-subnav'; import { PeriodoSelector } from '@/components/periodo-selector'; import { apiClient } from '@/lib/api/client'; import { useAuthStore } from '@/stores/auth-store'; import { usePeriodoStore, añoMesFromFechaInicio } from '@/stores/periodo-store'; import { User, AlertTriangle, Loader2, ChevronDown, ChevronRight, CheckCircle2 } from 'lucide-react'; interface Miembro { userId: string; nombre: string; email: string; rol: 'supervisor' | 'auxiliar'; contribuyentes: number; obligacionesAtrasadas: number; tareasAtrasadas: number; totalPendientes: number; totalPeriodo: number; completadasPeriodo: number; avancePct: number | null; } interface SupervisorConAuxiliares extends Miembro { auxiliares: Miembro[]; } interface EquipoStatsResponse { supervisores: SupervisorConAuxiliares[]; huerfanos: Miembro[]; } const ROLES_SUPERVISORY = new Set(['owner', 'cfo', 'supervisor']); function AvanceBar({ pct }: { pct: number | null }) { if (pct === null) return Sin datos; const color = pct >= 80 ? 'bg-success' : pct >= 50 ? 'bg-amber-500' : 'bg-destructive'; const text = pct >= 80 ? 'text-success' : pct >= 50 ? 'text-amber-600' : 'text-destructive'; return (
{pct}%
); } function AtrasoBadge({ total }: { total: number }) { if (total === 0) { return ( Al día ); } return ( {total} ); } export default function EquipoPage() { const role = useAuthStore(s => s.user?.role); const enabled = role ? ROLES_SUPERVISORY.has(role) : false; const { fechaInicio } = usePeriodoStore(); const { año, mes } = añoMesFromFechaInicio(fechaInicio); const [expandedId, setExpandedId] = useState(null); const { data, isLoading } = useQuery({ queryKey: ['despacho-equipo-stats', año, mes], queryFn: async () => { const { data } = await apiClient.get( `/despachos/equipo-stats?año=${año}&mes=${mes}`, ); return data; }, enabled, }); if (!enabled) { return ( <>
Esta sección solo está disponible para owner y supervisor.
); } const supervisores = data?.supervisores ?? []; const huerfanos = data?.huerfanos ?? []; const sinDatos = !isLoading && supervisores.length === 0 && huerfanos.length === 0; return ( <>
{isLoading ? (
Cargando...
) : sinDatos ? ( No hay supervisores ni auxiliares en el despacho. ) : ( <> {supervisores.length > 0 && ( {supervisores.map(sup => { const expanded = expandedId === sup.userId; const tieneAux = sup.auxiliares.length > 0; return ( setExpandedId(expanded ? null : sup.userId)} /> ); })}
Miembro Contribuyentes Avance del periodo Atrasos
)} {huerfanos.length > 0 && (

Auxiliares sin supervisor asignado

{huerfanos.map(aux => ( ))}
Auxiliar Contribuyentes Avance del periodo Atrasos
{aux.nombre}
{aux.email}
{aux.contribuyentes}
)} )}
); } function FilaSupervisor({ sup, expanded, tieneAux, onToggle, }: { sup: SupervisorConAuxiliares; expanded: boolean; tieneAux: boolean; onToggle: () => void; }) { return ( <> {tieneAux ? ( expanded ? : ) : null}
{sup.nombre}
{sup.email} · {sup.auxiliares.length} auxiliar{sup.auxiliares.length === 1 ? '' : 'es'}
{sup.contribuyentes} {expanded && sup.auxiliares.map(aux => (
{aux.nombre}
{aux.email}
{aux.contribuyentes} ))} {expanded && sup.auxiliares.length === 0 && ( Sin auxiliares asignados. )} ); }