HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux ip-172-31-4-197 6.8.0-1036-aws #38~22.04.1-Ubuntu SMP Fri Aug 22 15:44:33 UTC 2025 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/bots/enerbot/src/flows/flow-registrar-reporte.js
import { addKeyword, EVENTS } from "@builderbot/bot";
import texts from "../config/texts.js";
import { reportarFallaService } from "../services/enelar.service.js";

/**
 * Flujo final para registrar el reporte de falla
 * 
 * Este flujo:
 * 1. Recopila todos los datos del estado
 * 2. Formatea un comentario consolidado
 * 3. Guarda el reporte en la base de datos
 * 4. Envía el reporte al servicio ENELAR
 * 5. Notifica al usuario el resultado
 * 
 * Mensajes importantes:
 * - Éxito: "¡Registro completo! Recuerde que este reporte equivale a una llamada telefónica..."
 * - Error: "En este momento no podemos atender tu reporte..."
 */
const flowRegistrarReporte = addKeyword(EVENTS.ACTION).addAction(
  async (_, { state, endFlow, provider }) => {
    // Obtiene el estado completo de la conversación
    const myState = state.getMyState();

    // Obtiene la instancia de la base de datos
    const db = provider.getDB();

    // Construye el comentario consolidado con todos los datos relevantes
    let comentario = `${myState.celularReporta}, ${myState.comentarioConfirmado ? myState.comentario : "Sin comentario"
      }, ${myState.nombreReporta}, ${myState.barrio}, ${myState.municipio}, PT: ${myState.perdidaTotal
      }, Sector SE: ${myState.sectorSinEnergia}, Tacos: ${myState.tacosDisparados
      }`;

    // Prepara el payload para el servicio ENELAR
    const payload = {
      codsus: myState.codigo, // Código del suscriptor
      comentarios: limpiarTexto(comentario) // Comentario formateado y limpio
    };

    try {
      // Guarda el reporte completo en la base de datos
      delete myState._id; // Elimina propiedad _id si existe
      myState.createdAt = new Date(); // Agrega marca de tiempo
      await db.collection("reportes").insertOne(myState);
    } catch (error) {
      console.log("Error al guardar en DB:", error);
      // Continúa a pesar del error para intentar enviar el reporte
    }

    try {
      // Envía el reporte al servicio ENELAR
      await reportarFallaService(payload);

      // Mensaje de éxito: "¡Registro completo! Recuerde que este reporte equivale a una llamada telefónica..."
      return endFlow(texts.registroCompleto);
    } catch (error) {
      console.log("Error al reportar falla:", error);

      // Mensaje de error genérico: "En este momento no podemos atender tu reporte..."
      return endFlow(texts.error);
    }
  }
);

/**
 * Función para limpiar texto eliminando:
 * - Caracteres especiales Unicode
 * - Saltos de línea
 * - Espacios múltiples
 * @param {string} texto - Texto a limpiar
 * @returns {string} Texto limpio y normalizado
 */
function limpiarTexto(texto) {
  const textoLimpio = texto
    .replace(/[\u2000-\uFFFF]/g, "") // Elimina caracteres Unicode especiales
    .replace(/\n/g, "") // Elimina saltos de línea
    .replace(/\s+/g, " "); // Reduce espacios múltiples a uno solo

  return textoLimpio.trim(); // Elimina espacios al inicio/final
}

export default flowRegistrarReporte;