Actualizar server.js
This commit is contained in:
52
server.js
52
server.js
@@ -1200,20 +1200,10 @@ app.post("/providers/automate/:id", authMiddleware, async (req, res) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// AÑADIDO Y BLINDADO: CAPTURA COMPLETA, REGLA WA MANUAL, DESASIGNACIÓN Y BORRADO DE FECHA
|
// AÑADIDO Y BLINDADO: CAPTURA COMPLETA, REGLA WA MANUAL, DESASIGNACIÓN Y BORRADO DE FECHA
|
||||||
app.put('/providers/scraped/:id', authMiddleware, async (req, res) => {
|
// ESCUDO ANTI-ARCHIVO Y LOG AUTOMÁTICO
|
||||||
const { id } = req.params;
|
|
||||||
let { automation_status, status, name, phone, address, cp, description, guild_id, assigned_to, assigned_to_name, internal_notes, client_notes, is_urgent, ...extra } = req.body;
|
|
||||||
|
|
||||||
try {
|
|
||||||
if (automation_status) {
|
|
||||||
await pool.query(`UPDATE scraped_services SET automation_status = $1 WHERE id = $2 AND owner_id = $3`, [automation_status, id, req.user.accountId]);
|
|
||||||
return res.json({ ok: true });
|
|
||||||
}
|
|
||||||
|
|
||||||
// ESCUDO ANTI-ARCHIVO Y LOG AUTOMÁTICO
|
|
||||||
if (status === 'archived') {
|
if (status === 'archived') {
|
||||||
const checkQ = await pool.query(`
|
const checkQ = await pool.query(`
|
||||||
SELECT raw_data, assigned_to,
|
SELECT raw_data, assigned_to, service_ref,
|
||||||
(SELECT is_final FROM service_statuses WHERE id::text = raw_data->>'status_operativo') as is_final
|
(SELECT is_final FROM service_statuses WHERE id::text = raw_data->>'status_operativo') as is_final
|
||||||
FROM scraped_services WHERE id = $1 AND owner_id = $2
|
FROM scraped_services WHERE id = $1 AND owner_id = $2
|
||||||
`, [id, req.user.accountId]);
|
`, [id, req.user.accountId]);
|
||||||
@@ -1223,20 +1213,52 @@ app.put('/providers/scraped/:id', authMiddleware, async (req, res) => {
|
|||||||
const isFinal = row.is_final === true;
|
const isFinal = row.is_final === true;
|
||||||
const hasWorker = row.assigned_to !== null;
|
const hasWorker = row.assigned_to !== null;
|
||||||
let raw = row.raw_data || {};
|
let raw = row.raw_data || {};
|
||||||
|
const serviceRef = row.service_ref || raw["Referencia"] || id;
|
||||||
|
|
||||||
// SI tiene trabajador asignado Y NO está en un estado final operativo (Finalizado/Anulado)
|
// SI tiene trabajador asignado Y NO está en un estado final operativo (Finalizado/Anulado)
|
||||||
if (hasWorker && !isFinal) {
|
if (hasWorker && !isFinal) {
|
||||||
|
|
||||||
// Solo guardamos el aviso si no lo habíamos guardado ya antes (para no inundar el log)
|
// Solo guardamos el aviso y alertamos si no lo habíamos hecho ya antes
|
||||||
if (!raw.cerrado_proveedor) {
|
if (!raw.cerrado_proveedor) {
|
||||||
raw.cerrado_proveedor = true;
|
raw.cerrado_proveedor = true;
|
||||||
await pool.query(`UPDATE scraped_services SET raw_data = $1 WHERE id = $2 AND owner_id = $3`, [JSON.stringify(raw), id, req.user.accountId]);
|
await pool.query(`UPDATE scraped_services SET raw_data = $1 WHERE id = $2 AND owner_id = $3`, [JSON.stringify(raw), id, req.user.accountId]);
|
||||||
|
|
||||||
// GUARDAMOS EN EL LOG (Trazabilidad)
|
// GUARDAMOS EN EL LOG EL INTENTO DE CIERRE
|
||||||
await pool.query(
|
await pool.query(
|
||||||
"INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, $2, $3, $4)",
|
"INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, $2, $3, $4)",
|
||||||
[id, 'Sistema (Robot)', 'Intento de Cierre', 'La compañía ha cerrado el aviso en su portal, pero se mantiene vivo en IntegraRepara hasta que el técnico lo finalice.']
|
[id, 'Sistema (Robot)', 'Intento de Cierre', 'La compañía ha cerrado el aviso, pero se mantiene vivo en IntegraRepara.']
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// --- NUEVA ALERTA URGENTE AL OPERARIO POR WHATSAPP ---
|
||||||
|
const workerQ = await pool.query("SELECT full_name, phone FROM users WHERE id=$1", [row.assigned_to]);
|
||||||
|
if (workerQ.rowCount > 0) {
|
||||||
|
const w = workerQ.rows[0];
|
||||||
|
const msg = `🚨 *¡ALERTA URGENTE!* 🚨\n\nHola ${w.full_name}, la compañía aseguradora acaba de *CERRAR/ANULAR* el expediente *#${serviceRef}* en su sistema.\n\n⚠️ *NO ACUDAS NI REALICES EL TRABAJO* si no lo has hecho ya, porque no se va a cobrar.\n\nPor favor, contacta con la oficina para aclarar este aviso.`;
|
||||||
|
|
||||||
|
sendWhatsAppAuto(w.phone, msg, `cliente_${req.user.accountId}`, false).catch(console.error);
|
||||||
|
|
||||||
|
// Guardamos en el log que le hemos avisado
|
||||||
|
await pool.query(
|
||||||
|
"INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, $2, $3, $4)",
|
||||||
|
[id, 'Sistema (Robot)', 'Alerta de Cancelación', `WhatsApp de emergencia enviado a ${w.full_name} avisando de la anulación del proveedor.`]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
// -----------------------------------------------------
|
||||||
|
}
|
||||||
|
return res.json({ ok: true, note: "Protegido de archivo automático y operario alertado" });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Si no tiene trabajador, o el técnico YA lo había finalizado, lo archivamos sin problema
|
||||||
|
await pool.query(`UPDATE scraped_services SET status = 'archived', automation_status = 'manual' WHERE id = $1 AND owner_id = $2`, [id, req.user.accountId]);
|
||||||
|
|
||||||
|
// GUARDAMOS EN EL LOG LA BAJA DEFINITIVA
|
||||||
|
await pool.query(
|
||||||
|
"INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, $2, $3, $4)",
|
||||||
|
[id, 'Sistema', 'Archivado', 'El expediente se ha cerrado definitivamente y movido al histórico.']
|
||||||
|
);
|
||||||
|
|
||||||
|
return res.json({ ok: true });
|
||||||
}
|
}
|
||||||
return res.json({ ok: true, note: "Protegido de archivo automático" });
|
return res.json({ ok: true, note: "Protegido de archivo automático" });
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user