feat(mi-dia): botón Afluencia abre el formulario prellenado y actualiza la oportunidad
- Mis oportunidades: 'Afluencia →' navega a /client/?afluencia=<id> con nombre, contacto, desarrollo y modelo prellenados - Alta Afluencia: con oportunidadId el envío ACTUALIZA la oportunidad en Monday (perfil completo + etapa Afluencia) en vez de crear duplicado; sin oportunidadId el flujo de captura nueva no cambia - monday.service: actualizarOportunidadAfluencia (mismo builder de la creación + name); moverAGrupoSegunEstado tras actualizar - Tests: 457 API + 16 mi-dia + 116 alta-clientes, verde
This commit is contained in:
@@ -5,6 +5,7 @@ import {
|
||||
formatoFechaCorta,
|
||||
hoyLocal,
|
||||
urlCotizadorParaOportunidad,
|
||||
urlAfluenciaParaOportunidad,
|
||||
DESARROLLOS_LEAD,
|
||||
MOTIVOS_NO_COMPRA,
|
||||
ORIGENES_LEAD,
|
||||
@@ -107,3 +108,40 @@ describe('urlCotizadorParaOportunidad', () => {
|
||||
expect(params.has('unidad')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
describe('urlAfluenciaParaOportunidad', () => {
|
||||
const opBase: OportunidadMiDia = {
|
||||
id: 'opp-7',
|
||||
nombre: 'María Pérez',
|
||||
telefono: '4771234567',
|
||||
email: 'maria@correo.com',
|
||||
etapa: 'Agendo Cita',
|
||||
desarrollo: 'SENDA',
|
||||
modeloInteres: 'SOHO',
|
||||
unidadCodigo: '',
|
||||
updatedAt: '2026-09-04T10:00:00Z',
|
||||
ultimoCambio: null,
|
||||
}
|
||||
|
||||
it('abre /client con el id de la oportunidad y los datos de prefill', () => {
|
||||
const url = urlAfluenciaParaOportunidad(opBase)
|
||||
const params = new URLSearchParams(url.replace('/client/?', ''))
|
||||
expect(url.startsWith('/client/?')).toBe(true)
|
||||
expect(params.get('afluencia')).toBe('opp-7')
|
||||
expect(params.get('nombre')).toBe('María Pérez')
|
||||
expect(params.get('telefono')).toBe('4771234567')
|
||||
expect(params.get('email')).toBe('maria@correo.com')
|
||||
expect(params.get('desarrollo')).toBe('SENDA')
|
||||
expect(params.get('modelo')).toBe('SOHO')
|
||||
})
|
||||
|
||||
it('omite los campos vacíos', () => {
|
||||
const url = urlAfluenciaParaOportunidad({ ...opBase, telefono: '', email: '', desarrollo: '', modeloInteres: '' })
|
||||
const params = new URLSearchParams(url.replace('/client/?', ''))
|
||||
expect(params.get('afluencia')).toBe('opp-7')
|
||||
expect(params.has('telefono')).toBe(false)
|
||||
expect(params.has('email')).toBe(false)
|
||||
expect(params.has('desarrollo')).toBe(false)
|
||||
expect(params.has('modelo')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -182,6 +182,22 @@ export function urlCotizadorParaOportunidad(op: OportunidadMiDia): string {
|
||||
return `/quote/?${params.toString()}`
|
||||
}
|
||||
|
||||
/**
|
||||
* URL del formulario de Alta Afluencia (/client/) prellenado con los datos de
|
||||
* la oportunidad. Al enviarlo, el API ACTUALIZA esa oportunidad (perfil
|
||||
* completo + etapa 'Afluencia') en vez de crear un duplicado.
|
||||
*/
|
||||
export function urlAfluenciaParaOportunidad(op: OportunidadMiDia): string {
|
||||
const params = new URLSearchParams()
|
||||
params.set('afluencia', op.id)
|
||||
params.set('nombre', op.nombre)
|
||||
if (op.telefono !== '') params.set('telefono', op.telefono)
|
||||
if (op.email !== '') params.set('email', op.email)
|
||||
if (op.desarrollo !== '') params.set('desarrollo', op.desarrollo)
|
||||
if (op.modeloInteres !== '') params.set('modelo', op.modeloInteres)
|
||||
return `/client/?${params.toString()}`
|
||||
}
|
||||
|
||||
const ROLES_CON_EQUIPO = ['coordinador', 'corporativo', 'admin']
|
||||
|
||||
/** ¿El rol ve la sección de equipo? (misma regla que el API) */
|
||||
|
||||
Reference in New Issue
Block a user