Saltar a contenido

Configuración del sistema

⚙️ Solo para Super Admin

La sección Config (menú lateral → Config, ruta /settings) es exclusiva del Super Admin. Reúne los ajustes globales, en varias pestañas: Scraper · Email SMTP · WhatsApp · Mensajes WA · IA · Alertas · Registro · Accesos · Historial de scrapes · Sincronización.

Cambios de alcance global

Lo que se configura aquí afecta a todas las empresas. Cámbielo con cuidado.

Scraper

Controla el proceso que revisa Guatecompras.

Pestaña Scraper de la configuración

  • ProgramaciónExpresión cron (cada cuánto corre; ej. 0 0 8,12,18 * * ?) y Zona horaria.
  • Días a scrape, Máx. páginas (0 = todas), Delay entre páginas (ms) y Registros por página; interruptores Paginación y Dry run.
  • Filtros de GuatecomprasCategorías y Modalidades por sus IDs (separados por coma). Vacío = usa los predeterminados. Los íconos listan los IDs disponibles.
  • Ventana de días por categoría (opcional) — excepciones para categorías de alto volumen; Agregar excepción para definir días distintos por categoría.
  • Configuración avanzada — se expande para mostrar URL/endpoint, reintentos y timeouts.
  • Relays de salida (Guatemala) — la lista de salidas por donde el sistema llega a Guatecompras; se explica más abajo.
  • Guardar cambios conserva la configuración; ▶ Iniciar scrape ahora dispara una corrida manual inmediata.

El scraper no corre al arrancar

Al reiniciar el sistema, el scraper no ejecuta una revisión inmediata; solo reprograma su siguiente corrida según el cron. Para revisar ya, use Iniciar scrape ahora.

Relays de salida

Los servidores están alojados en Finlandia y Guatecompras bloquea el acceso desde ahí, así que todo el tráfico hacia el portal sale por un relay en Guatemala: tanto el scrape como las consultas de estado de Seguimiento. Antes había un solo relay configurado con un campo de host y puerto, y eso lo volvía un punto único de falla — cuando ese enlace murió, el sistema pasó cerca de 24 horas trayendo cero resultados. Por eso ahora es una lista con varios.

Cada relay aparece en una tarjeta con etiqueta, host:puerto y prioridad, y debajo, en letra pequeña, su estado: último OK, fallos seguidos (en naranja) y salida esperada si se definió. A la izquierda el interruptor lo habilita o deshabilita sin borrarlo, y a la derecha:

  • Probar — lo prueba en ese momento y responde con la IP de salida real y cuánto tardó. Es la forma confiable de saber si sirve: que un relay conteste al ping no prueba nada, ya ocurrió que respondiera pings sin dejar pasar nada de tráfico.
  • Editar y Eliminar. Al eliminar uno, el historial de scrapes que salió por él se conserva.

Agregar relay pide etiqueta (un nombre para reconocerlo, ej. Relay Guatemala (VM)), host y puerto (3128 por defecto), prioridadmenor valor = se intenta primero — y, opcional, una IP de salida esperada.

Cómo elige el sistema por dónde salir

Al empezar cada corrida recorre los relays habilitados, en orden de prioridad, y se queda con el primero que responde; esa corrida completa sale por él. No se queda pegado al último que funcionó, así que el relay preferido recupera el tráfico por sí solo en cuanto vuelve a estar sano. La prueba se hace en el momento: los datos de estado de la tarjeta son informativos y nunca deciden.

No fije la IP de salida esperada en un enlace residencial

En una conexión residencial el proveedor cambia la IP pública cada cierto tiempo (pasó después de un reinicio). Si la dejó fija, el sistema descartará un relay que está perfectamente sano. Úsela solo con enlaces de IP fija.

Sin relays no hay scraping

Si la lista queda vacía aparece un aviso naranja. Sin al menos un relay habilitado, el scraping falla por completo.

Email SMTP

Pestaña Email SMTP

El transporte de correo global que usan todas las empresas: Servidor SMTP, Puerto, interruptores STARTTLS / SSL/TLS, Usuario SMTP, Contraseña (déjela en blanco para no cambiarla) y Dirección From por defecto. Guardar cambios y Probar SMTP (envía un correo de prueba). La contraseña se guarda cifrada.

WhatsApp

Pestaña WhatsApp: perfiles de envío

La pestaña WhatsApp administra los perfiles de envío. Un perfil es una conexión de WhatsApp (un gateway) desde la cual salen los mensajes. Cada perfil tiene:

  • Nombre — identificador del perfil.
  • URL del gateway — la dirección del servicio de WhatsApp.
  • Activo — si está disponible para enviar.
  • Predeterminado — el perfil que se usa para los envíos a contactos individuales cuando una empresa no elige otro.
  • Plantilla por defecto — el texto base del mensaje para ese perfil (ver abajo).

