const db = require('vn-print/core/database'); const Report = require('vn-print/core/report'); // Put inside block to avoid circular dependency const Email = require('vn-print/core/email'); const smtp = require('vn-print/core/smtp'); const config = require('vn-print/core/config'); const storage = require('vn-print/core/storage'); module.exports = { async start(tickets, reqArgs) { if (tickets.length == 0) return; const failedtickets = []; for (const ticket of tickets) { try { await db.rawSql(`CALL vn.ticket_closeByTicket(?)`, [ticket.id]); const invoiceOut = await db.findOne(` SELECT io.id, io.ref, io.serial, cny.code companyCode, io.issued FROM ticket t JOIN invoiceOut io ON io.ref = t.refFk JOIN company cny ON cny.id = io.companyFk WHERE t.id = ? `, [ticket.id]); const mailOptions = { overrideAttachments: true, attachments: [] }; const isToBeMailed = ticket.recipient && ticket.salesPersonFk && ticket.isToBeMailed; if (invoiceOut) { const args = Object.assign({ invoiceId: invoiceOut.id, recipientId: ticket.clientFk, recipient: ticket.recipient, replyTo: ticket.salesPersonEmail }, reqArgs); const invoiceReport = new Report('invoice', args); const stream = await invoiceReport.toPdfStream(); const issued = invoiceOut.issued; const year = issued.getFullYear().toString(); const month = (issued.getMonth() + 1).toString(); const day = issued.getDate().toString(); const fileName = `${year}${invoiceOut.ref}.pdf`; // Store invoice storage.write(stream, { type: 'invoice', path: `${year}/${month}/${day}`, fileName: fileName }); if (isToBeMailed) { const invoiceAttachment = { filename: fileName, content: stream }; if (invoiceOut.serial == 'E' && invoiceOut.companyCode == 'VNL') { const exportation = new Report('exportation', args); const stream = await exportation.toPdfStream(); const fileName = `CITES-${invoiceOut.ref}.pdf`; mailOptions.attachments.push({ filename: fileName, content: stream }); } mailOptions.attachments.push(invoiceAttachment); const email = new Email('invoice', args); await email.send(mailOptions); } } else if (isToBeMailed) { const args = Object.assign({ ticketId: ticket.id, recipientId: ticket.clientFk, recipient: ticket.recipient, replyTo: ticket.salesPersonEmail }, reqArgs); const email = new Email('delivery-note-link', args); await email.send(); } } catch (error) { // Domain not found if (error.responseCode == 450) return invalidEmail(ticket); // 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 have failed:

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

`; } smtp.send({ to: config.app.reportEmail, subject: '[API] Nightly ticket closure report', html: body }); } }, async invalidEmail(ticket) { await db.rawSql(`UPDATE client SET email = NULL WHERE id = ?`, [ ticket.clientFk ]); const oldInstance = `{"email": "${ticket.recipient}"}`; const newInstance = `{"email": ""}`; await db.rawSql(` INSERT INTO clientLog (originFk, userFk, action, changedModel, oldInstance, newInstance) VALUES (?, NULL, 'UPDATE', 'Client', ?, ?)`, [ ticket.clientFk, oldInstance, newInstance ]); const body = `No se ha podido enviar el albarán ${ticket.id} al cliente ${ticket.clientFk} - ${ticket.clientName} porque la dirección de email "${ticket.recipient}" no es correcta o no está disponible.

Para evitar que se repita este error, se ha eliminado la dirección de email de la ficha del cliente. Actualiza la dirección de email con una correcta.`; smtp.send({ to: ticket.salesPersonEmail, subject: 'No se ha podido enviar el albarán', html: body }); } };