From 8f99b145100964de144469be2f820e8d723ebc5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Andr=C3=A9s?= Date: Thu, 9 Jan 2025 08:43:14 +0100 Subject: [PATCH] fix: refs #7965 UnifyProblems --- .../vn/procedures/sale_getProblems.sql | 43 +++++++++-------- .../vn/procedures/ticket_getProblems.sql | 48 +++++++++---------- 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/db/routines/vn/procedures/sale_getProblems.sql b/db/routines/vn/procedures/sale_getProblems.sql index ce6117ec5..483cacb1f 100644 --- a/db/routines/vn/procedures/sale_getProblems.sql +++ b/db/routines/vn/procedures/sale_getProblems.sql @@ -6,6 +6,7 @@ BEGIN /** * Calcula los problemas para un conjunto de sale * + * @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy * @table tmp.sale(saleFk) Identificadores de los sale a calcular * @return tmp.saleProblems */ @@ -45,7 +46,7 @@ BEGIN JOIN parking p ON p.id = sh.parkingFk JOIN sector s ON s.id = p.sectorFk GROUP BY ish.itemFk, s.warehouseFk; - + -- Disponible, faltas, inventario y retrasos OPEN vCursor; l: LOOP @@ -55,11 +56,11 @@ BEGIN IF vDone THEN LEAVE l; END IF; - + -- Disponible: no va a haber suficiente producto para preparar todos los pedidos CALL cache.available_refresh(vAvailableCache, FALSE, vWarehouseFk, vDate); - - -- Faltas: visible, disponible y ubicado son menores que la cantidad vendida + + -- Faltas: visible, disponible y ubicado son menores que la cantidad vendida CALL cache.visible_refresh(vVisibleCache, FALSE, vWarehouseFk); INSERT INTO tmp.saleProblems(saleFk, hasItemShortage) @@ -69,16 +70,16 @@ BEGIN JOIN ticket t ON t.id = s.ticketFk JOIN item i ON i.id = s.itemFk 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 cache.visible v ON v.item_id = i.id AND v.calc_id = vVisibleCache LEFT JOIN cache.available av ON av.item_id = i.id AND av.calc_id = vAvailableCache LEFT JOIN tItemShelving tis ON tis.itemFk = i.id - AND tis.warehouseFk = t.warehouseFk - WHERE IFNULL(v.visible, 0) < s.quantity - AND IFNULL(av.available, 0) < s.quantity - AND IFNULL(tis.visible, 0) < s.quantity + AND tis.warehouseFk = t.warehouseFk + WHERE (v.visible < s.quantity AND v.visible IS NOT NULL) + AND (av.available < s.quantity AND av.available IS NOT NULL) + AND (tis.visible < s.quantity AND tis.visible IS NOT NULL) AND NOT s.isPicked AND NOT s.reserved AND ic.merchandise @@ -87,7 +88,7 @@ BEGIN AND util.VN_CURDATE() = vDate AND t.warehouseFk = vWarehouseFk GROUP BY s.id; - + -- Inventario: Visible suficiente, pero ubicado menor a la cantidad vendida INSERT INTO tmp.saleProblems(saleFk, hasItemLost) SELECT s.id, TRUE @@ -100,9 +101,9 @@ BEGIN LEFT JOIN cache.visible v ON v.item_id = s.itemFk AND v.calc_id = vVisibleCache LEFT JOIN tItemShelving tis ON tis.itemFk = i.id - AND tis.warehouseFk = t.warehouseFk - WHERE IFNULL(v.visible, 0) >= s.quantity - AND IFNULL(tis.visible, 0) < s.quantity + AND tis.warehouseFk = t.warehouseFk + WHERE (v.visible >= s.quantity AND v.visible IS NOT NULL) + AND (tis.visible < s.quantity AND tis.visible IS NOT NULL) AND s.quantity > 0 AND NOT s.isPicked AND NOT s.reserved @@ -116,7 +117,7 @@ BEGIN -- Retraso: Disponible suficiente, pero no visible ni ubicado INSERT INTO tmp.saleProblems(saleFk, hasItemDelay) - SELECT s.id, TRUE + SELECT s.id, TRUE FROM tmp.sale ts JOIN sale s ON s.id = ts.saleFk JOIN ticket t ON t.id = s.ticketFk @@ -128,10 +129,10 @@ BEGIN LEFT JOIN cache.available av ON av.item_id = i.id AND av.calc_id = vAvailableCache LEFT JOIN tItemShelving tis ON tis.itemFk = i.id - AND tis.warehouseFk = t.warehouseFk - WHERE IFNULL(v.visible, 0) < s.quantity - AND IFNULL(av.available, 0) >= s.quantity - AND IFNULL(tis.visible, 0) < s.quantity + AND tis.warehouseFk = t.warehouseFk + WHERE (v.visible < s.quantity AND v.visible IS NOT NULL) + AND (av.available < s.quantity AND av.available IS NOT NULL) + AND (tis.visible < s.quantity AND tis.visible IS NOT NULL) AND s.quantity > 0 AND NOT s.isPicked AND NOT s.reserved @@ -141,9 +142,9 @@ BEGIN AND util.VN_CURDATE() = vDate AND t.warehouseFk = vWarehouseFk GROUP BY s.id - ON DUPLICATE KEY UPDATE hasItemDelay = TRUE; + ON DUPLICATE KEY UPDATE hasItemDelay = TRUE; - -- Redondeo: cantidad incorrecta con respecto al grouping + -- Redondeo: cantidad incorrecta con respecto al grouping CALL buy_getUltimate(NULL, vWarehouseFk, vDate); INSERT INTO tmp.saleProblems(saleFk, hasRounding) @@ -155,7 +156,7 @@ BEGIN JOIN item i ON i.id = s.itemFk JOIN tmp.buyUltimate bu ON bu.itemFk = s.itemFk JOIN buy b ON b.id = bu.buyFk - WHERE MOD(s.quantity, b.`grouping`) + WHERE MOD(s.quantity, b.`grouping`) GROUP BY s.id ON DUPLICATE KEY UPDATE hasRounding = TRUE; diff --git a/db/routines/vn/procedures/ticket_getProblems.sql b/db/routines/vn/procedures/ticket_getProblems.sql index fe77ed57b..1094a9d49 100644 --- a/db/routines/vn/procedures/ticket_getProblems.sql +++ b/db/routines/vn/procedures/ticket_getProblems.sql @@ -6,6 +6,7 @@ BEGIN /** * Calcula los problemas para un conjunto de tickets. * + * @param vIsTodayRelative Indica si se calcula el disponible como si todo saliera hoy * @table tmp.ticket(ticketFk) Identificadores de los tickets a calcular * @return tmp.ticketProblems, tmp.saleProblems */ @@ -13,14 +14,14 @@ BEGIN saleFk INT(11), PRIMARY KEY (saleFk) ) ENGINE = MEMORY - SELECT DISTINCT s.id saleFk + SELECT DISTINCT s.id saleFk FROM tmp.ticket tt - JOIN ticket t ON t.id = tt.ticketFk + JOIN ticket t ON t.id = tt.ticketFk JOIN sale s ON s.ticketFk = t.id WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayEnd(util.VN_CURDATE() + INTERVAL IF(vIsTodayRelative, 9.9, 1.9) DAY) GROUP BY s.id; - + CALL sale_getProblems(vIsTodayRelative); CREATE OR REPLACE TEMPORARY TABLE tmp.ticketProblems ( @@ -57,7 +58,7 @@ BEGIN FROM tmp.saleProblems sp JOIN vn.sale s ON s.id = sp.saleFk WHERE sp.hasRounding - GROUP BY s.ticketFk + GROUP BY s.ticketFk ), hasItemDelay AS( SELECT s.ticketFk FROM tmp.saleProblems sp @@ -71,23 +72,22 @@ BEGIN WHERE FIND_IN_SET('hasComponentLack', s.problem) GROUP BY s.ticketFk )SELECT tt.ticketFk, - IF(FIND_IN_SET('isFreezed', t.problem), TRUE, FALSE) isFreezed, + FIND_IN_SET('isFreezed', t.problem) isFreezed, t.risk, - IF(FIND_IN_SET('hasRisk', t.problem), TRUE, FALSE) hasRisk, - IF(FIND_IN_SET('hasHighRisk', t.problem), TRUE, FALSE) hasHighRisk, - IF(FIND_IN_SET('hasTicketRequest', t.problem), TRUE, FALSE) hasTicketRequest, - IF(FIND_IN_SET('isTaxDataChecked', t.problem), TRUE, FALSE) isTaxDataChecked, - IF(FIND_IN_SET('isTooLittle', t.problem) - AND util.VN_NOW() < (util.VN_CURDATE() + - INTERVAL HOUR(zc.`hour`) HOUR) + - INTERVAL MINUTE(zc.`hour`) MINUTE, - TRUE, FALSE) isTooLittle, - IF(c.businessTypeFk = 'VIP', TRUE, FALSE) isVip, - IF(his.ticketFk IS NULL, FALSE, TRUE) hasItemShortage, - IF(hid.ticketFk IS NULL, FALSE, TRUE) hasItemDelay, - IF(hil.ticketFk IS NULL, FALSE, TRUE) hasItemLost, - IF(hcl.ticketFk IS NULL, FALSE, TRUE) hasComponentLack, - IF(hr.ticketFk IS NULL, FALSE, TRUE) hasRounding, + FIND_IN_SET('hasRisk', t.problem) hasRisk, + FIND_IN_SET('hasHighRisk', t.problem) hasHighRisk, + FIND_IN_SET('hasTicketRequest', t.problem) hasTicketRequest, + FIND_IN_SET('isTaxDataChecked', t.problem) isTaxDataChecked, + FIND_IN_SET('isTooLittle', t.problem) + AND util.VN_NOW() < (util.VN_CURDATE() + + INTERVAL HOUR(zc.`hour`) HOUR) + + INTERVAL MINUTE(zc.`hour`) MINUTE isTooLittle, + c.businessTypeFk = 'VIP' isVip, + NOT (his.ticketFk IS NULL) hasItemShortage, + NOT (hid.ticketFk IS NULL) hasItemDelay, + NOT (hil.ticketFk IS NULL) hasItemLost, + NOT (hcl.ticketFk IS NULL) hasComponentLack, + NOT (hr.ticketFk IS NULL) hasRounding, 0 totalProblems FROM tmp.ticket tt JOIN vn.ticket t ON t.id = tt.ticketFk @@ -100,12 +100,12 @@ BEGIN LEFT JOIN vn.zoneClosure zc ON zc.zoneFk = t.zoneFk AND zc.dated = util.VN_CURDATE() GROUP BY t.id; - + UPDATE tmp.ticketProblems - SET totalProblems = isFreezed + hasHighRisk + hasTicketRequest + - isTaxDataChecked + hasComponentLack + hasItemDelay + + SET totalProblems = isFreezed + hasHighRisk + hasTicketRequest + + isTaxDataChecked + hasComponentLack + hasItemDelay + isTooLittle + hasItemLost + hasRounding + hasItemShortage + isVip; - + DROP TEMPORARY TABLE tmp.sale; END$$ DELIMITER ;