Merge pull request 'feat: refs #8188 refs#8188 orderPicking' (!3279) from 8188-orderPicking into test
gitea/salix/pipeline/head This commit looks good Details
gitea/salix/pipeline/pr-master This commit looks good Details

Reviewed-on: #3279
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
This commit is contained in:
Sergio De la torre 2024-12-10 06:05:11 +00:00
commit 699e56a64c
6 changed files with 223 additions and 1 deletions

View File

@ -20,6 +20,9 @@
},
"backupPrinterNotificationDelay": {
"type": "string"
},
"itemOrderReviewHours": {
"type": "number"
}
}
}

View File

@ -3772,7 +3772,8 @@ VALUES
(999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL),
(1000000, 18, 25, '2023-09-21', 25, 500, NULL, 103, NULL),
(999996, 19, 5, '2023-09-27', 1, 5, NULL, 103, NULL),
(999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL);
(999997, 21, 10, '2023-09-27', 5, 100, NULL, 103, NULL),
(1000000, 16, 25, '2023-08-21',25, 500, NULL, NULL, NULL);
-- Previous for Bolas de madera
INSERT IGNORE INTO vn.sectorCollection

View File

@ -0,0 +1,5 @@
-- Place your SQL code here
ALTER TABLE vn.productionConfig ADD itemOrderReviewHours int(11) DEFAULT 24 NULL
COMMENT 'Horas que no se tienen en cuenta para comprobar orden en el almacén, null para desactivar revisión';

View File

@ -0,0 +1,89 @@
module.exports = Self => {
const models = require('vn-loopback/server/server').models;
Self.remoteMethod('getItemsByReviewOrder', {
description:
'Get list items if they are ordered by pickingOrder and their created regarding where they will be parked',
accessType: 'READ',
accepts: [{
arg: 'shelving',
type: 'string',
required: true,
description: 'Shelving code'
},
{
arg: 'parking',
type: 'string',
required: true,
description: 'Parking code'
},
{
arg: 'itemFk',
type: 'number',
description: 'Item id'
},
],
returns: {
type: 'Array',
root: true
},
http: {
path: `/getItemsByReviewOrder`,
verb: 'GET'
}
});
Self.getItemsByReviewOrder = async(shelving, parking, itemFk, options) => {
const myOptions = {};
if (typeof options == 'object')
Object.assign(myOptions, options);
const config = await models.ProductionConfig.findOne();
const hoursToCompare = config['itemOrderReviewHours'];
if (!hoursToCompare) return [];
const parkingItem = await models.Parking.findOne({where: {code: parking}}, myOptions);
if (!parkingItem) return [];
const pickingOrderToCompare = parkingItem['pickingOrder'];
const result = await Self.rawSql(`
WITH currentItemShelving AS (
SELECT is2.created, is2.itemFk, sh.code
FROM vn.itemShelving is2
JOIN vn.shelving sh ON sh.id = is2.shelvingFk
LEFT JOIN vn.parking p ON p.id = sh.parkingFk
LEFT JOIN vn.sector s ON s.id = p.sectorFk
WHERE sh.code = ? AND (? IS NULL OR is2.itemFk = ?)
),
itemShelvings AS (
SELECT is2.itemFk, is2.created, sh.code, p.pickingOrder, p.code AS parkingFk
FROM vn.itemShelving is2
JOIN currentItemShelving ai ON is2.itemFk = ai.itemFk
JOIN vn.shelving sh ON sh.id = is2.shelvingFk AND ai.code <> sh.code
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
),
parkingDestiny AS (
SELECT ? AS pickingOrder
)
SELECT ish.*,
CASE
WHEN ish.pickingOrder < d.pickingOrder AND aish.created < ish.created
AND ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ? THEN "old"
WHEN ish.pickingOrder > d.pickingOrder AND aish.created > ish.created
AND ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ? THEN "new"
END AS itemCreated
FROM itemShelvings ish
JOIN parkingDestiny d ON d.pickingOrder IS NOT NULL
JOIN currentItemShelving aish ON ish.itemFk = aish.itemFk
WHERE ABS(TIMESTAMPDIFF(HOUR, aish.created, ish.created)) > ?
AND (
(ish.pickingOrder < d.pickingOrder AND aish.created < ish.created)
OR
(ish.pickingOrder > d.pickingOrder AND aish.created > ish.created)
);
`,
[shelving, itemFk, itemFk, pickingOrderToCompare,
hoursToCompare, hoursToCompare, hoursToCompare, hoursToCompare], myOptions);
return result;
};
};

View File

@ -0,0 +1,123 @@
const {models} = require('vn-loopback/server/server');
describe('itemShelving getItemsByReviewOrder()', () => {
it('should return empty because hoursToReview = 0', async() => {
const shelving = 'NBB';
const parking = '700-01';
const tx = await models.Sector.beginTransaction({});
const myOptions = {transaction: tx};
try {
const config = await models.ProductionConfig.findOne();
await config.updateAttributes({
itemOrderReviewHours: null,
});
const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, myOptions);
expect(result.length).toEqual(0);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
it('should return an item because you are trying parking a shelving and there is an older item', async() => {
const shelving = 'NBB';
const parking = 'K-26-2';
const itemFk = 1000000;
const tx = await models.Sector.beginTransaction({});
const myOptions = {transaction: tx};
try {
const config = await models.ProductionConfig.findOne();
await config.updateAttributes({
itemOrderReviewHours: 24,
});
const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
expect(result.length).toEqual(1);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
it('should return an item because you are trying parking a shelving and there is an newer item', async() => {
const shelving = 'NBB';
const parking = 'K-26-2';
const itemFk = 1000000;
const tx = await models.Sector.beginTransaction({});
const myOptions = {transaction: tx};
try {
const config = await models.ProductionConfig.findOne();
await config.updateAttributes({
itemOrderReviewHours: 24,
});
const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
expect(result.length).toEqual(1);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
it('should return a item list because you are trying parking a shelving and there is an newer item', async() => {
const shelving = 'NCC';
const parking = 'K-26-2';
const itemFk = 1000000;
const tx = await models.Sector.beginTransaction({});
const myOptions = {transaction: tx};
try {
const config = await models.ProductionConfig.findOne();
await config.updateAttributes({
itemOrderReviewHours: 24,
});
const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
expect(result.length).toEqual(2);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
it('should return empty list because all order is correct', async() => {
const shelving = 'NCC';
const parking = 'A-01-1';
const itemFk = 1000000;
const tx = await models.Sector.beginTransaction({});
const myOptions = {transaction: tx};
try {
const config = await models.ProductionConfig.findOne();
await config.updateAttributes({
itemOrderReviewHours: 24,
});
const result = await models.ItemShelving.getItemsByReviewOrder(shelving, parking, itemFk, myOptions);
expect(result.length).toEqual(0);
await tx.rollback();
} catch (e) {
await tx.rollback();
throw e;
}
});
});

View File

@ -5,4 +5,5 @@ module.exports = Self => {
require('../methods/item-shelving/getAlternative')(Self);
require('../methods/item-shelving/updateFromSale')(Self);
require('../methods/item-shelving/getListItemNewer')(Self);
require('../methods/item-shelving/getItemsByReviewOrder')(Self);
};