Merge pull request '8408-disponible-por-zonas' (!3495) from 8408-disponible-por-zonas into dev
gitea/salix/pipeline/head This commit looks good Details

Reviewed-on: #3495
Reviewed-by: Javi Gallego <jgallego@verdnatura.es>
This commit is contained in:
Pako Natek 2025-02-27 11:03:02 +00:00
commit 7b8476b42c
8 changed files with 118 additions and 78 deletions

View File

@ -278,6 +278,15 @@ INSERT INTO `hedera`.`tpvConfig` (currency, terminal, transactionType, maxAmount
INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk) INSERT INTO hedera.tpvMerchantEnable (merchantFk, companyFk)
VALUES (1, 442); VALUES (1, 442);
/* UPDATE vn.ticket t
JOIN vn.zone z ON z.id = t.zoneFk
SET t.shipped = DATE(t.shipped) +
INTERVAL HOUR(z.hour) HOUR +
INTERVAL MINUTE(z.hour) MINUTE;
*/
UPDATE vn.travel
SET availabled = landed
WHERE availabled IS NULL;
-- XXX -- XXX
SET foreign_key_checks = 1; SET foreign_key_checks = 1;

View File

@ -6,7 +6,15 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`available_refresh`
`vAvailabled` DATETIME `vAvailabled` DATETIME
) )
proc: BEGIN proc: BEGIN
DECLARE vStartDate DATE; /**
* Calculates the availability of all items by warehouse and date
*
* @param vCalc Returns cache.cache_calc.id
* @param vRefresh Forces the calculation
* @param vWarehouse vn.warehouse.id
* @param vAvailabled Moment in time for required availability
*
*/
DECLARE vReserveDate DATETIME; DECLARE vReserveDate DATETIME;
DECLARE vParams CHAR(100); DECLARE vParams CHAR(100);
DECLARE vInventoryDate DATE; DECLARE vInventoryDate DATE;
@ -28,7 +36,7 @@ proc: BEGIN
SET vAvailabled = vDated + INTERVAL HOUR(vAvailabled) HOUR; SET vAvailabled = vDated + INTERVAL HOUR(vAvailabled) HOUR;
CALL vn.item_getStock(vWarehouse, vDated, NULL); CALL vn.item_getStock(vWarehouse, vAvailabled, NULL);
SET vParams = CONCAT_WS('/', vWarehouse, vAvailabled); SET vParams = CONCAT_WS('/', vWarehouse, vAvailabled);
CALL cache_calc_start (vCalc, vRefresh, 'available', vParams); CALL cache_calc_start (vCalc, vRefresh, 'available', vParams);
@ -38,10 +46,16 @@ proc: BEGIN
END IF; END IF;
-- Calcula algunos parámetros necesarios -- Calcula algunos parámetros necesarios
SET vStartDate = TIMESTAMP(vDated, '00:00:00'); SELECT inventoried
SELECT inventoried INTO vInventoryDate FROM vn.config; INTO vInventoryDate
SELECT DATE_SUB(vStartDate, INTERVAL MAX(life) DAY) INTO vLifeScope FROM vn.itemType; FROM vn.config;
SELECT SUBTIME(util.VN_NOW(), reserveTime) INTO vReserveDate
SELECT DATE_SUB(vDated, INTERVAL MAX(life) DAY)
INTO vLifeScope
FROM vn.itemType;
SELECT SUBTIME(util.VN_NOW(), reserveTime)
INTO vReserveDate
FROM hedera.orderConfig; FROM hedera.orderConfig;
SELECT w.id INTO vWarehouseFkInventory SELECT w.id INTO vWarehouseFkInventory
@ -49,22 +63,22 @@ proc: BEGIN
WHERE w.code = 'inv'; WHERE w.code = 'inv';
-- Calcula el ultimo dia de vida para cada producto -- Calcula el ultimo dia de vida para cada producto
DROP TEMPORARY TABLE IF EXISTS itemRange; CREATE OR REPLACE TEMPORARY TABLE itemRange
CREATE TEMPORARY TABLE itemRange
(PRIMARY KEY (itemFk)) (PRIMARY KEY (itemFk))
ENGINE = MEMORY ENGINE = MEMORY
SELECT i.id itemFk, SELECT i.id itemFk,
util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended, it.life util.dayEnd(DATE_ADD(c.maxLanded, INTERVAL it.life DAY)) ended,
it.life
FROM vn.item i FROM vn.item i
LEFT JOIN ( LEFT JOIN (
SELECT b.itemFk, MAX(t.landed) maxLanded SELECT b.itemFk, MAX(t.availabled) maxLanded
FROM vn.buy b FROM vn.buy b
JOIN vn.entry e ON b.entryFk = e.id JOIN vn.entry e ON b.entryFk = e.id
JOIN vn.travel t ON t.id = e.travelFk JOIN vn.travel t ON t.id = e.travelFk
JOIN vn.warehouse w ON w.id = t.warehouseInFk JOIN vn.warehouse w ON w.id = t.warehouseInFk
JOIN vn.item i ON i.id = b.itemFk JOIN vn.item i ON i.id = b.itemFk
JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.itemType it ON it.id = i.typeFk
WHERE t.landed BETWEEN vLifeScope AND vStartDate WHERE t.landed BETWEEN vLifeScope AND vDated
AND t.warehouseInFk = vWarehouse AND t.warehouseInFk = vWarehouse
AND t.warehouseOutFk <> vWarehouseFkInventory AND t.warehouseOutFk <> vWarehouseFkInventory
AND it.life AND it.life
@ -72,62 +86,78 @@ proc: BEGIN
GROUP BY b.itemFk GROUP BY b.itemFk
) c ON i.id = c.itemFk ) c ON i.id = c.itemFk
JOIN vn.itemType it ON it.id = i.typeFk JOIN vn.itemType it ON it.id = i.typeFk
HAVING ended >= vStartDate OR life IS NULL; HAVING ended >= vDated OR life IS NULL;
-- Calcula el ATP -- Calcula el ATP (Available to Promise)
DELETE FROM available WHERE calc_id = vCalc; DELETE FROM available WHERE calc_id = vCalc;
DROP TEMPORARY TABLE IF EXISTS tmp.itemCalc; CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
CREATE TEMPORARY TABLE tmp.itemCalc
(INDEX (itemFk,warehouseFk)) (INDEX (itemFk,warehouseFk))
ENGINE = MEMORY ENGINE = MEMORY
SELECT itemFk, vWarehouse warehouseFk, DATE(dated) dated, SUM(quantity) quantity SELECT itemFk,
FROM (SELECT i.itemFk, i.shipped dated, i.quantity vWarehouse warehouseFk,
dated,
SUM(quantity) quantity
FROM (
SELECT i.itemFk,
i.shipped dated,
i.quantity
FROM vn.itemTicketOut i FROM vn.itemTicketOut i
JOIN itemRange ir ON ir.itemFk = i.itemFk JOIN itemRange ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vStartDate WHERE i.shipped >= vAvailabled
AND (ir.ended IS NULL OR i.shipped <= ir.ended) AND (ir.ended IS NULL
OR i.shipped <= ir.ended)
AND i.warehouseFk = vWarehouse AND i.warehouseFk = vWarehouse
UNION ALL UNION ALL
SELECT i.itemFk, IFNULL(i.availabled, i.landed), i.quantity SELECT i.itemFk,
i.availabled,
i.quantity
FROM vn.itemEntryIn i FROM vn.itemEntryIn i
JOIN itemRange ir ON ir.itemFk = i.itemFk JOIN itemRange ir ON ir.itemFk = i.itemFk
LEFT JOIN edi.warehouseFloramondo wf ON wf.entryFk = i.entryFk WHERE i.availabled >= vAvailabled
WHERE IFNULL(i.availabled, i.landed) >= vStartDate AND (ir.ended IS NULL
AND IFNULL(i.availabled, i.landed) <= vAvailabled OR i.availabled <= ir.ended)
AND (ir.ended IS NULL OR IFNULL(i.availabled, i.landed) <= ir.ended)
AND i.warehouseInFk = vWarehouse AND i.warehouseInFk = vWarehouse
AND wf.entryFk IS NULL UNION ALL
UNION ALL SELECT i.itemFk,
SELECT i.itemFk, i.shipped, i.quantity i.shipped,
i.quantity
FROM vn.itemEntryOut i FROM vn.itemEntryOut i
JOIN itemRange ir ON ir.itemFk = i.itemFk JOIN itemRange ir ON ir.itemFk = i.itemFk
WHERE i.shipped >= vStartDate WHERE i.shipped >= vAvailabled
AND (ir.ended IS NULL OR i.shipped <= ir.ended) AND (ir.ended IS NULL
OR i.shipped <= ir.ended)
AND i.warehouseOutFk = vWarehouse AND i.warehouseOutFk = vWarehouse
UNION ALL UNION ALL
SELECT r.item_id, r.shipment, -r.amount SELECT r.item_id,
r.shipment,
-r.amount
FROM hedera.order_row r FROM hedera.order_row r
JOIN hedera.`order` o ON o.id = r.order_id JOIN hedera.`order` o ON o.id = r.order_id
JOIN itemRange ir ON ir.itemFk = r.item_id JOIN itemRange ir ON ir.itemFk = r.item_id
WHERE r.shipment >= vStartDate WHERE r.shipment >= vDated
AND (ir.ended IS NULL OR r.shipment <= ir.ended) AND (ir.ended IS NULL
OR r.shipment <= ir.ended)
AND r.warehouse_id = vWarehouse AND r.warehouse_id = vWarehouse
AND r.created >= vReserveDate AND r.created >= vReserveDate
AND NOT o.confirmed AND NOT o.confirmed
) t ) t
GROUP BY itemFk, dated; GROUP BY itemFk, dated;
CALL vn.item_getAtp(vDated); CALL vn.item_getAtp(vAvailabled);
INSERT INTO available (calc_id, item_id, available) INSERT INTO available (calc_id, item_id, available)
SELECT vCalc, sub.itemFk, SUM(sub.quantity) SELECT vCalc,
sub.itemFk,
SUM(sub.quantity)
FROM ( FROM (
SELECT ir.itemFk, stock quantity SELECT ir.itemFk,
stock quantity
FROM tmp.itemList il FROM tmp.itemList il
JOIN itemRange ir ON ir.itemFk = il.itemFk JOIN itemRange ir ON ir.itemFk = il.itemFk
UNION ALL UNION ALL
SELECT itemFk, quantity SELECT itemFk,
quantity
FROM tmp.itemAtp FROM tmp.itemAtp
)sub )sub
GROUP BY sub.itemFk; GROUP BY sub.itemFk;

