feat(mejoras): 25 mejoras UX en todos los módulos + purga Monday

Backend: mi-dia siempre local, vocabulario canónico, AplicacionPago con usuario
Mi día: modal español real, cita desde modal, score falso eliminado
Cotizador: barra sticky, persistencia local con folio
Alta Clientes: redirect eliminado, foto conectada, asesor desde sesión, refs dinámicas
Cobranza: contrato Mora arreglado, link a Plan, abono próximo pago, WhatsApp
Landing: contactos locales, ModalContacto eliminado, ModoTrabajo eliminado
Dashboards: MiTablero unificado, funnel con descartados, drill-down, rango fechas
Chat FRASA: corpus 5 desarrollos, 6 herramientas, historial conversaciones

69 archivos, 7 apps construidas
This commit is contained in:
2026-09-11 06:52:37 +00:00
parent 075d47c304
commit 64b01246d6
69 changed files with 1600 additions and 1133 deletions

View File

@@ -11,6 +11,8 @@ export interface MiTablero {
oportunidades: number
apartados: number
vendidos: number
/** Leads descartados (etapa terminal DESCARTADO); etapa extra al final del funnel */
descartados: number
}
ventasMes: {
monto: number
@@ -125,6 +127,7 @@ export function construirMiTablero(
c.board === 'APARTADO' &&
['FIRMA CLIENTE (VENTA)', 'ESCRITURADO', 'FORMALIZADO'].includes(c.etapa.toUpperCase()),
).length
const descartados = capturas.filter((c) => c.etapa.toUpperCase() === 'DESCARTADO').length
// -- Ventas del mes --
const inicioMes = new Date(hoy.getFullYear(), hoy.getMonth(), 1)
@@ -183,7 +186,7 @@ export function construirMiTablero(
return {
generadoEn: ahora.toISOString(),
leadsPorDia,
conversion: { leads, oportunidades, apartados, vendidos },
conversion: { leads, oportunidades, apartados, vendidos, descartados },
ventasMes,
porOrigen,
porDesarrollo,
@@ -203,6 +206,7 @@ export async function obtenerMiTablero(usuarioId: string): Promise<MiTablero> {
const capturas = await prisma.leadCaptura.findMany({
where: { usuarioId },
select: {
leadId: true,
board: true,
etapa: true,
origen: true,
@@ -246,11 +250,11 @@ export async function obtenerMetricasUso(usuarioId?: string): Promise<MetricasUs
const inicioMes = new Date(hoy.getFullYear(), hoy.getMonth(), 1)
// Filtro por usuario específico (coordinador ve solo su equipo; admin ve todos)
const whereUsuario = usuarioId ? { usuarioId } : undefined
const usuarioFiltro = usuarioId ?? undefined
const [capturas, actividades, usuarios] = await Promise.all([
prisma.leadCaptura.findMany({
where: whereUsuario,
...(usuarioFiltro ? { where: { usuarioId: usuarioFiltro } } : {}),
select: {
usuarioId: true,
etapa: true,
@@ -258,14 +262,14 @@ export async function obtenerMetricasUso(usuarioId?: string): Promise<MetricasUs
},
}),
prisma.actividadLocal.findMany({
where: whereUsuario,
...(usuarioFiltro ? { where: { usuarioId: usuarioFiltro } } : {}),
select: {
usuarioId: true,
estado: true,
},
}),
prisma.usuario.findMany({
where: whereUsuario ? { id: usuarioId } : { activo: true },
where: usuarioFiltro ? { id: usuarioFiltro } : { activo: true },
select: {
id: true,
nombre: true,