Files
APP-SIGMA-WEB/src/controladores/controlador_Membresias.js
2025-06-06 12:22:22 -05:00

229 lines
11 KiB
JavaScript

// src/controladores/controlador_Membresias.js
const controladorMembresias = {
/**
* @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: (req, res) => { // ¡Ya no es async aquí directamente!
req.getConnection((err, connection) => { // Obtiene la conexión con un callback
if (err) {
console.error('Error al obtener conexión para listar tipos de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message });
}
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
`, (err, rows) => { // Ejecuta la query con un callback
if (err) {
console.error('Error al listar tipos de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al listar tipos de membresía', error: err.message });
}
res.json(rows);
// express-myconnection se encarga de liberar la conexión automáticamente si no usas transacciones manuales
});
});
},
/**
* @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: (req, res) => {
const { id } = req.params;
req.getConnection((err, connection) => {
if (err) {
console.error('Error al obtener conexión para tipo de membresía por ID:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message });
}
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], (err, rows) => {
if (err) {
console.error('Error al obtener tipo de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener tipo de membresía', error: err.message });
}
if (rows.length === 0) {
return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' });
}
res.json(rows[0]);
});
});
},
/**
* @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: (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;
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).' });
}
req.getConnection((err, connection) => {
if (err) {
console.error('Error al obtener conexión para crear tipo de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message });
}
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
],
(err, result) => {
if (err) {
console.error('Error al crear tipo de membresía:', err);
if (err.code === 'ER_DUP_ENTRY') {
return res.status(409).json({ mensaje: 'Ya existe un tipo de membresía con ese nombre.', error: err.message });
}
return res.status(500).json({ mensaje: 'Error interno del servidor al crear tipo de membresía', error: err.message });
}
res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId });
}
);
});
},
/**
* @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: (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;
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).' });
}
req.getConnection((err, connection) => {
if (err) {
console.error('Error al obtener conexión para actualizar tipo de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message });
}
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
],
(err, result) => {
if (err) {
console.error('Error al actualizar tipo de membresía:', err);
if (err.code === 'ER_DUP_ENTRY') {
return res.status(409).json({ mensaje: 'Ya existe otro tipo de membresía con ese nombre.', error: err.message });
}
return res.status(500).json({ mensaje: 'Error interno del servidor al actualizar tipo de membresía', error: err.message });
}
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' });
}
);
});
},
/**
* @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: (req, res) => {
const { id } = req.params;
req.getConnection((err, connection) => {
if (err) {
console.error('Error al obtener conexión para eliminar tipo de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message });
}
connection.query('UPDATE clientes_membresias SET estado_tipo = "ELIMINADO" WHERE id_tipo_membresia = ?', [id], (err, result) => {
if (err) {
console.error('Error al eliminar tipo de membresía:', err);
return res.status(500).json({ mensaje: 'Error interno del servidor al eliminar tipo de membresía', error: err.message });
}
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' });
});
});
}
};
module.exports = controladorMembresias;