DROP TRIGGER IF EXISTS `vn`.`entry_beforeUpdate`;

DELIMITER $$
CREATE DEFINER=`root`@`%` TRIGGER `vn`.`entry_beforeUpdate`
	BEFORE UPDATE ON `entry`
    FOR EACH ROW
BEGIN
    DECLARE vIsVirtual BOOL;
    DECLARE vPrintedCount INT;
    DECLARE vHasDistinctWarehouses BOOL;

	IF !(NEW.travelFk <=> OLD.travelFk) THEN
		SELECT COUNT(*) > 0 INTO vIsVirtual
			FROM entryVirtual WHERE entryFk = NEW.id;

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

		IF vIsVirtual 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 !(NEW.supplierFk <=> OLD.supplierFk) THEN
		SET NEW.currencyFk = entry_getCurrency(NEW.currencyFk, NEW.supplierFk);
	END IF;

    IF !(NEW.travelFk <=> OLD.travelFk)
	OR !(NEW.currencyFk <=> OLD.currencyFk) THEN 
		SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk,NEW.supplierFk);
	END IF;

	IF !(ABS(NEW.isBooked) <=> ABS(OLD.isBooked)) THEN
		INSERT INTO entryLog SET
			action = 'update',
            description = 'Cambia a Contabilizada',
            userFk = myWorker_getId(),
            originFk = NEW.id;
	END IF;
END$$
DELIMITER ;
