fix(mi-dia): leads y oportunidades en pestañas separadas + limpieza

- misLeads: solo muestra items del tablero Leads (captura ligera)
- misOportunidades: muestra items del tablero Oportunidades (afluencia)
- Eliminado el merge que causaba que el mismo item apareciera en ambas
- apartadosPorVencer: filtrado por esMio (solo propios)
- Limpiado duplicado MONICA RODRIGUEZ VEGA de Monday Leads
- 630 tests verdes
This commit is contained in:
2026-09-06 20:22:55 +00:00
parent e466013697
commit aadbc6f83f
4 changed files with 26 additions and 48 deletions

View File

@@ -282,11 +282,9 @@ export async function resumenMiDia(
fuente: 'oportunidad',
ultimoCambio: null,
}))
// 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) =>
// "Mis leads" solo muestra items del tablero Leads (captura ligera).
// Las oportunidades van exclusivamente en "Mis oportunidades".
const misLeads: LeadMiDia[] = misLeadsLeads.sort((a, b) =>
b.updatedAt.localeCompare(a.updatedAt),
)
@@ -589,37 +587,23 @@ export function resumenMiDiaLocal(
const oportunidadesLocales = capturas.filter((c) => c.board === 'OPORTUNIDADES')
const apartadosLocales = capturas.filter((c) => c.board === 'APARTADO')
// "Mis leads" mezcla Leads + Oportunidades, igual que el camino Monday
const misLeads: LeadMiDia[] = [
...leadsLocales
.filter((c) => !esEstadoTerminalLead(c.etapa))
.map((c) => ({
id: c.leadId,
nombre: c.nombreLead,
telefono: c.telefono ?? '',
email: c.email ?? '',
estado: c.etapa,
origen: c.origen ?? '',
updatedAt: c.updatedAt.toISOString(),
fuente: 'lead' as const,
ultimoCambio: ultimoCambioLocal(c, usuario.nombre),
pendienteSync: c.pendienteSync,
})),
...oportunidadesLocales
.filter((c) => !esEtapaTerminal(c.etapa))
.map((c) => ({
id: c.leadId,
nombre: c.nombreLead,
telefono: c.telefono ?? '',
email: c.email ?? '',
estado: c.etapa,
origen: c.origen ?? '',
updatedAt: c.updatedAt.toISOString(),
fuente: 'oportunidad' as const,
ultimoCambio: ultimoCambioLocal(c, usuario.nombre),
pendienteSync: c.pendienteSync,
})),
].sort(porUpdatedAtDesc)
// "Mis leads" solo muestra leads (board LEADS), no oportunidades
const misLeads: LeadMiDia[] = leadsLocales
.filter((c) => !esEstadoTerminalLead(c.etapa))
.map((c) => ({
id: c.leadId,
nombre: c.nombreLead,
telefono: c.telefono ?? '',
email: c.email ?? '',
estado: c.etapa,
origen: c.origen ?? '',
updatedAt: c.updatedAt.toISOString(),
fuente: 'lead' as const,
ultimoCambio: ultimoCambioLocal(c, usuario.nombre),
pendienteSync: c.pendienteSync,
}))
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
// (oportunidades se muestran exclusivamente en misOportunidades)
// Conteo por etapa de TODAS las oportunidades (incluye terminales, como Monday)
const porEtapa: Record<string, number> = {}