const express = require('express'); const router = express.Router(); const { isAgent } = require('../middleware/auth'); const Ticket = require('../models/Ticket'); const Department = require('../models/Department'); router.get('/dashboard', isAgent, async (req, res) => { try { let tickets; if (['superadmin', 'admin'].includes(req.session.user.rol)) { tickets = await Ticket.findAll(req.session.user.company_id); } else { tickets = await Ticket.findByAgent(req.session.user.company_id, req.session.user.id); } const stats = await Ticket.countByStatus(req.session.user.company_id); const departments = await Department.findAll(req.session.user.company_id); res.render('agent/dashboard', { tickets, stats, departments }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar dashboard'); res.redirect('/'); } }); router.get('/ticket/:id', isAgent, async (req, res) => { try { const ticket = await Ticket.findById(req.params.id); if (!ticket) { req.flash('error_msg', 'Ticket no encontrado'); return res.redirect('/agent/dashboard'); } if (ticket.company_id !== req.session.user.company_id && req.session.user.rol !== 'superadmin') { req.flash('error_msg', 'Acceso denegado'); return res.redirect('/agent/dashboard'); } const respuestas = await Ticket.getResponses(req.params.id); let agents = []; if (['superadmin', 'admin'].includes(req.session.user.rol)) { const User = require('../models/User'); const allUsers = await User.findAll(req.session.user.company_id); agents = allUsers.filter(u => u.rol === 'agent'); } res.render('agent/view-ticket', { ticket, respuestas, agents }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar ticket'); res.redirect('/agent/dashboard'); } }); router.post('/ticket/:id/respond', isAgent, async (req, res) => { const { mensaje } = req.body; if (!mensaje) { req.flash('error_msg', 'El mensaje es obligatorio'); return res.redirect(`/agent/ticket/${req.params.id}`); } try { await Ticket.addResponse(req.params.id, req.session.user.id, mensaje); req.flash('success_msg', 'Respuesta enviada'); res.redirect(`/agent/ticket/${req.params.id}`); } catch (error) { console.error(error); req.flash('error_msg', 'Error al enviar respuesta'); res.redirect(`/agent/ticket/${req.params.id}`); } }); router.post('/ticket/:id/status', isAgent, async (req, res) => { const { status, assigned_to } = req.body; try { const data = {}; if (status) data.status = status; if (assigned_to && ['superadmin', 'admin'].includes(req.session.user.rol)) { data.assigned_to = assigned_to; } await Ticket.update(req.params.id, data); req.flash('success_msg', 'Ticket actualizado'); res.redirect(`/agent/ticket/${req.params.id}`); } catch (error) { console.error(error); req.flash('error_msg', 'Error al actualizar ticket'); res.redirect(`/agent/ticket/${req.params.id}`); } }); router.post('/ticket/:id/assign', isAgent, async (req, res) => { if (!['superadmin', 'admin'].includes(req.session.user.rol)) { req.flash('error_msg', 'Acceso denegado'); return res.redirect('/agent/dashboard'); } const { assigned_to } = req.body; try { await Ticket.update(req.params.id, { assigned_to: assigned_to || null }); if (assigned_to) { await Ticket.update(req.params.id, { status: 'en_progreso' }); } req.flash('success_msg', 'Ticket asignado'); res.redirect(`/agent/ticket/${req.params.id}`); } catch (error) { console.error(error); req.flash('error_msg', 'Error al asignar ticket'); res.redirect(`/agent/ticket/${req.params.id}`); } }); module.exports = router;