diff --git a/modules/ticket/back/methods/ticket/closeAll.js b/modules/ticket/back/methods/ticket/closeAll.js index b645c714c9..9559333c87 100644 --- a/modules/ticket/back/methods/ticket/closeAll.js +++ b/modules/ticket/back/methods/ticket/closeAll.js @@ -1,5 +1,6 @@ const smtp = require('vn-print/core/smtp'); const config = require('vn-print/core/config'); +const Email = require('vn-print/core/email'); module.exports = Self => { Self.remoteMethodCtx('closeAll', { @@ -44,8 +45,7 @@ module.exports = Self => { LIMIT 1`, [toDate, toDate], myOptions); await Self.rawSql(` - DROP TEMPORARY TABLE IF EXISTS tmp.ticket_close; - CREATE TEMPORARY TABLE tmp.ticket_close + CREATE OR REPLACE TEMPORARY TABLE tmp.ticket_close ENGINE = MEMORY WITH wTickets AS( SELECT t.id ticketFk @@ -63,11 +63,12 @@ module.exports = Self => { FROM wTicketsTracking wt JOIN ticketTracking tt ON tt.id = wt.maxTracking ) SELECT tls.ticketFk, - t.clientFk, + t.clientFk clientId, c.name clientName, c.email recipient, + c.isToBeMailed, eu.email salesPersonEmail, - t.addressFk, + t.addressFk addressId, c.hasDailyInvoice, c.hasToInvoiceByAddress, t.totalWithVat, @@ -79,7 +80,7 @@ module.exports = Self => { JOIN agencyMode am ON am.id = t.agencyModeFk JOIN client c ON c.id = t.clientFk LEFT JOIN account.emailUser eu ON eu.userFk = c.salesPersonFk - WHERE (al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered')); + WHERE al.code = 'PACKED' OR (am.code = 'refund' AND al.code <> 'delivered'); CALL ticket_close(); `, [dateFrom, dateTo], myOptions); @@ -98,21 +99,27 @@ module.exports = Self => { AND tob.id IS NULL AND t.routeFk`, [dateFrom, dateTo], myOptions); - const [clients] = await Self.rawSql(` - SELECT clientFk clientId, - clientName, - recipient, - salesPersonEmail, - addressFk addressId, - companyFk, + const clients = await Self.rawSql(` + SELECT *, SUM(totalWithVat) total, 'quick' serialType FROM tmp.ticket_close WHERE hasDailyInvoice - GROUP BY IF (hasToInvoiceByAddress, addressFk, clientFk), companyFk - HAVING total > 0; + GROUP BY IF (hasToInvoiceByAddress, addressId, clientId), companyFk + HAVING total > 0 + `, [], myOptions); + + const [ticketsToMail] = await Self.rawSql(` + SELECT * + FROM tmp.ticket_close + WHERE NOT hasDailyInvoice + AND isToBeMailed + AND salesPersonEmail IS NOT NULL + AND salesPersonEmail <> '' + AND recipient IS NOT NULL + AND recipient <> ''; DROP TEMPORARY TABLE tmp.ticket_close; - `, [], myOptions); + `, [], myOptions); if (tx) await tx.commit(); @@ -130,21 +137,23 @@ module.exports = Self => { if (id) await Self.app.models.InvoiceOut.makePdfAndNotify(ctx, id, null, nestedTransaction); } catch (error) { - await Self.rawSql(` - INSERT INTO util.debug (variable, value) - VALUES ('invoicingTicketError', ?) - `, [client.clientId + ' - ' + error]); + await handleInvoicingError(error, client, failedClients); + } + } - if (error.responseCode == 450) { - await invalidEmail(client); - continue; - } + for (const ticket of ticketsToMail) { + const args = { + id: ticket.ticketFk, + recipientId: ticket.clientId, + recipient: ticket.recipient, + replyTo: ticket.salesPersonEmail, + }; - failedClients.push({ - id: client.clientId, - address: client.addressId, - error - }); + try { + const email = new Email('delivery-note-link', args); + await email.send(); + } catch (error) { + await handleInvoicingError(error, ticket, failedClients); } } @@ -188,4 +197,22 @@ module.exports = Self => { html: body, }).catch(err => console.error(err)); } + + async function handleInvoicingError(error, entity, failedClients) { + await Self.rawSql(` + INSERT INTO util.debug (variable, value) + VALUES ('invoicingTicketError', ?) + `, [entity.clientId + ' - ' + error]); + + if (error.responseCode == 450) { + await invalidEmail(entity); + return; + } + + failedClients.push({ + id: entity.clientId, + address: entity.addressId, + error + }); + } };