feat: Interesado en leads, lada MX/USA, orígenes FRASA y subcategoría de descarte

- Mis leads: botón Interesado (label sembrado en Monday, mueve a Leads
  Progreso); el botón Agenda cita ahora solo vive en Mis oportunidades
- Descarte: además de la categoría, subcategoría del catálogo de Monday
  (workspace de referencia CRM FRASA); se guarda en la columna
  Subcategoria del tablero Motivos No Compra y el item queda en el grupo
  de su categoría
- Teléfonos con selector de lada 🇲🇽 +52 / 🇺🇸 +1 en captura rápida (Mi
  día), Alta Afluencia y Alta de Cliente (tel. casa y celular); Monday
  escribe countryShortName MX/US y el número compacto (rechaza espacios);
  el dedup sigue comparando por los últimos 10 dígitos
- Origen nuevo en captura rápida y afluencia: PASE, PROSPECCION ASESOR,
  ACTIVACION, FACEBOOK FRASA, REFERIDO, OTRO (sembrados en Leads.Origen y
  Oportunidades.Origen del Lead)
- Tests: 461 API + 16 mi-dia + 116 alta-clientes, verde
This commit is contained in:
2026-09-04 23:28:56 +00:00
parent 5d7c6f58cd
commit 27ba9ea8fa
14 changed files with 279 additions and 72 deletions

View File

@@ -415,8 +415,14 @@ export class MondayService {
return typeof crudo === 'number' ? crudo : Number(crudo)
case 'email':
return { email: String(crudo), text: String(crudo) }
case 'phone':
return { phone: String(crudo), countryShortName: 'MX' }
case 'phone': {
// LADA explícita: '+1...' (o 11 dígitos empezando en 1) = USA; el resto = México.
// Monday rechaza el número con espacios ("+52 664..."): se envía compacto.
const tel = String(crudo).replace(/\s+/g, '')
const digitos = tel.replace(/\D/g, '')
const esUsa = tel.startsWith('+1') || (digitos.length === 11 && digitos.startsWith('1'))
return { phone: tel, countryShortName: esUsa ? 'US' : 'MX' }
}
case 'checkbox':
return { checked: crudo === true || crudo === 'true' ? 'true' : 'false' }
case 'people':
@@ -751,6 +757,7 @@ export class MondayService {
if (boardId === '') throw new AppError(500, 'MONDAY_BOARD_MOTIVOS no está configurado')
const columnValues = await this.construirColumnValues(boardId, {
Categoria: datos.categoria,
Subcategoria: datos.subcategoria,
Descripcion: datos.descripcion,
})
const buscada = datos.categoria.trim().toUpperCase()
@@ -1501,6 +1508,8 @@ export interface DatosVenta {
export interface DatosMotivoNoCompra {
nombre: string // '<motivo> — <nombre del item de origen>'
categoria: string // una de MOTIVOS_NO_COMPRA
/** Label de la columna status 'Subcategoria' (catálogo del board de referencia) */
subcategoria?: string
descripcion?: string
}