diff --git a/server.js b/server.js index d419f32..932b1f4 100644 --- a/server.js +++ b/server.js @@ -981,50 +981,38 @@ app.put("/clients/:id", authMiddleware, async (req, res) => { // ========================================== app.get("/statuses", authMiddleware, async (req, res) => { try { - let q = await pool.query("SELECT * FROM service_statuses WHERE owner_id=$1 ORDER BY id ASC", [req.user.accountId]); + // 1. FORZAMOS LA INYECCIÓN/ACTUALIZACIÓN SIEMPRE (A prueba de fallos) + const defaults = [ + {name:'Pendiente de Asignar', c:'gray', d:true, f:false, sys:true}, + {name:'Asignado', c:'blue', d:false, f:false, sys:true}, + {name:'Esperando al Cliente', c:'amber', d:false, f:false, sys:true}, + {name:'Citado', c:'emerald', d:false, f:false, sys:true}, + {name:'De Camino', c:'indigo', d:false, f:false, sys:true}, + {name:'Trabajando', c:'orange', d:false, f:false, sys:true}, + {name:'Incidencia', c:'red', d:false, f:false, sys:true}, + {name:'Desasignado', c:'rose', d:false, f:false, sys:true}, + {name:'Finalizado', c:'purple', d:false, f:true, sys:true}, + {name:'Anulado', c:'gray', d:false, f:true, sys:true} + ]; - // 🚀 VERIFICACIÓN DE MIGRACIÓN: Comprobamos si el usuario ya tiene los estados protegidos del sistema - const hasSystemStatuses = q.rows.some(s => s.is_system === true); - - if (!hasSystemStatuses) { - const defaults = [ - {name:'Pendiente de Asignar', c:'gray', d:true, f:false, sys:true}, - {name:'Asignado', c:'blue', d:false, f:false, sys:true}, - {name:'Esperando al Cliente', c:'amber', d:false, f:false, sys:true}, - {name:'Citado', c:'emerald', d:false, f:false, sys:true}, - {name:'De Camino', c:'indigo', d:false, f:false, sys:true}, - {name:'Trabajando', c:'orange', d:false, f:false, sys:true}, - {name:'Incidencia', c:'red', d:false, f:false, sys:true}, - {name:'Desasignado', c:'rose', d:false, f:false, sys:true}, - {name:'Finalizado', c:'purple', d:false, f:true, sys:true}, - {name:'Anulado', c:'gray', d:false, f:true, sys:true} - ]; - - for (const s of defaults) { - // Evitamos duplicados si el usuario ya había creado uno con el mismo nombre - const check = await pool.query("SELECT id FROM service_statuses WHERE owner_id=$1 AND name=$2", [req.user.accountId, s.name]); - if(check.rowCount === 0){ - await pool.query("INSERT INTO service_statuses (owner_id,name,color,is_default,is_final,is_system) VALUES ($1,$2,$3,$4,$5,$6)", [req.user.accountId,s.name,s.c,s.d,s.f,s.sys]); - } else { - // Si ya existe, lo convertimos en estado de sistema para protegerlo - await pool.query("UPDATE service_statuses SET is_system=true WHERE id=$1", [check.rows[0].id]); - } + for (const s of defaults) { + // Buscamos si existe por nombre + const check = await pool.query("SELECT id FROM service_statuses WHERE owner_id=$1 AND name=$2", [req.user.accountId, s.name]); + if(check.rowCount === 0){ + // Si no existe, lo creamos blindado + await pool.query("INSERT INTO service_statuses (owner_id,name,color,is_default,is_final,is_system) VALUES ($1,$2,$3,$4,$5,$6)", [req.user.accountId,s.name,s.c,s.d,s.f,s.sys]); + } else { + // Si existe, lo actualizamos para asegurarnos de que el color y el candado son correctos + await pool.query("UPDATE service_statuses SET is_system=true, color=$2, is_final=$3 WHERE id=$1", [check.rows[0].id, s.c, s.f]); } - // Recargamos la lista final - q = await pool.query("SELECT * FROM service_statuses WHERE owner_id=$1 ORDER BY id ASC", [req.user.accountId]); - } + } + + // 2. RECUPERAMOS LA LISTA YA ACTUALIZADA PARA EL FRONTEND + let q = await pool.query("SELECT * FROM service_statuses WHERE owner_id=$1 ORDER BY is_system DESC, id ASC", [req.user.accountId]); res.json({ ok: true, statuses: q.rows }); } catch (e) { res.status(500).json({ ok: false }); } }); -app.post("/statuses", authMiddleware, async (req, res) => { - try { - const { name, color } = req.body; - await pool.query("INSERT INTO service_statuses (owner_id, name, color, is_system) VALUES ($1, $2, $3, false)", [req.user.accountId, name, color || 'gray']); - res.json({ ok: true }); - } catch(e) { res.status(500).json({ ok: false }); } -}); - app.delete("/statuses/:id", authMiddleware, async (req, res) => { const client = await pool.connect(); try {