feat(apartado): ficha completa en Monday + estado visible en la app
- El alta (directa y progresiva) llena el Apartado con telefono, correo, curp, Precio Final, Enganche, Fecha Compra, Vendedor (el capturista con Monday vinculado) y Forma de Pago; el path webhook/cron hereda contacto, precio y asesor de la oportunidad. - Bidireccional: Mis clientes en /hoy muestra el estado actual del Apartado leyendolo de Monday (si lo mueven en Monday, la app lo refleja en el siguiente refresh). - getApartados con la correccion value-null al leer Estado. - Test del mapa de Tipo propuesta del cotizador (los 502 del log eran de un proceso previo al fix 4f31d1c; queda cubierto).
This commit is contained in:
@@ -310,6 +310,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
||||
nombreCompleto: 'Ana En Captura',
|
||||
proyecto: '',
|
||||
unidadCodigo: null,
|
||||
mondayApartadoId: null,
|
||||
createdAt: new Date('2026-08-26T09:00:00Z'),
|
||||
},
|
||||
{
|
||||
@@ -317,6 +318,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
||||
nombreCompleto: 'Luis Completado',
|
||||
proyecto: 'DIAGONAL',
|
||||
unidadCodigo: 'U-101',
|
||||
mondayApartadoId: null,
|
||||
createdAt: new Date('2026-08-27T09:00:00Z'),
|
||||
},
|
||||
]
|
||||
@@ -329,6 +331,7 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
||||
unidadCodigo: 'U-101',
|
||||
completado: true,
|
||||
capturadoEn: '2026-08-27T09:00:00.000Z',
|
||||
estadoApartado: null,
|
||||
},
|
||||
{
|
||||
id: 'c1',
|
||||
@@ -337,13 +340,57 @@ describe('resumenMiDia (GET /api/mi-dia/resumen)', () => {
|
||||
unidadCodigo: '',
|
||||
completado: false,
|
||||
capturadoEn: '2026-08-26T09:00:00.000Z',
|
||||
estadoApartado: null,
|
||||
},
|
||||
])
|
||||
})
|
||||
|
||||
it('mis clientes: estadoApartado cruza mondayApartadoId contra el tablero Apartado', async () => {
|
||||
const clientes = [
|
||||
{
|
||||
id: 'c1',
|
||||
nombreCompleto: 'Con Apartado',
|
||||
proyecto: 'DIAGONAL',
|
||||
unidadCodigo: 'U-101',
|
||||
mondayApartadoId: 'ap-1',
|
||||
createdAt: new Date('2026-08-27T09:00:00Z'),
|
||||
},
|
||||
{
|
||||
id: 'c2',
|
||||
nombreCompleto: 'Apartado Borrado',
|
||||
proyecto: 'DIAGONAL',
|
||||
unidadCodigo: 'U-102',
|
||||
mondayApartadoId: 'ap-fantasma', // ya no existe en Monday
|
||||
createdAt: new Date('2026-08-26T09:00:00Z'),
|
||||
},
|
||||
{
|
||||
id: 'c3',
|
||||
nombreCompleto: 'Sin Apartado',
|
||||
proyecto: '',
|
||||
unidadCodigo: null,
|
||||
mondayApartadoId: null,
|
||||
createdAt: new Date('2026-08-25T09:00:00Z'),
|
||||
},
|
||||
]
|
||||
const monday = mondayMock({ apartados: [apartado({ id: 'ap-1', estado: 'Alta Enkontrol' })] })
|
||||
const r = await resumenMiDia(monday, vendedor, new Map(), [], clientes, AHORA)
|
||||
expect(r.misClientes.map((c) => [c.id, c.estadoApartado])).toEqual([
|
||||
['c1', 'Alta Enkontrol'], // estado real del item en Monday
|
||||
['c2', null], // el apartado ya no existe
|
||||
['c3', null], // sin apartado ligado
|
||||
])
|
||||
})
|
||||
|
||||
it('mis clientes: proyecto con solo espacios cuenta como en captura', async () => {
|
||||
const clientes = [
|
||||
{ id: 'c1', nombreCompleto: 'Espacios', proyecto: ' ', unidadCodigo: null, createdAt: new Date('2026-08-26T09:00:00Z') },
|
||||
{
|
||||
id: 'c1',
|
||||
nombreCompleto: 'Espacios',
|
||||
proyecto: ' ',
|
||||
unidadCodigo: null,
|
||||
mondayApartadoId: null,
|
||||
createdAt: new Date('2026-08-26T09:00:00Z'),
|
||||
},
|
||||
]
|
||||
const r = await resumenMiDia(mondayMock({}), vendedor, new Map(), [], clientes, AHORA)
|
||||
expect(r.misClientes[0]?.completado).toBe(false)
|
||||
|
||||
Reference in New Issue
Block a user