From 8ef49c5169bfb7f605b787305c8523a3f42bf0db Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Fri, 14 Aug 2026 22:40:28 -0500 Subject: [PATCH] =?UTF-8?q?feat:=20bucles=20de=20crecimiento=20y=20activac?= =?UTF-8?q?i=C3=B3n=20de=20uMind?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cuatro cosas que ya estaban a medio construir y no se usaban como canal. 1. El badge del widget ahora es un enlace con UTM. Cada cliente ya te estaba dando exposición en su sitio y no se capitalizaba. El host sale de la URL del propio script, así funciona igual en cualquier entorno. 2. Reporte del mes por agente en Excel: conversaciones atendidas, con qué las abrió el visitante, y el consumo desglosado. Es lo que el cliente necesita para justificar el gasto puertas adentro — un panel al que hay que entrar no sirve para eso, un archivo que se reenvía sí. Reusa el generador de xlsx del cronograma. 3. Aviso automático de agentes sin base de conocimiento (cron diario). Un agente sin fuentes responde de memoria e inventa datos, el cliente concluye que el producto no sirve y se va. Es el punto donde más gente se cae y se detecta solo. Se avisa UNA vez por agente, usando el log de auditoría como registro de envío para no necesitar tabla nueva ni convertir el recordatorio en spam. 4. Tarjeta de uMind en el dashboard del portal: atajo si el cliente ya lo tiene, oferta si no. Es el punto de contacto más barato que hay — ya entró, ya confía, y el cobro se suma a la factura que ya recibe. El mensaje lidera con notas de voz y fotos, que es lo más difícil de copiar de lo que tenemos. La consulta de conversaciones agrupa en SQL en vez de traerse el historial entero para agrupar en Go. Co-Authored-By: Claude Sonnet 5 --- orchestrator/src/views/AgenteDetail.vue | 26 ++++- pkg/models/umind.go | 38 ++++++ pkg/services/cron_service.go | 8 ++ pkg/services/umind_activacion_service.go | 108 ++++++++++++++++++ public/orchestrator/assets/index-CXtokcMG.js | 26 +++++ public/orchestrator/assets/index-xrbA4kuN.js | 26 ----- public/orchestrator/index.html | 2 +- resources/views/portal/dashboard.html | 30 +++++ .../api/umind_widget_controller.go | 14 ++- rest/controllers/portal_controller.go | 6 + rest/controllers/umind_admin_controller.go | 95 ++++++++++++++- rest/routes/umind.go | 1 + 12 files changed, 342 insertions(+), 38 deletions(-) create mode 100644 pkg/services/umind_activacion_service.go create mode 100644 public/orchestrator/assets/index-CXtokcMG.js delete mode 100644 public/orchestrator/assets/index-xrbA4kuN.js diff --git a/orchestrator/src/views/AgenteDetail.vue b/orchestrator/src/views/AgenteDetail.vue index 07c9c59..81a3bb5 100644 --- a/orchestrator/src/views/AgenteDetail.vue +++ b/orchestrator/src/views/AgenteDetail.vue @@ -165,6 +165,15 @@ const showCanalForm = ref(false) const canalForm = ref(canalVacio()) const widgetCopiado = ref(false) +// El reporte se descarga con una navegación normal (no fetch): así el +// navegador maneja el archivo y la cookie de sesión viaja sola. +const urlReporte = computed(() => { + const hoy = new Date() + const desde = new Date(hoy.getFullYear(), hoy.getMonth(), 1).toISOString().slice(0, 10) + const hasta = hoy.toISOString().slice(0, 10) + return apiUmind(`/umind/reporte.xlsx?agente_id=${props.agenteId}&desde=${desde}&hasta=${hasta}`) +}) + const widgetSnippet = computed(() => { const siteKey = agente.value?.site_key || 'TU_SITE_KEY' return ` + + {{ if .tieneUmind }} + + uM +
+

uMind Studio

+

Configurá tus asistentes, revisá conversaciones y consumo.

+
+ +
+ {{ else }} +
+
+ uM +
+

Tu WhatsApp puede responder solo

+

+ Un asistente que contesta con la información de tu negocio — precios, horarios, servicios. + Entiende las notas de voz y lee las fotos que te mandan tus clientes. +

+ + Quiero activarlo + +
+
+
+ {{ end }} + {{ if .isPartner }} diff --git a/rest/controllers/api/umind_widget_controller.go b/rest/controllers/api/umind_widget_controller.go index 34fc8b9..9ccd58f 100644 --- a/rest/controllers/api/umind_widget_controller.go +++ b/rest/controllers/api/umind_widget_controller.go @@ -113,7 +113,10 @@ const umindWidgetJS = `(function () { var script = document.currentScript; var siteKey = script.getAttribute('data-site'); if (!siteKey) { console.error('[uMind] falta data-site en el