diff --git a/api-gateway/src/controllers/apartados.controller.ts b/api-gateway/src/controllers/apartados.controller.ts index 381132d..66d682e 100644 --- a/api-gateway/src/controllers/apartados.controller.ts +++ b/api-gateway/src/controllers/apartados.controller.ts @@ -28,12 +28,16 @@ export const FASES_APARTADO_PERMITIDAS = [ 'Contrato Enkontrol', 'Firma Cliente', 'Cancelacion Apartado', + 'Venta', 'Seguimiento', + 'Integracion', 'Llamada Escrituras', 'X Escriturar', 'Banco/Infonavit', 'X Autorizar', + 'Autorizado', 'Escriturado', + 'Titulado', 'Cancelo', ] as const diff --git a/api-gateway/src/services/mi-dia.service.ts b/api-gateway/src/services/mi-dia.service.ts index 6eaf60a..8c69ce3 100644 --- a/api-gateway/src/services/mi-dia.service.ts +++ b/api-gateway/src/services/mi-dia.service.ts @@ -334,10 +334,10 @@ export async function resumenMiDia( const miosOportunidadesIds = new Set( capturas.filter((c) => c.oportunidadId).map((c) => c.oportunidadId), ) - const miosApartados = apartados.filter( - (a) => - (esMio(a.vendedorIds, a.id) || apartadosDeMisClientes.has(a.id) || miosOportunidadesIds.has(a.id)) && !esEstadoFinalApartado(a.estado), + const miosApartadosTodos = apartados.filter((a) => + esMio(a.vendedorIds, a.id) || apartadosDeMisClientes.has(a.id) || miosOportunidadesIds.has(a.id), ) + const miosApartados = miosApartadosTodos.filter((a) => !esEstadoFinalApartado(a.estado)) const [cambiosLeads, cambiosOportunidades, cambiosApartados] = await Promise.all([ monday.getUltimosCambios( @@ -377,8 +377,9 @@ export async function resumenMiDia( // "Mis apartados": Vendedor = yo, estado no final del pipeline Enkontrol, // por fecha límite ascendente (sin fecha al final) - // Todos los apartados incluyendo terminales (para pestaña Escrituración) - const todosApartados: ApartadoMiDia[] = miosApartados + // Todos los apartados míos incluyendo terminales (para pestaña Escrituración); + // se calcula desde la lista ANTES de excluir estados finales + const todosApartados: ApartadoMiDia[] = miosApartadosTodos .map((a) => ({ id: a.id, nombre: a.nombre, diff --git a/apps/mi-dia/src/components/CalendarioCitas.tsx b/apps/mi-dia/src/components/CalendarioCitas.tsx index aadf183..4621d32 100644 --- a/apps/mi-dia/src/components/CalendarioCitas.tsx +++ b/apps/mi-dia/src/components/CalendarioCitas.tsx @@ -1,6 +1,7 @@ import { useMemo, useState } from 'react' import type { ActividadMiDia, OportunidadMiDia } from '../lib/mi-dia' -import { formatoFechaCorta } from '../lib/mi-dia' +import { formatoFechaCorta, urlWhatsApp } from '../lib/mi-dia' +import { getSesion } from '../services/auth' /** Evento unificado para el calendario */ interface EventoCalendario { @@ -12,16 +13,56 @@ interface EventoCalendario { detalle?: string estado?: string idOriginal: string + /** Oportunidad fuente (solo tipo 'oportunidad'): habilita llamar/WhatsApp/ver detalle */ + item?: OportunidadMiDia } interface Props { actividades: ActividadMiDia[] oportunidades: OportunidadMiDia[] + /** Abre el DetalleLeadModal de la oportunidad del evento (desde MiDiaPage) */ + onVerDetalle?: (item: OportunidadMiDia) => void } const NOMBRE_DIAS = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'] const NOMBRE_MESES = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'] +const CLASE_BOTON_EVENTO = + 'rounded-lg border border-[#D1D5DB] bg-white px-3 py-1.5 text-xs font-medium text-accent shadow-sm transition-all duration-100 ease-out hover:bg-blue-50 dark:border-accent dark:bg-[#0F172A] dark:text-accent dark:hover:bg-accent/10' + +/** Botones de contacto del evento: llamar, WhatsApp y ver detalle de la oportunidad */ +function AccionesEvento({ item, onVerDetalle }: { item: OportunidadMiDia; onVerDetalle?: (item: OportunidadMiDia) => void }) { + const vendedor = getSesion()?.usuario.nombre ?? '' + const tieneTelefono = item.telefono.trim() !== '' + return ( +
{notaError}
} {notasFiltradas.filter((n) => !n.completado).length === 0 ? (No hay tareas pendientes.
) : (