Actualizar server.js
This commit is contained in:
54
server.js
54
server.js
@@ -991,8 +991,6 @@ app.post("/public/new-request", async (req, res) => {
|
|||||||
|
|
||||||
if (!phone || !guild_id) return res.status(400).json({ ok: false, error: "Faltan datos clave" });
|
if (!phone || !guild_id) return res.status(400).json({ ok: false, error: "Faltan datos clave" });
|
||||||
|
|
||||||
// Por ahora, como es público, asumiremos que entra a la instancia principal (owner_id = 1),
|
|
||||||
// a menos que uses subdominios por empresa. Lo forzamos a 1 para este ejemplo.
|
|
||||||
const targetOwnerId = owner_id || 1;
|
const targetOwnerId = owner_id || 1;
|
||||||
const cleanPhone = phone.replace(/\D/g, "");
|
const cleanPhone = phone.replace(/\D/g, "");
|
||||||
if (cleanPhone.length < 9) return res.status(400).json({ ok: false, error: "Teléfono inválido" });
|
if (cleanPhone.length < 9) return res.status(400).json({ ok: false, error: "Teléfono inválido" });
|
||||||
@@ -1018,7 +1016,6 @@ app.post("/public/new-request", async (req, res) => {
|
|||||||
// 2. BUSCAR OPERARIO AL AZAR (Si es NORMAL)
|
// 2. BUSCAR OPERARIO AL AZAR (Si es NORMAL)
|
||||||
let assignedWorkerId = null;
|
let assignedWorkerId = null;
|
||||||
if (!is_urgent) {
|
if (!is_urgent) {
|
||||||
// Buscamos un operario activo de ese gremio al azar
|
|
||||||
const qWorker = await clientDb.query(`
|
const qWorker = await clientDb.query(`
|
||||||
SELECT u.id FROM users u
|
SELECT u.id FROM users u
|
||||||
JOIN user_guilds ug ON u.id = ug.user_id
|
JOIN user_guilds ug ON u.id = ug.user_id
|
||||||
@@ -1029,7 +1026,6 @@ app.post("/public/new-request", async (req, res) => {
|
|||||||
if (qWorker.rowCount > 0) {
|
if (qWorker.rowCount > 0) {
|
||||||
assignedWorkerId = qWorker.rows[0].id;
|
assignedWorkerId = qWorker.rows[0].id;
|
||||||
} else {
|
} else {
|
||||||
// Si no hay operarios para asignar calendario, lo forzamos a manual/bolsa
|
|
||||||
return res.status(400).json({ ok: false, error: "No hay técnicos disponibles para cita normal en este gremio. Llama a la oficina." });
|
return res.status(400).json({ ok: false, error: "No hay técnicos disponibles para cita normal en este gremio. Llama a la oficina." });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1053,28 +1049,54 @@ app.post("/public/new-request", async (req, res) => {
|
|||||||
`, [
|
`, [
|
||||||
targetOwnerId,
|
targetOwnerId,
|
||||||
ref,
|
ref,
|
||||||
is_urgent ? 'in_progress' : 'manual', // Si es urgente, va a la bolsa
|
is_urgent ? 'in_progress' : 'manual',
|
||||||
assignedWorkerId, // Solo tendrá id si NO es urgente
|
assignedWorkerId,
|
||||||
is_urgent,
|
is_urgent,
|
||||||
JSON.stringify(rawData)
|
JSON.stringify(rawData)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const newServiceId = qSvc.rows[0].id;
|
const newServiceId = qSvc.rows[0].id;
|
||||||
await clientDb.query('COMMIT');
|
|
||||||
|
|
||||||
// 4. BIFURCACIÓN DE RUTAS
|
// 4. SI ES URGENTE, DISPARAMOS EL WHATSAPP DIRECTAMENTE
|
||||||
if (is_urgent) {
|
if (is_urgent) {
|
||||||
// Mandamos a la cola automáticamente para que suene a los técnicos
|
// Buscamos un operario activo de ese gremio
|
||||||
// Lo ejecutamos en segundo plano llamando a tu propio endpoint
|
const workersQ = await clientDb.query(`
|
||||||
const port = process.env.PORT || 3000;
|
SELECT u.id, u.full_name, u.phone FROM users u
|
||||||
fetch(`http://127.0.0.1:${port}/providers/automate/${newServiceId}`, {
|
JOIN user_guilds ug ON u.id = ug.user_id
|
||||||
method: 'POST',
|
WHERE u.owner_id = $1 AND u.role = 'operario' AND u.status = 'active' AND ug.guild_id = $2
|
||||||
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.ADMIN_TOKEN || 'hack_interno'}` }, // Necesitarás un token interno para esto
|
ORDER BY RANDOM() LIMIT 1
|
||||||
body: JSON.stringify({ guild_id, cp: "00000", useDelay: false })
|
`, [targetOwnerId, guild_id]);
|
||||||
}).catch(e => console.error("Error lanzando bolsa urgente:", e));
|
|
||||||
|
|
||||||
|
if (workersQ.rowCount > 0) {
|
||||||
|
const worker = workersQ.rows[0];
|
||||||
|
const token = crypto.randomBytes(16).toString('hex');
|
||||||
|
|
||||||
|
// Creamos la alerta
|
||||||
|
await clientDb.query(`
|
||||||
|
INSERT INTO assignment_pings (scraped_id, user_id, token, expires_at)
|
||||||
|
VALUES ($1, $2, $3, CURRENT_TIMESTAMP + INTERVAL '5 minutes')
|
||||||
|
`, [newServiceId, worker.id, token]);
|
||||||
|
|
||||||
|
// Enviamos el WA al operario
|
||||||
|
const msg = `🚨 *URGENCIA PARTICULAR (WEB)*\n📍 Zona: Asignada\n🔗 https://portal.integrarepara.es/aceptar.html?t=${token}`;
|
||||||
|
|
||||||
|
// NOTA: Usamos `cliente_${targetOwnerId}` para que use la sesión de la empresa correcta
|
||||||
|
sendWhatsAppAuto(worker.phone, msg, `cliente_${targetOwnerId}`, false).catch(console.error);
|
||||||
|
|
||||||
|
// Dejamos huella
|
||||||
|
await clientDb.query(
|
||||||
|
"INSERT INTO scraped_service_logs (scraped_id, user_name, action, details) VALUES ($1, 'Sistema Automático', 'Bolsa de Urgencias', $2)",
|
||||||
|
[newServiceId, `Notificación enviada a: ${worker.full_name}`]
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
// Si no hay operarios en ese gremio, lo marcamos como fallido en la bolsa
|
||||||
|
await clientDb.query("UPDATE scraped_services SET automation_status = 'failed' WHERE id = $1", [newServiceId]);
|
||||||
|
}
|
||||||
|
|
||||||
|
await clientDb.query('COMMIT');
|
||||||
res.json({ ok: true, action: 'queued', message: "Aviso urgente en cola." });
|
res.json({ ok: true, action: 'queued', message: "Aviso urgente en cola." });
|
||||||
} else {
|
} else {
|
||||||
|
await clientDb.query('COMMIT');
|
||||||
// Devolvemos el token del cliente y el ID del servicio para redirigirlo al calendario
|
// Devolvemos el token del cliente y el ID del servicio para redirigirlo al calendario
|
||||||
res.json({
|
res.json({
|
||||||
ok: true,
|
ok: true,
|
||||||
|
|||||||
Reference in New Issue
Block a user