Botones: Agregar perfil, Sync grupos (importa los grupos de WhatsApp del gateway).

La pestaña Mensajes WA trae herramientas de prueba: Enviar mensaje de prueba (a un número) y Prueba grupo (a un grupo), para confirmar que la entrega funciona.

Verificar ≠ enviar

Verificar la conexión solo revisa el estado; para comprobar que los mensajes llegan, use Enviar mensaje de prueba.

Plantillas de mensaje de WhatsApp

Una plantilla define el texto de cada aviso de WhatsApp. En el texto puede intercalar variables que Licita Radar reemplaza, al momento de enviar, con los datos de la licitación.

Variables disponibles

Variable Se reemplaza por
${companyName} Nombre de la empresa.
${count} Cantidad de licitaciones incluidas en todo el aviso — no solo en el mensaje individual de WhatsApp que está viendo. Ver nota de agrupación abajo.
${title} Título de la licitación.
${entity} Entidad compradora.
${amount} Monto estimado (con su moneda, p. ej. 1,200.00 GTQ).
${deadline} Fecha límite para ofertar.
${url} Enlace a la licitación en Guatecompras.

Escriba las variables exactamente así, con ${…}. Cualquier otro texto se envía tal cual. Si una variable no tiene dato para esa licitación, se reemplaza por vacío.

Cómo se agrupan varias licitaciones en un solo aviso

Cuando un envío incluye varias licitaciones, Licita Radar arma un texto por licitación (usando su plantilla, si tiene una) y los une en la menor cantidad de mensajes de WhatsApp posible — normalmente uno o dos, sin importar cuántas licitaciones sean. Esto evita que un aviso con muchos eventos se corte a la mitad: WhatsApp empieza a rechazar mensajes después de una ráfaga de unos 25 seguidos, y antes de agrupar, cada licitación viajaba en su propio mensaje. Su plantilla no necesita saber nada de esto — se sigue escribiendo pensando en una licitación a la vez; Licita Radar la repite y las junta.

Dónde se define una plantilla (dos niveles)

Hay dos lugares para definir plantillas, y se aplican con esta prioridad:

  1. Plantilla de la empresa — pestaña WhatsApp de cada empresa, campo "Plantilla de mensaje (opcional)". Si está definida, manda para esa empresa. Ver Canales.
  2. Plantilla por defecto del perfil — aquí, en Config → WhatsApp, al crear o editar un perfil. Se usa cuando la empresa no tiene su propia plantilla.
  3. Mensaje por defecto del sistema — si no hay ninguna de las anteriores, Licita Radar arma un mensaje predefinido con emojis (título, NOG, entidad, modalidad, monto, fecha límite y enlace).

Dicho de otro modo: empresa → perfil → mensaje por defecto. Lo primero que exista, gana.

El mensaje por defecto del sistema

Si nadie configura plantillas, un aviso con una sola licitación se ve más o menos así:

🎯 *Nueva oportunidad — Mi Empresa*

📋 *NOG: 31034160*
Adquisición de renovación del licenciamiento de firewall
🏛 Instituto Técnico de Capacitación
📄 Licitación Pública (Art. 17 LCE)
💰 1,200.00 GTQ
⏰ Límite: 01/09/2026 00:00

https://www.guatecompras.gt/…

Y con varias licitaciones en el mismo aviso, así (nótese el encabezado con la cantidad y las licitaciones separadas por una línea):

🎯 *2 nuevas oportunidades — Mi Empresa*

📋 *NOG: 31034160*
Adquisición de renovación del licenciamiento de firewall
🏛 Instituto Técnico de Capacitación
📄 Licitación Pública (Art. 17 LCE)
💰 1,200.00 GTQ
⏰ Límite: 01/09/2026 00:00
https://www.guatecompras.gt/…

———
📋 *NOG: 31034205*
Servicio de mantenimiento de flotilla vehicular
🏛 Municipalidad de Villa Nueva
📄 Cotización
💰 1,250,000.00 GTQ
⏰ Límite: 02/09/2026 10:30
https://www.guatecompras.gt/…

Si el aviso trae demasiadas licitaciones para caber en un solo mensaje, Licita Radar lo reparte en dos o más y numera cada uno, p. ej. "(1/2)", "(2/2)", en el encabezado.

Crear una plantilla por defecto (a gusto) — paso a paso

