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 ;