refactor: refs #8058
gitea/salix/pipeline/pr-test There was a failure building this commit Details

This commit is contained in:
Carlos Andrés 2024-10-07 16:15:28 +02:00
parent 98bc78fd42
commit aa9a2dfda0
2 changed files with 71 additions and 102 deletions

View File

@ -3,12 +3,19 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_mergeSales`(
vSelf INT vSelf INT
) )
BEGIN BEGIN
DECLARE vHasSalesToMerge BOOL;
DECLARE EXIT HANDLER FOR SQLEXCEPTION DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN BEGIN
ROLLBACK; ROLLBACK;
RESIGNAL; RESIGNAL;
END; END;
START TRANSACTION;
SELECT id INTO vSelf
FROM ticket
WHERE id = vSelf FOR UPDATE;
CREATE OR REPLACE TEMPORARY TABLE tSalesToPreserve CREATE OR REPLACE TEMPORARY TABLE tSalesToPreserve
(PRIMARY KEY (id)) (PRIMARY KEY (id))
ENGINE = MEMORY ENGINE = MEMORY
@ -18,26 +25,25 @@ BEGIN
JOIN itemType it ON it.id = i.typeFk JOIN itemType it ON it.id = i.typeFk
WHERE s.ticketFk = vSelf WHERE s.ticketFk = vSelf
AND it.isMergeable AND it.isMergeable
GROUP BY s.itemFk, s.price, s.discount; GROUP BY s.itemFk, s.price, s.discount
HAVING COUNT(*) > 1;
START TRANSACTION; SELECT COUNT(*) INTO vHasSalesToMerge
FROM tSalesToPreserve;
UPDATE sale s IF vHasSalesToMerge THEN
JOIN tSalesToPreserve stp ON stp.id = s.id UPDATE sale s
SET s.quantity = newQuantity JOIN tSalesToPreserve stp ON stp.id = s.id
WHERE s.ticketFk = vSelf; SET s.quantity = newQuantity;
DELETE s.* DELETE s
FROM sale s FROM sale s
LEFT JOIN tSalesToPreserve stp ON stp.id = s.id JOIN tSalesToPreserve stp ON stp.itemFk = s.itemFk
JOIN item i ON i.id = s.itemFk WHERE s.ticketFk = vSelf
JOIN itemType it ON it.id = i.typeFk AND s.id <> stp.id;
WHERE s.ticketFk = vSelf END IF;
AND stp.id IS NULL
AND it.isMergeable;
COMMIT; COMMIT;
DROP TEMPORARY TABLE tSalesToPreserve; DROP TEMPORARY TABLE tSalesToPreserve;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -12,115 +12,78 @@ BEGIN
* @param vOriginalItemPackingTypeFk Tipo para el que se reserva el número de ticket original * @param vOriginalItemPackingTypeFk Tipo para el que se reserva el número de ticket original
* @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk) * @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk)
*/ */
DECLARE vItemPackingTypeFk VARCHAR(1) DEFAULT 'H';
DECLARE vNewTicketFk INT;
DECLARE vPackingTypesToSplit INT;
DECLARE vDone INT DEFAULT FALSE; DECLARE vDone INT DEFAULT FALSE;
DECLARE vHasItemPackingType BOOL;
DECLARE vItemPackingTypeFk INT;
DECLARE vNewTicketFk INT;
DECLARE vSaleGroup CURSOR FOR DECLARE vItemPackingTypes CURSOR FOR
SELECT itemPackingTypeFk SELECT DISTINCT itemPackingTypeFk
FROM tSaleGroup FROM tSalesToMove;
WHERE itemPackingTypeFk IS NOT NULL
ORDER BY (itemPackingTypeFk = vOriginalItemPackingTypeFk) DESC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE; DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
START TRANSACTION; SELECT COUNT(*) INTO vHasItemPackingType
FROM ticket t
SELECT id JOIN sale s ON s.ticketFk = t.id
FROM sale
WHERE ticketFk = vSelf
AND NOT quantity
FOR UPDATE;
DELETE FROM sale
WHERE NOT quantity
AND ticketFk = vSelf;
CREATE OR REPLACE TEMPORARY TABLE tSale
(PRIMARY KEY (id))
ENGINE = MEMORY
SELECT s.id, i.itemPackingTypeFk, IFNULL(sv.litros, 0) litros
FROM sale s
JOIN item i ON i.id = s.itemFk JOIN item i ON i.id = s.itemFk
LEFT JOIN saleVolume sv ON sv.saleFk = s.id WHERE t.id = vSelf
WHERE s.ticketFk = vSelf; AND i.itemPackingTypeFk = vOriginalItemPackingTypeFk;
CREATE OR REPLACE TEMPORARY TABLE tSaleGroup
ENGINE = MEMORY
SELECT itemPackingTypeFk, SUM(litros) totalLitros
FROM tSale
GROUP BY itemPackingTypeFk;
SELECT COUNT(*) INTO vPackingTypesToSplit
FROM tSaleGroup
WHERE itemPackingTypeFk IS NOT NULL;
CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT( CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT(
ticketFk INT, ticketFk INT,
itemPackingTypeFk VARCHAR(1) itemPackingTypeFk VARCHAR(1)
) ENGINE = MEMORY; ) ENGINE=MEMORY
SELECT vSelf, vOriginalItemPackingTypeFk;
CASE vPackingTypesToSplit IF NOT vHasItemPackingType THEN
WHEN 0 THEN LEAVE proc;
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk) END IF;
VALUES(vSelf, vItemPackingTypeFk);
WHEN 1 THEN
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk)
SELECT vSelf, itemPackingTypeFk
FROM tSaleGroup
WHERE itemPackingTypeFk IS NOT NULL;
ELSE
OPEN vSaleGroup;
FETCH vSaleGroup INTO vItemPackingTypeFk;
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk) CREATE OR REPLACE TEMPORARY TABLE tSalesToMove (
VALUES(vSelf, vItemPackingTypeFk); ticketFk INT,
saleFk INT,
itemPackingTypeFk INT
) ENGINE=MEMORY;
l: LOOP INSERT INTO tSalesToMove (saleFk, itemPackingTypeFk)
SET vDone = FALSE; SELECT s.id, i.itemPackingTypeFk
FETCH vSaleGroup INTO vItemPackingTypeFk; FROM ticket t
JOIN sale s ON s.ticketFk = t.id
JOIN item i ON i.id = s.itemFk
WHERE t.id = vSelf
AND i.itemPackingTypeFk <> vOriginalItemPackingTypeFk;
IF vDone THEN OPEN vItemPackingTypes;
LEAVE l;
END IF;
CALL ticket_Clone(vSelf, vNewTicketFk); l: LOOP
SET vDone = FALSE;
FETCH vItemPackingTypes INTO vItemPackingTypeFk;
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk) IF vDone THEN
VALUES(vNewTicketFk, vItemPackingTypeFk); LEAVE l;
END LOOP; END IF;
CLOSE vSaleGroup; CALL ticket_Clone(vSelf, vNewTicketFk);
SELECT s.id UPDATE tSalesToMove
FROM sale s SET ticketFk = vNewTicketFk
JOIN tSale ts ON ts.id = s.id WHERE itemPackingTypeFk = vItemPackingTypeFk;
JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
FOR UPDATE;
UPDATE sale s END LOOP;
JOIN tSale ts ON ts.id = s.id
JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk
SET s.ticketFk = t.ticketFk;
SELECT itemPackingTypeFk INTO vItemPackingTypeFk CLOSE vItemPackingTypes;
FROM tSaleGroup sg
WHERE sg.itemPackingTypeFk IS NOT NULL
ORDER BY sg.itemPackingTypeFk
LIMIT 1;
UPDATE sale s UPDATE sale s
JOIN tSale ts ON ts.id = s.id JOIN tSalesToMove stm ON stm.saleFk = s.id
JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = vItemPackingTypeFk SET s.ticketFk = stm.ticketFk
SET s.ticketFk = t.ticketFk WHERE stm.ticketFk;
WHERE ts.itemPackingTypeFk IS NULL;
END CASE;
COMMIT; INSERT INTO tmp.ticketIPT
SELECT ticketFk, itemPackingTypeFk
FROM tSalesToMove
GROUP BY ticketFk;
DROP TEMPORARY TABLE DROP TEMPORARY TABLE tSalesToMove;
tSale,
tSaleGroup;
END$$ END$$
DELIMITER ; DELIMITER ;