const express = require('express'); const router = express.Router(); const bcrypt = require('bcryptjs'); const { isCompanyAdmin } = require('../middleware/auth'); const User = require('../models/User'); const Department = require('../models/Department'); const Ticket = require('../models/Ticket'); router.get('/dashboard', isCompanyAdmin, async (req, res) => { try { const users = await User.findAll(req.session.user.company_id); const tickets = await Ticket.findAll(req.session.user.company_id); const departments = await Department.findAll(req.session.user.company_id); const stats = await Ticket.countByStatus(req.session.user.company_id); res.render('admin/dashboard', { users, tickets, departments, stats }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar dashboard'); res.redirect('/'); } }); router.get('/users', isCompanyAdmin, async (req, res) => { try { const users = await User.findAll(req.session.user.company_id); res.render('admin/users', { users }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar usuarios'); res.redirect('/admin/dashboard'); } }); router.get('/users/create', isCompanyAdmin, (req, res) => { res.render('admin/create-user'); }); router.post('/users/create', isCompanyAdmin, async (req, res) => { const { nombre, email, password, rol } = req.body; if (!nombre || !email || !password) { req.flash('error_msg', 'Todos los campos son obligatorios'); return res.redirect('/admin/users/create'); } try { const existing = await User.findByEmail(email); if (existing) { req.flash('error_msg', 'El email ya existe'); return res.redirect('/admin/users/create'); } const hashedPassword = await bcrypt.hash(password, 10); const userId = await User.create(req.session.user.company_id, nombre, email, hashedPassword, rol || 'client'); req.flash('success_msg', 'Usuario creado exitosamente'); res.redirect('/admin/users'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al crear usuario'); res.redirect('/admin/users/create'); } }); router.post('/users/invite/:id', isCompanyAdmin, async (req, res) => { try { const user = await User.findById(req.params.id); if (!user || user.company_id !== req.session.user.company_id) { req.flash('error_msg', 'Usuario no encontrado'); return res.redirect('/admin/users'); } const token = await User.generateInviteToken(user.id); const inviteLink = `${req.protocol}://${req.get('host')}/invite/${token}`; req.flash('success_msg', `Link de invitación: ${inviteLink}`); res.redirect('/admin/users'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al generar invitación'); res.redirect('/admin/users'); } }); router.post('/users/delete/:id', isCompanyAdmin, async (req, res) => { try { const user = await User.findById(req.params.id); if (!user || user.company_id !== req.session.user.company_id) { req.flash('error_msg', 'Usuario no encontrado'); return res.redirect('/admin/users'); } if (user.rol === 'superadmin') { req.flash('error_msg', 'No puedes eliminar al superadmin'); return res.redirect('/admin/users'); } await User.delete(req.params.id); req.flash('success_msg', 'Usuario eliminado'); res.redirect('/admin/users'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al eliminar usuario'); res.redirect('/admin/users'); } }); router.get('/departments', isCompanyAdmin, async (req, res) => { try { const departments = await Department.findAll(req.session.user.company_id); res.render('admin/departments', { departments }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar departamentos'); res.redirect('/admin/dashboard'); } }); router.post('/departments/create', isCompanyAdmin, async (req, res) => { const { nombre, descripcion } = req.body; if (!nombre) { req.flash('error_msg', 'El nombre es obligatorio'); return res.redirect('/admin/departments'); } try { await Department.create(req.session.user.company_id, nombre, descripcion || ''); req.flash('success_msg', 'Departamento creado'); res.redirect('/admin/departments'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al crear departamento'); res.redirect('/admin/departments'); } }); router.post('/departments/update/:id', isCompanyAdmin, async (req, res) => { const { nombre, descripcion } = req.body; try { await Department.update(req.params.id, nombre, descripcion || ''); req.flash('success_msg', 'Departamento actualizado'); res.redirect('/admin/departments'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al actualizar departamento'); res.redirect('/admin/departments'); } }); router.post('/departments/delete/:id', isCompanyAdmin, async (req, res) => { try { await Department.delete(req.params.id); req.flash('success_msg', 'Departamento eliminado'); res.redirect('/admin/departments'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al eliminar departamento'); res.redirect('/admin/departments'); } }); module.exports = router;