const {Email} = require('vn-print'); const {toCSV} = require('vn-loopback/util/csv'); module.exports = Self => { Self.remoteMethodCtx('deliveryNoteCsvEmail', { description: 'Returns the delivery note csv', accessType: 'READ', accepts: [ { arg: 'id', type: 'number', required: true, description: 'The ticket id', http: {source: 'path'} }, { arg: 'recipient', type: 'string', description: 'The recipient email', required: true, }, { arg: 'replyTo', type: 'string', description: 'The sender email to reply to', required: false }, { arg: 'recipientId', type: 'number', description: 'The client id', required: false } ], returns: [ { arg: 'body', type: 'file', root: true }, { arg: 'Content-Type', type: 'String', http: {target: 'header'} }, { arg: 'Content-Disposition', type: 'String', http: {target: 'header'} } ], http: { path: '/:id/delivery-note-csv-email', verb: 'POST' } }); Self.deliveryNoteCsvEmail = async(ctx, id) => { const args = Object.assign({}, ctx.args); const params = { recipient: args.recipient, lang: ctx.req.getLocale() }; delete args.ctx; for (const param in args) params[param] = args[param]; const sales = await Self.rawSql(` SELECT io.ref Invoice, io.issued InvoiceDate, s.ticketFk Ticket, s.itemFk Item, s.concept Description, i.size, i.subName Producer, s.quantity Quantity, s.price Price, s.discount Discount, s.created Created, tc.code Taxcode, tc.description TaxDescription, i.tag5, i.value5, i.tag6, i.value6, i.tag7, i.value7, i.tag8, i.value8, i.tag9, i.value9, i.tag10, i.value10 FROM vn.sale s JOIN vn.ticket t ON t.id = s.ticketFk JOIN vn.item i ON i.id = s.itemFk JOIN vn.supplier s2 ON s2.id = t.companyFk JOIN vn.itemTaxCountry itc ON itc.itemFk = i.id AND itc.countryFk = s2.countryFk JOIN vn.taxClass tc ON tc.id = itc.taxClassFk LEFT JOIN vn.invoiceOut io ON io.id = t.refFk WHERE s.ticketFk = ? ORDER BY s.ticketFk, s.created`, [id]); const content = toCSV(sales); const fileName = `ticket_${id}.csv`; const email = new Email('delivery-note', params); return email.send({ overrideAttachments: true, attachments: [{ filename: fileName, content: content }] }); }; };