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

74 lines
2.0 KiB
SQL

DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`travel_weeklyClone`(vSinceWeek INT, vToWeek INT)
BEGIN
/**
* Clona los traslados plantilla para las semanas pasadas por parámetros.
*
* @param vSinceWeek Número de semanas en el futuro para empezar a clonar
* @param vToWeek Número de semenas en el futuro hasta donde clonar
*/
DECLARE vCounter INT;
DECLARE vCurrentTravelFk INT;
DECLARE vShipped DATE;
DECLARE vLanded DATE;
DECLARE vWarehouseInFk INT;
DECLARE vWarehouseOutFk INT;
DECLARE vAgencyModeFk INT;
DECLARE vRef VARCHAR(255);
DECLARE vNewTravelFk INT;
DECLARE vDone BOOL;
DECLARE vRsTravel CURSOR FOR
SELECT travelFk,
@a := TIMESTAMPADD(DAY,vCounter * 7 - WEEKDAY(util.VN_CURDATE()) - 1 + weekDay, util.VN_CURDATE()),
@a := TIMESTAMPADD(DAY,duration,@a),
warehouseOutFk,
warehouseInFk,
`ref`,
agencyModeFk
FROM travelClonedWeekly
WHERE travelFk;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
SET vCounter = vSinceWeek;
vWeekLoop :LOOP
INSERT IGNORE INTO travel (shipped, landed, warehouseOutFk, warehouseInFk, agencyModeFk, ref, cargoSupplierFk, kg)
SELECT @a := TIMESTAMPADD(DAY, vCounter * 7 - WEEKDAY(util.VN_CURDATE()) - 1 + weekDay, util.VN_CURDATE()),
@a := TIMESTAMPADD(DAY, duration, @a),
warehouseOutFk,
warehouseInFk,
agencyModeFk,
ref,
supplierFk,
kg
FROM travelClonedWeekly
WHERE travelFk IS NULL;
OPEN vRsTravel;
l: LOOP
SET vDone = FALSE;
FETCH vRsTravel INTO vCurrentTravelFk, vShipped, vLanded, vWarehouseOutFk, vWarehouseInFk, vRef, vAgencyModeFk;
IF vDone THEN
LEAVE l;
END IF;
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION RESIGNAL SQLSTATE '01000';
CALL travel_cloneWithEntries(vCurrentTravelFk, vShipped, vLanded, vWarehouseOutFk, vWarehouseInFk, vRef, vAgencyModeFk, vNewTravelFk);
END;
END LOOP;
CLOSE vRsTravel;
IF vCounter = vToWeek THEN
LEAVE vWeekLoop;
END IF;
SET vCounter = vCounter + 1;
END LOOP vWeekLoop;
END$$
DELIMITER ;