From 72b4607d54344cf49d37d627d0e4a804e0e06927 Mon Sep 17 00:00:00 2001 From: guillermo Date: Thu, 29 Aug 2024 12:19:06 +0200 Subject: [PATCH] feat: refs #7905 Added new method getBuysCsv --- .../11206-turquoiseCyca/00-firstScript.sql | 2 + modules/entry/back/methods/entry/getBuys.js | 19 +---- .../entry/back/methods/entry/getBuysCsv.js | 75 +++++++++++++++++++ modules/entry/back/models/entry.js | 1 + 4 files changed, 80 insertions(+), 17 deletions(-) create mode 100644 db/versions/11206-turquoiseCyca/00-firstScript.sql create mode 100644 modules/entry/back/methods/entry/getBuysCsv.js diff --git a/db/versions/11206-turquoiseCyca/00-firstScript.sql b/db/versions/11206-turquoiseCyca/00-firstScript.sql new file mode 100644 index 0000000000..c1d63fcecd --- /dev/null +++ b/db/versions/11206-turquoiseCyca/00-firstScript.sql @@ -0,0 +1,2 @@ +INSERT INTO salix.ACL (model,property,principalId) + VALUES ('Entry','getBuysCsv','supplier'); diff --git a/modules/entry/back/methods/entry/getBuys.js b/modules/entry/back/methods/entry/getBuys.js index 65fb047c6d..245dada099 100644 --- a/modules/entry/back/methods/entry/getBuys.js +++ b/modules/entry/back/methods/entry/getBuys.js @@ -1,6 +1,5 @@ const UserError = require('vn-loopback/util/user-error'); const mergeFilters = require('vn-loopback/util/filter').mergeFilters; -const {toCSV} = require('vn-loopback/util/csv'); module.exports = Self => { Self.remoteMethodCtx('getBuys', { @@ -17,11 +16,6 @@ module.exports = Self => { arg: 'filter', type: 'object', description: 'Filter defining where, order, offset, and limit - must be a JSON-encoded string' - }, - { - arg: 'toCsv', - type: 'boolean', - description: 'If true, return the data in CSV format' } ], returns: { @@ -34,7 +28,7 @@ module.exports = Self => { } }); - Self.getBuys = async(ctx, id, filter, toCsv, options) => { + Self.getBuys = async(ctx, id, filter, options) => { const userId = ctx.req.accessToken.userId; const models = Self.app.models; const myOptions = {}; @@ -135,15 +129,6 @@ module.exports = Self => { }; defaultFilter = mergeFilters(defaultFilter, filter); - const data = models.Buy.find(defaultFilter, myOptions); - - if (toCsv) { - return [ - toCSV(data), - 'text/csv', - `attachment; filename="${id}.csv"` - ]; - } else - return data; + return models.Buy.find(defaultFilter, myOptions); }; }; diff --git a/modules/entry/back/methods/entry/getBuysCsv.js b/modules/entry/back/methods/entry/getBuysCsv.js new file mode 100644 index 0000000000..76b9cdc578 --- /dev/null +++ b/modules/entry/back/methods/entry/getBuysCsv.js @@ -0,0 +1,75 @@ +const UserError = require('vn-loopback/util/user-error'); +const {toCSV} = require('vn-loopback/util/csv'); + +module.exports = Self => { + Self.remoteMethodCtx('getBuys', { + description: 'Returns buys for one entry', + 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/getBuysCsv`, + verb: 'GET' + } + }); + + Self.getBuys = async(ctx, id, options) => { + const userId = ctx.req.accessToken.userId; + const models = Self.app.models; + const myOptions = {}; + + if (typeof options == 'object') + Object.assign(myOptions, options); + + const client = await models.Client.findById(userId, myOptions); + const supplier = await models.Supplier.findOne({where: {nif: client.fi}}, myOptions); + if (supplier) { + const isEntryOwner = (await Self.findById(id)).supplierFk === supplier.id; + if (!isEntryOwner) throw new UserError('Access Denied'); + } + + const data = await Self.rawSql(` + SELECT b.id, + b.itemFk, + i.name, + b.stickers, + b.packing, + b.grouping, + b.packing, + b.groupingMode, + b.quantity, + b.packagingFk, + b.weight, + b.buyingValue, + b.price2, + b.price3, + b.printedStickers + FROM buy b + JOIN item i ON i.id = b.itemFk + WHERE b.entryFk = ? + `, [id]); + + return [toCSV(data), 'text/csv', `inline; filename="buys-${id}.csv"`]; + }; +}; diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index b11d64415c..8ca79f5316 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -3,6 +3,7 @@ module.exports = Self => { require('../methods/entry/filter')(Self); require('../methods/entry/getEntry')(Self); require('../methods/entry/getBuys')(Self); + require('../methods/entry/getBuysCsv')(Self); require('../methods/entry/importBuys')(Self); require('../methods/entry/importBuysPreview')(Self); require('../methods/entry/lastItemBuys')(Self);