105 lines
3.9 KiB
JavaScript
105 lines
3.9 KiB
JavaScript
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;
|