View File

@ -2,7 +2,7 @@ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`stock_refresh`(v_refresh BOOL) CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `cache`.`stock_refresh`(v_refresh BOOL)
proc: BEGIN proc: BEGIN
/** /**
* Crea o actualiza la cache con el disponible hasta el ­a de * Crea o actualiza la cache con el disponible hasta el a de
* ayer. Esta cache es usada como base para otros procedimientos * ayer. Esta cache es usada como base para otros procedimientos
* como el cálculo del visible o del ATP. * como el cálculo del visible o del ATP.
* *
@ -36,15 +36,19 @@ proc: BEGIN
( (
SELECT itemFk AS item_id, warehouseFk AS warehouse_id, quantity AS amount SELECT itemFk AS item_id, warehouseFk AS warehouse_id, quantity AS amount
FROM vn.itemTicketOut FROM vn.itemTicketOut
WHERE shipped >= v_date_inv AND shipped < vCURDATE WHERE shipped >= v_date_inv
AND shipped < vCURDATE
UNION ALL UNION ALL
SELECT itemFk ASitem_id, warehouseInFk AS warehouse_id, quantity AS amount SELECT itemFk ASitem_id, warehouseInFk AS warehouse_id, quantity AS amount
FROM vn.itemEntryIn FROM vn.itemEntryIn
WHERE landed >= v_date_inv AND landed < vCURDATE AND isVirtualStock is FALSE WHERE availabled >= v_date_inv
AND availabled < vCURDATE
AND isVirtualStock is FALSE
UNION ALL UNION ALL
SELECT itemFk AS item_id ,warehouseOutFk AS warehouse_id, quantity AS amount SELECT itemFk AS item_id ,warehouseOutFk AS warehouse_id, quantity AS amount
FROM vn.itemEntryOut FROM vn.itemEntryOut
WHERE shipped >= v_date_inv AND shipped < vCURDATE WHERE shipped >= v_date_inv
AND shipped < vCURDATE
) t ) t
GROUP BY item_id, warehouse_id HAVING amount != 0; GROUP BY item_id, warehouse_id HAVING amount != 0;

View File

@ -1,11 +1,10 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vDated DATE) CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getAtp`(vAvailabled DATETIME)
BEGIN BEGIN
/** /**
* Calcula el valor mínimo acumulado para cada artículo ordenado por fecha y * Calcula el valor mínimo acumulado para cada artículo por almacén.
* almacén.
* *
* @param vDated Si no hay movimientos en la fecha indicada, debe devolver 0 * @param vAvailabled Starting time for calculation
* @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity) * @table tmp.itemCalc(itemFk, wareHouseFk, dated, quantity)
* @return tmp.itemAtp(itemFk, warehouseFk, quantity) * @return tmp.itemAtp(itemFk, warehouseFk, quantity)
*/ */
@ -17,7 +16,7 @@ BEGIN
SELECT itemFk, warehouseFk, dated, quantity SELECT itemFk, warehouseFk, dated, quantity
FROM tmp.itemCalc FROM tmp.itemCalc
UNION ALL UNION ALL
SELECT itemFk, warehouseFk, vDated, 0 SELECT itemFk, warehouseFk, vAvailabled, 0
FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2 FROM (SELECT DISTINCT itemFk, warehouseFk FROM tmp.itemCalc) t2
) t1 ) t1
GROUP BY itemFk, warehouseFk, dated GROUP BY itemFk, warehouseFk, dated
@ -28,7 +27,7 @@ BEGIN
SET @lastQuantity := 0; SET @lastQuantity := 0;
CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp CREATE OR REPLACE TEMPORARY TABLE tmp.itemAtp
(INDEX (itemFk, wareHouseFk)) (PRIMARY KEY (itemFk, wareHouseFk))
SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity SELECT itemFk, wareHouseFk, MIN(quantityAccumulated) quantity
FROM ( FROM (
SELECT SELECT
@ -43,6 +42,10 @@ BEGIN
)sub )sub
GROUP BY itemFk, wareHouseFk; GROUP BY itemFk, wareHouseFk;
INSERT IGNORE INTO tmp.itemAtp(itemFk, warehouseFk, quantity)
SELECT DISTINCT ic.itemFk, ic.warehouseFk, 0
FROM tmp.itemCalc ic;
DROP TEMPORARY TABLE tItemOrdered; DROP TEMPORARY TABLE tItemOrdered;
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -1,7 +1,7 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getMinacum`( CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getMinacum`(
vWarehouseFk TINYINT, vWarehouseFk TINYINT,
vDated DATE, vAvailabled DATETIME,
vRange INT, vRange INT,
vItemFk INT vItemFk INT
) )
@ -11,11 +11,12 @@ BEGIN
* especificado, en caso de NULL para todos. * especificado, en caso de NULL para todos.
* *
* @param vWarehouseFk Id warehouse * @param vWarehouseFk Id warehouse
* @param vDated Fecha inicio * @param vAvailabled Fecha inicio
* @param vRange Número de días a considerar * @param vRange Número de días a considerar
* @param vItemFk Id de artículo * @param vItemFk Id de artículo
* @return tmp.itemMinacum * @return tmp.itemMinacum
*/ */
DECLARE vDated DATE DEFAULT DATE(vAvailabled);
DECLARE vDatedTo DATETIME DEFAULT util.dayEnd(vDated + INTERVAL vRange DAY); DECLARE vDatedTo DATETIME DEFAULT util.dayEnd(vDated + INTERVAL vRange DAY);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc CREATE OR REPLACE TEMPORARY TABLE tmp.itemCalc
@ -27,25 +28,25 @@ BEGIN
sub.warehouseFk sub.warehouseFk
FROM ( FROM (
SELECT s.itemFk, SELECT s.itemFk,
DATE(t.shipped) dated, t.shipped dated,
-s.quantity quantity, -s.quantity quantity,
t.warehouseFk t.warehouseFk
FROM sale s FROM sale s
JOIN ticket t ON t.id = s.ticketFk JOIN ticket t ON t.id = s.ticketFk
WHERE t.shipped BETWEEN vDated AND vDatedTo WHERE t.shipped BETWEEN vAvailabled AND vDatedTo
AND t.warehouseFk AND t.warehouseFk
AND s.quantity <> 0 AND s.quantity <> 0
AND (vItemFk IS NULL OR s.itemFk = vItemFk) AND (vItemFk IS NULL OR s.itemFk = vItemFk)
AND (vWarehouseFk IS NULL OR t.warehouseFk = vWarehouseFk) AND (vWarehouseFk IS NULL OR t.warehouseFk = vWarehouseFk)
UNION ALL UNION ALL
SELECT b.itemFk, SELECT b.itemFk,
t.landed, t.availabled,
b.quantity, b.quantity,
t.warehouseInFk t.warehouseInFk
FROM buy b FROM buy b
JOIN entry e ON e.id = b.entryFk JOIN entry e ON e.id = b.entryFk
JOIN travel t ON t.id = e.travelFk JOIN travel t ON t.id = e.travelFk
WHERE t.landed BETWEEN vDated AND vDatedTo WHERE t.availabled BETWEEN vAvailabled AND vDatedTo
AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk) AND (vWarehouseFk IS NULL OR t.warehouseInFk = vWarehouseFk)
AND NOT e.isExcludedFromAvailable AND NOT e.isExcludedFromAvailable
AND b.quantity <> 0 AND b.quantity <> 0
@ -58,7 +59,7 @@ BEGIN
FROM buy b FROM buy b
JOIN entry e ON e.id = b.entryFk JOIN entry e ON e.id = b.entryFk
JOIN travel t ON t.id = e.travelFk JOIN travel t ON t.id = e.travelFk
WHERE t.shipped BETWEEN vDated AND vDatedTo WHERE t.shipped BETWEEN vAvailabled AND vDatedTo
AND (vWarehouseFk IS NULL OR t.warehouseOutFk = vWarehouseFk) AND (vWarehouseFk IS NULL OR t.warehouseOutFk = vWarehouseFk)
AND NOT e.isExcludedFromAvailable AND NOT e.isExcludedFromAvailable
AND b.quantity <> 0 AND b.quantity <> 0
@ -84,7 +85,7 @@ BEGIN
) sub ) sub
GROUP BY sub.itemFk, sub.warehouseFk, sub.dated; GROUP BY sub.itemFk, sub.warehouseFk, sub.dated;
CALL item_getAtp(vDated); CALL item_getAtp(vAvailabled);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemMinacum CREATE OR REPLACE TEMPORARY TABLE tmp.itemMinacum
(INDEX(itemFk)) (INDEX(itemFk))

