
USE `vn`;
DROP procedure IF EXISTS `vn`.`zoneGetShippedWarehouse`;

DELIMITER $$
USE `vn`$$
CREATE DEFINER=`root`@`%` PROCEDURE `zoneGetShippedWarehouse__`(vLanded DATE, vAddressFk INT, vAgencyModeFk INT)
BEGIN
/**
 * Devuelve la mínima fecha de envío para cada warehouse
 * 
 * @param vLanded La fecha de recepcion
 * @param vAddressFk Id del consignatario
 * @param vAgencyModeFk Id de la agencia
 * @return tmp.zoneGetShipped
 */
	
	DECLARE vGeoFk INT;
    
    SELECT p.geoFk INTO vGeoFk
		FROM address a 
			JOIN town t ON t.provinceFk = a.provinceFk
			JOIN postCode p ON p.townFk = t.id AND p.code = a.postalCode
	WHERE a.id = vAddressFk
	ORDER BY (a.city SOUNDS LIKE t.`name`) DESC
	LIMIT 1;

        
	DROP TEMPORARY TABLE IF EXISTS tmp.zoneGetShipped;
	CREATE TEMPORARY TABLE tmp.zoneGetShipped
			ENGINE = MEMORY
		SELECT * FROM (
			SELECT * FROM (
				SELECT z.id,
						TIMESTAMPADD(DAY,-z.travelingDays, vLanded) shipped,
						zi.isIncluded,z.warehouseFk
					FROM zoneGeo zgSon
						JOIN zoneGeo zgFather ON zgSon.lft BETWEEN zgFather.lft AND zgFather.rgt
						JOIN zoneIncluded zi ON zi.geoFk = zgFather.id
						JOIN zone z ON z.id = zi.zoneFk
						JOIN zoneCalendar zc ON zc.zoneFk = z.id
					WHERE zgSon.`id` = vGeoFk
						AND zc.delivered = vLanded
						AND z.agencyModeFk = vAgencyModeFk
						AND IF(TIMESTAMPADD(DAY,-z.travelingDays, vLanded) = CURDATE(), hour(now()) < hour(z.`hour`),TRUE)
					ORDER BY z.id, shipped ASC, zgFather.depth DESC, zi.isIncluded DESC) t 
				GROUP BY warehouseFk, id
				HAVING isIncluded > 0
                ORDER BY shipped) t
			GROUP BY warehouseFk;
END$$

DELIMITER ;
;
