feat(soporte): avisar por Telegram cuando entra un correo, con resumen si es largo

Los tickets del portal ya avisaban por Telegram; los que entran por correo solo
mandaban un mail al admin, que es justo el canal que nadie mira a tiempo. Ahora
pasan por el mismo despachador de notificaciones, así que se prenden y apagan
desde /app/notif-config como cualquier otro evento — nuevo ticket y respuesta
del cliente por separado.

El cuerpo del aviso es un resumen cuando el correo pasa los 700 caracteres
(hilos reenviados, texto pegado); abajo de eso va tal cual, porque resumir tres
renglones es gastar una llamada de IA para decir lo mismo. Si la IA falla, se
manda recortado. El ticket guarda siempre el texto completo.

DispatchTicketNuevo ahora acepta portalUser nil: un correo no tiene usuario de
portal detrás y no por eso hay que dejar de avisar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Lizandro Guarnizo
2026-08-17 19:12:36 -05:00
co-authored by Claude Opus 5
parent ac47769c27
commit d1bbb4a508
3 changed files with 75 additions and 2 deletions
+12
View File
@@ -78,3 +78,15 @@ func TestExtractEmailEdgeCases(t *testing.T) {
t.Errorf("ExtraerEmail('<a><b@c.com>') = %q, want 'b@c.com'", got)
}
}
func TestResumirTextoSoporteCortoNoLlamaALaIA(t *testing.T) {
// Sin base de datos, cualquier llamada a la IA explota: que este caso pase
// es la prueba de que un correo corto no la usa.
corto := "Hola, no me llega la factura de marzo. Gracias."
if got := ResumirTextoSoporte(corto); got != corto {
t.Errorf("ResumirTextoSoporte devolvió %q, esperaba el texto tal cual", got)
}
if got := ResumirTextoSoporte(" " + corto + "\n"); got != corto {
t.Errorf("no recortó los espacios: %q", got)
}
}