73 lines
1.8 KiB
MySQL
73 lines
1.8 KiB
MySQL
|
|
||
|
DROP PROCEDURE IF EXISTS `vn`.`zone_getAvailable`;
|
||
|
DELIMITER $$
|
||
|
CREATE DEFINER=`root`@`%` PROCEDURE `vn`.`zone_getAvailable`(vAddress INT, vLanded DATE)
|
||
|
BEGIN
|
||
|
DECLARE vHour TIME DEFAULT TIME(NOW());
|
||
|
|
||
|
CALL zone_getFromGeo(address_getGeo(vAddress));
|
||
|
|
||
|
DELETE t FROM tmp.zone t
|
||
|
JOIN zoneExclusion e
|
||
|
ON e.zoneFk = t.id AND e.`day` = vLanded;
|
||
|
|
||
|
DROP TEMPORARY TABLE IF EXISTS tAvailableZones;
|
||
|
CREATE TEMPORARY TABLE tAvailableZones
|
||
|
SELECT t.id zoneFk,
|
||
|
TIME(e.`hour`) `hour`,
|
||
|
e.travelingDays,
|
||
|
e.price,
|
||
|
e.bonus,
|
||
|
CASE
|
||
|
WHEN e.`from` IS NULL AND e.`to` IS NULL
|
||
|
THEN 3
|
||
|
WHEN e.`to` IS NULL
|
||
|
THEN 2
|
||
|
ELSE 1
|
||
|
END specificity
|
||
|
FROM tmp.zone t
|
||
|
JOIN zoneEvent e ON e.zoneFk = t.id
|
||
|
WHERE (e.`from` = vLanded AND e.`to` IS NULL)
|
||
|
OR (
|
||
|
(e.`from` IS NULL OR vLanded BETWEEN e.`from` AND e.`to`)
|
||
|
AND e.weekDays & (1 << WEEKDAY(vLanded))
|
||
|
);
|
||
|
|
||
|
-- XXX: Compatibility with the deprecated #zoneCalendar table
|
||
|
|
||
|
INSERT INTO tAvailableZones
|
||
|
SELECT t.id zoneFk,
|
||
|
NULL,
|
||
|
NULL,
|
||
|
c.price,
|
||
|
c.bonus,
|
||
|
4
|
||
|
FROM tmp.zone t
|
||
|
JOIN zoneCalendar c ON c.zoneFk = t.id
|
||
|
WHERE c.delivered = vLanded;
|
||
|
|
||
|
DROP TEMPORARY TABLE tmp.zone;
|
||
|
|
||
|
UPDATE tAvailableZones t
|
||
|
JOIN zone z ON z.id = t.zoneFk
|
||
|
SET t.`hour` = IFNULL(t.`hour`, TIME(z.`hour`)),
|
||
|
t.travelingDays = IFNULL(t.travelingDays, z.travelingDays),
|
||
|
t.price = IFNULL(t.price, z.price),
|
||
|
t.bonus = IFNULL(t.bonus, z.bonus);
|
||
|
|
||
|
DELETE FROM tAvailableZones
|
||
|
WHERE (@shipped := TIMESTAMPADD(DAY, -travelingDays, vLanded)) < CURDATE()
|
||
|
OR @shipped = CURDATE() AND vHour > `hour`;
|
||
|
|
||
|
SELECT *
|
||
|
FROM (
|
||
|
SELECT * FROM tAvailableZones
|
||
|
ORDER BY zoneFk, specificity
|
||
|
) t
|
||
|
GROUP BY zoneFk;
|
||
|
|
||
|
DROP TEMPORARY TABLE tAvailableZones;
|
||
|
END$$
|
||
|
DELIMITER ;
|
||
|
|