feat(mi-dia): gate de afluencia para apartar, pestana Afluencia en bitacora, cita cliente con fecha en calendario, filtros por desarrollo/origen corregidos, rangos salariales nuevos y soporte como acceso directo
This commit is contained in:
@@ -60,8 +60,27 @@ export const VOCABULARIO = {
|
||||
// Labels oficiales de desarrollo (verificados el 2026-09-04; SOLE y MUTUO
|
||||
// agregados 2026-09 — existen en captura e inventario)
|
||||
DESARROLLOS: ['ATELIER', 'DIAGONAL', 'ESTANZA', 'SENDA', 'SOLANA', 'SOLE', 'MUTUO'],
|
||||
// Campos de calificación que hacen "completa" una afluencia: sin ellos la
|
||||
// oportunidad NO puede avanzar a 'Aparto' (regla de negocio del cliente)
|
||||
CAMPOS_AFLUENCIA_REQUERIDOS: ['estadoCivil', 'tipoEmpleo', 'rangoSalarial', 'tipoEconomia', 'califica', 'loQuierePara'],
|
||||
} as const
|
||||
|
||||
/** Campos de afluencia faltantes en un datosJson ('[]' = afluencia completa) */
|
||||
export function camposAfluenciaFaltantes(datosJson: string | null): string[] {
|
||||
let datos: Record<string, unknown> = {}
|
||||
if (datosJson) {
|
||||
try { datos = JSON.parse(datosJson) as Record<string, unknown> } catch { datos = {} }
|
||||
}
|
||||
return VOCABULARIO.CAMPOS_AFLUENCIA_REQUERIDOS.filter(
|
||||
(c) => typeof datos[c] !== 'string' || (datos[c] as string).trim() === '',
|
||||
)
|
||||
}
|
||||
|
||||
/** ¿La fila tiene la afluencia completa? (gate de 'Aparto' y flag de Mi día) */
|
||||
export function afluenciaCompleta(datosJson: string | null): boolean {
|
||||
return camposAfluenciaFaltantes(datosJson).length === 0
|
||||
}
|
||||
|
||||
export type FaseLead = (typeof VOCABULARIO.FASES_LEAD)[number]
|
||||
export type FaseOportunidad = (typeof VOCABULARIO.FASES_OPORTUNIDAD)[number]
|
||||
export type FaseApartado = (typeof VOCABULARIO.FASES_APARTADO)[number]
|
||||
|
||||
Reference in New Issue
Block a user