diff --git a/src/controladores/controlador_Areas.js b/src/controladores/controlador_Areas.js index 7784d81..a7d2f61 100644 --- a/src/controladores/controlador_Areas.js +++ b/src/controladores/controlador_Areas.js @@ -1,18 +1,38 @@ +// src/controladores/controlador_Areas.js + const controladorAreas = { /** * @function listarAreas - * @description Lista todas las áreas de acceso configuradas en la tabla `areas_configuracion`. - * @param {Object} req - Objeto de solicitud de Express. + * @description Lista todas las áreas de acceso configuradas en la tabla `clientes_membresias_areas_acceso`. + * Filtra por estado si se proporciona un query param `estado`. + * @param {Object} req - Objeto de solicitud de Express (req.query.estado). * @param {Object} res - Objeto de respuesta de Express. */ listarAreas: (req, res) => { + const { estado } = req.query; // Obtener el parámetro de estado req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para listar áreas:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } - connection.query('SELECT id_area, nombre_area, descripcion, estado_area FROM areas_configuracion WHERE estado_area = "ACTIVA" ORDER BY nombre_area', (err, rows) => { + + let query = 'SELECT id_area, nombre_area, descripcion, estado_area, fecha_creacion, fecha_modificacion FROM clientes_membresias_areas_acceso'; + const queryParams = []; + + if (estado) { + // Validar que el estado sea uno de los permitidos por el ENUM + const estadosPermitidos = ['ACTIVA', 'INACTIVA']; + if (!estadosPermitidos.includes(estado.toUpperCase())) { + return res.status(400).json({ mensaje: `El estado proporcionado '${estado}' no es válido. Los estados permitidos son: ${estadosPermitidos.join(', ')}.` }); + } + query += ' WHERE estado_area = ?'; + queryParams.push(estado.toUpperCase()); + } + + query += ' ORDER BY nombre_area'; + + connection.query(query, queryParams, (err, rows) => { if (err) { console.error('Error al listar áreas de configuración:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al listar áreas', error: err.message }); @@ -22,9 +42,126 @@ const controladorAreas = { }); }, - // Puedes añadir otros métodos aquí si necesitas CRUD completo para las áreas de configuración - // por ejemplo: obtenerAreaPorId, crearArea, actualizarArea, eliminarArea + /** + * @function obtenerAreaPorId + * @description Obtiene una área específica por su ID. + * @param {Object} req - Objeto de solicitud de Express (req.params.id). + * @param {Object} res - Objeto de respuesta de Express. + */ + obtenerAreaPorId: (req, res) => { + const { id } = req.params; + req.getConnection((err, connection) => { + if (err) { + console.error('Error al obtener conexión para área por ID:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); + } + connection.query('SELECT id_area, nombre_area, descripcion, estado_area FROM clientes_membresias_areas_acceso WHERE id_area = ?', [id], (err, rows) => { + if (err) { + console.error('Error al obtener área por ID:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al obtener área', error: err.message }); + } + if (rows.length === 0) { + return res.status(404).json({ mensaje: 'Área no encontrada' }); + } + res.json(rows[0]); + }); + }); + }, + + /** + * @function crearArea + * @description Crea una nueva área de acceso. + * @param {Object} req - Objeto de solicitud de Express (req.body contiene los datos del área). + * @param {Object} res - Objeto de respuesta de Express. + */ + crearArea: (req, res) => { + const { nombre_area, descripcion } = req.body; + if (!nombre_area) { + return res.status(400).json({ mensaje: 'El nombre del área es obligatorio.' }); + } + req.getConnection((err, connection) => { + if (err) { + console.error('Error al obtener conexión para crear área:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); + } + connection.query('INSERT INTO clientes_membresias_areas_acceso (nombre_area, descripcion, estado_area, fecha_creacion) VALUES (?, ?, "ACTIVA", NOW())', [nombre_area, descripcion], (err, result) => { + if (err) { + console.error('Error al crear área:', err); + if (err.code === 'ER_DUP_ENTRY') { + return res.status(409).json({ mensaje: 'Ya existe un área con ese nombre.', error: err.message }); + } + return res.status(500).json({ mensaje: 'Error interno del servidor al crear área', error: err.message }); + } + res.status(201).json({ mensaje: 'Área creada exitosamente', id_area: result.insertId }); + }); + }); + }, + + /** + * @function actualizarArea + * @description Actualiza una área de acceso existente. + * @param {Object} req - Objeto de solicitud de Express (req.params.id, req.body). + * @param {Object} res - Objeto de respuesta de Express. + */ + actualizarArea: (req, res) => { + const { id } = req.params; + const { nombre_area, descripcion, estado_area } = req.body; + if (!nombre_area || !estado_area) { + return res.status(400).json({ mensaje: 'El nombre del área y el estado son obligatorios para actualizar.' }); + } + + // Validar que el estado sea uno de los permitidos por el ENUM + const estadosPermitidos = ['ACTIVA', 'INACTIVA']; + if (!estadosPermitidos.includes(estado_area.toUpperCase())) { + return res.status(400).json({ mensaje: `El estado proporcionado '${estado_area}' no es válido. Los estados permitidos son: ${estadosPermitidos.join(', ')}.` }); + } + + req.getConnection((err, connection) => { + if (err) { + console.error('Error al obtener conexión para actualizar área:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); + } + connection.query('UPDATE clientes_membresias_areas_acceso SET nombre_area = ?, descripcion = ?, estado_area = ?, fecha_modificacion = NOW() WHERE id_area = ?', [nombre_area, descripcion, estado_area, id], (err, result) => { + if (err) { + console.error('Error al actualizar área:', err); + if (err.code === 'ER_DUP_ENTRY') { + return res.status(409).json({ mensaje: 'Ya existe otra área con ese nombre.', error: err.message }); + } + return res.status(500).json({ mensaje: 'Error interno del servidor al actualizar área', error: err.message }); + } + if (result.affectedRows === 0) { + return res.status(404).json({ mensaje: 'Área no encontrada para actualizar' }); + } + res.json({ mensaje: 'Área actualizada exitosamente' }); + }); + }); + }, + + /** + * @function inactivarArea + * @description Cambia el estado de una área a 'INACTIVA'. (Eliminación lógica). + * @param {Object} req - Objeto de solicitud de Express (req.params.id). + * @param {Object} res - Objeto de respuesta de Express. + */ + inactivarArea: (req, res) => { + const { id } = req.params; + req.getConnection((err, connection) => { + if (err) { + console.error('Error al obtener conexión para inactivar área:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); + } + connection.query('UPDATE clientes_membresias_areas_acceso SET estado_area = "INACTIVA", fecha_modificacion = NOW() WHERE id_area = ?', [id], (err, result) => { + if (err) { + console.error('Error al inactivar área:', err); + return res.status(500).json({ mensaje: 'Error interno del servidor al inactivar área', error: err.message }); + } + if (result.affectedRows === 0) { + return res.status(404).json({ mensaje: 'Área no encontrada para inactivar' }); + } + res.json({ mensaje: 'Área inactivada exitosamente' }); + }); + }); + } }; module.exports = controladorAreas; -// Este controlador maneja las operaciones relacionadas con las áreas de configuración \ No newline at end of file diff --git a/src/rutas/rt_clientes.js b/src/rutas/rt_clientes.js index eb1b781..86bdc22 100644 --- a/src/rutas/rt_clientes.js +++ b/src/rutas/rt_clientes.js @@ -74,8 +74,12 @@ rutas.get('/api/miembros/estado/:estado', controladorMiembros.listarMiembrosPorE // GET /api/tipos-membresia/:id_tipo_membresia/miembros rutas.get('/api/tipos-membresia/:id_tipo_membresia/miembros', controladorMiembros.listarMiembrosPorTipoMembresia); -// Rutas para la gestión de Áreas de Configuración -rutas.get('/api/areas', controladorAreas.listarAreas); // Endpoint para listar todas las áreas +// Rutas para la administración de Áreas de Acceso +rutas.get('/api/areas', controladorAreas.listarAreas); +rutas.get('/api/areas/:id', controladorAreas.obtenerAreaPorId); +rutas.post('/api/areas', controladorAreas.crearArea); +rutas.put('/api/areas/:id', controladorAreas.actualizarArea); +rutas.put('/api/areas/:id/inactivar', controladorAreas.inactivarArea); // Ruta específica para inactivar // Ruta para obtener ciudades rutas.get('/api/ciudades', controladorClientes.obtenerCiudades);