From 22719820fde2af9852ccef33994d8be752e1ae10 Mon Sep 17 00:00:00 2001
From: Pako <pako@verdnatura.es>
Date: Mon, 7 Oct 2024 14:21:18 +0200
Subject: [PATCH] feat: refs #8069 overStocking protocol

---
 .../orderRow_updateOverstocking.sql           | 52 +++++++++++++++++++
 .../procedures/order_confirmWithUser.sql      | 15 ++++++
 .../hedera/triggers/orderRow_afterInsert.sql  | 10 ++++
 .../11287-azureRaphis/00-firstScript.sql      |  3 ++
 4 files changed, 80 insertions(+)
 create mode 100644 db/routines/hedera/procedures/orderRow_updateOverstocking.sql
 create mode 100644 db/routines/hedera/triggers/orderRow_afterInsert.sql
 create mode 100644 db/versions/11287-azureRaphis/00-firstScript.sql

diff --git a/db/routines/hedera/procedures/orderRow_updateOverstocking.sql b/db/routines/hedera/procedures/orderRow_updateOverstocking.sql
new file mode 100644
index 0000000000..e919ff9229
--- /dev/null
+++ b/db/routines/hedera/procedures/orderRow_updateOverstocking.sql
@@ -0,0 +1,52 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`vn`@`localhost` 
+PROCEDURE `hedera`.`orderRow_updateOverstocking`(vOrderFk INT)
+BEGIN
+/**
+* Set amount = 0 to avoid overbooking sales
+* 
+* @param vOrderFk hedera.order.id
+*/
+	DECLARE vCalcFk INT;
+	DECLARE vDone BOOL;
+	DECLARE vWarehouseFk INT;
+
+	DECLARE cWarehouses CURSOR FOR
+		SELECT DISTINCT warehouseFk
+		FROM orderRow
+		WHERE orderFk = vOrderFk
+			AND shipment = util.VN_CURDATE();
+
+	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
+
+	DECLARE EXIT HANDLER FOR SQLEXCEPTION
+	BEGIN
+		ROLLBACK;
+		RESIGNAL;
+	END;
+
+	OPEN cWarehouses;
+	checking: LOOP
+		SET vDone = FALSE;
+
+		FETCH cWarehouses INTO vWarehouseFk;
+
+		IF vDone THEN
+			LEAVE checking;
+		END IF;
+
+		CALL cache.available_refresh(vCalcFk, FALSE, vWarehouseFk, util.VN_CURDATE());
+
+		UPDATE orderRow r
+				JOIN `order` o ON o.id = r.orderFk
+				JOIN orderConfig oc
+				JOIN cache.available a ON a.calc_id = vCalcFk AND a.item_id = r.itemFk
+			SET r.amount = 0
+			WHERE ADDTIME(o.rowUpdated, oc.reserveTime) < util.VN_NOW()
+				AND a.available <= 0
+				AND r.warehouseFk = vWarehouseFk
+				AND r.orderFk = vOrderFk;
+	END LOOP;
+	CLOSE cWarehouses;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/routines/hedera/procedures/order_confirmWithUser.sql b/db/routines/hedera/procedures/order_confirmWithUser.sql
index 2b033b704b..a0c5c56677 100644
--- a/db/routines/hedera/procedures/order_confirmWithUser.sql
+++ b/db/routines/hedera/procedures/order_confirmWithUser.sql
@@ -13,6 +13,7 @@ BEGIN
  */
 	DECLARE vHasRows BOOL;
 	DECLARE vDone BOOL;
+	DECLARE vHas0Amount BOOL;
 	DECLARE vWarehouseFk INT;
 	DECLARE vShipment DATE;
 	DECLARE vShipmentDayEnd DATETIME;
@@ -97,6 +98,20 @@ BEGIN
 		SELECT employeeFk INTO vUserFk FROM orderConfig;
 	END IF;
 
+	CALL orderRow_updateOverstocking(vSelf);
+
+	-- Check if any product has a quantity of 0
+	SELECT EXISTS (
+		SELECT id
+			FROM orderRow
+			WHERE orderFk = vSelf
+				AND amount = 0
+	) INTO vHas0Amount;
+
+	IF vHas0Amount THEN
+		CALL util.throw('Remove lines with quantity = 0 before confirming');
+	END IF;
+
 	START TRANSACTION;
 
 	CALL order_checkEditable(vSelf);
diff --git a/db/routines/hedera/triggers/orderRow_afterInsert.sql b/db/routines/hedera/triggers/orderRow_afterInsert.sql
new file mode 100644
index 0000000000..525e5d4d24
--- /dev/null
+++ b/db/routines/hedera/triggers/orderRow_afterInsert.sql
@@ -0,0 +1,10 @@
+DELIMITER $$
+CREATE OR REPLACE DEFINER=`root`@`localhost` TRIGGER `hedera`.`orderRow_afterInsert`
+	AFTER INSERT ON `orderRow`
+	FOR EACH ROW
+BEGIN
+	UPDATE `order` 
+		SET rowUpdated = NOW() 
+	WHERE id = NEW.orderFk;
+END$$
+DELIMITER ;
\ No newline at end of file
diff --git a/db/versions/11287-azureRaphis/00-firstScript.sql b/db/versions/11287-azureRaphis/00-firstScript.sql
new file mode 100644
index 0000000000..77d60eb40e
--- /dev/null
+++ b/db/versions/11287-azureRaphis/00-firstScript.sql
@@ -0,0 +1,3 @@
+-- Place your SQL code here
+ALTER TABLE hedera.`order` ADD IF NOT EXISTS rowUpdated DATETIME NULL 
+    COMMENT 'Timestamp for last updated record in orderRow table';
\ No newline at end of file