feat(mejoras): 22 mejoras UX en todos los módulos

Mi día: cancelación con motivo, conteo escrituración real, cita sin retroceder, calendario completo
Cobranza: MoraDashboard respeta alcance, hoy dinámico, cancelar con motivo
Landing: contactos paginados, error vs vacío diferenciado
Dashboards: KPI renombrado, drill-down planes activos
Chat: historial recarga, preguntas rotativas, error solo toast
Transversal: shadow-sm corrupto corregido en 9 archivos

553 API tests + 7 apps construidas
This commit is contained in:
2026-09-11 12:48:47 +00:00
parent 89d95eb53b
commit 1ba7aa49da
28 changed files with 518 additions and 160 deletions

View File

@@ -83,9 +83,9 @@ export default function MiTablero({ alCambiarAcciones }: { alCambiarAcciones: (a
detalle={`${conversion.oportunidades} de ${conversion.leads} leads`}
/>
<KpiCard
titulo="Ventas del mes"
valor={conversion.vendidos}
detalle={`$${(tablero.ventasMes.monto / 1000).toFixed(0)}k MXN · ${tablero.ventasMes.unidades} cotizada(s)`}
titulo="Cotizaciones del mes"
valor={tablero.ventasMes.unidades}
detalle={`$${(tablero.ventasMes.monto / 1000).toFixed(0)}k MXN cotizados`}
/>
<KpiCard
titulo="Actividades abiertas"

View File

@@ -47,7 +47,7 @@ export default function SeccionEquipo() {
{equipo.porVendedor.length === 0 ? (
<EstadoVacio mensaje="Sin leads asignados al equipo" />
) : (
<table className="w-full overflow-hidden rounded-xl border border-[#E5E7EB] bg-white shadow dark:border-[#1E293B] dark:bg-[#1E293B] -sm">
<table className="w-full overflow-hidden rounded-xl border border-[#E5E7EB] bg-white shadow-sm dark:border-[#1E293B] dark:bg-[#1E293B]">
<thead className="border-b border-[#E5E7EB]">
<tr>
<th className={CLASE_ENCABEZADO}>Vendedor</th>

View File

@@ -49,6 +49,7 @@ const RANGOS_DIAS = [7, 30, 90] as const
/** Rutas de drill-down a otras apps del ecosistema (NGINX las sirve como SPAs aparte) */
const RUTA_PLANES_VENCIDOS = '/pay/?vista=todos&status=ACTIVO&sort=atraso&dir=desc'
const RUTA_PLANES_ACTIVOS = '/pay/?vista=todos&status=ACTIVO'
const RUTA_MI_DIA = '/hoy/'
/**
@@ -194,7 +195,8 @@ export default function TableroGeneral({
<KpiCard
titulo="Planes activos"
valor={resumen.cobranza.planes.activos}
detalle={`${resumen.cobranza.planes.liquidados} liquidados · ${resumen.cobranza.planes.cancelados} cancelados`}
detalle={`${resumen.cobranza.planes.liquidados} liquidados · ${resumen.cobranza.planes.cancelados} cancelados · click para ver planes`}
onClick={() => irAApp(RUTA_PLANES_ACTIVOS)}
/>
<KpiCard titulo="Actividades abiertas" valor={resumen.actividadesAbiertas} />
<KpiCard