diff --git a/server.js b/server.js index aa6b3b9..679e474 100644 --- a/server.js +++ b/server.js @@ -402,10 +402,12 @@ app.get("/public/portal/:token", async (req, res) => { logo: userData.company_logo || null }; - // 3. Obtenemos los servicios. - // AHORA BUSCAMOS POR client_id. Si el client_id es nulo (expedientes viejos), buscamos por teléfono en el JSON. - const cleanPhoneToMatch = String(client.phone || "").replace(/\D/g, "").slice(-9); - const requestedServiceId = req.query.service || null; // <-- Capturamos el ID del enlace si existe + // 3. TELÉFONO SEGURO E ID SEGURO (Esto evita el Error 500 y el fallo de enlace) + let cleanPhoneToMatch = String(client.phone || "").replace(/\D/g, "").slice(-9); + if (cleanPhoneToMatch.length < 8) cleanPhoneToMatch = "NO_VALIDO_123"; // Seguridad + + // Si hay ID en el enlace lo usamos, si no, mandamos un "0" para que no explote la DB + const requestedServiceId = req.query.service ? String(req.query.service) : "0"; const qServices = await pool.query(` SELECT @@ -420,7 +422,7 @@ app.get("/public/portal/:token", async (req, res) => { WHERE s.owner_id = $1 AND s.provider != 'SYSTEM_BLOCK' AND ( - s.id::text = $4 -- <-- LA MAGIA: Forzamos a que traiga el expediente del enlace + s.id::text = $4 OR s.client_id = $2 OR (s.client_id IS NULL AND REPLACE(s.raw_data->>'Teléfono', ' ', '') LIKE $3) OR (s.client_id IS NULL AND REPLACE(s.raw_data->>'TELEFONO', ' ', '') LIKE $3) @@ -444,11 +446,10 @@ app.get("/public/portal/:token", async (req, res) => { }; }); - // Incluso si no hay servicios, devolvemos el portal vacío para que no dé error 404 res.json({ ok: true, client: { name: client.full_name }, company, services: formattedServices }); } catch (e) { - console.error("🔥 ERROR EN PORTAL:", e.message); + console.error("🔥 ERROR EN PORTAL:", e); res.status(500).json({ ok: false, error: "Error interno" }); } });