salix/db/routines/vn/procedures/entry_transfer.sql

160 lines
4.2 KiB
MySQL
Raw Normal View History

2024-05-23 10:39:30 +00:00
DELIMITER $$
2024-11-28 07:13:53 +00:00
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`entry_transfer`(
vOriginalEntry INT,
OUT vNewEntry INT
)
2024-05-23 10:39:30 +00:00
BEGIN
/**
2024-10-23 10:32:48 +00:00
* Adelanta a mañana la mercancia de una entrada a partir de lo que hay ubicado en el almacén
2024-11-28 07:13:53 +00:00
*
2024-10-23 10:32:48 +00:00
* @param vOriginalEntry entrada que se quiera adelantar
2024-11-28 07:13:53 +00:00
* @param vNewEntry nueva entrada creada
2024-10-23 10:32:48 +00:00
*/
2024-05-23 10:39:30 +00:00
DECLARE vNewEntryFk INT;
DECLARE vTravelFk INT;
DECLARE vWarehouseFk INT;
2024-12-04 07:12:47 +00:00
DECLARE vWarehouseInFk INT;
DECLARE vWarehouseOutFk INT;
DECLARE vRef INT;
DECLARE vIsReceived INT;
DECLARE vAgencyModeFk INT;
DECLARE vNewTravelFk INT;
2024-05-23 10:39:30 +00:00
2024-07-17 08:28:22 +00:00
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
RESIGNAL;
END;
2024-11-28 07:13:53 +00:00
2024-05-23 10:39:30 +00:00
-- Clonar la entrada
2024-11-28 07:13:53 +00:00
CALL entry_clone(vOriginalEntry, vNewEntryFk);
2024-05-23 10:39:30 +00:00
2024-08-06 05:20:30 +00:00
START TRANSACTION;
-- Hay que crear un nuevo travel, con salida hoy y llegada mañana y asignar la entrada nueva al nuevo travel.
2024-12-04 07:12:47 +00:00
SELECT warehouseInFk,warehouseOutFk,`ref`,isReceived ,agencyModeFk
INTO vWarehouseInFk,vWarehouseOutFk, vRef,vIsReceived, vAgencyModeFk
FROM travel t
JOIN entry e ON e.travelFk = t.id
2024-12-04 08:40:28 +00:00
WHERE e.id = vOriginalEntry;
2024-12-04 07:12:47 +00:00
2024-12-04 08:40:28 +00:00
SELECT t.id INTO vNewTravelFk
2024-12-04 07:12:47 +00:00
FROM travel t
JOIN entry e ON e.travelFk = t.id
WHERE t.shipped = util.VN_CURDATE()
AND t.landed = util.VN_CURDATE() + INTERVAL 1 DAY
AND warehouseInFk = vWarehouseInFk
AND warehouseOutFk = vWarehouseOutFk
AND `ref` = vRef
AND isReceived =vIsReceived
AND agencyModeFk = vAgencyModeFk;
2024-12-04 08:40:28 +00:00
IF vNewTravelFk IS NULL THEN
2024-12-04 07:12:47 +00:00
INSERT INTO travel(
2024-05-23 10:39:30 +00:00
shipped,
landed,
warehouseInFk,
warehouseOutFk,
`ref`,
isReceived,
agencyModeFk)
SELECT util.VN_CURDATE(),
util.VN_CURDATE() + INTERVAL 1 DAY,
t.warehouseInFk,
2024-11-28 07:13:53 +00:00
t.warehouseOutFk,
2024-05-23 10:39:30 +00:00
t.`ref`,
t.isReceived,
t.agencyModeFk
FROM travel t
JOIN entry e ON e.travelFk = t.id
2024-10-23 10:32:48 +00:00
WHERE e.id = vOriginalEntry;
2024-05-23 10:39:30 +00:00
2024-12-04 07:12:47 +00:00
SET vTravelFk = LAST_INSERT_ID();
ELSE
SET vTravelFk = vNewTravelFk;
END IF;
2024-05-23 10:39:30 +00:00
UPDATE entry
2024-12-04 12:32:10 +00:00
SET travelFk = vTravelFk,
evaNotes = vOriginalEntry
2024-05-23 10:39:30 +00:00
WHERE id = vNewEntryFk;
-- Poner a 0 las cantidades
UPDATE buy b
SET b.quantity = 0, b.stickers = 0
WHERE b.entryFk = vNewEntryFk;
-- Eliminar duplicados
2024-11-28 07:13:53 +00:00
DELETE b
2024-05-23 10:39:30 +00:00
FROM buy b
2024-11-28 07:13:53 +00:00
LEFT JOIN (SELECT b.id, b.itemFk
FROM buy b
2024-05-23 10:39:30 +00:00
WHERE b.entryFk = vNewEntryFk
GROUP BY b.itemFk) tBuy ON tBuy.id = b.id
WHERE b.entryFk = vNewEntryFk
AND tBuy.id IS NULL;
2024-11-28 07:13:53 +00:00
2024-05-23 10:39:30 +00:00
SELECT t.warehouseInFk INTO vWarehouseFk
FROM travel t
JOIN entry e ON e.travelFk = t.id
WHERE e.id = vOriginalEntry;
-- Actualizar la nueva entrada con lo que no está ubicado HOY, descontando lo vendido HOY de esas ubicaciones
2024-08-06 05:20:30 +00:00
CREATE OR REPLACE TEMPORARY TABLE tBuy
2024-11-28 07:13:53 +00:00
WITH tBuy AS (
SELECT b.itemFk, SUM(b.quantity) totalQuantity
FROM vn.buy b
2024-11-28 07:13:53 +00:00
WHERE b.entryFk = vOriginalEntry
GROUP BY b.itemFk
),
itemShelvings AS (
SELECT ish.itemFk, SUM(visible) visible
FROM vn.itemShelving ish
2024-12-04 07:12:47 +00:00
JOIN vn.shelving sh ON sh.id = ish.shelvingFk
JOIN vn.parking p ON p.id = sh.parkingFk
JOIN vn.sector s ON s.id = p.sectorFk
2024-11-28 07:13:53 +00:00
WHERE s.warehouseFk = vWarehouseFk
2024-12-04 12:32:10 +00:00
AND sh.parked >= util.VN_CURDATE()
2024-11-28 07:13:53 +00:00
GROUP BY ish.itemFk
),
sales AS (
SELECT s.itemFk, SUM(s.quantity) sold
FROM vn.ticket t
JOIN vn.sale s ON s.ticketFk = t.id
JOIN vn.itemShelvingSale iss ON iss.saleFk = s.id
JOIN vn.itemShelving is2 ON is2.id = iss.itemShelvingFk
2024-12-04 07:12:47 +00:00
JOIN vn.shelving s2 ON s2.id = is2.shelvingFk
2024-11-28 07:13:53 +00:00
WHERE t.shipped BETWEEN util.VN_CURDATE() AND util.dayend(util.VN_CURDATE())
2024-12-04 12:32:10 +00:00
AND s2.parked >= util.VN_CURDATE()
2024-11-28 07:13:53 +00:00
GROUP BY s.itemFk
)
SELECT tmp.itemFk,
IFNULL(iss.visible, 0) visible,
tmp.totalQuantity,
IFNULL(s.sold, 0) sold
FROM tBuy tmp
LEFT JOIN itemShelvings iss ON tmp.itemFk = iss.itemFk
LEFT JOIN sales s ON s.itemFk = tmp.itemFk
2024-12-04 08:40:28 +00:00
WHERE visible < tmp.totalQuantity
2024-08-06 05:20:30 +00:00
OR iss.itemFk IS NULL;
2024-05-23 10:39:30 +00:00
UPDATE buy b
2024-11-28 07:13:53 +00:00
JOIN tBuy tmp ON tmp.itemFk = b.itemFk
SET b.quantity = tmp.totalQuantity - tmp.visible - tmp.sold
2024-05-23 10:39:30 +00:00
WHERE b.entryFk = vNewEntryFk;
2024-11-28 07:13:53 +00:00
2024-05-23 10:39:30 +00:00
-- Limpia la nueva entrada
2024-11-28 07:13:53 +00:00
DELETE b
2024-05-23 10:39:30 +00:00
FROM buy b
WHERE b.entryFk = vNewEntryFk
AND b.quantity = 0;
2024-08-06 05:20:30 +00:00
COMMIT;
2024-07-17 08:28:22 +00:00
SET vNewEntry = vNewEntryFk;
2024-07-17 08:30:23 +00:00
2024-11-28 07:13:53 +00:00
CALL cache.visible_refresh(@c,TRUE,vWarehouseFk);
CALL cache.available_refresh(@c, TRUE, vWarehouseFk, util.VN_CURDATE());
2024-05-23 10:39:30 +00:00
END$$
DELIMITER ;