'use client'; import { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle, Button, cn } from '@horux/shared-ui'; import { DashboardShell } from '@/components/layouts/dashboard-shell'; import { useMisTareas, useCompletarTareaPeriodo, useDescompletarTareaPeriodo } from '@/lib/hooks/use-tareas-mis'; import { CheckCircle2, Circle, AlertTriangle, Clock, Building2 } from 'lucide-react'; const RECURRENCIAS: Record = { semanal: 'Semanal', quincenal: 'Quincenal', mensual: 'Mensual', bimestral: 'Bimestral', trimestral: 'Trimestral', semestral: 'Semestral', anual: 'Anual', }; const DIAS_SEMANA = ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado']; interface TareaItem { id: string; contribuyenteId: string; contribuyenteRfc: string; contribuyenteRazonSocial: string; nombre: string; descripcion: string | null; recurrencia: string; diaSemana: number | null; diaMes: number | null; soloSupervisorCompleta: boolean; periodoActual: { id: string; fechaLimite: string; completada: boolean; completadaAt: string | null; completadaPor: string | null; notas: string | null; } | null; } export default function TareasPage() { const { data: tareas, isLoading } = useMisTareas(); const completarMut = useCompletarTareaPeriodo(); const descompletarMut = useDescompletarTareaPeriodo(); const [filter, setFilter] = useState<'todas' | 'pendientes' | 'completadas'>('todas'); if (isLoading) { return (

Cargando tareas...

); } const all = tareas ?? []; const filtered = all.filter((t: TareaItem) => { if (filter === 'pendientes') return !t.periodoActual?.completada; if (filter === 'completadas') return t.periodoActual?.completada; return true; }); // Agrupar por contribuyente const grouped = filtered.reduce((acc: Record, t: TareaItem) => { const key = t.contribuyenteId; if (!acc[key]) acc[key] = []; acc[key].push(t); return acc; }, {}); const contribuyenteMap = all.reduce((acc: Record, t: TareaItem) => { if (!acc[t.contribuyenteId]) { acc[t.contribuyenteId] = { rfc: t.contribuyenteRfc, razonSocial: t.contribuyenteRazonSocial }; } return acc; }, {}); const pendingCount = all.filter((t: TareaItem) => !t.periodoActual?.completada).length; const completedCount = all.filter((t: TareaItem) => t.periodoActual?.completada).length; return (
{/* Stats */}

{pendingCount}

Pendientes

{completedCount}

Completadas

{/* Filters */}
{(['todas', 'pendientes', 'completadas'] as const).map((f) => ( ))}
{/* Tareas por contribuyente */} {Object.keys(grouped).length === 0 ? ( No hay tareas {filter === 'pendientes' ? 'pendientes' : filter === 'completadas' ? 'completadas' : ''}. ) : ( Object.keys(grouped).map((contribuyenteId) => { const info = contribuyenteMap[contribuyenteId]; const items = grouped[contribuyenteId]; return ( {info.razonSocial} ({info.rfc}) {items.map((t: TareaItem) => { const p = t.periodoActual; const fl = p ? new Date(p.fechaLimite) : null; const today = new Date(); today.setHours(0, 0, 0, 0); const atrasada = !!fl && !p?.completada && fl < today; const recLabel = RECURRENCIAS[t.recurrencia] || t.recurrencia; const cuando = (t.recurrencia === 'semanal' || t.recurrencia === 'quincenal') ? DIAS_SEMANA[t.diaSemana ?? 1] : `día ${t.diaMes}`; return (
{t.nombre} {t.soloSupervisorCompleta && ( Supervisor )} {atrasada && ( Atrasada )}
{t.descripcion && (

{t.descripcion}

)}

{recLabel} · {cuando} {fl && ` · vence ${fl.toLocaleDateString('es-MX', { day: 'numeric', month: 'short' })}`}

); })}
); }) )}
); }