feat: inicializacion de Help Desk segun estandar Telcotronics con bitacora de errores e integracion MCP

This commit is contained in:
2026-10-16 23:29:32 -05:00
commit 0f2708462e
54 changed files with 7590 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
const Company = require('../models/Company');
module.exports = {
isAuthenticated: (req, res, next) => {
if (req.session.user) return next();
req.flash('error_msg', 'Por favor inicia sesión');
res.redirect('/login');
},
isSuperAdmin: (req, res, next) => {
if (req.session.user && req.session.user.rol === 'superadmin') return next();
req.flash('error_msg', 'Acceso denegado');
res.redirect('/');
},
isCompanyAdmin: (req, res, next) => {
if (req.session.user && ['superadmin', 'admin'].includes(req.session.user.rol)) return next();
req.flash('error_msg', 'Acceso denegado');
res.redirect('/');
},
isAgent: (req, res, next) => {
if (req.session.user && ['superadmin', 'admin', 'agent'].includes(req.session.user.rol)) return next();
req.flash('error_msg', 'Acceso denegado');
res.redirect('/');
},
loadCompany: async (req, res, next) => {
if (req.session.user && req.session.user.company_id) {
const company = await Company.findById(req.session.user.company_id);
res.locals.company = company;
}
next();
},
checkPlan: (feature) => {
return async (req, res, next) => {
if (!res.locals.company) return next();
const company = res.locals.company;
if (!company.is_active) {
req.flash('error_msg', 'Tu cuenta está desactivada');
return res.redirect('/logout');
}
if (feature === 'users') {
const User = require('../models/User');
const count = await User.countByCompany(company.id);
if (count >= company.max_users) {
req.flash('error_msg', `Límite de usuarios alcanzado (${company.max_users})`);
return res.redirect('/');
}
}
if (feature === 'tickets') {
const Ticket = require('../models/Ticket');
const [rows] = await require('../config/db').query(
'SELECT COUNT(*) as total FROM tickets WHERE company_id = ?', [company.id]
);
if (rows[0].total >= company.max_tickets) {
req.flash('error_msg', `Límite de tickets alcanzado (${company.max_tickets})`);
return res.redirect('/');
}
}
next();
};
}
};