feat: refs #6897 add recalcEntryPrices method and enhance ACL permissions for entry operations
gitea/salix/pipeline/pr-dev There was a failure building this commit Details

This commit is contained in:
Pablo Natek 2025-02-03 13:16:48 +01:00
parent ef5c2ab3a2
commit e7dd1f6a58
9 changed files with 95 additions and 6 deletions

View File

@ -168,6 +168,7 @@
"emailVerified", "emailVerified",
"twoFactor" "twoFactor"
] ]
} }
} }
} }

View File

@ -1,8 +1,10 @@
INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId) INSERT INTO salix.ACL (model,property,accessType,permission,principalType,principalId)
VALUES ('Entry','getBuyList','READ','ALLOW','ROLE','buyer'), VALUES ('Entry','getBuyList','READ','ALLOW','ROLE','buyer'),
('Entry','getBuyUltimate','READ','ALLOW','ROLE','buyer'),
('Entry','create','WRITE','ALLOW','ROLE','buyer'), ('Entry','create','WRITE','ALLOW','ROLE','buyer'),
('Entry','cloneEntry','WRITE','ALLOW','ROLE','buyer'), ('Entry','cloneEntry','WRITE','ALLOW','ROLE','buyer'),
('Entry','deleteEntry','WRITE','ALLOW','ROLE','buyer'), ('Entry','deleteEntry','WRITE','ALLOW','ROLE','buyer'),
('Entry','recalcEntryPrices','WRITE','ALLOW','ROLE','buyer'),
('EntryType','find','READ','ALLOW','ROLE','buyer'), ('EntryType','find','READ','ALLOW','ROLE','buyer'),
('EntryConfig','findOne','READ','ALLOW','ROLE','buyer'); ('EntryConfig','findOne','READ','ALLOW','ROLE','buyer');

View File

@ -136,6 +136,18 @@ module.exports = Self => {
description: 'company name', description: 'company name',
http: {source: 'query'} http: {source: 'query'}
}, },
{
arg: 'workerFk',
type: 'number',
description: 'buyer id',
http: {source: 'query'}
},
{
arg: 'itemTypeFk',
type: 'number',
description: 'item family id',
http: {source: 'query'}
},
{ {
arg: 'groupBy', arg: 'groupBy',
type: 'string', type: 'string',
@ -182,6 +194,8 @@ module.exports = Self => {
case 'price3': case 'price3':
case 'packingOut': case 'packingOut':
case 'minPrice': case 'minPrice':
case 'workerFk':
case 'itemTypeFk':
return {[param]: value}; return {[param]: value};
} }
}); });
@ -227,7 +241,10 @@ module.exports = Self => {
i.tag10, i.tag10,
i.value10, i.value10,
s.company_name, s.company_name,
ik.hexJson`; ik.hexJson,
it.workerFk,
it.id itemTypeFk
`;
const groupByFields = `SUM(b.printedStickers) printedStickers, const groupByFields = `SUM(b.printedStickers) printedStickers,
SUM(b.packing) packing, SUM(b.packing) packing,
@ -249,6 +266,7 @@ module.exports = Self => {
LEFT JOIN buy b ON b.itemFk = i.id LEFT JOIN buy b ON b.itemFk = i.id
LEFT JOIN edi.ekt e ON e.id = b.ektFk LEFT JOIN edi.ekt e ON e.id = b.ektFk
LEFT JOIN edi.supplier s ON e.pro = s.supplier_id LEFT JOIN edi.supplier s ON e.pro = s.supplier_id
LEFT JOIN itemType it ON it.id = i.typeFk
WHERE b.entryFk = ? WHERE b.entryFk = ?
${groupBy ?? ''} ${groupBy ?? ''}
) sub`, ) sub`,
@ -266,7 +284,6 @@ module.exports = Self => {
const buysChecked = buys.filter(buy => buy?.isChecked); const buysChecked = buys.filter(buy => buy?.isChecked);
result[0].isChecked = buysChecked.length === buys.length; result[0].isChecked = buysChecked.length === buys.length;
} }
console.log('id:', entryFk);
return itemsIndex === 0 ? result : result[itemsIndex]; return itemsIndex === 0 ? result : result[itemsIndex];
}; };
}; };

