DELIMITER $$
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`entry_beforeUpdate`
	BEFORE UPDATE ON `entry`
	FOR EACH ROW
BEGIN
	DECLARE vIsRaid BOOL;
	DECLARE vPrintedCount INT;
	DECLARE vHasDistinctWarehouses BOOL;
	DECLARE vTotalBuy INT;

	IF NEW.isBooked = OLD.isBooked AND (
			NOT (NEW.supplierFk <=> OLD.supplierFk) OR
			NOT (NEW.dated <=> OLD.dated) OR
			NOT (NEW.travelFk <=> OLD.travelFk) OR
			NOT (NEW.companyFk <=> OLD.companyFk) OR
			NOT (NEW.invoiceInFk <=> OLD.invoiceInFk) OR
			NOT (NEW.typeFk <=> OLD.typeFk)
		) THEN

		CALL entry_isEditable(OLD.id);
	ELSE

		IF NEW.isBooked THEN
			SELECT COUNT(*) INTO vTotalBuy
				FROM buy
				WHERE entryFk = NEW.id;
			IF NOT vTotalBuy THEN
				CALL util.throw('Entry must have lines to be marked booked');
			END IF;
		END IF;
	END IF;

	SET NEW.editorFk = account.myUser_getId();

	IF NOT (NEW.travelFk <=> OLD.travelFk) THEN

		IF NEW.travelFk IS NOT NULL THEN
			CALL travel_throwAwb(NEW.travelFk);
		END IF;

		SELECT t.isRaid INTO vIsRaid
			FROM travel t
				JOIN entry e ON e.travelFk = t.id
			WHERE e.id = NEW.id;

		SELECT NOT (o.warehouseInFk <=> n.warehouseInFk)
				OR NOT (o.warehouseOutFk <=> n.warehouseOutFk)
			INTO vHasDistinctWarehouses
			FROM travel o, travel n
			WHERE o.id = OLD.travelFk
				AND n.id = NEW.travelFk;

		IF vIsRaid AND vHasDistinctWarehouses THEN
			SIGNAL SQLSTATE '45000'
				SET MESSAGE_TEXT = 'A cloned entry cannot be moved to a travel with different warehouses';
		END IF;

		IF NEW.travelFk IS NULL THEN
			SELECT COUNT(*) INTO vPrintedCount
				FROM buy
				WHERE entryFk = OLD.id
					AND printedStickers > 0;

			IF vPrintedCount > 0 THEN
				SIGNAL SQLSTATE '45000'
					SET MESSAGE_TEXT = 'An entry that contains lines with printed labels cannot be deleted';
			END IF;
		END IF;
	END IF;

	IF NOT (NEW.supplierFk <=> OLD.supplierFk) THEN
		CALL supplier_checkIsActive(NEW.supplierFk);
		SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk);
	END IF;

	IF NOT (NEW.travelFk <=> OLD.travelFk)
		OR NOT (NEW.currencyFk <=> OLD.currencyFk)
		OR NOT (NEW.supplierFk <=> OLD.supplierFk) THEN

		SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk, NEW.supplierFk);
	END IF;
END$$
DELIMITER ;