DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`item_setVisibleDiscard`(
	vItemFk INT,
	vWarehouseFk INT,
	vQuantity INT,
	vAddressFk INT)
BEGIN
/**
 * Procedimiento para dar dar de baja/alta un item, si vAdressFk es NULL
 * se entiende que se da de alta y se toma el addressFk de la configuración
 *
 * @param vItemFk Identificador del ítem
 * @param vWarehouseFk id del warehouse
 * @param vQuantity a dar de alta/baja
 * @param vAddressFk id address
 */

	DECLARE vTicketFk INT;
	DECLARE vClientFk INT;
	DECLARE vDefaultCompanyFk INT;
	DECLARE vDefaultCurrencyFk INT;
	DECLARE vCalc INT;
	DECLARE vAddressShortage INT;

	SELECT barcodeToItem(vItemFk) INTO vItemFk;

	IF vAddressFk IS NULL THEN
		SELECT pc.shortageAddressFk INTO vAddressShortage
			FROM productionConfig pc ;
	ELSE
		SET vAddressShortage = vAddressFk;
	END IF;

	SELECT a.clientFk INTO vClientFk
		FROM address a
		WHERE a.id = vAddressShortage;

	SELECT t.id INTO vTicketFk
		FROM ticket t
			JOIN address a ON a.id = t.addressFk
			JOIN ticketState ts ON ts.ticketFk = t.id
		WHERE t.warehouseFk = vWarehouseFk
			AND a.id = vAddressShortage
			AND DATE(t.shipped) = util.VN_CURDATE()
			AND ts.code = 'DELIVERED'
		LIMIT 1;

	CALL cache.visible_refresh(vCalc, TRUE, vWarehouseFk);

	IF vTicketFk IS NULL THEN
		SELECT DEFAULT(companyFk), DEFAULT(currencyFk) 
				INTO vDefaultCompanyFk, vDefaultCurrencyFk
			FROM vn.ticket 
			LIMIT 1;

		CALL ticket_add(
			vClientFk,
			util.VN_CURDATE(),
			vWarehouseFk,
			vDefaultCompanyFk,
			vAddressFk,
			NULL,
			NULL,
			util.VN_CURDATE(),
			account.myUser_getId(),
			FALSE,
			vDefaultCurrencyFk,
			vTicketFk);
	END IF;

	INSERT INTO sale(ticketFk, itemFk, concept, quantity)
		SELECT vTicketFk,
				vItemFk,
				name,
				vQuantity
			FROM item
			WHERE id = vItemFk;

	UPDATE cache.visible
		SET visible = visible - vQuantity
		WHERE calc_id = vCalc
			AND item_id = vItemFk;
END$$
DELIMITER ;
