drop procedure `vn`.`ticket_closeAll`;

DELIMITER $$
$$
create definer = root@`%` procedure `vn`.`ticket_closeAll__`()
BEGIN
/**
 * Realiza el cierre de todos los 
 * tickets de la tabla tmp.ticketClosure.
 *
 * @param vTicketFk Id del ticket
 */
	DECLARE vDone BOOL;
	DECLARE vClientFk INT;
    DECLARE vCurTicketFk INT;
	DECLARE vIsTaxDataChecked BOOL;
	DECLARE vCompanyFk INT;
	DECLARE vShipped DATE;
	DECLARE vNewInvoiceId INT;
	DECLARE vHasDailyInvoice BOOL;
	DECLARE vWithPackage BOOL;
    DECLARE vHasToInvoice BOOL;

	DECLARE cur CURSOR FOR
		SELECT ticketFk FROM tmp.ticketClosure;
		
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
	DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
		RESIGNAL;
	END;
            
	DROP TEMPORARY TABLE IF EXISTS  tmp.ticketClosure2;
	CREATE TEMPORARY TABLE tmp.ticketClosure2
			SELECT ticketFk FROM tmp.ticketClosure;

	INSERT INTO tmp.ticketClosure 
			SELECT id FROM stowaway s 
				JOIN tmp.ticketClosure2 tc ON s.shipFk = tc.ticketFk;
	OPEN cur;

	proc: LOOP
		SET vDone = FALSE;
		
		FETCH cur INTO vCurTicketFk;

		IF vDone THEN
			LEAVE proc;
		END IF;

		-- ticketClosure start
		SELECT
				c.id,
				c.isTaxDataChecked,
				t.companyFk,
				t.shipped,
				co.hasDailyInvoice,
				w.isManaged,
                c.hasToInvoice
			INTO vClientFk,
				vIsTaxDataChecked,
				vCompanyFk, 
				vShipped,
				vHasDailyInvoice,
				vWithPackage,
                vHasToInvoice
			FROM ticket t 
				JOIN `client` c ON c.id = t.clientFk
				JOIN province p ON p.id = c.provinceFk
				JOIN country co ON co.id = p.countryFk
				JOIN warehouse w ON w.id = t.warehouseFk
			WHERE t.id = vCurTicketFk;

		INSERT INTO ticketPackaging (ticketFk, packagingFk, quantity)
			(SELECT vCurTicketFk, p.id, COUNT(*)
				FROM expedition e 
					JOIN packaging p ON p.itemFk = e.itemFk
				WHERE e.ticketFk = vCurTicketFk AND p.isPackageReturnable
					AND vWithPackage
				GROUP BY p.itemFk);

		-- No retornables o no catalogados
		INSERT INTO sale (itemFk, ticketFk, concept, quantity, price, isPriceFixed) 
			(SELECT e.itemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.itemFk, vClientFk), 1 
				FROM expedition e 
					JOIN item i ON i.id = e.itemFk 
					LEFT JOIN packaging p ON p.itemFk = i.id
				WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
					AND getSpecialPrice(e.itemFk, vClientFk) > 0
				GROUP BY e.itemFk);
                
		CALL vn.zonePromo_Make();
			
		IF(vHasDailyInvoice) AND vHasToInvoice THEN

			-- Facturacion rapida
			CALL ticketTrackingAdd(vCurTicketFk, 'DELIVERED', NULL);
			-- Facturar si está contabilizado
			IF vIsTaxDataChecked THEN
				CALL invoiceOut_newFromClient(
					vClientFk, 
					(SELECT invoiceSerial(vClientFk, vCompanyFk, 'M')), 
					vShipped, 
					vCompanyFk, 
					NULL,
					NULL,
					vNewInvoiceId);
			END IF;
		ELSE
			CALL ticketTrackingAdd(vCurTicketFk, (SELECT vn.getAlert3State(vCurTicketFk)), NULL);
		END IF;
	END LOOP;

	CLOSE cur;
    
	DROP TEMPORARY TABLE IF EXISTS  tmp.ticketClosure;
END;;$$
DELIMITER ;

