Files
FRASA-CAS/api-gateway/src/controllers/mi-dia.controller.ts

70 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 === 'manager' ||
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 }
res.json(resumenMiDiaLocal(usuarioMiDia, capturas, clientes, new Date(), actividades, usuarios))
}