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
66 lines
2.7 KiB
TypeScript
66 lines
2.7 KiB
TypeScript
import type { Request, Response } from 'express'
|
|
import { prisma } from '../services/prisma.js'
|
|
import { resumenMiDiaLocal, type ActividadLocalMiDia, type UsuarioLocal } from '../services/mi-dia.service.js'
|
|
import { AppError } from '../utils/errors.js'
|
|
|
|
const ROLES_CON_EQUIPO = ['coordinador', 'corporativo', 'admin']
|
|
|
|
/**
|
|
* GET /api/mi-dia/resumen — agenda del vendedor logueado.
|
|
* SIEMPRE responde desde datos locales (LeadCaptura / Cliente / ActividadLocal):
|
|
* Monday ya no participa en este endpoint. El "mío" se resuelve por el
|
|
* usuarioId de cada captura; admin/dirección ven todas.
|
|
*/
|
|
export async function resumenMiDiaEndpoint(req: Request, res: Response): Promise<void> {
|
|
// Con AUTH_ENABLED=false (arranque temprano/tests) no hay token: se usa el admin
|
|
const sub = req.usuarioToken?.sub
|
|
const usuario = sub
|
|
? await prisma.usuario.findUnique({ where: { id: sub } })
|
|
: await prisma.usuario.findUnique({ where: { username: 'admin' } })
|
|
if (!usuario || !usuario.activo) throw new AppError(401, 'Credenciales inválidas')
|
|
|
|
// Capturas de afluencia: admin ve todas, otros solo las suyas
|
|
const esAdmin = usuario.rol === 'admin' || usuario.rol === 'direccion_general' || usuario.rol === 'director_ventas'
|
|
const capturas = await prisma.leadCaptura.findMany({
|
|
where: esAdmin ? {} : { usuarioId: usuario.id },
|
|
orderBy: { createdAt: 'desc' },
|
|
})
|
|
|
|
// Altas de clientes: admin ve todas, otros solo las suyas
|
|
const clientes = await prisma.cliente.findMany({
|
|
where: esAdmin ? {} : { capturadoPorId: usuario.id },
|
|
orderBy: { createdAt: 'desc' },
|
|
})
|
|
|
|
// Actividades locales del usuario
|
|
const actividadesRaw = await prisma.actividadLocal.findMany({
|
|
where: { usuarioId: usuario.id },
|
|
orderBy: { createdAt: 'desc' },
|
|
})
|
|
const actividades: ActividadLocalMiDia[] = actividadesRaw.map((a) => ({
|
|
id: a.id,
|
|
titulo: a.titulo,
|
|
descripcion: a.descripcion,
|
|
usuarioId: a.usuarioId,
|
|
leadCapturaId: a.leadCapturaId,
|
|
fechaVencimiento: a.fechaVencimiento,
|
|
fechaCierre: a.fechaCierre,
|
|
estado: a.estado,
|
|
tipo: a.tipo,
|
|
}))
|
|
|
|
// Usuarios activos (para la sección equipo, solo coordinador/admin)
|
|
let usuarios: UsuarioLocal[] = []
|
|
if (ROLES_CON_EQUIPO.includes(usuario.rol)) {
|
|
const usuariosRaw = await prisma.usuario.findMany({
|
|
where: { activo: true },
|
|
select: { id: true, nombre: true, rol: true, activo: true },
|
|
})
|
|
usuarios = usuariosRaw.map((u) => ({ id: u.id, nombre: u.nombre, rol: u.rol, activo: u.activo }))
|
|
}
|
|
|
|
const usuarioMiDia = { nombre: usuario.nombre, rol: usuario.rol, mondayUserId: usuario.mondayUserId }
|
|
|
|
res.json(resumenMiDiaLocal(usuarioMiDia, capturas, clientes, new Date(), actividades, usuarios))
|
|
}
|