const db = require('../core/database'); const Email = require('../core/email'); const smtp = require('../core/smtp'); const config = require('../core/config'); module.exports = app => { app.get('/api/closure', async function(request, response) { const failedtickets = []; const tickets = await db.rawSql(` SELECT t.id, t.clientFk, c.email recipient FROM expedition e JOIN ticket t ON t.id = e.ticketFk JOIN client c ON c.id = t.clientFk JOIN warehouse w ON w.id = t.warehouseFk AND hasComission LEFT JOIN ticketState ts ON ts.ticketFk = t.id WHERE ts.code = 'PACKED' AND DATE(t.shipped) BETWEEN DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND CURDATE() AND t.refFk IS NULL GROUP BY e.ticketFk`); for (const ticket of tickets) { try { await db.rawSql(`CALL vn.ticketClosureTicket(:ticketId)`, { ticketId: ticket.id }); const args = { ticketId: ticket.id, clientId: ticket.clientFk, recipient: ticket.recipient }; const email = new Email('delivery-note-link', args); await email.send(); } catch (error) { // Save tickets on a list of failed ids failedtickets.push({ id: ticket.id, stacktrace: error }); } } // Send email with failed tickets if (failedtickets.length > 0) { let body = 'This following tickets has failed:

'; for (ticket of failedtickets) { body += `Ticket: ${ticket.id}
${ticket.stacktrace}

`; } smtp.send({ to: config.app.reportEmail, subject: '[API] Nightly ticket closure has failed', html: body }); } response.status(200).json({ message: 'Closure executed successfully' }); }); };