0
respostas

Minha solução trabalhando com Trigger

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

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora