65 lines
1.8 KiB
MySQL
65 lines
1.8 KiB
MySQL
|
DELIMITER $$
|
||
|
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`zone_getOptionsForLanding`(vLanded DATE, vShowExpiredZones BOOLEAN)
|
||
|
BEGIN
|
||
|
/**
|
||
|
* Gets computed options for the passed zones and delivery date.
|
||
|
*
|
||
|
* @table tmp.zone(id) The zones ids
|
||
|
* @param vLanded The delivery date
|
||
|
* @return tmp.zoneOption The computed options
|
||
|
*/
|
||
|
DROP TEMPORARY TABLE IF EXISTS tmp.zoneOption;
|
||
|
CREATE TEMPORARY TABLE tmp.zoneOption
|
||
|
ENGINE = MEMORY
|
||
|
SELECT
|
||
|
zoneFk,
|
||
|
`hour`,
|
||
|
travelingDays,
|
||
|
price,
|
||
|
bonus,
|
||
|
vLanded landed,
|
||
|
TIMESTAMPADD(DAY, -travelingDays, vLanded) shipped
|
||
|
FROM (
|
||
|
SELECT t.id zoneFk,
|
||
|
TIME(IFNULL(e.`hour`, z.`hour`)) `hour`,
|
||
|
IFNULL(e.travelingDays, z.travelingDays) travelingDays,
|
||
|
IFNULL(e.price, z.price) price,
|
||
|
IFNULL(e.bonus, z.bonus) bonus
|
||
|
FROM tmp.zone t
|
||
|
JOIN zone z ON z.id = t.id
|
||
|
JOIN zoneEvent e ON e.zoneFk = t.id
|
||
|
WHERE (
|
||
|
e.`type` = 'day'
|
||
|
AND e.dated = vLanded
|
||
|
) OR (
|
||
|
e.`type` != 'day'
|
||
|
AND e.weekDays & (1 << WEEKDAY(vLanded))
|
||
|
AND (e.`started` IS NULL OR vLanded >= e.`started`)
|
||
|
AND (e.`ended` IS NULL OR vLanded <= e.`ended`)
|
||
|
)
|
||
|
ORDER BY
|
||
|
zoneFk,
|
||
|
CASE
|
||
|
WHEN e.`type` = 'day'
|
||
|
THEN 1
|
||
|
WHEN e.`type` = 'range'
|
||
|
THEN 2
|
||
|
ELSE 3
|
||
|
END
|
||
|
LIMIT 10000000000000000000
|
||
|
) t
|
||
|
GROUP BY zoneFk;
|
||
|
|
||
|
DELETE t FROM tmp.zoneOption t
|
||
|
JOIN zoneExclusion e ON e.zoneFk = t.zoneFk AND e.`dated` = t.landed
|
||
|
LEFT JOIN zoneExclusionGeo eg ON eg.zoneExclusionFk = e.id
|
||
|
WHERE eg.zoneExclusionFk IS NULL;
|
||
|
|
||
|
IF NOT vShowExpiredZones THEN
|
||
|
DELETE FROM tmp.zoneOption
|
||
|
WHERE shipped < util.VN_CURDATE()
|
||
|
OR (shipped = util.VN_CURDATE() AND util.VN_CURTIME() > `hour`);
|
||
|
END IF;
|
||
|
END$$
|
||
|
DELIMITER ;
|