8069-Overstocking #3051

Merged
pako merged 7 commits from 8069-Overstocking into dev 2024-10-02 12:34:14 +00:00
4 changed files with 80 additions and 0 deletions

View File

@ -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
jgallego marked this conversation as resolved Outdated

sols una taula no cal alias

sols una taula no cal alias
AND shipped = 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
pako marked this conversation as resolved
Review

cal pensar, si hi ha 20 disponibles, pero el client demana 100?

cal pensar, si hi ha 20 disponibles, pero el client demana 100?
Review

a.available <= 0 soluciona el tema. Quan la cistella de la compra està fora de hora, eixa quantitat no s'ha tingut en compte en el càlcul del disponible

a.available <= 0 soluciona el tema. Quan la cistella de la compra està fora de hora, eixa quantitat no s'ha tingut en compte en el càlcul del disponible
AND r.warehouseFk = vWarehouseFk
AND r.orderFk = vOrderFk;
END LOOP;
CLOSE cWarehouses;
END$$
DELIMITER ;

View File

@ -12,6 +12,7 @@ BEGIN
* @param vUser The user identifier * @param vUser The user identifier
*/ */
DECLARE vHasRows BOOL; DECLARE vHasRows BOOL;
DECLARE vHas0Amount BOOL;
DECLARE vDone BOOL; DECLARE vDone BOOL;
DECLARE vWarehouseFk INT; DECLARE vWarehouseFk INT;
DECLARE vShipment DATE; DECLARE vShipment DATE;
@ -101,6 +102,8 @@ BEGIN
CALL order_checkEditable(vSelf); CALL order_checkEditable(vSelf);
jgallego marked this conversation as resolved Outdated

es confirmen moltisim pedidos al dia, pero la cache no es calcula tantes vegades, este enfoque colocaria molta carrega, faria les mateixes comprobacions practicamente cada minut varies vegades.
Quan parlarem diguerem de asociar-ho al calcul del disponible

es confirmen moltisim pedidos al dia, pero la cache no es calcula tantes vegades, este enfoque colocaria molta carrega, faria les mateixes comprobacions practicamente cada minut varies vegades. Quan parlarem diguerem de asociar-ho al calcul del disponible
Outdated
Review

Si ho fique en available_refresh, estic cridant desde el esquema hedera al esquema order

I si per eixemple, algú a mà coloca una quantitat gran en una linea de pedido, al recalcular el dispo, borraría moltes cistelles. Després, si modifica la quantitat, les cistelles no tornen al lloc. Per això semblava millor que en el moment de confirmar, faça la cridà.

Si ho fique en available_refresh, estic cridant desde el esquema hedera al esquema order I si per eixemple, algú a mà coloca una quantitat gran en una linea de pedido, al recalcular el dispo, borraría moltes cistelles. Després, si modifica la quantitat, les cistelles no tornen al lloc. Per això semblava millor que en el moment de confirmar, faça la cridà.
CALL orderRow_updateOverstocking(vSelf);
-- Check order is not empty -- Check order is not empty
SELECT COUNT(*) > 0 INTO vHasRows SELECT COUNT(*) > 0 INTO vHasRows
FROM orderRow FROM orderRow
@ -111,6 +114,18 @@ BEGIN
CALL util.throw('ORDER_EMPTY'); CALL util.throw('ORDER_EMPTY');
END IF; END IF;
-- 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;
-- Crea los tickets del pedido -- Crea los tickets del pedido
OPEN vDates; OPEN vDates;
lDates: LOOP lDates: LOOP

View File

@ -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 ;

View File

@ -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';