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;