DROP TRIGGER IF EXISTS AtualizaResumoAluguel;
DELIMITER $$
CREATE TRIGGER AtualizaResumoAluguel
AFTER INSERT ON alugueis
FOR EACH ROW
BEGIN
DECLARE v_dias INT;
DECLARE v_desconto DECIMAL(5,2);
DECLARE v_valor_final DECIMAL(10,2);
-- Calcula a quantidade de dias da hospedagem
SET v_dias = DATEDIFF(NEW.data_fim, NEW.data_inicio);
-- Define o percentual de desconto
SET v_desconto = CASE
WHEN v_dias BETWEEN 4 AND 6 THEN 0.05
WHEN v_dias BETWEEN 7 AND 9 THEN 0.10
WHEN v_dias >= 10 THEN 0.15
ELSE 0
END;
-- Calcula o valor final com desconto aplicado
SET v_valor_final = ROUND(NEW.preco_total * (1 - v_desconto), 2);
-- Insere os dados no resumo_aluguel somente se ainda não existir
IF NOT EXISTS (
SELECT 1
FROM resumo_aluguel
WHERE aluguel_id = NEW.aluguel_id AND cliente_id = NEW.cliente_id
) THEN
INSERT INTO resumo_aluguel (
aluguel_id,
cliente_id,
valor_total,
desconto_aplicado,
valor_final
)
VALUES (
NEW.aluguel_id,
NEW.cliente_id,
NEW.preco_total,
v_desconto * 100, -- converte para porcentagem
v_valor_final
);
END IF;
END$$
DELIMITER ;
DROP TRIGGER IF EXISTS ValidaAluguelAntesInserir;
DELIMITER $$
DELIMITER $$
CREATE TRIGGER ValidaAluguelAntesInserir
BEFORE INSERT ON alugueis
FOR EACH ROW
BEGIN
DECLARE v_exist_cliente INT;
DECLARE v_exist_hospedagem INT;
-- Verifica se o cliente existe
SELECT COUNT(*) INTO v_exist_cliente
FROM clientes
WHERE cliente_id = NEW.cliente_id;
IF v_exist_cliente = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Cliente não existe na base de dados.';
END IF;
-- Verifica se a hospedagem existe
SELECT COUNT(*) INTO v_exist_hospedagem
FROM hospedagens
WHERE hospedagem_id = NEW.hospedagem_id;
IF v_exist_hospedagem = 0 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Hospedagem informada não existe na base de dados.';
END IF;
-- Verifica se o aluguel_id já existe
IF EXISTS (SELECT 1 FROM alugueis WHERE aluguel_id = NEW.aluguel_id) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Não é possível incluir este aluguel, pois ele já existe na base de dados.';
END IF;
END$$
DELIMITER ;
Criei outra Trigger como before insert para validação e para retornar erros e exceções em msn mais amigaveis para o usuario