diff --git a/server.js b/server.js index 582e23b..e982876 100644 --- a/server.js +++ b/server.js @@ -2795,7 +2795,8 @@ app.get("/config/company", authMiddleware, async (req, res) => { app.post("/config/company", authMiddleware, async (req, res) => { const client = await pool.connect(); try { - const { slug, company_name, company_logo, portal_settings, app_settings } = req.body; + // 1. Recogemos el nuevo objeto billing_settings + const { slug, company_name, company_logo, portal_settings, app_settings, billing_settings } = req.body; let cleanSlug = null; if (slug) { @@ -2805,15 +2806,26 @@ app.post("/config/company", authMiddleware, async (req, res) => { if (check.rowCount > 0) return res.status(400).json({ ok: false, error: "Ese enlace ya está en uso por otra empresa" }); } + // 2. Magia Blanca: Creamos la columna billing_settings "al vuelo" si no existía, sin que tengas que ir a Adminer + await client.query(` + DO $$ BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name='users' AND column_name='billing_settings') THEN + ALTER TABLE users ADD COLUMN billing_settings JSONB DEFAULT '{}'; + END IF; + END $$; + `); + + // 3. Guardamos todo, incluyendo la facturación await client.query(` UPDATE users SET company_slug = COALESCE($1, company_slug), full_name = COALESCE($2, full_name), company_logo = COALESCE($3, company_logo), portal_settings = COALESCE($4, portal_settings), - app_settings = COALESCE($5, app_settings) - WHERE id = $6 - `, [cleanSlug, company_name, company_logo, portal_settings, app_settings, req.user.accountId]); + app_settings = COALESCE($5, app_settings), + billing_settings = COALESCE($6, billing_settings) + WHERE id = $7 + `, [cleanSlug, company_name, company_logo, portal_settings, app_settings, billing_settings, req.user.accountId]); res.json({ ok: true }); } catch (e) { @@ -2824,6 +2836,22 @@ app.post("/config/company", authMiddleware, async (req, res) => { } }); +app.get("/config/company", authMiddleware, async (req, res) => { + try { + // 4. Modificamos también el GET para que devuelva los datos de facturación al Frontend + const q = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings, billing_settings FROM users WHERE id=$1", [req.user.accountId]); + res.json({ ok: true, config: q.rows[0] || {} }); + } catch (e) { + // Si falla porque la columna aún no se ha creado (el usuario nunca ha guardado), devolvemos el resto normal + try { + const fallback = await pool.query("SELECT company_slug, full_name, plan_tier, company_logo, portal_settings, app_settings FROM users WHERE id=$1", [req.user.accountId]); + res.json({ ok: true, config: fallback.rows[0] || {} }); + } catch(fallbackError) { + res.status(500).json({ ok: false }); + } + } +}); + // RUTA: Alta de expediente manual con validación de cliente app.post("/services/manual-high", authMiddleware, async (req, res) => { try {