DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`ticketGetVisibleAvailable`(
    vTicket INT)
BEGIN
    DECLARE vVisibleCalc INT;
    DECLARE vAvailableCalc INT;
    DECLARE vShipped DATE;
    DECLARE vWarehouse TINYINT;
    DECLARE vAlertLevel INT;
	DECLARE vAlertLevelFree INT;

    SELECT t.warehouseFk, t.shipped, ts.alertLevel, al.id
			INTO vWarehouse, vShipped, vAlertLevel, vAlertLevelFree
        FROM ticket t
			JOIN alertLevel al ON al.code = 'FREE'
            LEFT JOIN ticketState ts ON ts.ticketFk = vTicket
       WHERE t.id = vTicket;

    IF vAlertLevel IS NULL OR vAlertLevel = vAlertLevelFree THEN
        IF vShipped >= util.VN_CURDATE() THEN
            CALL cache.available_refresh(vAvailableCalc, FALSE, vWarehouse, vShipped);
        END IF;
        IF vShipped = util.VN_CURDATE() THEN
            CALL cache.visible_refresh(vVisibleCalc, FALSE, vWarehouse);
        END IF;
    END IF;

    SELECT s.id, s.itemFk, s.quantity, s.concept, s.price, s.reserved, s.discount, v.visible, av.available, it.image, it.subName
        FROM sale s
            LEFT JOIN cache.visible v ON v.item_id = s.itemFk AND v.calc_id = vVisibleCalc
            LEFT JOIN cache.available av ON av.item_id = s.itemFk AND av.calc_id = vAvailableCalc
            LEFT JOIN item it ON it.id = s.itemFk
        WHERE s.ticketFk = vTicket
		ORDER BY s.concept;
END$$
DELIMITER ;