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;