feat(mi-dia): tabs Mis oportunidades/Mis apartados con fases y cotizador vinculado
- Resumen Mi día: misOportunidades.items (lista de trabajo con perfil y último cambio) y misApartados (Vendedor = yo, estados no finales) - Nuevos endpoints: POST /oportunidades/:id/etapa (Agendo Cita, Afluencia, Cotizador, Aparto, No Asistio, Abandono; con fecha de cita) y POST /apartados/:id/estado (pipeline Enkontrol: Pago Apartado → Firma Cliente (Venta) / Cancelacion Apartado); ambos mueven el item al grupo Monday correspondiente - Mi día: tabs Mis leads / Mis oportunidades / Mis apartados; botón Cotizar abre /quote con el cliente prellenado y la oportunidad ligada - Cotizador: prefill desde query params (cliente, teléfono, email, desarrollo, unidad) y envío de oportunidadId; al guardar, el API actualiza ESE item (Precio final, Tipo propuesta, etapa Cotizador) en vez de buscar por teléfono o crear duplicado - grupos-estado: 'Cancelacion Apartado' → Historico - Estados finales de apartado: agrega Firma Cliente (Venta) y Cancelacion Apartado - Tests: 455 API + 14 mi-dia + 88 cotizador, todo en verde
This commit is contained in:
@@ -4,10 +4,12 @@ import {
|
||||
esRolConEquipo,
|
||||
formatoFechaCorta,
|
||||
hoyLocal,
|
||||
urlCotizadorParaOportunidad,
|
||||
DESARROLLOS_LEAD,
|
||||
MOTIVOS_NO_COMPRA,
|
||||
ORIGENES_LEAD,
|
||||
textoDiasRestantes,
|
||||
type OportunidadMiDia,
|
||||
} from './mi-dia'
|
||||
|
||||
describe('catálogos', () => {
|
||||
@@ -67,3 +69,41 @@ describe('hoyLocal', () => {
|
||||
expect(hoyLocal()).toMatch(/^\d{4}-\d{2}-\d{2}$/)
|
||||
})
|
||||
})
|
||||
|
||||
describe('urlCotizadorParaOportunidad', () => {
|
||||
const opBase: OportunidadMiDia = {
|
||||
id: 'opp-1',
|
||||
nombre: 'María Pérez',
|
||||
telefono: '4771234567',
|
||||
email: 'maria@correo.com',
|
||||
etapa: 'Afluencia',
|
||||
desarrollo: 'SENDA',
|
||||
modeloInteres: 'SOHO',
|
||||
unidadCodigo: 'U-9',
|
||||
updatedAt: '2026-09-04T10:00:00Z',
|
||||
ultimoCambio: null,
|
||||
}
|
||||
|
||||
it('prellena cliente, contacto, desarrollo y unidad, y vincula la oportunidad', () => {
|
||||
const url = urlCotizadorParaOportunidad(opBase)
|
||||
const params = new URLSearchParams(url.replace('/quote/?', ''))
|
||||
expect(url.startsWith('/quote/?')).toBe(true)
|
||||
expect(params.get('cliente')).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('unidad')).toBe('U-9')
|
||||
expect(params.get('oportunidadId')).toBe('opp-1')
|
||||
})
|
||||
|
||||
it('omite los campos vacíos', () => {
|
||||
const url = urlCotizadorParaOportunidad({ ...opBase, telefono: '', email: '', desarrollo: '', unidadCodigo: '' })
|
||||
const params = new URLSearchParams(url.replace('/quote/?', ''))
|
||||
expect(params.get('cliente')).toBe('María Pérez')
|
||||
expect(params.get('oportunidadId')).toBe('opp-1')
|
||||
expect(params.has('telefono')).toBe(false)
|
||||
expect(params.has('email')).toBe(false)
|
||||
expect(params.has('desarrollo')).toBe(false)
|
||||
expect(params.has('unidad')).toBe(false)
|
||||
})
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user