Saltar a contenido

ADR-0005 · Aviso WebSocket propio del matcher al terminar (match_completed)

  • Estado: aceptado
  • Decisores: mvaliente
  • Fecha de la decisión: 2026-08-15
  • Relacionado: ADR-17 del paquete Confirmacion Automatica (la preasignación que este aviso hace visible a tiempo)

Contexto y problema

La pantalla de confirmación de cobros recarga el extracto cuando llega sync_sucessfull, que marca el fin de la conciliación. Pero el matcher de ADR-17 recién arranca ahí y tarda —medido el 2026-08-14: 12 segundos para las 47 solicitudes de una cuenta—, así que la recarga leía el extracto antes de que existiera un solo U_MatchDraft y la preselección llegaba tarde salvo por casualidad. Suscribir la pantalla a la sala al montar (fix del 14/08) no alcanzó: el aviso al que reaccionaba seguía siendo el equivocado.

Opciones consideradas

  1. Evento interno nuevo auto-confirm.match.completed → broadcast WS match_completed en la sala de conciliación — elegida.
  2. Retrasar sync_sucessfull hasta que el matcher termine — acopla la conciliación al matcher y castiga a las cuentas donde el matcher no corre.
  3. Polling del front tras sync_sucessfull — tráfico ciego y una espera arbitraria que igual puede quedarse corta.

Decisión

El matcher anuncia el fin de cada corrida con un evento interno nuevo (events/match-completed.event.ts), emitido en el finally de procesarCuenta: el aviso sale también cuando no había solicitudes y cuando la corrida falló, porque quien espera necesita saber que ya no hay más escrituras en camino — un aviso condicionado al éxito dejaría al front esperando para siempre. La corrida omitida por el guard enCurso no anuncia (sale antes del try).

Un listener nuevo (notifications/bank-match-notifications.listener.ts) lo traduce al broadcast WS match_completed en la misma sala de sync_sucessfull: quien escucha uno escucha el otro, sin una suscripción nueva que mantener. El listener vive en notifications para que el matcher no conozca la infraestructura de WS — el mismo criterio por el que la conciliación emite bank.sync.completed sin saber que el matcher existe.

Los dos avisos siguen haciendo falta. sync_sucessfull pone la lista en pantalla y apaga el spinner; match_completed trae la marca del sugerido. Y el segundo no siempre llega (matcher apagado, cuenta fuera de AUTO_CONFIRM_ACCOUNTS), así que el front no puede depender solo de él: su recarga es silenciosa (sin spinner, sin pisar la lista si falla) y filtrada por accountCode, porque el aviso es de sala y llega también por cuentas ajenas.

Consecuencias

  • La preselección aparece sola ~12 s después del sync, sin apretar nada.
  • Un oyente que falle no puede volver error una corrida ya registrada: la emisión va en su propio try y nunca propaga.
  • scripts/correr-matcher.ts arma su propio EventEmitter2 (corre fuera de Nest); el aviso ahí no llega a ningún front, y está bien: es una herramienta de diagnóstico.