salix/db/routines/vn/procedures/sale_replaceItem.sql

148 lines
3.4 KiB
MySQL
Raw Normal View History

2024-01-25 16:33:54 +00:00
DELIMITER $$
2024-08-20 08:06:10 +00:00
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`sale_replaceItem`(vSaleFk INT, vNewItemFk INT, vQuantity INT)
2024-01-25 16:33:54 +00:00
BEGIN
/**
2024-11-27 17:19:57 +00:00
* Añade un nuevo artículo para sustituir a otro, y actualiza la memoria de sustituciones.
2024-01-25 16:33:54 +00:00
*
2024-11-27 17:19:57 +00:00
* @param vSaleFk Id de la tabla sale
* @param vNewItemFk Artículo sustituto
* @param vQuantity Cantidad que se va a sustituir
2024-01-25 16:33:54 +00:00
*/
DECLARE vTicketFk INT;
DECLARE vItemFk INT;
DECLARE vWarehouseFk SMALLINT;
DECLARE vDate DATE;
DECLARE vGrouping INT;
2024-04-17 05:15:24 +00:00
DECLARE vGroupingMode VARCHAR(255);
2024-01-25 16:33:54 +00:00
DECLARE vPacking INT;
DECLARE vRoundQuantity INT DEFAULT 1;
DECLARE vLanded DATE;
DECLARE vAddressFk INT;
DECLARE vAgencyModeFk INT;
DECLARE vNewPrice DECIMAL(10,2);
DECLARE vOldPrice DECIMAL(10,2);
2024-11-27 17:19:57 +00:00
DECLARE vNewForeignPrice DECIMAL(10,2);
DECLARE vOldForeignPrice DECIMAL(10,2);
2024-01-30 09:52:33 +00:00
DECLARE vOption VARCHAR(255);
2024-01-25 16:33:54 +00:00
DECLARE vNewSaleFk INT;
DECLARE vFinalPrice DECIMAL(10,2);
2024-11-27 17:19:57 +00:00
DECLARE vFinalForeignPrice DECIMAL(10,2);
DECLARE vCurrencyFk INT;
2024-01-25 16:33:54 +00:00
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
SELECT s.ticketFk,
LEAST(s.quantity, vQuantity),
s.itemFk,
t.shipped,
t.warehouseFk,
t.landed,
t.addressFk,
t.agencyModeFk,
2024-11-27 17:19:57 +00:00
s.price,
s.foreignPrice,
t.currencyFk
2024-01-25 16:33:54 +00:00
INTO vTicketFk,
vQuantity,
vItemFk,
vDate,
vWarehouseFk,
vLanded,
vAddressFk,
vAgencyModeFk,
2024-11-27 17:19:57 +00:00
vOldPrice,
vOldForeignPrice,
vCurrencyFk
2024-01-25 16:33:54 +00:00
FROM sale s
JOIN ticket t ON t.id = s.ticketFk
WHERE s.id = vSaleFk;
2024-07-16 16:44:24 +00:00
CALL buy_getUltimate(vNewItemFk, vWarehouseFk, vDate);
2024-01-25 16:33:54 +00:00
SELECT `grouping`, groupingMode, packing
2024-04-17 05:15:24 +00:00
INTO vGrouping,vGroupingMode,vPacking
2024-01-25 16:33:54 +00:00
FROM buy b
JOIN tmp.buyUltimate tmp ON b.id = tmp.buyFk
WHERE tmp.itemFk = vNewItemFk AND tmp.WarehouseFk = vWarehouseFk;
2024-07-16 16:44:24 +00:00
DROP TEMPORARY TABLE tmp.buyUltimate;
2024-11-27 17:19:57 +00:00
2024-04-17 05:15:24 +00:00
IF vGroupingMode = 'packing' AND vPacking > 0 THEN
2024-01-25 16:33:54 +00:00
SET vRoundQuantity = vPacking;
END IF;
2024-04-17 05:15:24 +00:00
IF vGroupingMode = 'grouping' AND vGrouping > 0 THEN
2024-01-25 16:33:54 +00:00
SET vRoundQuantity = vGrouping;
END IF;
CALL catalog_calcFromItem(
vLanded,
vAddressFk,
vAgencyModeFk,
2024-11-27 17:19:57 +00:00
vCurrencyFk,
2024-01-25 16:33:54 +00:00
vNewItemFk);
2024-11-27 17:19:57 +00:00
SELECT price, foreignPrice INTO vNewPrice, vNewForeignPrice
2024-03-25 13:56:12 +00:00
FROM tmp.ticketComponentPrice
2024-03-26 15:27:49 +00:00
ORDER BY (vQuantity % `grouping`) ASC
LIMIT 1;
2024-01-25 16:33:54 +00:00
2024-04-26 07:09:22 +00:00
IF vNewPrice IS NULL THEN
CALL util.throw('price retrieval failed');
END IF;
2024-01-25 16:33:54 +00:00
IF vNewPrice > vOldPrice THEN
2024-11-27 17:19:57 +00:00
SET vFinalPrice = vOldPrice,
vFinalForeignPrice = vOldForeignPrice,
vOption = 'substitution';
2024-01-25 16:33:54 +00:00
ELSE
2024-11-27 17:19:57 +00:00
SET vFinalPrice = vNewPrice,
vFinalForeignPrice = vNewForeignPrice,
vOption = 'renewPrices';
2024-01-25 16:33:54 +00:00
END IF;
START TRANSACTION;
UPDATE sale
2024-04-25 06:01:32 +00:00
SET originalQuantity = quantity - vQuantity,
quantity = quantity - vQuantity
2024-01-25 16:33:54 +00:00
WHERE id = vSaleFk;
INSERT INTO vn.sale(ticketFk,
itemFk,
quantity,
concept,
2024-11-27 17:19:57 +00:00
price,
foreignPrice)
2024-01-25 16:33:54 +00:00
SELECT vTicketFk,
vNewItemFk,
2024-04-26 07:09:22 +00:00
CEIL(vQuantity / vRoundQuantity) * vRoundQuantity,
CONCAT('+ ', i.name),
2024-11-27 17:19:57 +00:00
vFinalPrice,
vFinalForeignPrice
2024-01-25 16:33:54 +00:00
FROM vn.item i
WHERE id = vNewItemFk;
SELECT LAST_INSERT_ID() INTO vNewSaleFk;
DROP TEMPORARY TABLE IF EXISTS tmp.sale;
CREATE TEMPORARY TABLE tmp.sale
(PRIMARY KEY (saleFk))
ENGINE = MEMORY
SELECT id saleFk, vWarehouseFk warehouseFk
FROM sale s WHERE id = vNewSaleFk;
CALL ticketComponentUpdateSale(vOption);
CALL catalog_componentPurge();
INSERT INTO itemProposal(itemFk, mateFk, counter)
VALUES(vItemFk, vNewItemFk, 1)
ON DUPLICATE KEY UPDATE counter = counter + 1;
COMMIT;
END$$
DELIMITER ;