Se ha creado una nueva ruta en la API v2 (`GET /api/v2/search-client-member-status`) para dar soporte al frontend en la búsqueda dinámica de clientes para el registro de pagos. Cambios principales: - Se crea el archivo `api_v2_controlador.js` en la carpeta `controladores` para alojar la nueva lógica. - La nueva API busca clientes por nombre o RUC/cédula. - Para cada cliente encontrado, se realiza una consulta a la tabla `clientes_miembros` para determinar si es un miembro activo y si tiene valores vencidos. - Se registra la nueva ruta en `rt_api_v2.js`, asociándola con su controlador. - Se actualiza la colección de Postman (`APP_SIGMA_NODE.postman_collection.json`) para incluir y documentar el nuevo endpoint. Esta funcionalidad es clave para mejorar la experiencia de usuario en el formulario de registro de pagos, permitiendo una selección de cliente más ágil e informativa.
61 lines
2.5 KiB
JavaScript
61 lines
2.5 KiB
JavaScript
const controlador = {};
|
|
|
|
/**
|
|
* @description Busca clientes y verifica su estado de membresía.
|
|
* Busca por nombre o RUC/cédula.
|
|
* Si el cliente es miembro, añade información sobre su estado y si tiene valores vencidos.
|
|
* Ruta: GET /api/v2/search-client-member-status
|
|
*/
|
|
controlador.searchClientMemberStatus = (req, res) => {
|
|
const { query } = req.query;
|
|
|
|
if (!query || query.length < 2) {
|
|
return res.status(400).json({ error: 'Se requiere un término de búsqueda de al menos 2 caracteres.' });
|
|
}
|
|
|
|
req.getConnection((err, conn) => {
|
|
if (err) {
|
|
console.error("Error de conexión a la BD:", err);
|
|
return res.status(500).json({ error: 'Error interno del servidor.' });
|
|
}
|
|
|
|
// Paso 1: Buscar clientes que coincidan con el término de búsqueda.
|
|
const clientSql = `
|
|
SELECT
|
|
c.client_id,
|
|
c.client_nombre,
|
|
c.client_rucCed
|
|
FROM clientes c
|
|
WHERE c.client_nombre LIKE ? OR c.client_rucCed LIKE ?
|
|
LIMIT 10
|
|
`;
|
|
const searchTerm = `%${query}%`;
|
|
|
|
conn.query(clientSql, [searchTerm, searchTerm], (err, clients) => {
|
|
if (err) {
|
|
console.error("Error en la búsqueda de clientes:", err);
|
|
return res.status(500).json({ error: 'Error al buscar clientes.' });
|
|
}
|
|
|
|
// Paso 2: Para cada cliente, verificar si es miembro y su estado.
|
|
const promises = clients.map(client => new Promise((resolve, reject) => {
|
|
const memberSql = `SELECT estado, fecha_fin FROM clientes_miembros WHERE client_id = ? ORDER BY fecha_fin DESC LIMIT 1`;
|
|
conn.query(memberSql, [client.client_id], (err, memberStatus) => {
|
|
if (err) return reject(err);
|
|
const isMember = memberStatus.length > 0;
|
|
const hasOverdue = isMember && (memberStatus[0].estado === 'VENCIDO' || new Date(memberStatus[0].fecha_fin) < new Date());
|
|
resolve({ ...client, isMember, hasOverdue, memberStatus: isMember ? memberStatus[0].estado : null });
|
|
});
|
|
}));
|
|
|
|
Promise.all(promises)
|
|
.then(results => res.status(200).json(results))
|
|
.catch(error => {
|
|
console.error("Error verificando estado de miembros:", error);
|
|
res.status(500).json({ error: 'Error al verificar estado de miembros.' });
|
|
});
|
|
});
|
|
});
|
|
};
|
|
|
|
module.exports = controlador; |