8069-Overstocking #3051
|
@ -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
|
||||
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
jgallego
commented
cal pensar, si hi ha 20 disponibles, pero el client demana 100? cal pensar, si hi ha 20 disponibles, pero el client demana 100?
pako
commented
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 ;
|
|
@ -12,6 +12,7 @@ BEGIN
|
|||
* @param vUser The user identifier
|
||||
*/
|
||||
DECLARE vHasRows BOOL;
|
||||
DECLARE vHas0Amount BOOL;
|
||||
DECLARE vDone BOOL;
|
||||
DECLARE vWarehouseFk INT;
|
||||
DECLARE vShipment DATE;
|
||||
|
@ -101,6 +102,8 @@ BEGIN
|
|||
|
||||
CALL order_checkEditable(vSelf);
|
||||
|
||||
jgallego marked this conversation as resolved
Outdated
jgallego
commented
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. 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
pako
commented
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
|
||||
SELECT COUNT(*) > 0 INTO vHasRows
|
||||
FROM orderRow
|
||||
|
@ -111,6 +114,18 @@ BEGIN
|
|||
CALL util.throw('ORDER_EMPTY');
|
||||
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
|
||||
OPEN vDates;
|
||||
lDates: LOOP
|
||||
|
|
|
@ -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 ;
|
|
@ -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';
|
sols una taula no cal alias