const express = require('express'); const router = express.Router(); const { isAuthenticated } = require('../middleware/auth'); const Ticket = require('../models/Ticket'); const Department = require('../models/Department'); router.get('/dashboard', isAuthenticated, async (req, res) => { try { const tickets = await Ticket.findByUser(req.session.user.company_id, req.session.user.id); res.render('client/dashboard', { tickets }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar tickets'); res.redirect('/'); } }); router.get('/new-ticket', isAuthenticated, async (req, res) => { try { const departments = await Department.findAll(req.session.user.company_id); res.render('client/new-ticket', { departments }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar formulario'); res.redirect('/client/dashboard'); } }); router.post('/new-ticket', isAuthenticated, async (req, res) => { const { department_id, asunto, mensaje, prioridad } = req.body; if (!asunto || !mensaje) { req.flash('error_msg', 'Asunto y mensaje son obligatorios'); return res.redirect('/client/new-ticket'); } try { await Ticket.create(req.session.user.company_id, req.session.user.id, department_id || null, asunto, mensaje, prioridad || 'media'); req.flash('success_msg', 'Ticket creado exitosamente'); res.redirect('/client/dashboard'); } catch (error) { console.error(error); req.flash('error_msg', 'Error al crear ticket'); res.redirect('/client/new-ticket'); } }); router.get('/ticket/:id', isAuthenticated, async (req, res) => { try { const ticket = await Ticket.findById(req.params.id); if (!ticket) { req.flash('error_msg', 'Ticket no encontrado'); return res.redirect('/client/dashboard'); } if (ticket.company_id !== req.session.user.company_id) { req.flash('error_msg', 'Acceso denegado'); return res.redirect('/client/dashboard'); } if (ticket.user_id !== req.session.user.id && req.session.user.rol === 'client') { req.flash('error_msg', 'Acceso denegado'); return res.redirect('/client/dashboard'); } const respuestas = await Ticket.getResponses(req.params.id); res.render('client/view-ticket', { ticket, respuestas }); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cargar ticket'); res.redirect('/client/dashboard'); } }); router.post('/ticket/:id/respond', isAuthenticated, async (req, res) => { const { mensaje } = req.body; if (!mensaje) { req.flash('error_msg', 'El mensaje es obligatorio'); return res.redirect(`/client/ticket/${req.params.id}`); } try { await Ticket.addResponse(req.params.id, req.session.user.id, mensaje); req.flash('success_msg', 'Respuesta enviada'); res.redirect(`/client/ticket/${req.params.id}`); } catch (error) { console.error(error); req.flash('error_msg', 'Error al enviar respuesta'); res.redirect(`/client/ticket/${req.params.id}`); } }); router.post('/ticket/:id/close', isAuthenticated, async (req, res) => { try { const ticket = await Ticket.findById(req.params.id); if (ticket && ticket.company_id !== req.session.user.company_id) { req.flash('error_msg', 'Acceso denegado'); return res.redirect('/client/dashboard'); } await Ticket.update(req.params.id, { status: 'cerrado' }); req.flash('success_msg', 'Ticket cerrado'); res.redirect(`/client/ticket/${req.params.id}`); } catch (error) { console.error(error); req.flash('error_msg', 'Error al cerrar ticket'); res.redirect(`/client/ticket/${req.params.id}`); } }); module.exports = router;