From fe8ab609f4dfabe7592e161d8b3d0074d6997075 Mon Sep 17 00:00:00 2001 From: marsalva Date: Wed, 25 Feb 2026 22:43:24 +0000 Subject: [PATCH] Actualizar server.js --- server.js | 52 ++++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/server.js b/server.js index ae14b89..3a7ac24 100644 --- a/server.js +++ b/server.js @@ -498,12 +498,9 @@ async function ensureInstance(instanceName) { return { baseUrl, headers }; } -// ========================================== -// 馃殌 RUTAS P脷BLICAS (M脫VIL OPERARIO) -// ========================================== // ========================================== -// 馃敆 PORTAL P脷BLICO DEL CLIENTE (Mejorado con Historial) +// 馃敆 PORTAL P脷BLICO DEL CLIENTE (BLINDADO) // ========================================== app.get("/public/portal/:token", async (req, res) => { try { @@ -514,52 +511,51 @@ app.get("/public/portal/:token", async (req, res) => { if (qClient.rowCount === 0) return res.status(404).json({ ok: false, error: "Enlace inv谩lido" }); const client = qClient.rows[0]; + // Asegurarnos de tener el ID correcto de la cuenta + const ownerId = client.owner_id || client.account_id; + // 2. Obtener la Configuraci贸n de la Empresa - const qConfig = await pool.query("SELECT * FROM config WHERE account_id = $1", [client.owner_id]); + const qConfig = await pool.query("SELECT * FROM config WHERE account_id::text = $1::text", [ownerId]); let company = { name: "IntegraRepara", logo: "" }; if (qConfig.rowCount > 0 && qConfig.rows[0].portal_settings) { company = qConfig.rows[0].portal_settings; } - // 3. Buscar TODOS los servicios asociados al tel茅fono del cliente - // Usamos el tel茅fono para buscar en el JSONB (cuidando las min煤sculas y may煤sculas de las llaves posibles) + // 3. Buscar TODOS los servicios usando el client_id (S煤per r谩pido y no da error 500) const qServices = await pool.query(` SELECT - s.id, s.service_ref, s.status, s.raw_data, s.is_urgent, - st.name as status_name, st.is_final as status_is_final, + s.*, + st.name as status_name, + st.is_final as status_is_final, u.name as assigned_worker FROM scraped_services s - LEFT JOIN service_statuses st ON st.id::text = s.raw_data->>'status_operativo' - LEFT JOIN users u ON u.id = s.assigned_to - WHERE s.owner_id = $1 + LEFT JOIN service_statuses st ON st.id::text = (s.raw_data->>'status_operativo')::text + LEFT JOIN users u ON u.id::text = s.assigned_to::text + WHERE s.client_id = $1 AND s.provider != 'SYSTEM_BLOCK' - AND ( - s.raw_data->>'Tel茅fono' LIKE '%' || $2 || '%' OR - s.raw_data->>'TELEFONOS' LIKE '%' || $2 || '%' OR - s.raw_data->>'TELEFONO' LIKE '%' || $2 || '%' - ) ORDER BY - st.is_final ASC, -- Activos primero - s.created_at DESC -- Luego ordenados por fecha de creaci贸n - `, [client.owner_id, client.phone]); + st.is_final ASC NULLS FIRST, + s.created_at DESC + `, [client.id]); - // Formatear servicios para enviarlos limpios al cliente + // Formatear servicios para el frontal const formattedServices = qServices.rows.map(s => ({ id: s.id, title: s.is_urgent ? `馃毃 URGENTE: Expediente #${s.service_ref}` : `Expediente #${s.service_ref}`, - description: s.raw_data["Descripci贸n"] || s.raw_data["DESCRIPCION"] || "Revisi贸n t茅cnica solicitada.", + description: s.raw_data?.["Descripci贸n"] || s.raw_data?.["DESCRIPCION"] || "Revisi贸n t茅cnica solicitada.", status_name: s.status_name || 'Pendiente', - is_final: s.status_is_final, - scheduled_date: s.raw_data.scheduled_date, - scheduled_time: s.raw_data.scheduled_time, - assigned_worker: s.assigned_worker || 'Pendiente' + is_final: s.status_is_final === true, + scheduled_date: s.raw_data?.scheduled_date, + scheduled_time: s.raw_data?.scheduled_time, + assigned_worker: s.assigned_worker || 'Pendiente', + raw_data: s.raw_data // MUY IMPORTANTE: Se necesita para calcular el ETA del cami贸n })); res.json({ ok: true, client, company, services: formattedServices }); } catch (e) { - console.error("Error en Portal Cliente:", e); - res.status(500).json({ ok: false, error: "Server error" }); + console.error("馃敟 Error 500 en Portal Cliente:", e.message); + res.status(500).json({ ok: false, error: "Error interno del servidor" }); } });