USE `vn`;
DROP procedure IF EXISTS `ticketGetProblems`;

DELIMITER $$
USE `vn`$$
CREATE DEFINER=`root`@`%` PROCEDURE `ticketGetProblems`()
BEGIN
/*
    * Obtiene los problemas de uno o varios tickets
    *
    * @table tmp.ticketGetProblems(ticketFk, clientFk, warehouseFk, shipped)
    * @return tmp.ticketProblems
    */
    DECLARE vWarehouse INT;
    DECLARE vDate DATE;
    DECLARE vAvailableCache INT;
    DECLARE vVisibleCache INT;
    DECLARE vDone INT DEFAULT 0;

    DECLARE vCursor CURSOR FOR
        SELECT DISTINCT tt.warehouseFk, date(tt.shipped)
            FROM tmp.ticketGetProblems tt
            WHERE DATE(tt.shipped) BETWEEN CURDATE()
                AND TIMESTAMPADD(DAY, 1.9, CURDATE());
  
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = 1;

    DROP TEMPORARY TABLE IF EXISTS tmp.ticketProblems;
        CREATE TEMPORARY TABLE tmp.ticketProblems (
            ticketFk INT(11) PRIMARY KEY,
            isFreezed INTEGER(1) DEFAULT 0,
            risk DECIMAL(10,2) DEFAULT 0,
            hasTicketRequest INTEGER(1) DEFAULT 0,
            isAvailable INTEGER(1) DEFAULT 1
        ) ENGINE = MEMORY;

     DROP TEMPORARY TABLE IF EXISTS tmp.ticketList;
        CREATE TEMPORARY TABLE tmp.ticketList
        (PRIMARY KEY (ticketFk))
         ENGINE = MEMORY
            SELECT tp.ticketFk, c.id clientFk
                FROM tmp.ticketGetProblems tp
        JOIN vn.client c ON c.id = tp.clientFk;
 
 -- Inserta tickets de clientes congelados
    INSERT INTO tmp.ticketProblems(ticketFk, isFreezed)
        SELECT DISTINCT tl.ticketFk, 1
            FROM tmp.ticketList tl
                JOIN vn.client c ON c.id = tl.clientFk
            WHERE c.isFreezed;

    DELETE tl FROM tmp.ticketList tl
        JOIN tmp.ticketProblems tp ON tl.ticketFk = tp.ticketFk;

     DROP TEMPORARY TABLE IF EXISTS tmp.clientGetDebt;
     CREATE TEMPORARY TABLE tmp.clientGetDebt
        (PRIMARY KEY (clientFk))
        ENGINE = MEMORY
            SELECT DISTINCT clientFk
                FROM tmp.ticketList;

    CALL clientGetDebt(CURDATE());

 -- Inserta tickets de clientes con riesgo
    INSERT INTO tmp.ticketProblems(ticketFk, risk)
        SELECT DISTINCT tl.ticketFk, r.risk
            FROM tmp.ticketList tl
                JOIN vn.ticket t ON t.id = tl.ticketFk
                JOIN vn.agencyMode a ON t.agencyModeFk = a.id
                JOIN tmp.risk r ON r.clientFk = t.clientFk
                JOIN vn.client c ON c.id = t.clientFk
            WHERE r.risk > c.credit + 10
                AND a.deliveryMethodFk != 3
        ON DUPLICATE KEY UPDATE
            risk = r.risk;
   
    DELETE tl FROM tmp.ticketList tl
        JOIN tmp.ticketProblems tp ON tl.ticketFk = tp.ticketFk;
  
     -- Inserta tickets que tengan codigos 100
    INSERT INTO tmp.ticketProblems(ticketFk, hasTicketRequest)
        SELECT DISTINCT tl.ticketFk, 'Code 100'
            FROM tmp.ticketList tl
                JOIN vn.ticketRequest tr ON tr.ticketFk = tl.ticketFk
            WHERE tr.isOK IS NULL
        ON DUPLICATE KEY UPDATE
            hasTicketRequest = 1;
      
    DELETE tl FROM tmp.ticketList tl
        JOIN tmp.ticketProblems tp ON tl.ticketFk = tp.ticketFk;

    OPEN vCursor;

    WHILE NOT vDone
    DO
        FETCH vCursor INTO vWarehouse, vDate;
   
        CALL cache.visible_refresh(vVisibleCache, FALSE, vWarehouse);
        CALL cache.available_refresh(vAvailableCache, FALSE, vWarehouse, vDate);

 -- Inserta tickets con articulos que no tegan disponible
        INSERT INTO tmp.ticketProblems(ticketFk, isAvailable)
            SELECT tl.ticketFk, 0
                FROM tmp.ticketList tl
                    JOIN vn.ticket t ON t.id = tl.ticketFk
                    LEFT JOIN vn.sale s ON s.ticketFk = t.id
                    JOIN vn.item i ON i.id = s.itemFk
                    JOIN vn.itemType it on it.id = i.typeFk
                    LEFT JOIN cache.visible v ON i.id = v.item_id
                    AND v.calc_id = vVisibleCache
                    LEFT JOIN cache.available av ON av.item_id = i.id
                    AND av.calc_id = vAvailableCache
                WHERE date(t.shipped) = vDate
                    AND categoryFk != 6
                    AND s.quantity > IFNULL(v.visible, 0)
                    AND IFNULL(av.available, 0) < 0
                    AND s.isPicked = FALSE
                    AND NOT i.generic
                    AND vWarehouse = t.warehouseFk
                GROUP BY tl.ticketFk
            ON DUPLICATE KEY UPDATE
                isAvailable = 0;

   
    DELETE tl FROM tmp.ticketList tl
        JOIN tmp.ticketProblems tp ON tl.ticketFk = tp.ticketFk; 

   
    INSERT INTO tmp.ticketProblems(ticketFk, isAvailable)
        SELECT tl.ticketFk, 0
            FROM tmp.ticketList tl
                JOIN vn.ticket t ON t.id = tl.ticketFk
                LEFT JOIN vn.sale s ON s.ticketFk = t.id
                JOIN vn.item i ON i.id = s.itemFk
                JOIN vn.itemType it on it.id = i.typeFk
                LEFT JOIN cache.visible v ON i.id = v.item_id AND v.calc_id = vVisibleCache
                LEFT JOIN cache.available av ON av.item_id = i.id AND av.calc_id = vAvailableCache
            WHERE IFNULL(av.available, 0) >= 0
                AND s.quantity > IFNULL(v.visible, 0)
                AND s.isPicked = FALSE
                AND s.reserved = FALSE
                AND it.categoryFk != 6
                AND date(t.shipped) = vDate
                AND NOT i.generic
                AND CURDATE() = vDate
                AND t.warehouseFk = vWarehouse
            GROUP BY tl.ticketFk
        ON DUPLICATE KEY UPDATE
            isAvailable = 0;
 
    DELETE tl FROM tmp.ticketList tl
        JOIN tmp.ticketProblems tp ON tl.ticketFk = tp.ticketFk;

    END WHILE;

    CLOSE vCursor;

    SELECT * FROM tmp.ticketProblems;
   
    DROP TEMPORARY TABLE
        tmp.clientGetDebt,
        tmp.ticketList;
END$$

DELIMITER ;