View File

@ -1,21 +1,21 @@
DELIMITER $$ DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getStock`( CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_getStock`(
vWarehouseFk SMALLINT, vWarehouseFk SMALLINT,
vDated DATE, vAvailabled DATETIME,
vItemFk INT vItemFk INT
) )
BEGIN BEGIN
/** /**
* Calcula el stock de un artículo de un vWarehouseFk, * Calcula el stock de un artículo de un vWarehouseFk,
* desde la fecha del inventario hasta vDated * desde la fecha del inventario hasta el momento anterior a vAvailabled
* *
* @param vWarehouse Warehouse id * @param vWarehouse Warehouse id
* @param vDated Max date to filter * @param vAvailabled Maximum time to filter
* @param vItemFk Item id * @param vItemFk Item id
* *
* @return tmp.itemList(itemFk, stock, visible, available) * @return tmp.itemList(itemFk, stock, visible, available)
*/ */
SET vDated = TIMESTAMP(vDated, '00:00:00'); CALL cache.stock_refresh(FALSE);
CREATE OR REPLACE TEMPORARY TABLE tmp.itemList CREATE OR REPLACE TEMPORARY TABLE tmp.itemList
(UNIQUE INDEX i USING HASH (itemFk)) (UNIQUE INDEX i USING HASH (itemFk))
@ -28,15 +28,15 @@ BEGIN
SELECT itemFk, quantity SELECT itemFk, quantity
FROM itemTicketOut FROM itemTicketOut
WHERE shipped >= util.VN_CURDATE() WHERE shipped >= util.VN_CURDATE()
AND shipped < vDated AND shipped < vAvailabled
AND warehouseFk = vWarehouseFk AND warehouseFk = vWarehouseFk
AND (vItemFk IS NULL OR itemFk = vItemFk) AND (vItemFk IS NULL OR itemFk = vItemFk)
UNION ALL UNION ALL
SELECT iei.itemFk, iei.quantity SELECT iei.itemFk, iei.quantity
FROM itemEntryIn iei FROM itemEntryIn iei
JOIN item i ON i.id = iei.itemFk JOIN item i ON i.id = iei.itemFk
WHERE IFNULL(iei.availabled, iei.landed) >= util.VN_CURDATE() WHERE iei.availabled >= util.VN_CURDATE()
AND IFNULL(iei.availabled, iei.landed) < vDated AND iei.availabled < vAvailabled
AND iei.warehouseInFk = vWarehouseFk AND iei.warehouseInFk = vWarehouseFk
AND (vItemFk IS NULL OR iei.itemFk = vItemFk) AND (vItemFk IS NULL OR iei.itemFk = vItemFk)
UNION ALL UNION ALL
@ -44,23 +44,16 @@ BEGIN
FROM itemEntryOut ieo FROM itemEntryOut ieo
JOIN item i ON i.id = ieo.itemFk JOIN item i ON i.id = ieo.itemFk
WHERE ieo.shipped >= util.VN_CURDATE() WHERE ieo.shipped >= util.VN_CURDATE()
AND ieo.shipped < vDated AND ieo.shipped < vAvailabled
AND ieo.warehouseOutFk = vWarehouseFk AND ieo.warehouseOutFk = vWarehouseFk
AND (vItemFk IS NULL OR ieo.itemFk = vItemFk) AND (vItemFk IS NULL OR ieo.itemFk = vItemFk)
UNION ALL
SELECT item_id, amount
FROM cache.stock
WHERE warehouse_id = vWarehouseFk
) sub ) sub
GROUP BY itemFk GROUP BY itemFk
HAVING stock; HAVING stock;
CALL cache.stock_refresh(FALSE);
INSERT INTO tmp.itemList(itemFk, stock, visible, available)
SELECT item_id, amount, amount, amount
FROM cache.stock
WHERE warehouse_id = vWarehouseFk
AND (vItemFk IS NULL OR vItemFk = item_id)
ON DUPLICATE KEY UPDATE
stock = stock + VALUES(stock),
visible = visible + VALUES(visible),
available = available + VALUES(available);
END$$ END$$
DELIMITER ; DELIMITER ;

View File

@ -6,7 +6,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticket_getMovable`(
) )
BEGIN BEGIN
/** /**
* Cálcula el stock movible para los artículos de un ticket * Cálcula el stock que se puede adelantar para los artículos de un ticket.
* vNewShipped debe ser menor que vOldShipped, en los otros casos se * vNewShipped debe ser menor que vOldShipped, en los otros casos se
* asume que siempre es posible * asume que siempre es posible
* *
@ -25,7 +25,7 @@ BEGIN
CALL item_getMinacum( CALL item_getMinacum(
vWarehouseFk, vWarehouseFk,
vNewShipped, vNewShipped,
DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), vNewShipped), DATEDIFF(DATE_SUB(vOldShipped, INTERVAL 1 DAY), DATE(vNewShipped)),
NULL NULL
); );

View File

@ -84,8 +84,8 @@ describe('sale priceDifference()', () => {
const {items} = await models.Ticket.priceDifference(ctx, options); const {items} = await models.Ticket.priceDifference(ctx, options);
expect(items[0].movable).toEqual(386); expect(items[0].movable).toEqual(356);
expect(items[1].movable).toEqual(1810); expect(items[1].movable).toEqual(1790);
await tx.rollback(); await tx.rollback();
} catch (e) { } catch (e) {