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

@@ -148,6 +148,8 @@ export interface ResumenMiDia {
misCapturas: CapturaMiDia[]
misClientes: ClienteMiDia[]
misActividadesHoy: ActividadMiDia[]
/** Todas las actividades ABIERTAS del usuario (sin filtro de fecha): alimenta el calendario */
todasMisActividades: ActividadMiDia[]
apartadosPorVencer: ApartadoPorVencer[]
/** MIS oportunidades: conteo por etapa + lista de trabajo (etapas no terminales) */
misOportunidades: { porEtapa: Record<string, number>; items: OportunidadMiDia[] }
@@ -381,13 +383,8 @@ export function resumenMiDiaLocal(
const hoy = fechaLocal(ahora, 0)
const manana = fechaLocal(ahora, 1)
const en7Dias = fechaLocal(ahora, 7)
const misActividadesHoy: ActividadMiDia[] = actividades
const actividadesAbiertasOrdenadas = actividades
.filter((a) => a.estado.toUpperCase() === 'ABIERTA')
.filter((a) => {
if (!a.fechaVencimiento) return true
const fv = a.fechaVencimiento.toISOString().slice(0, 10)
return fv <= manana
})
.sort((a, b) => {
const fa = a.fechaVencimiento?.toISOString() ?? '9999'
const fb = b.fechaVencimiento?.toISOString() ?? '9999'
@@ -400,6 +397,12 @@ export function resumenMiDiaLocal(
fecha: a.fechaVencimiento ? a.fechaVencimiento.toISOString().slice(0, 10) : '',
estado: a.estado,
}))
const todasMisActividades: ActividadMiDia[] = actividadesAbiertasOrdenadas
const misActividadesHoy: ActividadMiDia[] = actividadesAbiertasOrdenadas
.filter((a) => {
if (a.fecha === '') return true
return a.fecha <= manana
})
// --- Apartados por vencer ---
const apartadosPorVencer: ApartadoPorVencer[] = apartadosLocales
@@ -479,6 +482,7 @@ export function resumenMiDiaLocal(
misCapturas: misCapturasSinDuplicadosLocal,
misClientes,
misActividadesHoy,
todasMisActividades,
apartadosPorVencer,
misOportunidades: { porEtapa, items: itemsOportunidades },
misApartados,