From 91aeab58425569546511544f605a5fd176f4ce38 Mon Sep 17 00:00:00 2001 From: Pablinux Date: Wed, 4 Jun 2025 21:47:49 -0500 Subject: [PATCH] Cambios en el crud --- src/controladores/controlador_Membresias.js | 416 ++++++++++---------- 1 file changed, 207 insertions(+), 209 deletions(-) diff --git a/src/controladores/controlador_Membresias.js b/src/controladores/controlador_Membresias.js index ee21b20..6c8e4aa 100644 --- a/src/controladores/controlador_Membresias.js +++ b/src/controladores/controlador_Membresias.js @@ -1,226 +1,224 @@ // src/controladores/controlador_Membresias.js -// La conexión/pool se obtendrá a través de req.getConnection() inyectado por express-myconnection. - const controladorMembresias = { - // --- Funciones para Tipos de Membresía (clientes_membresias) --- + // --- Funciones para Tipos de Membresía (clientes_membresias) --- - /** - * @function listarTiposMembresia - * @description Lista todos los tipos de membresía disponibles, incluyendo información del combo ensamblado si aplica. - * @param {Object} req - Objeto de solicitud de Express. - * @param {Object} res - Objeto de respuesta de Express. - */ - listarTiposMembresia: async (req, res) => { - let connection; - try { - connection = await req.getConnection(); - const [rows] = await connection.query(` - SELECT - cm.id_tipo_membresia, - cm.nombre_tipo, - cm.categoria_membresia, - cm.es_grupal, - cm.capacidad_maxima_miembros, - cm.valor, - cm.descripcion, - cm.duracion_dias, - cm.visitas_maximas_diarias, - cm.areas_de_acceso, - cm.id_combo_ensamblado_incluido, - cm.cantidad_combo_incluido, - pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, - cm.estado_tipo, - cm.fecha_creacion, - cm.fecha_modificacion - FROM - clientes_membresias cm - LEFT JOIN - productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID - `); - res.json(rows); - } catch (error) { - console.error('Error al listar tipos de membresía:', error); - res.status(500).json({ mensaje: 'Error interno del servidor al listar tipos de membresía', error: error.message }); - } finally { - if (connection && typeof connection.release === 'function') connection.release(); - } - }, + /** + * @function listarTiposMembresia + * @description Lista todos los tipos de membresía disponibles, incluyendo información del combo ensamblado si aplica. + * @param {Object} req - Objeto de solicitud de Express. + * @param {Object} res - Objeto de respuesta de Express. + */ + listarTiposMembresia: async (req, res) => { + // let connection; // No es necesario si se usa req.pool directamente + try { + // CAMBIO CLAVE AQUÍ: Usar req.pool directamente + const [rows] = await req.pool.query(` + SELECT + cm.id_tipo_membresia, + cm.nombre_tipo, + cm.categoria_membresia, + cm.es_grupal, + cm.capacidad_maxima_miembros, + cm.valor, + cm.descripcion, + cm.duracion_dias, + cm.visitas_maximas_diarias, + cm.areas_de_acceso, + cm.id_combo_ensamblado_incluido, + cm.cantidad_combo_incluido, + pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, + cm.estado_tipo, + cm.fecha_creacion, + cm.fecha_modificacion + FROM + clientes_membresias cm + LEFT JOIN + productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID + `); + res.json(rows); + } catch (error) { + console.error('Error al listar tipos de membresía:', error); + res.status(500).json({ mensaje: 'Error interno del servidor al listar tipos de membresía', error: error.message }); + } + // finally { // El bloque finally para release no es necesario si se usa req.pool directamente + // if (connection && typeof connection.release === 'function') connection.release(); + // } + }, - /** - * @function obtenerTipoMembresiaPorId - * @description Obtiene un tipo de membresía específico por su ID. - * @param {Object} req - Objeto de solicitud de Express (req.params.id contiene el ID del tipo de membresía). - * @param {Object} res - Objeto de respuesta de Express. - */ - obtenerTipoMembresiaPorId: async (req, res) => { - const { id } = req.params; // ID de la tabla clientes_membresias - let connection; - try { - connection = await req.getConnection(); - const [rows] = await connection.query(` - SELECT - cm.id_tipo_membresia, - cm.nombre_tipo, - cm.categoria_membresia, - cm.es_grupal, - cm.capacidad_maxima_miembros, - cm.valor, - cm.descripcion, - cm.duracion_dias, - cm.visitas_maximas_diarias, - cm.areas_de_acceso, - cm.id_combo_ensamblado_incluido, - cm.cantidad_combo_incluido, - pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, - cm.estado_tipo, - cm.fecha_creacion, - cm.fecha_modificacion - FROM - clientes_membresias cm - LEFT JOIN - productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID - WHERE cm.id_tipo_membresia = ?`, [id]); - - if (rows.length === 0) { - return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' }); - } - res.json(rows[0]); - } catch (error) { - console.error('Error al obtener tipo de membresía:', error); - res.status(500).json({ mensaje: 'Error interno del servidor al obtener tipo de membresía', error: error.message }); - } finally { - if (connection && typeof connection.release === 'function') connection.release(); - } - }, + /** + * @function obtenerTipoMembresiaPorId + * @description Obtiene un tipo de membresía específico por su ID. + * @param {Object} req - Objeto de solicitud de Express (req.params.id contiene el ID del tipo de membresía). + * @param {Object} res - Objeto de respuesta de Express. + */ + obtenerTipoMembresiaPorId: async (req, res) => { + const { id } = req.params; // ID de la tabla clientes_membresias + // let connection; + try { + // CAMBIO CLAVE AQUÍ: Usar req.pool directamente + const [rows] = await req.pool.query(` + SELECT + cm.id_tipo_membresia, + cm.nombre_tipo, + cm.categoria_membresia, + cm.es_grupal, + cm.capacidad_maxima_miembros, + cm.valor, + cm.descripcion, + cm.duracion_dias, + cm.visitas_maximas_diarias, + cm.areas_de_acceso, + cm.id_combo_ensamblado_incluido, + cm.cantidad_combo_incluido, + pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, + cm.estado_tipo, + cm.fecha_creacion, + cm.fecha_modificacion + FROM + clientes_membresias cm + LEFT JOIN + productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID + WHERE cm.id_tipo_membresia = ?`, [id]); + + if (rows.length === 0) { + return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' }); + } + res.json(rows[0]); + } catch (error) { + console.error('Error al obtener tipo de membresía:', error); + res.status(500).json({ mensaje: 'Error interno del servidor al obtener tipo de membresía', error: error.message }); + } + // finally { + // if (connection && typeof connection.release === 'function') connection.release(); + // } + }, - /** - * @function crearTipoMembresia - * @description Crea un nuevo tipo de membresía. - * @param {Object} req - Objeto de solicitud de Express (req.body contiene los datos del tipo de membresía). - * @param {Object} res - Objeto de respuesta de Express. - */ - crearTipoMembresia: async (req, res) => { - const { - nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, - valor, descripcion, duracion_dias, visitas_maximas_diarias, - areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido - } = req.body; + /** + * @function crearTipoMembresia + * @description Crea un nuevo tipo de membresía. + * @param {Object} req - Objeto de solicitud de Express (req.body contiene los datos del tipo de membresía). + * @param {Object} res - Objeto de respuesta de Express. + */ + crearTipoMembresia: async (req, res) => { + const { + nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, + valor, descripcion, duracion_dias, visitas_maximas_diarias, + areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido + } = req.body; - // Validaciones básicas de campos obligatorios - if (!nombre_tipo || es_grupal === undefined || valor === undefined) { - return res.status(400).json({ mensaje: 'Faltan campos obligatorios para el tipo de membresía (nombre_tipo, es_grupal, valor).' }); - } + // Validaciones básicas de campos obligatorios + if (!nombre_tipo || es_grupal === undefined || valor === undefined) { + return res.status(400).json({ mensaje: 'Faltan campos obligatorios para el tipo de membresía (nombre_tipo, es_grupal, valor).' }); + } - let connection; - try { - connection = await req.getConnection(); - const [result] = await connection.query( - `INSERT INTO clientes_membresias ( - nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, - valor, descripcion, duracion_dias, visitas_maximas_diarias, - areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, - estado_tipo, fecha_creacion - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())`, - [ - nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, - valor, descripcion, duracion_dias, visitas_maximas_diarias, - areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido - ] - ); - res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId }); - } catch (error) { - console.error('Error al crear tipo de membresía:', error); - // Manejo de error específico por entrada duplicada (ej. nombre_tipo único) - if (error.code === 'ER_DUP_ENTRY') { - return res.status(409).json({ mensaje: 'Ya existe un tipo de membresía con ese nombre.', error: error.message }); - } - res.status(500).json({ mensaje: 'Error interno del servidor al crear tipo de membresía', error: error.message }); - } finally { - if (connection && typeof connection.release === 'function') connection.release(); - } - }, + // let connection; + try { + // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query + const [result] = await req.pool.query( + `INSERT INTO clientes_membresias ( + nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, + valor, descripcion, duracion_dias, visitas_maximas_diarias, + areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, + estado_tipo, fecha_creacion + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())`, + [ + nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, + valor, descripcion, duracion_dias, visitas_maximas_diarias, + areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido + ] + ); + res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId }); + } catch (error) { + console.error('Error al crear tipo de membresía:', error); + if (error.code === 'ER_DUP_ENTRY') { + return res.status(409).json({ mensaje: 'Ya existe un tipo de membresía con ese nombre.', error: error.message }); + } + res.status(500).json({ mensaje: 'Error interno del servidor al crear tipo de membresía', error: error.message }); + } + // finally { + // if (connection && typeof connection.release === 'function') connection.release(); + // } + }, - /** - * @function actualizarTipoMembresia - * @description Actualiza un tipo de membresía existente por su ID. - * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID, req.body para los datos). - * @param {Object} res - Objeto de respuesta de Express. - */ - actualizarTipoMembresia: async (req, res) => { - const { id } = req.params; // ID del tipo de membresía a actualizar - const { - nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, - valor, descripcion, duracion_dias, visitas_maximas_diarias, - areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo - } = req.body; + /** + * @function actualizarTipoMembresia + * @description Actualiza un tipo de membresía existente por su ID. + * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID, req.body para los datos). + * @param {Object} res - Objeto de respuesta de Express. + */ + actualizarTipoMembresia: async (req, res) => { + const { id } = req.params; // ID del tipo de membresía a actualizar + const { + nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, + valor, descripcion, duracion_dias, visitas_maximas_diarias, + areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo + } = req.body; - // Validaciones básicas de campos obligatorios - if (!nombre_tipo || es_grupal === undefined || valor === undefined || !estado_tipo) { - return res.status(400).json({ mensaje: 'Faltan campos obligatorios para actualizar el tipo de membresía (nombre_tipo, es_grupal, valor, estado_tipo).' }); - } + if (!nombre_tipo || es_grupal === undefined || valor === undefined || !estado_tipo) { + return res.status(400).json({ mensaje: 'Faltan campos obligatorios para actualizar el tipo de membresía (nombre_tipo, es_grupal, valor, estado_tipo).' }); + } - let connection; - try { - connection = await req.getConnection(); - const [result] = await connection.query( - `UPDATE clientes_membresias SET - nombre_tipo = ?, categoria_membresia = ?, es_grupal = ?, - capacidad_maxima_miembros = ?, valor = ?, descripcion = ?, - duracion_dias = ?, visitas_maximas_diarias = ?, areas_de_acceso = ?, - id_combo_ensamblado_incluido = ?, cantidad_combo_incluido = ?, - estado_tipo = ?, fecha_modificacion = NOW() - WHERE id_tipo_membresia = ?`, - [ - nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, - valor, descripcion, duracion_dias, visitas_maximas_diarias, - areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, id - ] - ); + // let connection; + try { + // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query + const [result] = await req.pool.query( + `UPDATE clientes_membresias SET + nombre_tipo = ?, categoria_membresia = ?, es_grupal = ?, + capacidad_maxima_miembros = ?, valor = ?, descripcion = ?, + duracion_dias = ?, visitas_maximas_diarias = ?, areas_de_acceso = ?, + id_combo_ensamblado_incluido = ?, cantidad_combo_incluido = ?, + estado_tipo = ?, fecha_modificacion = NOW() + WHERE id_tipo_membresia = ?`, + [ + nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, + valor, descripcion, duracion_dias, visitas_maximas_diarias, + areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, id + ] + ); - if (result.affectedRows === 0) { - return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para actualizar' }); - } - res.json({ mensaje: 'Tipo de membresía actualizado exitosamente' }); - } catch (error) { - console.error('Error al actualizar tipo de membresía:', error); - // Manejo de error específico por entrada duplicada - if (error.code === 'ER_DUP_ENTRY') { - return res.status(409).json({ mensaje: 'Ya existe otro tipo de membresía con ese nombre.', error: error.message }); - } - res.status(500).json({ mensaje: 'Error interno del servidor al actualizar tipo de membresía', error: error.message }); - } finally { - if (connection && typeof connection.release === 'function') connection.release(); - } - }, + if (result.affectedRows === 0) { + return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para actualizar' }); + } + res.json({ mensaje: 'Tipo de membresía actualizado exitosamente' }); + } catch (error) { + console.error('Error al actualizar tipo de membresía:', error); + if (error.code === 'ER_DUP_ENTRY') { + return res.status(409).json({ mensaje: 'Ya existe otro tipo de membresía con ese nombre.', error: error.message }); + } + res.status(500).json({ mensaje: 'Error interno del servidor al actualizar tipo de membresía', error: error.message }); + } + // finally { + // if (connection && typeof connection.release === 'function') connection.release(); + // } + }, - /** - * @function eliminarTipoMembresia - * @description Elimina lógicamente un tipo de membresía por su ID (cambia su estado a 'ELIMINADO'). - * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID). - * @param {Object} res - Objeto de respuesta de Express. - */ - eliminarTipoMembresia: async (req, res) => { - const { id } = req.params; - let connection; - try { - connection = await req.getConnection(); - // Se recomienda una eliminación lógica para mantener la integridad referencial - // si hay adquisiciones de membresía o historial asociados. - const [result] = await connection.query('UPDATE clientes_membresias SET estado_tipo = "ELIMINADO" WHERE id_tipo_membresia = ?', [id]); - - if (result.affectedRows === 0) { - return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para eliminar' }); - } - res.json({ mensaje: 'Tipo de membresía eliminado (lógicamente) exitosamente' }); - } catch (error) { - console.error('Error al eliminar tipo de membresía:', error); - res.status(500).json({ mensaje: 'Error interno del servidor al eliminar tipo de membresía', error: error.message }); - } finally { - if (connection && typeof connection.release === 'function') connection.release(); - } - } + /** + * @function eliminarTipoMembresia + * @description Elimina lógicamente un tipo de membresía por su ID (cambia su estado a 'ELIMINADO'). + * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID). + * @param {Object} res - Objeto de respuesta de Express. + */ + eliminarTipoMembresia: async (req, res) => { + const { id } = req.params; + // let connection; + try { + // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query + const [result] = await req.pool.query('UPDATE clientes_membresias SET estado_tipo = "ELIMINADO" WHERE id_tipo_membresia = ?', [id]); + + if (result.affectedRows === 0) { + return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para eliminar' }); + } + res.json({ mensaje: 'Tipo de membresía eliminado (lógicamente) exitosamente' }); + } catch (error) { + console.error('Error al eliminar tipo de membresía:', error); + res.status(500).json({ mensaje: 'Error interno del servidor al eliminar tipo de membresía', error: error.message }); + } + // finally { + // if (connection && typeof connection.release === 'function') connection.release(); + // } + } }; module.exports = controladorMembresias; \ No newline at end of file