Merge branch 'dev' into 8645-addSupplierRefToAgencyTermFilter
gitea/salix/pipeline/pr-dev This commit looks good Details

This commit is contained in:
Jose Antonio Tubau 2025-02-27 11:21:09 +00:00
commit 93862fecfc
12 changed files with 146 additions and 99 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

@ -4,7 +4,7 @@ CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`catalog_calculate`(
vAddressFk INT, vAddressFk INT,
vAgencyModeFk INT, vAgencyModeFk INT,
vShowExpiredZones BOOLEAN) vShowExpiredZones BOOLEAN)
BEGIN BEGIN
/** /**
* Calcula los articulos disponibles y sus precios * Calcula los articulos disponibles y sus precios
* *
@ -12,7 +12,7 @@ BEGIN
* @param vLanded Fecha de recepcion de mercancia * @param vLanded Fecha de recepcion de mercancia
* @param vAddressFk Id del consignatario * @param vAddressFk Id del consignatario
* @param vAgencyModeFk Id de la agencia * @param vAgencyModeFk Id de la agencia
* @return tmp.ticketCalculateItem(itemFk, available, producer, * @return tmp.ticketCalculateItem(itemFk, available, producer,
* item, size, stems, category, inkFk, image, origin, price) * item, size, stems, category, inkFk, image, origin, price)
* @return tmp.ticketLot(warehouseFk, itemFk, available, buyFk) * @return tmp.ticketLot(warehouseFk, itemFk, available, buyFk)
* @return tmp.ticketComponent * @return tmp.ticketComponent
@ -48,34 +48,34 @@ BEGIN
CALL catalog_componentPrepare(); CALL catalog_componentPrepare();
CREATE OR REPLACE TEMPORARY TABLE tmp.ticketCalculateItem( CREATE OR REPLACE TEMPORARY TABLE tmp.ticketCalculateItem(
itemFk INT(11) NOT NULL, itemFk INT(11) NOT NULL,
available INT(11), available INT(11),
producer VARCHAR(50), producer VARCHAR(50),
item VARCHAR(50), item VARCHAR(50),
size INT(10) UNSIGNED, size INT(10) UNSIGNED,
stems INT(11), stems INT(11),
category VARCHAR(3), category VARCHAR(3),
inkFk VARCHAR(3), inkFk VARCHAR(3),
image VARCHAR(50), image VARCHAR(50),
origin VARCHAR(3), origin VARCHAR(3),
price DECIMAL(10,2), price DECIMAL(10,2),
priceKg DECIMAL(10,2), priceKg DECIMAL(10,2),
`grouping` INT(10) UNSIGNED, `grouping` INT(10) UNSIGNED,
minQuantity INT(10) UNSIGNED, minQuantity INT(10) UNSIGNED,
PRIMARY KEY `itemFk` (`itemFk`) PRIMARY KEY `itemFk` (`itemFk`)
) ENGINE = MEMORY DEFAULT CHARSET=utf8; ) ENGINE = MEMORY DEFAULT CHARSET=utf8;
OPEN cTravelTree; OPEN cTravelTree;
l: LOOP l: LOOP
SET vDone = FALSE; SET vDone = FALSE;
FETCH cTravelTree INTO vZoneFk, vWarehouseFk, vShipped, vHour; FETCH cTravelTree INTO vZoneFk, vWarehouseFk, vShipped, vHour;
SET vAvailabled = vShipped + INTERVAL HOUR(vHour) HOUR; SET vAvailabled = vShipped + INTERVAL HOUR(vHour) HOUR;
IF vDone THEN IF vDone THEN
LEAVE l; LEAVE l;
END IF; END IF;
CALL `cache`.available_refresh(vAvailableCalc, FALSE, vWarehouseFk, vAvailabled); CALL `cache`.available_refresh(vAvailableCalc, FALSE, vWarehouseFk, vAvailabled);
CALL buy_getUltimate(NULL, vWarehouseFk, vShipped); CALL buy_getUltimate(NULL, vWarehouseFk, vShipped);
@ -89,25 +89,25 @@ BEGIN
JOIN tmp.item i ON i.itemFk = a.item_id JOIN tmp.item i ON i.itemFk = a.item_id
JOIN item it ON it.id = i.itemFk JOIN item it ON it.id = i.itemFk
JOIN `zone` z ON z.id = vZoneFk JOIN `zone` z ON z.id = vZoneFk
LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = a.item_id LEFT JOIN tmp.buyUltimate bu ON bu.itemFk = a.item_id
JOIN agencyMode am ON am.id = vAgencyModeFk JOIN agencyMode am ON am.id = vAgencyModeFk
JOIN agency ag ON ag.id = am.agencyFk JOIN agency ag ON ag.id = am.agencyFk
JOIN itemType itt ON itt.id = it.typeFk JOIN itemType itt ON itt.id = it.typeFk
JOIN itemCategory itc on itc.id = itt.categoryFk JOIN itemCategory itc on itc.id = itt.categoryFk
JOIN address ad ON ad.id = vAddressFk JOIN address ad ON ad.id = vAddressFk
LEFT JOIN clientItemType cit LEFT JOIN clientItemType cit
ON cit.clientFk = ad.clientFk ON cit.clientFk = ad.clientFk
AND cit.itemTypeFk = itt.id AND cit.itemTypeFk = itt.id
LEFT JOIN zoneItemType zit LEFT JOIN zoneItemType zit
ON zit.zoneFk = vZoneFk ON zit.zoneFk = vZoneFk
AND zit.itemTypeFk = itt.id AND zit.itemTypeFk = itt.id
LEFT JOIN agencyModeItemType ait LEFT JOIN agencyModeItemType ait
ON ait.agencyModeFk = vAgencyModeFk ON ait.agencyModeFk = vAgencyModeFk
AND ait.itemTypeFk = itt.id AND ait.itemTypeFk = itt.id
LEFT JOIN ( LEFT JOIN (
SELECT i.id SELECT i.id
FROM item i FROM item i
JOIN priceDelta pd JOIN priceDelta pd
ON pd.itemTypeFk = i.typeFk ON pd.itemTypeFk = i.typeFk
AND (pd.minSize IS NULL OR pd.minSize <= i.`size`) AND (pd.minSize IS NULL OR pd.minSize <= i.`size`)
AND (pd.maxSize IS NULL OR pd.maxSize >= i.`size`) AND (pd.maxSize IS NULL OR pd.maxSize >= i.`size`)
@ -132,8 +132,7 @@ BEGIN
AND cit.id IS NULL AND cit.id IS NULL
AND zit.id IS NULL AND zit.id IS NULL
AND ait.id IS NULL AND ait.id IS NULL
AND pd.id IS NULL AND pd.id IS NULL;
;
DROP TEMPORARY TABLE tmp.buyUltimate; DROP TEMPORARY TABLE tmp.buyUltimate;

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

@ -0,0 +1,4 @@
-- Place your SQL code here
ALTER TABLE vn.priceDelta ADD IF NOT EXISTS isHidden BOOL
DEFAULT FALSE NOT NULL
COMMENT 'Hides the itemType when building de catalog recordset';

View File

@ -0,0 +1,4 @@
-- Place your SQL code here
ALTER TABLE vn.priceDelta ADD IF NOT EXISTS isHidden BOOL
DEFAULT FALSE NOT NULL
COMMENT 'Hides the itemType when building de catalog recordset';

View File

@ -167,7 +167,7 @@ module.exports = Self => {
} }
smtp.send({ smtp.send({
to: config.app.reportEmail, to: 'administracion@verdnatura.es', // #8687
subject: '[API] Nightly ticket closure report', subject: '[API] Nightly ticket closure report',
html: body, html: body,
}).catch(err => console.error(err)); }).catch(err => console.error(err));

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) {