DELIMITER $$
CREATE OR REPLACE DEFINER=`root`@`localhost` PROCEDURE `vn`.`ticket_close`()
BEGIN
/**
 * Realiza el cierre de todos los 
 * tickets de la tabla tmp.ticket_close.
 *
 * @table tmp.ticket_close(ticketFk) Identificadores de los tickets a cerrar
 */
	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.ticket_close;
		
	DECLARE CONTINUE HANDLER FOR NOT FOUND SET vDone = TRUE;
	DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN
		RESIGNAL;
	END;

	OPEN cur;

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

		IF vDone THEN
			LEAVE proc;
		END IF;

		SELECT
				c.id,
				c.isTaxDataChecked,
				t.companyFk,
				t.shipped,
				IFNULL(a.hasDailyInvoice, 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
				LEFT JOIN autonomy a ON a.id = p.autonomyFk
				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.freightItemFk
				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.freightItemFk, vCurTicketFk, i.name, COUNT(*) AS amount, getSpecialPrice(e.freightItemFk, vClientFk), 1
				FROM expedition e 
					JOIN item i ON i.id = e.freightItemFk
					LEFT JOIN packaging p ON p.itemFk = i.id
				WHERE e.ticketFk = vCurTicketFk AND IFNULL(p.isPackageReturnable, 0) = 0
					AND getSpecialPrice(e.freightItemFk, vClientFk) > 0
				GROUP BY e.freightItemFk);
			
		IF(vHasDailyInvoice) AND vHasToInvoice THEN

			-- Facturacion rapida
			CALL ticket_setState(vCurTicketFk, 'DELIVERED');
			-- 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 ticket_setState(vCurTicketFk, (SELECT vn.getAlert3State(vCurTicketFk)));
		END IF;
	END LOOP;

	CLOSE cur;
END$$
DELIMITER ;