DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` PROCEDURE `vn`.`expedition_selfConsumptionPackaging`(
	vSelf INT,
	vAction ENUM('add', 'remove')
)
BEGIN
/**
 * Maneja el consumo de cajas para autoconsumo, permitiendo
 * añadir o quitar cajas utilizadas según la acción indicada.
 *
 * @param vSelf Id de expedición
 */
	DECLARE vClientFk INT;
	DECLARE vAddressFk INT;
	DECLARE vItemFk INT;
	DECLARE vItemName VARCHAR(50);
	DECLARE vWarehouseFk INT;
	DECLARE vCreated DATE;
	DECLARE vTicketFk INT;
	DECLARE vSaleFk INT;
	DECLARE vQuantity INT;

	IF vAction NOT IN ('add', 'remove') THEN
		CALL util.throw('Action not supported');
	END IF;

	SELECT pc.clientSelfConsumptionFk,
			pc.addressSelfConsumptionFk,
			i.id,
			i.name,
			t.warehouseFk,
			e.created
			INTO vClientFk,
				vAddressFk,
				vItemFk,
				vItemName,
				vWarehouseFk,
				vCreated
		FROM expedition e
			JOIN packaging p ON p.id = e.packagingFk
			JOIN item i ON i.id = p.itemFk
			JOIN ticket t ON t.id = e.ticketFk
			JOIN productionConfig pc
		WHERE e.id = vSelf;

	IF vClientFk IS NULL OR vAddressFk IS NULL THEN
		CALL util.throw('Some config parameters are not set');
	END IF;

	SET vCreated = DATE(vCreated);

	SELECT id INTO vTicketFk
		FROM ticket
			WHERE shipped BETWEEN vCreated AND util.dayEnd(vCreated)
				AND clientFk = vClientFk
				AND addressFk = vAddressFk
				AND warehouseFk = vWarehouseFk;

	IF vTicketFk IS NULL AND vAction = 'add' THEN
		INSERT INTO ticket(clientFk, warehouseFk, shipped, nickname, addressFk)
			VALUES (vClientFk, vWarehouseFk, vCreated, 'CAJAS AUTOCONSUMO', vAddressFk);

		SET vTicketFk = LAST_INSERT_ID();
	END IF;

	SELECT id, quantity INTO vSaleFk, vQuantity
		FROM sale
		WHERE itemFk = vItemFk
			AND ticketFk = vTicketFk
		LIMIT 1;

	IF vAction = 'add' THEN
		IF vSaleFk IS NOT NULL THEN
			UPDATE sale
				SET quantity = quantity + 1
				WHERE id = vSaleFk;
		ELSE
			INSERT INTO sale(itemFk, ticketFk, concept, quantity)
				VALUES (vItemFk, vTicketFk, vItemName, 1);
		END IF;
	ELSE
		IF vSaleFk IS NOT NULL THEN
			IF vQuantity > 1 THEN
				UPDATE sale
					SET quantity = quantity - 1
					WHERE id = vSaleFk;
			ELSE
				DELETE FROM sale WHERE id = vSaleFk;
			END IF;
		END IF;
	END IF;
END$$
DELIMITER ;