feat(round-robin): reparto solo con el equipo 'vendedores' de Monday

- obtenerVendedores ahora lee el team de Monday (MONDAY_RR_TEAM,
  default 'vendedores') con cache de 1 h; MONDAY_RR_USER_IDS queda como
  override manual.
- Escrituras a columnas status resuelven el label real sin importar
  mayusculas: si renombran labels en la UI de Monday (paso con
  NUEVO→Nuevo) el API sigue escribiendo en vez de tronar con 502.
- mapearLead: un status nunca escrito (value null) se lee como vacio;
  Monday regresaba el label default del tablero como texto y el
  round-robin creia que el lead estaba descartado.
This commit is contained in:
2026-09-04 02:39:37 +00:00
parent f382987fbf
commit d4fc9ee892
5 changed files with 127 additions and 15 deletions

View File

@@ -370,5 +370,50 @@ describe('MondayService', () => {
const leads = await crearServicio().getLeads()
expect(leads.map((l) => l.edad)).toEqual([null, null])
})
it('estado con value null (default del tablero, nunca escrito) se lee como vacío', async () => {
mockearFetch((body) => {
if (body.query.includes('columns')) return respuestaOk({ boards: [{ columns: COLUMNAS_LEADS_BASE }] })
return respuestaOk({
boards: [
{
items_page: {
cursor: null,
items: [
// text trae el label default del board, pero value es null: no hay estado real
{ ...itemLead('1'), column_values: [{ id: 'people_v', text: '', value: null }, { id: 'color_e', text: 'Descartado', value: null }] },
// estado real escrito: value presente → se usa text
{ ...itemLead('2'), column_values: [{ id: 'people_v', text: '', value: null }, { id: 'color_e', text: 'Nuevo', value: '{"index":1}' }] },
],
},
},
],
})
})
const leads = await crearServicio().getLeads()
expect(leads.map((l) => l.estado)).toEqual(['', 'Nuevo'])
})
})
describe('escrituras status tolerantes a case (rename de labels en la UI)', () => {
it('cambiarValorColumna resuelve el label real sin importar mayúsculas', async () => {
const llamadas = mockearFetch((body) => {
if (body.query.includes('settings_str')) {
return respuestaOk({
boards: [{ columns: [{ id: 'color_e', title: 'Estado', settings_str: '{"labels":{"1":"Nuevo","5":"Descartado"}}' }] }],
})
}
if (body.query.includes('columns')) {
return respuestaOk({ boards: [{ columns: [{ id: 'color_e', title: 'Estado', type: 'status' }] }] })
}
return respuestaOk({ change_column_value: { id: 'it-1' } })
})
await crearServicio().cambiarValorColumna('b1', 'it-1', 'Estado', 'NUEVO')
const mutacion = llamadas.find((l) => l.body.query.includes('change_column_value'))
expect(JSON.parse(String(mutacion?.body.variables['value']))).toEqual({ label: 'Nuevo' })
})
})
})