const pool = require('../db/connection'); const transporter = require('../services/mailService'); const contractsNearToEnd = async (req, res) => { try{ const countResult = await pool.query('SELECT contratcsneartoend() as total'); const contractsResult = await pool.query('SELECT * FROM contractsneartoenddata()'); const userEmails = await pool.query('SELECT * FROM getusersmailneartoend()'); const totalExpiring = countResult.rows[0].total; const contracts = contractsResult.rows; const users = userEmails.rows; if(totalExpiring >= 1 && users.length > 0){ const recipients = users.map(u => u.email); const mailOptions = { from: 'soporte@horuxfin.com', to: recipients, subject: 'Contratos próximos a expirar', html: `
` }; await transporter.sendMail(mailOptions); res.json({ message: 'Correo enviado con contratos por expirar.', data:totalExpiring }); }else{ res.json({ message: 'No hay contratos por expirar', data:totalExpiring }); } }catch(error){ console.error(error); res.status(500).json({ status: 500, message: 'No se pudo mandar el correo con los contratos por expirar' }); } }; const paymentDeadLine = async (req, res) => { try{ const deadLineCount = await pool.query('SELECT countdelaypayments() as total'); const deadLineResult = await pool.query('SELECT * FROM getdelaypayments()'); const usersDeadLine = await pool.query('SELECT * FROM getusersmailpaymentdelay()'); const totalDeadline = deadLineCount.rows[0].total; const deadLines = deadLineResult.rows; const users = usersDeadLine.rows; if(totalDeadline >= 1 && users.length >0){ const recipients = users.map(u => u.email); const mailOptions = { from: 'soporte@horuxfin.com', to: recipients, subject: 'WARNING: OVERDUE PAYMENTS', html: ` ` }; await transporter.sendMail(mailOptions); res.json({ message: 'Correo enviado con pagos atrasados.', data:totalDeadline }); }else{ res.json({ message: 'No hay pagos con atraso', data:totalDeadline }); } }catch(error){ console.error(error); res.status(500).json({ status: 500, message: 'No se pudo mandar el correo con con los pagos atrasados' }); } }; const expensesNearToDeadline = async (req, res) => { try{ const deadLineCount = await pool.query('SELECT COUNT(*) FROM expensesneartodeadline()'); const deadLineResult = await pool.query('SELECT * FROM expensesneartodeadline()'); const usersDeadLine = await pool.query('SELECT * FROM getusersmailpaymentdelay()'); const totalDeadline = deadLineCount.rows[0].count; const deadLines = deadLineResult.rows; const users = usersDeadLine.rows; console.log(totalDeadline); if(totalDeadline >= 1 && users.length >0){ const recipients = users.map(u => u.email); const mailOptions = { from: 'soporte@horuxfin.com', to: recipients, subject: 'WARNING: PAYMENTS DUE SOON FOR LATE PAYMENTS', html: ` ` }; await transporter.sendMail(mailOptions); res.json({ message: 'Correo enviado con pagos por expirar.', data:totalDeadline }); }else{ res.json({ message: 'No hay pagos con atraso', data:totalDeadline }); } }catch(error){ console.error(error); res.status(500).json({ status: 500, message: 'No se pudo mandar el correo con los pagos prontos a fecha limite' }); } }; const expensesspecial = async (req, res) => { try{ const expensesCount = await pool.query('SELECT COUNT(*) AS total FROM getexpensesspecial()'); const expensesResult = await pool.query('SELECT * FROM getexpensesspecial()'); const totalExpenses = expensesCount.rows[0].total; const expenses = expensesResult.rows; if(totalExpenses >= 1){ const mailOptions = { from: 'soporte@horuxfin.com', to: 'soporte@horuxfin.com', subject: 'Recordatorio: Hay gastos por aprobar', html: `Actualmente hay ${totalExpenses} gasto(s) por aprobar
Cantidad de contratos ${totalDayExpired} que expiraron hoy.
Por favor considere si seran recontratados o no para que se inicie el proceso.
` }; await transporter.sendMail(mailOptions); res.json({ message: 'Correo enviado con contratos expirados hoy', data:totalDayExpired }); }else{ res.json({ message: 'Hoy no expiro ningun contrato', data:totalDayExpired }); } }catch(error){ console.error(error); res.status(500).json({ status: 500, message: 'No se pudo mandar el correo con los contratos por expirar' }); } }; const expiredContractsMonth = async (req, res) => { try{ // Verifica si hoy es el último día del mes if (isLastDayOfMonth()) { return res.status(200).json({ message: 'El proceso solo se ejecuta el último día del mes', executed: false }); } const endpointName = 'expiredContractsMonth'; const current = new Date(); const mes = current.getMonth() + 1; const anio = current.getFullYear(); const validateEndpoint = await pool.query('SELECT validateendpoint($1,$2::int,$3::int) AS total',[endpointName,mes,anio]); if (validateEndpoint.rows[0].total > 0) { return res.status(400).json({ message: `Este endpoint ya fue ejecutado en ${current.toLocaleString('es-MX', { month: 'long' })}.` }); }else { await pool.query(`INSERT INTO endpoint_logs (endpoint_name) VALUES ($1)`,[endpointName]); const expiredCountTotal = await pool.query('SELECT COUNT(*) AS total FROM getexpirecontractsmonth()'); const expiredResult = await pool.query('SELECT * FROM getexpirecontractsmonth()'); const userEmails = await pool.query('SELECT * FROM getusersmailneartoend()'); const totalExpired = expiredCountTotal.rows[0].total; const expiredContracts = expiredResult.rows; const currentMonth = new Date().toLocaleString('es-MX', { month: 'long' }); const users = userEmails.rows; if(totalExpired >= 1 && users.length > 0){ const recipients = users.map(u => u.email); const mailOptions = { from: 'soporte@horuxfin.com', to: recipients, subject: `Contratos expirados en el mes ${currentMonth} `, html: ` ` }; await transporter.sendMail(mailOptions); res.json({ message: 'Correo enviado con contratos expirados en el mes', data:totalExpired }); }else{ res.json({ message: 'Este mes no expiro ningun contrato', data:totalExpired }); }} }catch(error){ console.error(error); res.status(500).json({ status: 500, message: 'No se pudo mandar el correo con los contratos por expirar' }); } }; const isLastDayOfMonth = () => { const today = new Date(); const tomorrow = new Date(today); tomorrow.setDate(today.getDate() + 1); return tomorrow.getDate() === 1; }; const formatDateDMY = (value) => { if (!value) return ''; const date = value instanceof Date ? value : new Date(value); if (isNaN(date.getTime())) return ''; return date.toLocaleDateString('es-MX', { day: '2-digit', month: '2-digit', year: 'numeric' }); }; module.exports = {contractsNearToEnd,paymentDeadLine,expensesspecial, emailbirthday,expiredcontracts,expiredContractsMonth,expensesNearToDeadline};