feat(ux): 17 mejoras de experiencia de usuario
Backend (10 endpoints nuevos): - Recordatorios personales (CRUD + tabla RecordatorioVendedor) - Lead scoring 0-100 (etapa+recencia+datos) - Dashboard mora (pagos vencidos, monto, días atraso) - Timeline de pagos (pagado/vence/futuro) - Perfil completo contacto (pagos+cotizaciones+docs+score) - Exportar contactos a CSV Frontend Mi día: - Resumen matutino (saludo+KPIs) - Historial visual lead (timeline) - Score badge 0-100 (verde/amarillo/rojo) - Vista kanban (drag & drop) Frontend Cobranza: - Dashboard mora (tabla+WhatsApp) - Timeline pagos visual (nodos coloreados) Frontend Alta Clientes: - Checklist documentos visual - Foto cliente (cámara) Frontend Landing: - Perfil contacto completo - Exportar contactos CSV Frontend Mi día (extras): - Comparativa mensual - KPIs dashboard (leads hoy, ventas, conversión) 806 tests, 5 apps construidas.
This commit is contained in:
@@ -43,6 +43,7 @@ import {
|
||||
listarPlanes,
|
||||
obtenerPlan,
|
||||
registrarAbonoEndpoint,
|
||||
timelinePlan,
|
||||
} from '../controllers/planes.controller.js'
|
||||
import {
|
||||
cambiarEtapaOportunidadEndpoint,
|
||||
@@ -64,7 +65,12 @@ import {
|
||||
listarUsuariosMondayEndpoint,
|
||||
} from '../controllers/usuarios.controller.js'
|
||||
import { resumenMiDiaEndpoint } from '../controllers/mi-dia.controller.js'
|
||||
import { listarContactosEndpoint, detalleContactoEndpoint } from '../controllers/contactos.controller.js'
|
||||
import {
|
||||
listarContactosEndpoint,
|
||||
detalleContactoEndpoint,
|
||||
perfilCompletoEndpoint,
|
||||
exportarContactosEndpoint,
|
||||
} from '../controllers/contactos.controller.js'
|
||||
import { webhookMonday } from '../controllers/webhooks.controller.js'
|
||||
import {
|
||||
correrRoundRobin,
|
||||
@@ -80,7 +86,7 @@ import {
|
||||
subirDocumento,
|
||||
} from '../controllers/ai.controller.js'
|
||||
import { loginEndpoint, meEndpoint, cambiarPasswordEndpoint } from '../controllers/auth.controller.js'
|
||||
import { resumenReportes } from '../controllers/reportes.controller.js'
|
||||
import { resumenReportes, scoringEndpoint, moraEndpoint } from '../controllers/reportes.controller.js'
|
||||
import { estadoSistema } from '../controllers/sistema.controller.js'
|
||||
import {
|
||||
requireAdmin,
|
||||
@@ -95,6 +101,12 @@ import {
|
||||
} from '../controllers/config.controller.js'
|
||||
import { crearNotaEndpoint, listarNotasEndpoint } from '../controllers/notas.controller.js'
|
||||
import { listarAuditoriaEndpoint } from '../controllers/auditoria.controller.js'
|
||||
import {
|
||||
crearRecordatorioEndpoint,
|
||||
listarRecordatoriosEndpoint,
|
||||
completarRecordatorioEndpoint,
|
||||
eliminarRecordatorioEndpoint,
|
||||
} from '../controllers/recordatorio-vendedor.controller.js'
|
||||
import { buscarEndpoint } from '../controllers/buscar.controller.js'
|
||||
import {
|
||||
miTableroEndpoint,
|
||||
@@ -176,6 +188,7 @@ apiRouter.post('/planes', crearPlan)
|
||||
apiRouter.get('/planes', listarPlanes)
|
||||
apiRouter.get('/planes/cobranza-del-dia', cobranzaHoy)
|
||||
apiRouter.get('/planes/:id', obtenerPlan)
|
||||
apiRouter.get('/planes/:id/timeline', timelinePlan)
|
||||
apiRouter.post('/planes/:id/abonos', registrarAbonoEndpoint)
|
||||
apiRouter.post('/planes/:id/notas', agregarNota)
|
||||
apiRouter.post('/planes/:id/cancelar', cancelarPlan)
|
||||
@@ -184,6 +197,12 @@ apiRouter.patch('/planes/:id/monday', ligarMondayItem)
|
||||
apiRouter.get('/cobranza/recordatorios', listarRecordatorios)
|
||||
apiRouter.post('/cobranza/recordatorios/run', correrRecordatorios)
|
||||
|
||||
// ── Recordatorios personales del vendedor ────────────────────────────
|
||||
apiRouter.post('/recordatorios', crearRecordatorioEndpoint)
|
||||
apiRouter.get('/recordatorios', listarRecordatoriosEndpoint)
|
||||
apiRouter.patch('/recordatorios/:id/completar', completarRecordatorioEndpoint)
|
||||
apiRouter.delete('/recordatorios/:id', eliminarRecordatorioEndpoint)
|
||||
|
||||
apiRouter.post('/oportunidades/:mondayItemId/perder', perderOportunidadEndpoint)
|
||||
// Cambio de etapa desde los botones de "Mis oportunidades" (Mi día)
|
||||
apiRouter.post('/oportunidades/:itemId/etapa', cambiarEtapaOportunidadEndpoint)
|
||||
@@ -200,7 +219,9 @@ apiRouter.get('/apartados/:id/notas', listarNotasEndpoint)
|
||||
apiRouter.get('/mi-dia/resumen', resumenMiDiaEndpoint)
|
||||
|
||||
apiRouter.get('/contactos', listarContactosEndpoint)
|
||||
apiRouter.get('/contactos/exportar', exportarContactosEndpoint)
|
||||
apiRouter.get('/contactos/:id/detalle', detalleContactoEndpoint)
|
||||
apiRouter.get('/contactos/:id/completo', perfilCompletoEndpoint)
|
||||
|
||||
// GET estático: va ANTES de /leads/:itemId para no colisionar con el parámetro
|
||||
apiRouter.get('/leads/buscar', buscarLeadsEndpoint)
|
||||
@@ -218,6 +239,8 @@ apiRouter.patch('/usuarios/me/monday', actualizarVinculoMondayEndpoint)
|
||||
apiRouter.patch('/usuarios/:id/rol', actualizarRolEndpoint)
|
||||
|
||||
apiRouter.get('/reportes/resumen', resumenReportes)
|
||||
apiRouter.get('/reportes/scoring', scoringEndpoint)
|
||||
apiRouter.get('/reportes/mora', moraEndpoint)
|
||||
// Tablero personal del vendedor: métricas, conversión, ventas, origen, desarrollos
|
||||
apiRouter.get('/reportes/mi-tablero', miTableroEndpoint)
|
||||
// Métricas de uso (admin/coordinador): leads por usuario, tasa de descarte, actividades
|
||||
|
||||
Reference in New Issue
Block a user