109 lines
2.3 KiB
MySQL
109 lines
2.3 KiB
MySQL
|
USE `hedera`;
|
||
|
DROP procedure IF EXISTS `orderAddItem`;
|
||
|
|
||
|
DELIMITER $$
|
||
|
USE `hedera`$$
|
||
|
CREATE DEFINER=`root`@`%` PROCEDURE `orderAddItem`(IN `vOrder` INT, IN `vWarehouse` INT, IN `vItem` INT, IN `vAmount` INT)
|
||
|
BEGIN
|
||
|
DECLARE vRow INT;
|
||
|
DECLARE vAdd INT;
|
||
|
DECLARE vAvailable INT;
|
||
|
DECLARE vDone BOOL;
|
||
|
DECLARE vGrouping INT;
|
||
|
DECLARE vRate INT;
|
||
|
DECLARE vShipment DATE;
|
||
|
DECLARE vPrice DECIMAL(10,2);
|
||
|
DECLARE vDate DATE;
|
||
|
DECLARE vAddress INT;
|
||
|
DECLARE vAgencyMode INT;
|
||
|
DECLARE cur CURSOR FOR
|
||
|
SELECT grouping, price, rate
|
||
|
FROM tmp.bionic_price
|
||
|
WHERE warehouse_id = vWarehouse
|
||
|
AND item_id = vItem
|
||
|
ORDER BY grouping DESC;
|
||
|
|
||
|
DECLARE CONTINUE HANDLER FOR NOT FOUND
|
||
|
SET vDone = TRUE;
|
||
|
|
||
|
DECLARE EXIT HANDLER FOR SQLEXCEPTION
|
||
|
BEGIN
|
||
|
ROLLBACK;
|
||
|
RESIGNAL;
|
||
|
END;
|
||
|
|
||
|
SELECT date_send, address_id, agency_id
|
||
|
INTO vDate, vAddress, vAgencyMode
|
||
|
FROM `order`
|
||
|
WHERE id = vOrder;
|
||
|
|
||
|
CALL vn2008.bionic_from_item(vDate, vAddress, vAgencyMode, vItem);
|
||
|
|
||
|
START TRANSACTION;
|
||
|
|
||
|
SELECT shipped INTO vShipment
|
||
|
FROM tmp.travel_tree
|
||
|
WHERE warehouseFk = vWarehouse;
|
||
|
|
||
|
SELECT available INTO vAvailable
|
||
|
FROM tmp.bionic_lot
|
||
|
WHERE warehouse_id = vWarehouse
|
||
|
AND item_id = vItem;
|
||
|
|
||
|
IF vAmount > IFNULL(vAvailable, 0)
|
||
|
THEN
|
||
|
CALL util.throw ('ORDER_ROW_UNAVAILABLE');
|
||
|
END IF;
|
||
|
|
||
|
OPEN cur;
|
||
|
|
||
|
l: LOOP
|
||
|
SET vDone = FALSE;
|
||
|
FETCH cur INTO vGrouping, vPrice, vRate;
|
||
|
|
||
|
IF vDone THEN
|
||
|
LEAVE l;
|
||
|
END IF;
|
||
|
|
||
|
SET vAdd = vAmount - MOD(vAmount, vGrouping);
|
||
|
SET vAmount = vAmount - vAdd;
|
||
|
|
||
|
IF vAdd = 0 THEN
|
||
|
ITERATE l;
|
||
|
END IF;
|
||
|
|
||
|
INSERT INTO order_row SET
|
||
|
order_id = vOrder,
|
||
|
item_id = vItem,
|
||
|
warehouse_id = vWarehouse,
|
||
|
shipment = vShipment,
|
||
|
rate = vRate,
|
||
|
amount = vAdd,
|
||
|
price = vPrice;
|
||
|
|
||
|
SET vRow = LAST_INSERT_ID();
|
||
|
|
||
|
INSERT INTO order_component (order_row_id, component_id, price)
|
||
|
SELECT vRow, c.component_id, c.cost
|
||
|
FROM tmp.bionic_component c
|
||
|
JOIN bi.tarifa_componentes t
|
||
|
ON t.Id_Componente = c.component_id
|
||
|
AND (t.tarifa_class IS NULL OR t.tarifa_class = vRate)
|
||
|
WHERE c.warehouse_id = vWarehouse
|
||
|
AND c.item_id = vItem;
|
||
|
END LOOP;
|
||
|
|
||
|
CLOSE cur;
|
||
|
|
||
|
IF vAmount > 0
|
||
|
THEN
|
||
|
CALL util.throw ('AMOUNT_NOT_MATCH_GROUPING');
|
||
|
END IF;
|
||
|
|
||
|
COMMIT;
|
||
|
CALL vn2008.bionic_free ();
|
||
|
END$$
|
||
|
|
||
|
DELIMITER ;
|
||
|
|