diff --git a/server.js b/server.js index a25088f..0793021 100644 --- a/server.js +++ b/server.js @@ -1008,14 +1008,27 @@ app.get("/statuses", authMiddleware, async (req, res) => { const nombresOficiales = defaults.map(d => d.name); await pool.query("UPDATE service_statuses SET is_system=false WHERE owner_id=$1 AND name != ALL($2::text[])", [req.user.accountId, nombresOficiales]); - // 2. RECUPERAMOS LOS ESTADOS + // 🚀 FUSIÓN AUTOMÁTICA: Movemos todo lo viejo al nuevo y borramos el fantasma + let currentDb = await pool.query("SELECT * FROM service_statuses WHERE owner_id=$1", [req.user.accountId]); + const idEsperando = currentDb.rows.find(s => s.name === 'Esperando al Cliente')?.id; + const idPendiente = currentDb.rows.find(s => s.name === 'Pendiente de Cita')?.id; + + if (idEsperando && idPendiente) { + // Pasamos los servicios normales + await pool.query("UPDATE services SET status_id = $1 WHERE status_id = $2 AND owner_id = $3", [idEsperando, idPendiente, req.user.accountId]); + // Pasamos los servicios del panel operativo (JSON) + await pool.query(`UPDATE scraped_services SET raw_data = jsonb_set(COALESCE(raw_data, '{}'::jsonb), '{status_operativo}', to_jsonb($1::text)) WHERE raw_data->>'status_operativo' = $2 AND owner_id = $3`, [String(idEsperando), String(idPendiente), req.user.accountId]); + // Exterminamos "Pendiente de Cita" + await pool.query("DELETE FROM service_statuses WHERE id = $1 AND owner_id = $2", [idPendiente, req.user.accountId]); + } + + // 2. RECUPERAMOS LOS ESTADOS LIMPIOS let q = await pool.query("SELECT * FROM service_statuses WHERE owner_id=$1", [req.user.accountId]); - // 🚀 MAGIA DE ORDENACIÓN: Forzamos el orden visual lógico del flujo de trabajo + // ORDENAMOS let sortedStatuses = q.rows.sort((a, b) => { let idxA = nombresOficiales.indexOf(a.name); let idxB = nombresOficiales.indexOf(b.name); - // Si hay un estado viejo o creado a mano (ej. Pendiente de Cita), lo mandamos al final (99) if(idxA === -1) idxA = 99; if(idxB === -1) idxB = 99; return idxA - idxB; @@ -1025,6 +1038,10 @@ app.get("/statuses", authMiddleware, async (req, res) => { } catch (e) { res.status(500).json({ ok: false }); } }); + res.json({ ok: true, statuses: sortedStatuses }); + } catch (e) { res.status(500).json({ ok: false }); } +}); + app.get("/clients/search", authMiddleware, async (req, res) => { try { const { phone } = req.query; const p = normalizePhone(phone); if(!p) return res.json({ok:true,client:null}); const q = await pool.query("SELECT * FROM clients WHERE phone=$1 AND owner_id=$2 LIMIT 1", [p, req.user.accountId]); res.json({ ok: true, client: q.rows[0] || null }); } catch (e) { res.status(500).json({ ok: false }); } }); app.get("/companies", authMiddleware, async (req, res) => { try { const q = await pool.query("SELECT * FROM companies WHERE owner_id=$1 ORDER BY name ASC", [req.user.accountId]); res.json({ ok: true, companies: q.rows }); } catch (e) { res.status(500).json({ ok: false }); } }); app.post("/companies", authMiddleware, async (req, res) => { try { const { name } = req.body; await pool.query("INSERT INTO companies (name, owner_id) VALUES ($1, $2)", [name, req.user.accountId]); res.json({ ok: true }); } catch (e) { res.status(500).json({ ok: false }); } });