feat: mis clientes en Mi dia + perfilamiento de la afluencia en dashboards
- Cliente.capturadoPorId: el alta (directa y progresiva) registra al usuario que la inicio; el panel Mi dia muestra 'Mis clientes' con su estado (En captura / Cliente) sin depender de Monday. - LeadMonday ahora lee las 11 columnas de perfil del tablero Leads (estado civil, edad, rango salarial, tipo de empleo/economia, califica, credito, modelo, etc.). - GET /api/reportes/resumen agrega leads.perfil con conteos por dimension (valores vacios se omiten; edad en buckets). - /dash/ gana la seccion 'Perfilamiento de la afluencia' con mini-graficas de barras por dimension.
This commit is contained in:
@@ -39,6 +39,19 @@ export interface LeadMonday {
|
||||
telefono: string // columna phone 'Teléfono' ('' si no tiene)
|
||||
email: string // columna email 'Email' ('' si no tiene)
|
||||
vendedorIds: number[] // user IDs asignados en la columna people 'Vendedor'
|
||||
// Perfilamiento (alimenta las gráficas de /dash/); todos tolerantes: si la
|
||||
// columna no existe en el board o viene vacía, quedan '' / null
|
||||
desarrollo?: string // status 'Desarrollo'
|
||||
modeloInteres?: string // status 'Modelo de Interés'
|
||||
medioContacto?: string // text 'Medio de Contacto'
|
||||
edad?: number | null // numbers 'Edad' (null si vacía o no numérica)
|
||||
estadoCivil?: string // status 'Estado Civil'
|
||||
tipoEmpleo?: string // status 'Tipo de Empleo'
|
||||
credito?: string // status 'Crédito'
|
||||
tipoEconomia?: string // status 'Tipo de Economía'
|
||||
califica?: string // status 'Califica'
|
||||
rangoSalarial?: string // text 'Rango Salarial'
|
||||
loQuierePara?: string // text 'Lo Quiere Para'
|
||||
}
|
||||
|
||||
/** Actividad del tablero Actividades (agenda de seguimiento del CRM) */
|
||||
@@ -656,6 +669,13 @@ export class MondayService {
|
||||
const colOrigen = cols.get('Origen')
|
||||
const colTelefono = cols.get('Teléfono')
|
||||
const colEmail = cols.get('Email')
|
||||
// Perfilamiento: lectura tolerante por título ('' / null si falta la columna)
|
||||
const textoDe = (titulo: string): string => {
|
||||
const col = cols.get(titulo)
|
||||
return col ? (porId.get(col.id)?.text ?? '') : ''
|
||||
}
|
||||
const edadRaw = textoDe('Edad')
|
||||
const edadNum = Number(edadRaw)
|
||||
return {
|
||||
id: item.id,
|
||||
nombre: item.name,
|
||||
@@ -666,6 +686,17 @@ export class MondayService {
|
||||
telefono: colTelefono ? (porId.get(colTelefono.id)?.text ?? '') : '',
|
||||
email: colEmail ? (porId.get(colEmail.id)?.text ?? '') : '',
|
||||
vendedorIds,
|
||||
desarrollo: textoDe('Desarrollo'),
|
||||
modeloInteres: textoDe('Modelo de Interés'),
|
||||
medioContacto: textoDe('Medio de Contacto'),
|
||||
edad: edadRaw.trim() === '' || Number.isNaN(edadNum) ? null : edadNum,
|
||||
estadoCivil: textoDe('Estado Civil'),
|
||||
tipoEmpleo: textoDe('Tipo de Empleo'),
|
||||
credito: textoDe('Crédito'),
|
||||
tipoEconomia: textoDe('Tipo de Economía'),
|
||||
califica: textoDe('Califica'),
|
||||
rangoSalarial: textoDe('Rango Salarial'),
|
||||
loQuierePara: textoDe('Lo Quiere Para'),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user