feat: refs #8188 refs#8188 orderPicking #3279

Merged
sergiodt merged 4 commits from 8188-orderPicking into test 2024-12-10 06:05:12 +00:00
6 changed files with 223 additions and 1 deletions

View File

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

View File

@ -3772,7 +3772,8 @@ VALUES
(999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL), (999992, 18, 50, '2023-09-21', NULL, 1, NULL, 103, NULL),
(1000000, 18, 25, '2023-09-21', 25, 500, 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), (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 -- Previous for Bolas de madera
INSERT IGNORE INTO vn.sectorCollection 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
sergiodt marked this conversation as resolved Outdated

revisar traduccion

revisar traduccion
COMMENT 'Horas que no se tienen en cuenta para comprobar orden en el almacén, null para desactivar revisión';
Review

confirmar con Pako esta lógica de negocio

confirmar con Pako esta lógica de negocio
Review

Confirmat en Pako

Confirmat en Pako

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/getAlternative')(Self);
require('../methods/item-shelving/updateFromSale')(Self); require('../methods/item-shelving/updateFromSale')(Self);
require('../methods/item-shelving/getListItemNewer')(Self); require('../methods/item-shelving/getListItemNewer')(Self);
require('../methods/item-shelving/getItemsByReviewOrder')(Self);
}; };