From ab446b54ed2e015ebd947ba256dbe3801ee65b1c Mon Sep 17 00:00:00 2001 From: guillermo Date: Mon, 5 Aug 2024 11:29:35 +0200 Subject: [PATCH] feat: refs #7644 Optimized entry labels report --- loopback/locale/es.json | 3 +- modules/entry/back/methods/entry/buyLabel.js | 2 +- modules/entry/back/methods/entry/print.js | 58 +++++++++++++++++++ modules/entry/back/models/entry.js | 1 + package.json | 5 +- .../reports/buy-label/buy-label.html | 2 +- .../templates/reports/buy-label/buy-label.js | 5 +- print/templates/reports/buy-label/sql/buy.sql | 38 ++++++++++++ .../templates/reports/buy-label/sql/buys.sql | 33 ----------- 9 files changed, 107 insertions(+), 40 deletions(-) create mode 100644 modules/entry/back/methods/entry/print.js create mode 100644 print/templates/reports/buy-label/sql/buy.sql delete mode 100644 print/templates/reports/buy-label/sql/buys.sql diff --git a/loopback/locale/es.json b/loopback/locale/es.json index acc3d69f6..e1f7fd655 100644 --- a/loopback/locale/es.json +++ b/loopback/locale/es.json @@ -368,5 +368,6 @@ "Payment method is required": "El método de pago es obligatorio", "Cannot send mail": "Não é possível enviar o email", "CONSTRAINT `supplierAccountTooShort` failed for `vn`.`supplier`": "La cuenta debe tener exactamente 10 dígitos", - "The sale not exists in the item shelving": "La venta no existe en la estantería del artículo" + "The sale not exists in the item shelving": "La venta no existe en la estantería del artículo", + "The entry not have stickers": "La entrada no tiene etiquetas" } \ No newline at end of file diff --git a/modules/entry/back/methods/entry/buyLabel.js b/modules/entry/back/methods/entry/buyLabel.js index d9b0ebf1d..919f7c4d7 100644 --- a/modules/entry/back/methods/entry/buyLabel.js +++ b/modules/entry/back/methods/entry/buyLabel.js @@ -1,6 +1,6 @@ module.exports = Self => { Self.remoteMethodCtx('buyLabel', { - description: 'Returns the entry buys labels', + description: 'Returns the entry buy labels', accessType: 'READ', accepts: [ { diff --git a/modules/entry/back/methods/entry/print.js b/modules/entry/back/methods/entry/print.js new file mode 100644 index 000000000..c155c3d8b --- /dev/null +++ b/modules/entry/back/methods/entry/print.js @@ -0,0 +1,58 @@ +const UserError = require('vn-loopback/util/user-error'); +module.exports = Self => { + Self.remoteMethodCtx('print', { + description: 'Print stickers of all entries', + accessType: 'READ', + accepts: [ + { + arg: 'id', + type: 'number', + required: true, + description: 'The entry id', + http: {source: 'path'} + } + ], + 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/print', + verb: 'GET' + }, + accessScopes: ['DEFAULT', 'read:multimedia'] + }); + + Self.print = async function(ctx, id, options) { + const models = Self.app.models; + const myOptions = {}; + if (typeof options == 'object') + Object.assign(myOptions, options); + + // Importación dinámica porque no admite commonjs + const PDFMerger = ((await import('pdf-merger-js')).default); + const merger = new PDFMerger(); + const buys = await models.Buy.find({where: {entryFk: id}}, myOptions); + + for (const buy of buys) { + if (buy.stickers < 1) continue; + ctx.args.id = buy.id; + const pdfBuffer = await models.Entry.buyLabel(ctx, myOptions); + await merger.add(new Uint8Array(pdfBuffer[0])); + } + + if (!merger._doc) throw new UserError('The entry not have stickers'); + return [await merger.saveAsBuffer(), 'application/pdf', `filename="entry-${id}.pdf"`]; + }; +}; diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index 6e27e1ece..b11d64415 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -10,6 +10,7 @@ module.exports = Self => { require('../methods/entry/addFromPackaging')(Self); require('../methods/entry/addFromBuy')(Self); require('../methods/entry/buyLabel')(Self); + require('../methods/entry/print')(Self); Self.observe('before save', async function(ctx, options) { if (ctx.isNewInstance) return; diff --git a/package.json b/package.json index ea126bce3..32efa9ab2 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "mysql": "2.18.1", "node-ssh": "^11.0.0", "object.pick": "^1.3.0", + "pdf-merger-js": "^5.1.2", "puppeteer": "21.11.0", "read-chunk": "^3.2.0", "require-yaml": "0.0.1", @@ -80,10 +81,10 @@ "gulp-merge-json": "^1.3.1", "gulp-nodemon": "^2.5.0", "gulp-print": "^2.0.1", - "gulp-wrap": "^0.15.0", - "gulp-yaml": "^1.0.1", "gulp-rename": "^2.0.0", "gulp-replace": "^1.1.4", + "gulp-wrap": "^0.15.0", + "gulp-yaml": "^1.0.1", "html-loader": "^0.4.5", "html-loader-jest": "^0.2.1", "html-webpack-plugin": "^5.5.1", diff --git a/print/templates/reports/buy-label/buy-label.html b/print/templates/reports/buy-label/buy-label.html index 4a0d7f3fc..5777d34de 100644 --- a/print/templates/reports/buy-label/buy-label.html +++ b/print/templates/reports/buy-label/buy-label.html @@ -86,7 +86,7 @@
{{$t('boxNum')}} - {{`${buy.labelNum} / ${maxLabelNum}`}} + {{`${buy.labelNum} / ${buy.maxLabelNum}`}}
diff --git a/print/templates/reports/buy-label/buy-label.js b/print/templates/reports/buy-label/buy-label.js index 48ffe336c..932c34453 100755 --- a/print/templates/reports/buy-label/buy-label.js +++ b/print/templates/reports/buy-label/buy-label.js @@ -7,8 +7,9 @@ module.exports = { name: 'buy-label', mixins: [vnReport], async serverPrefetch() { - this.buys = await this.rawSqlFromDef('buys', [this.id, this.id]); - this.maxLabelNum = Math.max(...this.buys.map(buy => buy.labelNum)); + const models = require('vn-loopback/server/server').models; + const buy = await models.Buy.findById(this.id, null); + this.buys = await this.rawSqlFromDef('buy', [buy.entryFk, buy.entryFk, buy.entryFk, this.id]); const date = new Date(); this.weekNum = moment(date).isoWeek(); this.dayNum = moment(date).day(); diff --git a/print/templates/reports/buy-label/sql/buy.sql b/print/templates/reports/buy-label/sql/buy.sql new file mode 100644 index 000000000..72765baa9 --- /dev/null +++ b/print/templates/reports/buy-label/sql/buy.sql @@ -0,0 +1,38 @@ +WITH RECURSIVE numbers AS ( + SELECT 1 n + UNION ALL + SELECT n + 1 + FROM numbers + WHERE n < ( + SELECT MAX(stickers) + FROM buy + WHERE entryFk = ? + ) +), +labels AS ( + SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) labelNum, + i.name, + i.`size`, + i.category, + ink.id color, + o.code, + b.packing, + b.`grouping`, + i.stems, + b.id, + b.itemFk, + p.name producer, + IF(i2.id, i2.comment, i.comment) comment + FROM buy b + JOIN item i ON i.id = b.itemFk + LEFT JOIN producer p ON p.id = i.producerFk + LEFT JOIN ink ON ink.id = i.inkFk + LEFT JOIN origin o ON o.id = i.originFk + LEFT JOIN item i2 ON i2.id = b.itemOriginalFk + JOIN numbers num + WHERE b.entryFk = ? + AND num.n <= b.stickers +) +SELECT *, (SELECT SUM(stickers) FROM buy WHERE entryFk = ?) maxLabelNum + FROM labels + WHERE id = ? \ No newline at end of file diff --git a/print/templates/reports/buy-label/sql/buys.sql b/print/templates/reports/buy-label/sql/buys.sql deleted file mode 100644 index 44b1b4bad..000000000 --- a/print/templates/reports/buy-label/sql/buys.sql +++ /dev/null @@ -1,33 +0,0 @@ -WITH RECURSIVE numbers AS ( - SELECT 1 n - UNION ALL - SELECT n + 1 - FROM numbers - WHERE n < ( - SELECT MAX(stickers) - FROM buy - WHERE entryFk = ? - ) -) -SELECT ROW_NUMBER() OVER(ORDER BY b.id, num.n) labelNum, - i.name, - i.`size`, - i.category, - ink.id color, - o.code, - b.packing, - b.`grouping`, - i.stems, - b.id, - b.itemFk, - p.name producer, - IF(i2.id, i2.comment, i.comment) comment - FROM buy b - JOIN item i ON i.id = b.itemFk - LEFT JOIN producer p ON p.id = i.producerFk - LEFT JOIN ink ON ink.id = i.inkFk - LEFT JOIN origin o ON o.id = i.originFk - LEFT JOIN item i2 ON i2.id = b.itemOriginalFk - JOIN numbers num - WHERE b.entryFk = ? - AND num.n <= b.stickers