salix/db/routines/vn/triggers/entry_beforeUpdate.sql

84 lines
2.2 KiB
MySQL
Raw Normal View History

DELIMITER $$
2024-08-20 08:06:10 +00:00
CREATE OR REPLACE DEFINER=`vn`@`localhost` TRIGGER `vn`.`entry_beforeUpdate`
BEFORE UPDATE ON `entry`
FOR EACH ROW
BEGIN
2024-11-11 13:19:11 +00:00
DECLARE vIsRaid BOOL;
DECLARE vPrintedCount INT;
DECLARE vHasDistinctWarehouses BOOL;
2024-04-22 13:03:08 +00:00
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);
2024-04-22 13:03:08 +00:00
ELSE
2024-04-29 17:40:43 +00:00
IF NEW.isBooked THEN
2024-04-22 13:03:08 +00:00
SELECT COUNT(*) INTO vTotalBuy
2024-04-29 17:40:43 +00:00
FROM buy
WHERE entryFk = NEW.id;
2024-04-30 12:37:06 +00:00
IF NOT vTotalBuy THEN
CALL util.throw('Entry must have lines to be marked booked');
2024-04-22 13:03:08 +00:00
END IF;
END IF;
END IF;
SET NEW.editorFk = account.myUser_getId();
IF NOT (NEW.travelFk <=> OLD.travelFk) THEN
2024-05-16 13:34:45 +00:00
IF NEW.travelFk IS NOT NULL THEN
2024-05-17 06:16:50 +00:00
CALL travel_throwAwb(NEW.travelFk);
END IF;
2024-11-11 13:19:11 +00:00
SELECT isRaid INTO vIsRaid
FROM travel t
JOIN entry e ON e.travelFk = t.id
WHERE entryFk = 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;
2024-11-11 13:19:11 +00:00
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)
2024-09-16 10:26:29 +00:00
OR NOT (NEW.currencyFk <=> OLD.currencyFk)
OR NOT (NEW.supplierFk <=> OLD.supplierFk) THEN
2024-09-16 10:26:29 +00:00
SET NEW.commission = entry_getCommission(NEW.travelFk, NEW.currencyFk, NEW.supplierFk);
END IF;
END$$
DELIMITER ;