'use client'; import { useState } from 'react'; 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, Search, FolderOpen, ChevronDown } 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 [filtroCliente, setFiltroCliente] = useState(''); const [filtroCartera, setFiltroCartera] = useState(''); 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 ?? []; const carterasUnicas = Array.from(new Set(items.map(it => it.carteraNombre || 'Sin cartera'))).sort((a, b) => a.localeCompare(b, 'es', { sensitivity: 'base' }) ); const itemsFiltrados = items.filter((it) => { const coincideCliente = [it.nombre, it.rfc].some(v => v.toLowerCase().includes(filtroCliente.trim().toLowerCase()) ); const coincideCartera = filtroCartera === '' || (filtroCartera === '__sin_cartera__' ? !it.carteraNombre : it.carteraNombre === filtroCartera); return coincideCliente && coincideCartera; }); return ( <>
{isLoading ? (
Cargando...
) : items.length === 0 ? ( No tienes contribuyentes asignados todavía. Pídele al owner que te los asigne en su cartera. ) : (
setFiltroCliente(e.target.value)} placeholder="Buscar por cliente o RFC..." className="w-full rounded-md border border-input bg-background pl-9 pr-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring" />
{itemsFiltrados.length === 0 ? (
No hay resultados para los filtros seleccionados.
) : ( {itemsFiltrados.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}
)}
)}
); }