diff --git a/loopback/locale/es.json b/loopback/locale/es.json index 73a3920d2..756ce301a 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -316,5 +316,6 @@ "The ticket doesn't exist.": "No existe el ticket.", "Social name should be uppercase": "La razón social debe ir en mayúscula", "Street should be uppercase": "La dirección fiscal debe ir en mayúscula", + "The response is not a PDF": "La respuesta no es un PDF", "Ticket without Route": "Ticket sin ruta" } diff --git a/modules/route/back/methods/route/downloadCmrsZip.js b/modules/route/back/methods/route/downloadCmrsZip.js new file mode 100644 index 000000000..532e019b6 --- /dev/null +++ b/modules/route/back/methods/route/downloadCmrsZip.js @@ -0,0 +1,71 @@ +const JSZip = require('jszip'); +const axios = require('axios'); +const UserError = require('vn-loopback/util/user-error'); + +module.exports = Self => { + Self.remoteMethodCtx('downloadCmrsZip', { + description: 'Download a zip file with multiple cmrs pdfs', + accessType: 'READ', + accepts: [ + { + arg: 'ids', + type: 'string', + description: 'The cmrs ids', + } + ], + 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: '/downloadCmrsZip', + verb: 'GET' + } + }); + + Self.downloadCmrsZip = async function(ctx, ids, options) { + const models = Self.app.models; + const myOptions = {}; + const token = ctx.req.accessToken; + const zip = new JSZip(); + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const zipConfig = await models.ZipConfig.findOne(null, myOptions); + let totalSize = 0; + ids = ids.split(','); + try { + for (let id of ids) { + if (zipConfig && totalSize > zipConfig.maxSize) throw new UserError('Files are too large'); + const response = await axios.get( + `${ctx.req.headers.referer}api/Routes/${id}/cmr?access_token=${token.id}`, { + ...myOptions, + responseType: 'arraybuffer', + }); + + if (response.headers['content-type'] !== 'application/pdf') + throw new UserError(`The response is not a PDF`); + + zip.file(`${id}.pdf`, response.data, { binary: true }); + } + + const zipStream = zip.generateNodeStream({ streamFiles: true }); + + return [zipStream, 'application/zip', `filename="cmrs.zip"`]; + } catch (e) { + throw e; + } + }; +}; diff --git a/modules/route/back/methods/route/getExternalCmrs.js b/modules/route/back/methods/route/getExternalCmrs.js index 7b3772c9e..4750e53a1 100644 --- a/modules/route/back/methods/route/getExternalCmrs.js +++ b/modules/route/back/methods/route/getExternalCmrs.js @@ -22,6 +22,11 @@ module.exports = Self => { type: 'integer', description: 'The worker id', }, + { + arg: 'routeFk', + type: 'integer', + description: 'The route id', + }, { arg: 'country', type: 'string', @@ -57,6 +62,7 @@ module.exports = Self => { filter, cmrFk, ticketFk, + routeFk, country, clientFk, hasCmrDms, @@ -66,6 +72,7 @@ module.exports = Self => { const params = { cmrFk, ticketFk, + routeFk, country, clientFk, hasCmrDms, @@ -89,37 +96,38 @@ module.exports = Self => { let stmts = []; const stmt = new ParameterizedSQL(` - SELECT * - FROM ( - SELECT t.cmrFk, - t.id ticketFk, - co.country, - t.clientFk, - IF(sub.id, TRUE, FALSE) hasCmrDms, - DATE(t.shipped) shipped - FROM ticket t - JOIN ticketState ts ON ts.ticketFk = t.id - JOIN state s ON s.id = ts.stateFk - JOIN alertLevel al ON al.id = s.alertLevel - JOIN client c ON c.id = t.clientFk - JOIN address a ON a.id = t.addressFk - JOIN province p ON p.id = a.provinceFk - JOIN country co ON co.id = p.countryFk - JOIN agencyMode am ON am.id = t.agencyModeFk - JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk - JOIN warehouse w ON w.id = t.warehouseFk - LEFT JOIN ( - SELECT td.ticketFk, d.id - FROM ticketDms td - JOIN dms d ON d.id = td.dmsFk - JOIN dmsType dt ON dt.id = d.dmsTypeFk - WHERE dt.name = 'cmr' - ) sub ON sub.ticketFk = t.id - WHERE co.code <> 'ES' - AND am.name <> 'ABONO' - AND w.code = 'ALG' - AND dm.code = 'DELIVERY' - AND t.cmrFk + SELECT * + FROM ( + SELECT t.cmrFk, + t.id ticketFk, + t.routeFk, + co.country, + t.clientFk, + IF(sub.id, TRUE, FALSE) hasCmrDms, + DATE(t.shipped) shipped + FROM ticket t + JOIN ticketState ts ON ts.ticketFk = t.id + JOIN state s ON s.id = ts.stateFk + JOIN alertLevel al ON al.id = s.alertLevel + JOIN client c ON c.id = t.clientFk + JOIN address a ON a.id = t.addressFk + JOIN province p ON p.id = a.provinceFk + JOIN country co ON co.id = p.countryFk + JOIN agencyMode am ON am.id = t.agencyModeFk + JOIN deliveryMethod dm ON dm.id = am.deliveryMethodFk + JOIN warehouse w ON w.id = t.warehouseFk + LEFT JOIN ( + SELECT td.ticketFk, d.id + FROM ticketDms td + JOIN dms d ON d.id = td.dmsFk + JOIN dmsType dt ON dt.id = d.dmsTypeFk + WHERE dt.name = 'cmr' + ) sub ON sub.ticketFk = t.id + WHERE co.code <> 'ES' + AND am.name <> 'ABONO' + AND w.code = 'ALG' + AND dm.code = 'DELIVERY' + AND t.cmrFk ) sub `); diff --git a/modules/route/back/models/route.js b/modules/route/back/models/route.js index 7e61acf25..65fa43ab5 100644 --- a/modules/route/back/models/route.js +++ b/modules/route/back/models/route.js @@ -16,6 +16,7 @@ module.exports = Self => { require('../methods/route/downloadZip')(Self); require('../methods/route/cmr')(Self); require('../methods/route/getExternalCmrs')(Self); + require('../methods/route/downloadCmrsZip')(Self); Self.validate('kmStart', validateDistance, { message: 'Distance must be lesser than 1000'