#6321 - Negative tickets #1945
|
@ -18,7 +18,7 @@ const opts = getopts(process.argv.slice(2), {
|
||||||
let server;
|
let server;
|
||||||
const PARALLEL = false;
|
const PARALLEL = false;
|
||||||
const SETUP_TIMEOUT = 15 * 60 * 1000;
|
const SETUP_TIMEOUT = 15 * 60 * 1000;
|
||||||
const SPEC_TIMEOUT = 30 * 10000;
|
const SPEC_TIMEOUT = 30 * 1000;
|
||||||
|
|
||||||
process.on('exit', teardown);
|
process.on('exit', teardown);
|
||||||
process.on('uncaughtException', onError);
|
process.on('uncaughtException', onError);
|
||||||
|
|
|
@ -1,9 +1,20 @@
|
||||||
DELIMITER $$
|
DELIMITER $$
|
||||||
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getLack`(IN vForce BOOLEAN, IN vDays INT)
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`item_getLack`(
|
||||||
|
vForce BOOLEAN,
|
||||||
|
vDays INT,
|
||||||
|
vId INT,
|
||||||
|
vLongname INT,
|
||||||
|
vSupplierFk VARCHAR(255),
|
||||||
|
vColor VARCHAR(255),
|
||||||
|
vSize INT,
|
||||||
|
vOrigen VARCHAR(255),
|
||||||
|
vLack INT,
|
||||||
|
vWarehouseFk INT
|
||||||
|
)
|
||||||
BEGIN
|
BEGIN
|
||||||
/**
|
/**
|
||||||
* Calcula una tabla con el máximo negativo visible para cada producto y almacen
|
* Calcula una tabla con el máximo negativo visible para cada producto y almacen
|
||||||
*
|
*
|
||||||
* @param vForce Fuerza el recalculo del stock
|
* @param vForce Fuerza el recalculo del stock
|
||||||
* @param vDays Numero de dias a considerar
|
* @param vDays Numero de dias a considerar
|
||||||
**/
|
**/
|
||||||
|
@ -13,33 +24,33 @@ BEGIN
|
||||||
CALL item_getMinETD();
|
CALL item_getMinETD();
|
||||||
CALL item_zoneClosure();
|
CALL item_zoneClosure();
|
||||||
|
|
||||||
SELECT i.id itemFk,
|
SELECT i.id itemFk,
|
||||||
i.longName,
|
i.longName,
|
||||||
w.id warehouseFk,
|
w.id warehouseFk,
|
||||||
p.`name` producer,
|
p.`name` producer,
|
||||||
i.`size`,
|
i.`size`,
|
||||||
i.category,
|
i.category,
|
||||||
w.name warehouse,
|
w.name warehouse,
|
||||||
SUM(IFNULL(sub.amount,0)) lack,
|
SUM(IFNULL(sub.amount,0)) lack,
|
||||||
i.inkFk,
|
i.inkFk,
|
||||||
IFNULL(im.timed, util.midnight()) timed,
|
IFNULL(im.timed, util.midnight()) timed,
|
||||||
IFNULL(izc.timed, util.midnight()) minTimed,
|
IFNULL(izc.timed, util.midnight()) minTimed,
|
||||||
o.name originFk
|
o.name originFk
|
||||||
FROM (SELECT item_id,
|
FROM (SELECT item_id,
|
||||||
warehouse_id,
|
warehouse_id,
|
||||||
amount
|
amount
|
||||||
FROM cache.stock
|
FROM cache.stock
|
||||||
WHERE amount > 0
|
WHERE amount > 0
|
||||||
UNION ALL
|
UNION ALL
|
||||||
SELECT itemFk,
|
SELECT itemFk,
|
||||||
warehouseFk,
|
warehouseFk,
|
||||||
amount
|
amount
|
||||||
FROM tmp.itemMinacum
|
FROM tmp.itemMinacum
|
||||||
) sub
|
) sub
|
||||||
JOIN warehouse w ON w.id = sub.warehouse_id
|
JOIN warehouse w ON w.id = sub.warehouse_id
|
||||||
JOIN item i ON i.id = sub.item_id
|
JOIN item i ON i.id = sub.item_id
|
||||||
LEFT JOIN producer p ON p.id = i.producerFk
|
LEFT JOIN producer p ON p.id = i.producerFk
|
||||||
JOIN itemType it ON it.id = i.typeFk
|
JOIN itemType it ON it.id = i.typeFk
|
||||||
JOIN itemCategory ic ON ic.id = it.categoryFk
|
JOIN itemCategory ic ON ic.id = it.categoryFk
|
||||||
LEFT JOIN tmp.itemMinETD im ON im.itemFk = i.id
|
LEFT JOIN tmp.itemMinETD im ON im.itemFk = i.id
|
||||||
LEFT JOIN tmp.itemZoneClosure izc ON izc.itemFk = i.id
|
LEFT JOIN tmp.itemZoneClosure izc ON izc.itemFk = i.id
|
||||||
|
@ -47,6 +58,14 @@ BEGIN
|
||||||
WHERE w.isForTicket
|
WHERE w.isForTicket
|
||||||
AND ic.display
|
AND ic.display
|
||||||
AND it.code != 'GEN'
|
AND it.code != 'GEN'
|
||||||
|
AND (vId IS NULL OR i.id = vId)
|
||||||
|
AND (vLongname IS NULL OR i.longName = vLongname)
|
||||||
|
AND (vSupplierFk IS NULL OR p.`name` LIKE CONCAT('%', vSupplierFk, '%'))
|
||||||
|
AND (vColor IS NULL OR vColor = i.inkFk)
|
||||||
|
AND (vSize IS NULL OR vSize = i.`size`)
|
||||||
|
AND (vOrigen IS NULL OR vOrigen = w.name)
|
||||||
|
AND (vLack IS NULL OR vLack = sub.amount)
|
||||||
|
AND (vWarehouseFk IS NULL OR vWarehouseFk = w.id)
|
||||||
GROUP BY i.id, w.id
|
GROUP BY i.id, w.id
|
||||||
HAVING lack < 0;
|
HAVING lack < 0;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
|
|
||||||
const ParameterizedSQL = require('loopback-connector').ParameterizedSQL;
|
|
||||||
const {buildFilter} = require('vn-loopback/util/filter');
|
|
||||||
|
|
||||||
module.exports = Self => {
|
module.exports = Self => {
|
||||||
Self.remoteMethod('itemLack', {
|
Self.remoteMethod('itemLack', {
|
||||||
description: 'Download a ticket delivery note document',
|
description: 'Download a ticket delivery note document',
|
||||||
|
@ -34,9 +30,9 @@ module.exports = Self => {
|
||||||
description: 'Supplier id',
|
description: 'Supplier id',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'color',
|
arg: 'colour',
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'Color\'s item',
|
description: 'Colour\'s item',
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
arg: 'size',
|
arg: 'size',
|
||||||
|
@ -48,9 +44,15 @@ module.exports = Self => {
|
||||||
type: 'string',
|
type: 'string',
|
||||||
description: 'origen id',
|
description: 'origen id',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
arg: 'warehouse',
|
||||||
|
type: 'number',
|
||||||
|
description: 'The warehouse id',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
arg: 'lack',
|
arg: 'lack',
|
||||||
type: 'number', description: 'The item id',
|
type: 'number',
|
||||||
|
description: 'The item id',
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
returns: [
|
returns: [
|
||||||
|
@ -70,91 +72,19 @@ module.exports = Self => {
|
||||||
const myOptions = {};
|
const myOptions = {};
|
||||||
if (typeof options == 'object')
|
if (typeof options == 'object')
|
||||||
Object.assign(myOptions, options);
|
Object.assign(myOptions, options);
|
||||||
const conn = Self.dataSource.connector;
|
const filterKeyOrder = ['id', 'longname', 'supplier', 'colour', 'size', 'origen', 'lack', 'warehouse'];
|
||||||
let where = {};
|
|
||||||
filter = Object.assign(ctx.args ?? {}, filter);
|
|
||||||
where = buildFilter(filter, (param, value) => {
|
|
||||||
switch (param) {
|
|
||||||
case 'id':
|
|
||||||
return {'i.id': value};
|
|
||||||
case 'longname':
|
|
||||||
return {'i.longName': value};
|
|
||||||
case 'name':
|
|
||||||
return {'p.name': {like: `%${value}%`}};
|
|
||||||
case 'color':
|
|
||||||
return {'i.inkFk': value};
|
|
||||||
case 'size':
|
|
||||||
return {'i.size': value};
|
|
||||||
case 'origen':
|
|
||||||
return {'w.id': value};
|
|
||||||
case 'lack':
|
|
||||||
return {'sub.amount': value};
|
|
||||||
}
|
|
||||||
}) ?? {};
|
|
||||||
|
|
||||||
const stmts = [];
|
delete ctx.args.ctx;
|
||||||
stmts.push(`SET @_optimizer_search_depth = @@optimizer_search_depth`);
|
delete ctx.args.filter;
|
||||||
stmts.push(`SET SESSION optimizer_search_depth = 0`);
|
|
||||||
|
|
||||||
stmts.push(`CALL cache.stock_refresh(true)`);
|
let procedureParams = [true, 2];
|
||||||
stmts.push(`CALL item_getMinacum(NULL, util.VN_CURDATE(), 2, NULL)`);
|
procedureParams.push(...filterKeyOrder.map(clave => ctx.args[clave] ?? null));
|
||||||
stmts.push(`CALL item_getMinETD()`);
|
const procedureArgs = Array(procedureParams.length).fill('?').join(', ');
|
||||||
stmts.push(`CALL item_zoneClosure()`);
|
let query = `CALL vn.item_getLack(${procedureArgs})`;
|
||||||
|
|
||||||
const stmt = new ParameterizedSQL(`
|
const result = await Self.rawSql(query, procedureParams, myOptions);
|
||||||
SELECT i.id itemFk,
|
|
||||||
i.longName,
|
|
||||||
w.id warehouseFk,
|
|
||||||
p.name producer,
|
|
||||||
p.id producerFk,
|
|
||||||
i.size,
|
|
||||||
i.category,
|
|
||||||
w.name warehouse,
|
|
||||||
SUM(IFNULL(sub.amount,0)) lack,
|
|
||||||
i.inkFk,
|
|
||||||
IFNULL(im.timed, util.midnight()) timed,
|
|
||||||
IFNULL(izc.timed, util.midnight()) minTimed
|
|
||||||
FROM (SELECT item_id,
|
|
||||||
warehouse_id,
|
|
||||||
amount
|
|
||||||
FROM cache.stock
|
|
||||||
WHERE amount > 0
|
|
||||||
UNION ALL
|
|
||||||
SELECT itemFk,
|
|
||||||
warehouseFk,
|
|
||||||
amount
|
|
||||||
FROM tmp.itemMinacum
|
|
||||||
) sub
|
|
||||||
JOIN warehouse w ON w.id = sub.warehouse_id
|
|
||||||
JOIN item i ON i.id = sub.item_id
|
|
||||||
LEFT JOIN producer p ON p.id = i.producerFk
|
|
||||||
JOIN itemType it ON it.id = i.typeFk
|
|
||||||
JOIN itemCategory ic ON ic.id = it.categoryFk
|
|
||||||
LEFT JOIN tmp.itemMinETD im ON im.itemFk = i.id
|
|
||||||
LEFT JOIN tmp.itemZoneClosure izc ON izc.itemFk = i.id
|
|
||||||
`);
|
|
||||||
|
|
||||||
const sqlWhere = conn.makeWhere(where);
|
const itemsIndex = 0;
|
||||||
stmt.merge(sqlWhere);
|
return result[itemsIndex];
|
||||||
const prefix = Object.keys(where).length > 0 ? 'AND' : 'WHERE';
|
|
||||||
stmt.merge(`${prefix} w.isForTicket
|
|
||||||
AND ic.display
|
|
||||||
AND it.code != 'GEN'`);
|
|
||||||
|
|
||||||
stmt.merge(`
|
|
||||||
GROUP BY i.id, w.id
|
|
||||||
HAVING lack < 0`
|
|
||||||
);
|
|
||||||
stmt.merge(conn.makeSuffix(filter));
|
|
||||||
const itemsIndex = stmts.push(stmt) - 1;
|
|
||||||
stmts.push(
|
|
||||||
`DROP TEMPORARY TABLE
|
|
||||||
tmp.itemMinacum,
|
|
||||||
tmp.itemMinETD,
|
|
||||||
tmp.itemZoneClosure`);
|
|
||||||
|
|
||||||
const sql = ParameterizedSQL.join(stmts, ';');
|
|
||||||
const result = await conn.executeStmt(sql, myOptions);
|
|
||||||
return itemsIndex === 0 ? result : result[itemsIndex];
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue