feat(mi-dia): vendedores solo-app con cuenta Monday compartida

- Las listas personales de Mi día (leads, oportunidades, apartados) se
  calculan por captura local (LeadCaptura/Cliente + mapping
  LeadOportunidad) ADEMÁS de la columna people de Monday: la app ya es
  totalmente usable sin cuenta Monday
- Config MONDAY_VENDEDOR_COMPARTIDO_ID: cuando el usuario está ligado a
  la cuenta compartida, la columna people se ignora para 'lo mío' (si
  no, todos verían los leads de todos)
- scripts/vincular-vendedores-compartido.js: vincula todos los usuarios
  con rol vendedor a la cuenta Monday compartida
- Tests: 478 API, verde; verificado en vivo con usuario sin Monday
This commit is contained in:
2026-09-05 05:37:52 +00:00
parent b40b8d4627
commit af2fb10956
6 changed files with 171 additions and 24 deletions

View File

@@ -2,6 +2,7 @@ import type { Request, Response } from 'express'
import { prisma } from '../services/prisma.js'
import { mondayService } from '../services/monday.service.js'
import { resumenMiDia } from '../services/mi-dia.service.js'
import { config } from '../config/index.js'
import { AppError } from '../utils/errors.js'
/**
@@ -44,6 +45,17 @@ export async function resumenMiDiaEndpoint(req: Request, res: Response): Promise
orderBy: { createdAt: 'desc' },
})
// "Lo mío" incluye las oportunidades ligadas a mis capturas (mapping
// LeadOportunidad: conversión con "Agendo" y afluencias históricas)
const mappings = await prisma.leadOportunidad.findMany({
where: { leadId: { in: capturas.map((c) => c.leadId) } },
})
const capturadosIds = new Set([
...capturas.map((c) => c.leadId),
...capturas.map((c) => c.oportunidadId).filter((id): id is string => id !== null),
...mappings.map((m) => m.oportunidadId),
])
// Altas de clientes iniciadas por el usuario (registro local)
const clientes = await prisma.cliente.findMany({
where: { capturadoPorId: usuario.id },
@@ -57,6 +69,9 @@ export async function resumenMiDiaEndpoint(req: Request, res: Response): Promise
nombresPorMondayId,
capturas,
clientes,
new Date(),
config.automatizaciones.vendedorCompartidoId > 0 ? config.automatizaciones.vendedorCompartidoId : null,
capturadosIds,
),
)
}