fix(mi-dia): apartados por vencer solo propios + eliminar duplicado leads/oportunidades

1. apartadosPorVencer: filtrado por esMio — cada vendedor solo ve sus
   propios apartados por vencer, no los de todos.

2. misLeads: excluye items que ya estan en misOportunidades — evita que
   el mismo item aparezca en ambas pestanas (leads + oportunidades).

3. 630 tests verdes.
This commit is contained in:
2026-09-06 19:04:44 +00:00
parent 487cd6f578
commit e466013697
2 changed files with 7 additions and 2 deletions

View File

@@ -315,7 +315,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
expect(r.misActividadesHoy).toEqual([])
expect(r.conteos).toEqual({ leadsNuevosSemana: 0, actividadesAbiertas: 0 })
// Los apartados por vencer son del pipeline completo: sí se muestran
expect(r.apartadosPorVencer).toHaveLength(1)
expect(r.apartadosPorVencer).toHaveLength(0) // solo apartados propios
})
it('conteos: leads nuevos de los últimos 7 días suman AMBOS tableros (incluye terminales recientes)', async () => {

View File

@@ -282,7 +282,11 @@ export async function resumenMiDia(
fuente: 'oportunidad',
ultimoCambio: null,
}))
const misLeads: LeadMiDia[] = [...misLeadsLeads, ...misLeadsOportunidades].sort((a, b) =>
// Excluir de "Mis leads" los que ya aparecen en "Mis oportunidades"
// para no mostrar el mismo item en dos pestañas
const idsEnOportunidades = new Set(misLeadsOportunidades.map((o) => o.id))
const misLeadsLeadsSinDuplicados = misLeadsLeads.filter((l) => !idsEnOportunidades.has(l.id))
const misLeads: LeadMiDia[] = [...misLeadsLeadsSinDuplicados, ...misLeadsOportunidades].sort((a, b) =>
b.updatedAt.localeCompare(a.updatedAt),
)
@@ -437,6 +441,7 @@ export async function resumenMiDia(
const apartadosPorVencer: ApartadoPorVencer[] = apartados
.filter(
(a) =>
esMio(a.vendedorIds, a.id) &&
a.fechaLimite !== '' &&
a.fechaLimite >= hoy &&
a.fechaLimite <= en7Dias &&