Diálogo de perfil con el campo "Plantilla por defecto"

  1. Vaya a Config → WhatsApp.
  2. Pulse Agregar perfil (o edite uno existente con su ✏️).
  3. En el diálogo, complete Nombre, URL del gateway y los interruptores según necesite.
  4. En el campo Plantilla por defecto, escriba su mensaje usando texto libre y las variables. Por ejemplo:

    Hola, hay ${count} nueva(s) oportunidad(es) para ${companyName}.
    
    ${title}
    Entidad: ${entity}
    Monto: ${amount}
    Cierra: ${deadline}
    
    Ver detalle: ${url}
    
  5. Pulse Crear perfil (o Guardar cambios).

A partir de ese momento, cualquier empresa que no tenga su propia plantilla usará este texto. WhatsApp admite formato básico: *texto* para negrita y _texto_ para cursiva.

¿Quiere una plantilla distinta para una sola empresa?

Defínala en la pestaña WhatsApp de esa empresa ("Plantilla de mensaje (opcional)"). Esa plantilla tiene prioridad sobre la del perfil, solo para esa empresa. Deje ese campo en blanco para volver a heredar la del perfil.

IA (licita-ai)

Pestaña IA

La conexión con el servicio de inteligencia artificial que filtra las licitaciones:

  • Análisis de IA habilitado — interruptor global. Si está apagado, ninguna empresa puede analizar con IA (las coincidencias de keywords siguen sin filtrar).
  • URL base del servicio y API Key.
  • Confiar en certificado self-signed — necesario para la red interna con certificado propio.
  • Timeout análisis y Timeout requisitos (ms).
  • Guardar cambios y Verificar conexión (muestra el estado de salud del servicio).

Alertas

Avisa cuando el scraper deja de traer datos, para no enterarse por casualidad. Ya ha pasado tres veces que el scraper estuvo caído entre 14 y 19 horas sin que nadie lo notara.

  • Enviar alertas — interruptor general. Viene apagado y sin destinos: hasta que se configure uno, no se envía nada.
  • CanalWhatsApp, Email o Ambos.
  • Destinos de WhatsApp — teléfonos o el JID de un grupo (termina en @g.us), separados por coma. Usar un grupo es lo más cómodo: se agrega o quita gente desde WhatsApp, sin entrar al sistema.
  • Destinos de email — correos separados por coma.
  • Guardar y enviar prueba — guarda y manda un mensaje de prueba a los destinos. Funciona aunque las alertas estén apagadas, para poder verificar el destino antes de encenderlas. El resultado dice exactamente qué pasó con cada destinatario.

Cuándo avisa, y cuándo no

Solo avisa cuando una corrida termina FALLIDA, es decir cuando no entró ni un concurso. Manda un mensaje al caer y otro al recuperarse: si fallan varias corridas seguidas no repite el aviso. Las corridas PARCIALES no alertan, porque siguen trayendo datos y avisar por ellas volvería la alerta ruido que se ignora.

Accesos

Pestaña Accesos

Bitácora de cada intento de inicio de sesión, exitoso o no. Sirve para dos cosas distintas: auditar quién entró, y detectar intentos de entrar que no deberían existir.

Cada fila muestra el correo, la fecha y hora, la dirección IP desde la que se intentó y el navegador. Los intentos fallidos agregan el motivo: Credenciales incorrectas, Cuenta bloqueada o Cuenta inactiva. Si el correo no corresponde a ninguna cuenta del sistema, la fila lo marca como (cuenta inexistente) — varios seguidos son señal de que alguien está probando contraseñas.

  • Buscar por correo — filtra por dirección; sirve tanto para una cuenta real como para un correo que nadie tiene.
  • Todos / Exitosos / Fallidos — filtra por resultado.
  • Refrescar — vuelve a cargar la lista.

Esta pestaña no dice si la gente está usando el sistema

Solo registra el momento en que alguien escribe su contraseña. La sesión se renueva sola durante días, así que una persona que entra a diario puede pasar meses sin aparecer aquí. Para saber si una cuenta se está usando, vea el indicador de actividad en Usuarios.

Cada instancia guarda lo suyo

La bitácora es local: no se comparte ni se sincroniza entre instancias. Si tiene varias, consulte la de cada una por separado.

Historial de scrapes

Pestaña Historial de scrapes

Tabla con el historial de corridas del scraper. Cada tarjeta se expande para ver el resumen de notificaciones de esa corrida: total enviadas/fallidas y el detalle por destinatario, agrupado por canal. Es la mejor forma de auditar qué hizo el sistema en cada revisión y confirmar que los avisos salieron.

Sincronización

Define si esta instancia hace su propio scrape (Scrape directo) o se sincroniza desde otra instancia madre (URL + API key). Incluye la gestión de instancias hijas autorizadas. Es una función de infraestructura para despliegues con varias instancias.