import { useEffect, useMemo, useState } from 'react' import { Link } from 'react-router-dom' import { listarPlanes, type ResultadoPlanes } from '../services/repository' import { cobranzaDelDia, round2, statusPago } from '../lib/cobranza' import { formatoFechaCorta, formatoMoneda } from '../lib/formatters' import KpiCard from '../components/KpiCard' /** Vista "Cobranza del día": vencidos + por vencer en 7 días, a través de todos los planes activos */ export default function HoyPage() { const [resultado, setResultado] = useState(null) const [errorCarga, setErrorCarga] = useState(null) const hoy = useMemo(() => new Date(), []) useEffect(() => { let activo = true listarPlanes() .then((r) => { if (activo) setResultado(r) }) .catch((e: unknown) => { if (activo) setErrorCarga(e instanceof Error ? e.message : 'Error al cargar los planes') }) return () => { activo = false } }, []) const planes = useMemo(() => resultado?.planes ?? [], [resultado]) const items = useMemo(() => cobranzaDelDia(planes, hoy), [planes, hoy]) const vencidos = items.filter((i) => i.atraso > 0) const porVencer = items.length - vencidos.length const totalPorCobrar = round2( items.reduce((acc, i) => acc + (i.pago.monto - i.pago.montoPagado), 0), ) if (!resultado) { return errorCarga ? (
{errorCarga}
) : (

Cargando...

) } return (

Cobranza del día

Pagos vencidos y vencimientos de los próximos 7 días, en todos los planes activos.

{resultado.origen === 'local' && (

Modo offline: sin conexión al API; mostrando datos guardados en este navegador.

)}
{items.map(({ plan, pago, atraso }) => ( ))} {items.length === 0 && ( )}
Cliente Teléfono Unidad # pago Vencimiento Monto Restante Días atraso Plan
{plan.clienteNombre} {plan.clienteTelefono ? ( {plan.clienteTelefono} ) : ( — )} {plan.unidadCodigo} {pago.numPago} {formatoFechaCorta(pago.fechaVencimiento)} {formatoMoneda(pago.monto)} {formatoMoneda(round2(pago.monto - pago.montoPagado))} {atraso > 0 ? ( {atraso} ) : ( {statusPago(pago, hoy) === 'PARCIAL' ? 'Parcial' : 'Por vencer'} )} Ver plan
No hay pagos vencidos ni vencimientos en los próximos 7 días.
) }