Merge pull request 'refactor: refs #8210 ticket_splitItemPackingType' (!3217) from 8210-RefactorTicket_splitItemPackingType into dev
gitea/salix/pipeline/head This commit looks good Details

Reviewed-on: #3217
Reviewed-by: Pako Natek <pako@verdnatura.es>
This commit is contained in:
Carlos Andrés 2024-11-21 12:39:34 +00:00
commit dbf71b981e
2 changed files with 94 additions and 92 deletions

View File

@ -5,122 +5,122 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_splitItemPacki
) )
BEGIN BEGIN
/** /**
* Clona y reparte las ventas de un ticket en funcion del tipo de empaquetado. * Separa en diferentes tickets según el tipo de empaquetado
* Respeta el id inicial para el tipo propuesto. * El ticket original conserva las líneas del tipo de empaquetado especificado
* Las líneas sin tipo de empaquetado se asignan al ticket del tipo por defecto.
* *
* @param vSelf Id ticket * @param vSelf Id del ticket original
* @param vOriginalItemPackingTypeFk Tipo para el que se reserva el número de ticket original * @param vOriginalItemPackingTypeFk Tipo de empaquetado a mantener en el ticket original
* @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk) * @return table tmp.ticketIPT(ticketFk, itemPackingTypeFk)
*/ */
DECLARE vItemPackingTypeFk VARCHAR(1) DEFAULT 'H'; DECLARE vIsDone BOOLEAN DEFAULT FALSE;
DECLARE vCurrentPackingType VARCHAR(1);
DECLARE vDefaultPackingType VARCHAR(1);
DECLARE vHasOriginalPackingType BOOLEAN;
DECLARE vNewTicketFk INT; DECLARE vNewTicketFk INT;
DECLARE vPackingTypesToSplit INT; DECLARE vTicketFk INT;
DECLARE vDone INT DEFAULT FALSE;
DECLARE vSaleGroup CURSOR FOR DECLARE vItemPackingTypes CURSOR FOR
SELECT itemPackingTypeFk SELECT DISTINCT itemPackingTypeFk FROM tSalesToMove;
FROM tSaleGroup
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 vIsDone = TRUE;
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
CREATE OR REPLACE TEMPORARY TABLE tSalesToMove (
ticketFk INT,
saleFk INT,
itemPackingTypeFk VARCHAR(1)
) ENGINE=MEMORY;
SELECT COALESCE(MAX(ic.defaultPackingTypeFk), MAX(i.itemPackingTypeFk)) INTO vDefaultPackingType
FROM vn.sale s
JOIN item i ON i.id = s.itemFk
LEFT JOIN itemConfig ic ON ic.defaultPackingTypeFk = i.itemPackingTypeFk
WHERE s.ticketFk = vSelf
GROUP BY s.ticketFk;
SELECT EXISTS (
SELECT TRUE
FROM sale s
JOIN item i ON i.id = s.itemFk
WHERE s.ticketFk = vSelf
AND i.itemPackingTypeFk = vOriginalItemPackingTypeFk
) INTO vHasOriginalPackingType;
IF vOriginalItemPackingTypeFk IS NULL OR NOT vHasOriginalPackingType THEN
SET vOriginalItemPackingTypeFk = vDefaultPackingType;
END IF;
START TRANSACTION; START TRANSACTION;
SELECT id SELECT t.id INTO vTicketFk
FROM sale FROM ticket t
WHERE ticketFk = vSelf JOIN sale s ON s.id = t.id
AND NOT quantity WHERE t.id = vSelf
FOR UPDATE; FOR UPDATE;
DELETE FROM sale INSERT INTO tSalesToMove (saleFk, itemPackingTypeFk)
WHERE NOT quantity SELECT s.id, i.itemPackingTypeFk
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 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 s.ticketFk = vSelf
WHERE s.ticketFk = vSelf; AND i.itemPackingTypeFk <> vOriginalItemPackingTypeFk;
CREATE OR REPLACE TEMPORARY TABLE tSaleGroup OPEN vItemPackingTypes;
ENGINE = MEMORY l: LOOP
SELECT itemPackingTypeFk, SUM(litros) totalLitros SET vIsDone = FALSE;
FROM tSale FETCH vItemPackingTypes INTO vCurrentPackingType;
GROUP BY itemPackingTypeFk;
SELECT COUNT(*) INTO vPackingTypesToSplit IF vIsDone THEN
FROM tSaleGroup LEAVE l;
WHERE itemPackingTypeFk IS NOT NULL; END IF;
CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT( CALL ticket_Clone(vSelf, vNewTicketFk);
ticketFk INT,
itemPackingTypeFk VARCHAR(1)
) ENGINE = MEMORY;
CASE vPackingTypesToSplit SELECT id INTO vTicketFk
WHEN 0 THEN FROM ticket t
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk) WHERE t.id = vNewTicketFk
VALUES(vSelf, vItemPackingTypeFk); FOR UPDATE;
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) UPDATE tSalesToMove
VALUES(vSelf, vItemPackingTypeFk); SET ticketFk = vNewTicketFk
WHERE itemPackingTypeFk = vCurrentPackingType;
l: LOOP IF vCurrentPackingType = vDefaultPackingType THEN
SET vDone = FALSE; INSERT INTO tSalesToMove (ticketFk, saleFk, itemPackingTypeFk)
FETCH vSaleGroup INTO vItemPackingTypeFk; SELECT vNewTicketFk, s.id, i.itemPackingTypeFk
FROM sale s
JOIN item i ON i.id = s.itemFk
WHERE s.ticketFk = vSelf
AND i.itemPackingTypeFk IS NULL;
END IF;
IF vDone THEN END LOOP;
LEAVE l; CLOSE vItemPackingTypes;
END IF;
CALL ticket_Clone(vSelf, vNewTicketFk); UPDATE sale s
JOIN tSalesToMove t ON t.saleFk = s.id
SET s.ticketFk = t.ticketFk;
INSERT INTO tmp.ticketIPT(ticketFk, itemPackingTypeFk) CREATE OR REPLACE TEMPORARY TABLE tmp.ticketIPT
VALUES(vNewTicketFk, vItemPackingTypeFk); ENGINE=MEMORY
END LOOP; SELECT s.ticketFk, MAX(i.itemPackingTypeFk) itemPackingTypeFk
FROM sale s
CLOSE vSaleGroup; JOIN item i ON i.id = s.itemFk
WHERE s.ticketFk = vSelf
SELECT s.id GROUP BY s.ticketFk
FROM sale s UNION
JOIN tSale ts ON ts.id = s.id SELECT ticketFk, MAX(itemPackingTypeFk)
JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = ts.itemPackingTypeFk FROM tSalesToMove
FOR UPDATE; GROUP BY ticketFk;
UPDATE sale s
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
FROM tSaleGroup sg
WHERE sg.itemPackingTypeFk IS NOT NULL
ORDER BY sg.itemPackingTypeFk
LIMIT 1;
UPDATE sale s
JOIN tSale ts ON ts.id = s.id
JOIN tmp.ticketIPT t ON t.itemPackingTypeFk = vItemPackingTypeFk
SET s.ticketFk = t.ticketFk
WHERE ts.itemPackingTypeFk IS NULL;
END CASE;
COMMIT; COMMIT;
DROP TEMPORARY TABLE DROP TEMPORARY TABLE tSalesToMove;
tSale,
tSaleGroup;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -0,0 +1,2 @@
ALTER TABLE vn.itemConfig ADD defaultPackingTypeFk VARCHAR(1) DEFAULT 'H' NULL;