'use client'; import Link from 'next/link'; 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 { useContribuyenteStore } from '@/stores/contribuyente-store'; import { usePeriodoStore, añoMesFromFechaInicio } from '@/stores/periodo-store'; import { Building2, Clock, AlertTriangle, CheckCircle2, Loader2 } from 'lucide-react'; interface Asignado { contribuyenteId: string; rfc: string; nombre: string; carteraNombre: string | null; obligacionesPendientes: number; obligacionesAtrasadas: number; obligacionesCompletadas: number; tareasPendientes: number; tareasAtrasadas: number; tareasCompletadas: number; } const ROLES_ASIGNADOS = new Set(['owner', 'cfo', 'supervisor', 'auxiliar', 'contador', 'visor']); const PLATFORM_SUPERSET = new Set(['platform_admin', 'platform_ti']); export default function MisAsignadosPage() { const role = useAuthStore(s => s.user?.role); const platformRoles = useAuthStore(s => s.user?.platformRoles); const isPlatformStaff = platformRoles?.some(r => PLATFORM_SUPERSET.has(r)) ?? false; const enabled = role ? (ROLES_ASIGNADOS.has(role) || isPlatformStaff) : false; const { setSelectedContribuyente } = useContribuyenteStore(); const { fechaInicio } = usePeriodoStore(); const { año, mes } = añoMesFromFechaInicio(fechaInicio); const { data, isLoading } = useQuery({ queryKey: ['despacho-mis-asignados', año, mes], queryFn: async () => { const { data } = await apiClient.get(`/despachos/mis-asignados?año=${año}&mes=${mes}`); return data; }, enabled, }); if (!enabled) { return ( <>
No tienes contribuyentes asignados.
); } const items = data ?? []; return ( <>
{isLoading ? (
Cargando...
) : items.length === 0 ? ( No tienes contribuyentes asignados todavía. Pídele al owner que te los asigne en su cartera. ) : ( {items.map(it => { const total = it.obligacionesPendientes + it.obligacionesAtrasadas + it.obligacionesCompletadas + it.tareasPendientes + it.tareasAtrasadas + it.tareasCompletadas; const completadas = it.obligacionesCompletadas + it.tareasCompletadas; const pct = total > 0 ? Math.round((completadas / total) * 100) : null; const barColor = pct === null ? 'bg-muted' : pct >= 80 ? 'bg-success' : pct >= 50 ? 'bg-amber-500' : 'bg-destructive'; const totalAtrasos = it.obligacionesAtrasadas + it.tareasAtrasadas; const tieneAtrasos = totalAtrasos > 0; return ( ); })}
Contribuyente Cartera Avance Atrasos Obl. periodo Tareas periodo
setSelectedContribuyente(it.contribuyenteId, it.rfc, it.nombre)} className="hover:underline" >
{it.nombre}
{it.rfc}
{it.carteraNombre ?? '—'} {pct === null ? ( Sin datos ) : (
= 80 ? 'text-success' : pct >= 50 ? 'text-amber-600' : 'text-destructive' }`}> {pct}%
)}
{tieneAtrasos ? ( {totalAtrasos} ) : ( Al día )} {it.obligacionesCompletadas} / 0 ? 'text-amber-600 font-medium' : 'text-muted-foreground'}> {it.obligacionesPendientes} {it.tareasCompletadas} / 0 ? 'text-amber-600 font-medium' : 'text-muted-foreground'}> {it.tareasPendientes}
)}
); }