Cambios en el crud

This commit is contained in:
Pablinux
2025-06-04 21:47:49 -05:00
parent 34e3622624
commit 91aeab5842

View File

@@ -1,226 +1,224 @@
// src/controladores/controlador_Membresias.js // src/controladores/controlador_Membresias.js
// La conexión/pool se obtendrá a través de req.getConnection() inyectado por express-myconnection.
const controladorMembresias = { const controladorMembresias = {
// --- Funciones para Tipos de Membresía (clientes_membresias) --- // --- Funciones para Tipos de Membresía (clientes_membresias) ---
/** /**
* @function listarTiposMembresia * @function listarTiposMembresia
* @description Lista todos los tipos de membresía disponibles, incluyendo información del combo ensamblado si aplica. * @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} req - Objeto de solicitud de Express.
* @param {Object} res - Objeto de respuesta de Express. * @param {Object} res - Objeto de respuesta de Express.
*/ */
listarTiposMembresia: async (req, res) => { listarTiposMembresia: async (req, res) => {
let connection; // let connection; // No es necesario si se usa req.pool directamente
try { try {
connection = await req.getConnection(); // CAMBIO CLAVE AQUÍ: Usar req.pool directamente
const [rows] = await connection.query(` const [rows] = await req.pool.query(`
SELECT SELECT
cm.id_tipo_membresia, cm.id_tipo_membresia,
cm.nombre_tipo, cm.nombre_tipo,
cm.categoria_membresia, cm.categoria_membresia,
cm.es_grupal, cm.es_grupal,
cm.capacidad_maxima_miembros, cm.capacidad_maxima_miembros,
cm.valor, cm.valor,
cm.descripcion, cm.descripcion,
cm.duracion_dias, cm.duracion_dias,
cm.visitas_maximas_diarias, cm.visitas_maximas_diarias,
cm.areas_de_acceso, cm.areas_de_acceso,
cm.id_combo_ensamblado_incluido, cm.id_combo_ensamblado_incluido,
cm.cantidad_combo_incluido, cm.cantidad_combo_incluido,
pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado,
cm.estado_tipo, cm.estado_tipo,
cm.fecha_creacion, cm.fecha_creacion,
cm.fecha_modificacion cm.fecha_modificacion
FROM FROM
clientes_membresias cm clientes_membresias cm
LEFT JOIN LEFT JOIN
productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID
`); `);
res.json(rows); res.json(rows);
} catch (error) { } catch (error) {
console.error('Error al listar tipos de membresía:', 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 }); 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(); // 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 * @function obtenerTipoMembresiaPorId
* @description Obtiene un tipo de membresía específico por su ID. * @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} 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. * @param {Object} res - Objeto de respuesta de Express.
*/ */
obtenerTipoMembresiaPorId: async (req, res) => { obtenerTipoMembresiaPorId: async (req, res) => {
const { id } = req.params; // ID de la tabla clientes_membresias const { id } = req.params; // ID de la tabla clientes_membresias
let connection; // let connection;
try { try {
connection = await req.getConnection(); // CAMBIO CLAVE AQUÍ: Usar req.pool directamente
const [rows] = await connection.query(` const [rows] = await req.pool.query(`
SELECT SELECT
cm.id_tipo_membresia, cm.id_tipo_membresia,
cm.nombre_tipo, cm.nombre_tipo,
cm.categoria_membresia, cm.categoria_membresia,
cm.es_grupal, cm.es_grupal,
cm.capacidad_maxima_miembros, cm.capacidad_maxima_miembros,
cm.valor, cm.valor,
cm.descripcion, cm.descripcion,
cm.duracion_dias, cm.duracion_dias,
cm.visitas_maximas_diarias, cm.visitas_maximas_diarias,
cm.areas_de_acceso, cm.areas_de_acceso,
cm.id_combo_ensamblado_incluido, cm.id_combo_ensamblado_incluido,
cm.cantidad_combo_incluido, cm.cantidad_combo_incluido,
pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado,
cm.estado_tipo, cm.estado_tipo,
cm.fecha_creacion, cm.fecha_creacion,
cm.fecha_modificacion cm.fecha_modificacion
FROM FROM
clientes_membresias cm clientes_membresias cm
LEFT JOIN LEFT JOIN
productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID
WHERE cm.id_tipo_membresia = ?`, [id]); WHERE cm.id_tipo_membresia = ?`, [id]);
if (rows.length === 0) { if (rows.length === 0) {
return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' }); return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' });
} }
res.json(rows[0]); res.json(rows[0]);
} catch (error) { } catch (error) {
console.error('Error al obtener tipo de membresía:', 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 }); 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(); // finally {
} // if (connection && typeof connection.release === 'function') connection.release();
}, // }
},
/** /**
* @function crearTipoMembresia * @function crearTipoMembresia
* @description Crea un nuevo tipo de membresía. * @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} req - Objeto de solicitud de Express (req.body contiene los datos del tipo de membresía).
* @param {Object} res - Objeto de respuesta de Express. * @param {Object} res - Objeto de respuesta de Express.
*/ */
crearTipoMembresia: async (req, res) => { crearTipoMembresia: async (req, res) => {
const { const {
nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros,
valor, descripcion, duracion_dias, visitas_maximas_diarias, valor, descripcion, duracion_dias, visitas_maximas_diarias,
areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido
} = req.body; } = req.body;
// Validaciones básicas de campos obligatorios // Validaciones básicas de campos obligatorios
if (!nombre_tipo || es_grupal === undefined || valor === undefined) { 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).' }); return res.status(400).json({ mensaje: 'Faltan campos obligatorios para el tipo de membresía (nombre_tipo, es_grupal, valor).' });
} }
let connection; // let connection;
try { try {
connection = await req.getConnection(); // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query
const [result] = await connection.query( const [result] = await req.pool.query(
`INSERT INTO clientes_membresias ( `INSERT INTO clientes_membresias (
nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros,
valor, descripcion, duracion_dias, visitas_maximas_diarias, valor, descripcion, duracion_dias, visitas_maximas_diarias,
areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido,
estado_tipo, fecha_creacion estado_tipo, fecha_creacion
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())`, ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())`,
[ [
nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros,
valor, descripcion, duracion_dias, visitas_maximas_diarias, valor, descripcion, duracion_dias, visitas_maximas_diarias,
areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido
] ]
); );
res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId }); res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId });
} catch (error) { } catch (error) {
console.error('Error al crear tipo de membresía:', 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') {
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 });
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 });
res.status(500).json({ mensaje: 'Error interno del servidor al crear tipo de membresía', error: error.message }); }
} finally { // finally {
if (connection && typeof connection.release === 'function') connection.release(); // if (connection && typeof connection.release === 'function') connection.release();
} // }
}, },
/** /**
* @function actualizarTipoMembresia * @function actualizarTipoMembresia
* @description Actualiza un tipo de membresía existente por su ID. * @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} 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. * @param {Object} res - Objeto de respuesta de Express.
*/ */
actualizarTipoMembresia: async (req, res) => { actualizarTipoMembresia: async (req, res) => {
const { id } = req.params; // ID del tipo de membresía a actualizar const { id } = req.params; // ID del tipo de membresía a actualizar
const { const {
nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros,
valor, descripcion, duracion_dias, visitas_maximas_diarias, valor, descripcion, duracion_dias, visitas_maximas_diarias,
areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo
} = req.body; } = req.body;
// Validaciones básicas de campos obligatorios if (!nombre_tipo || es_grupal === undefined || valor === undefined || !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).' });
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; // let connection;
try { try {
connection = await req.getConnection(); // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query
const [result] = await connection.query( const [result] = await req.pool.query(
`UPDATE clientes_membresias SET `UPDATE clientes_membresias SET
nombre_tipo = ?, categoria_membresia = ?, es_grupal = ?, nombre_tipo = ?, categoria_membresia = ?, es_grupal = ?,
capacidad_maxima_miembros = ?, valor = ?, descripcion = ?, capacidad_maxima_miembros = ?, valor = ?, descripcion = ?,
duracion_dias = ?, visitas_maximas_diarias = ?, areas_de_acceso = ?, duracion_dias = ?, visitas_maximas_diarias = ?, areas_de_acceso = ?,
id_combo_ensamblado_incluido = ?, cantidad_combo_incluido = ?, id_combo_ensamblado_incluido = ?, cantidad_combo_incluido = ?,
estado_tipo = ?, fecha_modificacion = NOW() estado_tipo = ?, fecha_modificacion = NOW()
WHERE id_tipo_membresia = ?`, WHERE id_tipo_membresia = ?`,
[ [
nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros,
valor, descripcion, duracion_dias, visitas_maximas_diarias, valor, descripcion, duracion_dias, visitas_maximas_diarias,
areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, id areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, id
] ]
); );
if (result.affectedRows === 0) { if (result.affectedRows === 0) {
return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para actualizar' }); return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para actualizar' });
} }
res.json({ mensaje: 'Tipo de membresía actualizado exitosamente' }); res.json({ mensaje: 'Tipo de membresía actualizado exitosamente' });
} catch (error) { } catch (error) {
console.error('Error al actualizar tipo de membresía:', 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') {
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 });
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 });
res.status(500).json({ mensaje: 'Error interno del servidor al actualizar tipo de membresía', error: error.message }); }
} finally { // finally {
if (connection && typeof connection.release === 'function') connection.release(); // if (connection && typeof connection.release === 'function') connection.release();
} // }
}, },
/** /**
* @function eliminarTipoMembresia * @function eliminarTipoMembresia
* @description Elimina lógicamente un tipo de membresía por su ID (cambia su estado a 'ELIMINADO'). * @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} req - Objeto de solicitud de Express (req.params.id para el ID).
* @param {Object} res - Objeto de respuesta de Express. * @param {Object} res - Objeto de respuesta de Express.
*/ */
eliminarTipoMembresia: async (req, res) => { eliminarTipoMembresia: async (req, res) => {
const { id } = req.params; const { id } = req.params;
let connection; // let connection;
try { try {
connection = await req.getConnection(); // CAMBIO CLAVE AQUÍ: Usar req.pool directamente para la query
// Se recomienda una eliminación lógica para mantener la integridad referencial const [result] = await req.pool.query('UPDATE clientes_membresias SET estado_tipo = "ELIMINADO" WHERE id_tipo_membresia = ?', [id]);
// 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' });
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) {
res.json({ mensaje: 'Tipo de membresía eliminado (lógicamente) exitosamente' }); console.error('Error al eliminar tipo de membresía:', error);
} catch (error) { res.status(500).json({ mensaje: 'Error interno del servidor al eliminar tipo de membresía', error: error.message });
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 {
} finally { // if (connection && typeof connection.release === 'function') connection.release();
if (connection && typeof connection.release === 'function') connection.release(); // }
} }
}
}; };
module.exports = controladorMembresias; module.exports = controladorMembresias;