From ef5c2ab3a212dc440b77f51fcc42cebd984e694c Mon Sep 17 00:00:00 2001 From: pablone Date: Mon, 27 Jan 2025 08:11:41 +0100 Subject: [PATCH] feat: refs #6897 add cloneEntry and deleteEntry methods with corresponding ACL permissions --- .../11399-bronzeOak/00-firstScript.sql | 2 + .../back/methods/entry-buys/getBuyList.js | 7 +-- .../entry/back/methods/entry/cloneEntry.js | 47 ++++++++++++++++++ .../entry/back/methods/entry/deleteEntry.js | 49 +++++++++++++++++++ modules/entry/back/methods/entry/filter.js | 11 ++--- modules/entry/back/models/entry.js | 2 + modules/entry/back/models/entry.json | 8 ++- 7 files changed, 115 insertions(+), 11 deletions(-) create mode 100644 modules/entry/back/methods/entry/cloneEntry.js create mode 100644 modules/entry/back/methods/entry/deleteEntry.js diff --git a/db/versions/11399-bronzeOak/00-firstScript.sql b/db/versions/11399-bronzeOak/00-firstScript.sql index 786d131bf..14836847b 100644 --- a/db/versions/11399-bronzeOak/00-firstScript.sql +++ b/db/versions/11399-bronzeOak/00-firstScript.sql @@ -1,6 +1,8 @@ INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) VALUES ('Entry','getBuyList','READ','ALLOW','ROLE','buyer'), ('Entry','create','WRITE','ALLOW','ROLE','buyer'), + ('Entry','cloneEntry','WRITE','ALLOW','ROLE','buyer'), + ('Entry','deleteEntry','WRITE','ALLOW','ROLE','buyer'), ('EntryType','find','READ','ALLOW','ROLE','buyer'), ('EntryConfig','findOne','READ','ALLOW','ROLE','buyer'); diff --git a/modules/entry/back/methods/entry-buys/getBuyList.js b/modules/entry/back/methods/entry-buys/getBuyList.js index 41e4e793d..bf168ffaf 100644 --- a/modules/entry/back/methods/entry-buys/getBuyList.js +++ b/modules/entry/back/methods/entry-buys/getBuyList.js @@ -230,6 +230,7 @@ module.exports = Self => { ik.hexJson`; const groupByFields = `SUM(b.printedStickers) printedStickers, + SUM(b.packing) packing, SUM(b.stickers) stickers, SUM(b.weight) weight, SUM(b.quantity) quantity, @@ -260,12 +261,12 @@ module.exports = Self => { let sql = ParameterizedSQL.join(stmts, ';'); let result = await conn.executeStmt(sql, myOptions); - if (groupBy) { + if (groupBy && result.length) { const buys = await Self.app.models.Buy.find({where: {entryFk}}, myOptions); const buysChecked = buys.filter(buy => buy?.isChecked); - result[0].isAllChecked = buysChecked.length === buys.length; + result[0].isChecked = buysChecked.length === buys.length; } - + console.log('id:', entryFk); return itemsIndex === 0 ? result : result[itemsIndex]; }; }; diff --git a/modules/entry/back/methods/entry/cloneEntry.js b/modules/entry/back/methods/entry/cloneEntry.js new file mode 100644 index 000000000..159f485ab --- /dev/null +++ b/modules/entry/back/methods/entry/cloneEntry.js @@ -0,0 +1,47 @@ + +module.exports = Self => { + Self.remoteMethodCtx('cloneEntry', { + description: 'Clones an entry', + accessType: 'WRITE', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'The entry id', + http: {source: 'path'} + }], + returns: { + type: 'object', + root: true + }, + http: { + path: `/:id/cloneEntry`, + verb: 'POST' + } + }); + + Self.cloneEntry = async(ctx, id, options) => { + const userId = ctx.req.accessToken.userId; + const myOptions = {userId}; + let tx; + let result; + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + result = await Self.rawSql('CALL entry_clone(?)', [id], myOptions); + console.log('result: ', result); + + if (tx) await tx.commit(); + return result[0]; + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/entry/back/methods/entry/deleteEntry.js b/modules/entry/back/methods/entry/deleteEntry.js new file mode 100644 index 000000000..7b257b570 --- /dev/null +++ b/modules/entry/back/methods/entry/deleteEntry.js @@ -0,0 +1,49 @@ + +module.exports = Self => { + Self.remoteMethodCtx('deleteEntry', { + description: 'Clones an entry', + accessType: 'WRITE', + accepts: [{ + arg: 'id', + type: 'number', + required: true, + description: 'The entry id', + http: {source: 'path'} + }], + http: { + path: `/:id/deleteEntry`, + verb: 'POST' + } + }); + + Self.deleteEntry = async(ctx, id, options) => { + const userId = ctx.req.accessToken.userId; + const myOptions = {userId}; + let tx; + if (typeof options == 'object') + Object.assign(myOptions, options); + + if (!myOptions.transaction) { + tx = await Self.beginTransaction({}); + myOptions.transaction = tx; + } + + try { + const entry = await Self.findById(id, null, myOptions); + console.log('entry: ', entry); + await entry.updateAttribute('travelFk', null, myOptions); + await Self.rawSql('DELETE FROM vn.duaEntry WHERE entryFk = ?;', [id], myOptions); + await Self.rawSql(` + DELETE i.* + FROM vn.invoiceIn i + JOIN vn.entry e ON e.invoiceInFk = i.id + WHERE e.id = ?`, [id], myOptions + ); + + if (tx) await tx.commit(); + } catch (e) { + if (tx) await tx.rollback(); + throw e; + } + }; +}; diff --git a/modules/entry/back/methods/entry/filter.js b/modules/entry/back/methods/entry/filter.js index 4104eb6b3..44f324294 100644 --- a/modules/entry/back/methods/entry/filter.js +++ b/modules/entry/back/methods/entry/filter.js @@ -238,7 +238,6 @@ module.exports = Self => { return {[`et.code`]: value}; } }); - console.log('where: ', where); filter = mergeFilters(ctx.args.filter, {where}); const userId = ctx.req.accessToken.userId; const client = await Self.app.models.Client.findById(userId, myOptions); @@ -290,11 +289,11 @@ module.exports = Self => { t.isReceived FROM vn.entry e JOIN vn.supplier s ON s.id = e.supplierFk - JOIN vn.travel t ON t.id = e.travelFk - JOIN vn.warehouse w ON w.id = t.warehouseInFk - JOIN vn.warehouse w2 ON w2.id = t.warehouseOutFk - JOIN vn.company co ON co.id = e.companyFk - JOIN vn.currency cu ON cu.id = e.currencyFk + LEFT JOIN vn.travel t ON t.id = e.travelFk + LEFT JOIN vn.warehouse w ON w.id = t.warehouseInFk + LEFT JOIN vn.warehouse w2 ON w2.id = t.warehouseOutFk + LEFT JOIN vn.company co ON co.id = e.companyFk + LEFT JOIN vn.currency cu ON cu.id = e.currencyFk LEFT JOIN vn.awb a ON a.id = t.awbFk LEFT JOIN vn.agencyMode am ON am.id = t.agencyModeFk LEFT JOIN vn.entryType et ON et.code = e.typeFk` diff --git a/modules/entry/back/models/entry.js b/modules/entry/back/models/entry.js index 518974986..257d034ca 100644 --- a/modules/entry/back/models/entry.js +++ b/modules/entry/back/models/entry.js @@ -16,6 +16,8 @@ module.exports = Self => { require('../methods/entry/buyLabelSupplier')(Self); require('../methods/entry-buys/getBuyList')(Self); require('../methods/entry-buys/getBuyUltimate')(Self); + require('../methods/entry/cloneEntry')(Self); + require('../methods/entry/deleteEntry')(Self); Self.observe('before save', async(ctx, options) => { if (ctx.isNewInstance) return; diff --git a/modules/entry/back/models/entry.json b/modules/entry/back/models/entry.json index 4a09c7d6a..cbf011417 100644 --- a/modules/entry/back/models/entry.json +++ b/modules/entry/back/models/entry.json @@ -56,8 +56,7 @@ "required": true }, "travelFk": { - "type": "number", - "required": true + "type": "number" }, "companyFk": { "type": "number", @@ -101,6 +100,11 @@ "type": "belongsTo", "model": "EntryType", "foreignKey": "typeFk" + }, + "invoiceIn": { + "type": "belongsTo", + "model": "InvoiceIn", + "foreignKey": "invoiceInFk" } } }