View File

@ -32,6 +32,15 @@ module.exports = Self => {
if (typeof options == 'object') if (typeof options == 'object')
Object.assign(myOptions, options); Object.assign(myOptions, options);
return Self.rawSql('CALL vn.buy_getUltimate(?, ?, ?)', [itemFk, warehouseFk, date], myOptions); await Self.rawSql('CALL vn.buy_getUltimate(?, ?, ?)', [itemFk, warehouseFk, date], myOptions);
return Self.rawSql(
`SELECT b.*
FROM cache.last_buy lb
JOIN buy b ON b.id = lb.buy_id
WHERE lb.item_id = ?
ORDER BY (lb.warehouse_id = ?) desc
LIMIT 1`,
[itemFk, warehouseFk], myOptions
);
}; };
}; };

View File

@ -35,7 +35,6 @@ module.exports = Self => {
try { try {
result = await Self.rawSql('CALL entry_clone(?)', [id], myOptions); result = await Self.rawSql('CALL entry_clone(?)', [id], myOptions);
console.log('result: ', result);
if (tx) await tx.commit(); if (tx) await tx.commit();
return result[0]; return result[0];

View File

@ -30,7 +30,6 @@ module.exports = Self => {
try { try {
const entry = await Self.findById(id, null, myOptions); const entry = await Self.findById(id, null, myOptions);
console.log('entry: ', entry);
await entry.updateAttribute('travelFk', null, myOptions); await entry.updateAttribute('travelFk', null, myOptions);
await Self.rawSql('DELETE FROM vn.duaEntry WHERE entryFk = ?;', [id], myOptions); await Self.rawSql('DELETE FROM vn.duaEntry WHERE entryFk = ?;', [id], myOptions);
await Self.rawSql(` await Self.rawSql(`

View File

@ -0,0 +1,50 @@
module.exports = Self => {
Self.remoteMethodCtx('recalcEntryPrices', {
description: 'Clones an entry',
accessType: 'WRITE',
accepts: [{
arg: 'entryFk',
type: 'number',
required: true,
description: 'The entry id',
http: {source: 'path'}
}],
returns: {
type: 'object',
root: true
},
http: {
path: `/:entryFk/recalcEntryPrices`,
verb: 'POST'
}
});
Self.recalcEntryPrices = async(ctx, entryFk, 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;
}
const entry = await Self.findById(entryFk, myOptions);
const entryConfig = await Self.app.models.EntryConfig.findOne(myOptions);
if (entry.supplierFk === entryConfig.inventorySupplierFk) return;
try {
result = await Self.rawSql('CALL vn.buy_recalcPricesByEntry(?)', [entryFk], myOptions);
if (tx) await tx.commit();
return result[0];
} catch (e) {
if (tx) await tx.rollback();
throw e;
}
};
};

View File

@ -18,6 +18,7 @@ module.exports = Self => {
require('../methods/entry-buys/getBuyUltimate')(Self); require('../methods/entry-buys/getBuyUltimate')(Self);
require('../methods/entry/cloneEntry')(Self); require('../methods/entry/cloneEntry')(Self);
require('../methods/entry/deleteEntry')(Self); require('../methods/entry/deleteEntry')(Self);
require('../methods/entry/recalcEntryPrices')(Self);
Self.observe('before save', async(ctx, options) => { Self.observe('before save', async(ctx, options) => {
if (ctx.isNewInstance) return; if (ctx.isNewInstance) return;

View File

@ -67,6 +67,12 @@
}, },
"invoiceAmount": { "invoiceAmount": {
"type": "number" "type": "number"
},
"lockerUserFk":{
"type": "number"
},
"locked":{
"type": "date"
} }
}, },
"relations": { "relations": {
@ -105,6 +111,11 @@
"type": "belongsTo", "type": "belongsTo",
"model": "InvoiceIn", "model": "InvoiceIn",
"foreignKey": "invoiceInFk" "foreignKey": "invoiceInFk"
},
"user": {
"type": "belongsTo",
"model": "VnUser",
"foreignKey": "lockerUserFk"
} }
} }
} }