Black November

ATÉ 50% OFF

TÁ ACABANDO!

0 dias

0 horas

0 min

0 seg

1
resposta

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

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Oi, Paulo! Como vai?

Agradeço por compartilhar seu código com a comunidade Alura.

Gostei de ver como você estruturou suas triggers para gerenciar tanto o cálculo do valor final quanto a validação antes da inserção. A organização do código com AFTER INSERT e BEFORE INSERT mostra cuidado em manter a integridade dos dados e melhorar a experiência do usuário com mensagens amigáveis. Continue assim!

Uma dica interessante para o futuro é utilizar a função IFNULL em consultas para evitar valores nulos que possam gerar erros. Por exemplo:


SELECT IFNULL(preco_total,0) AS preco_total
FROM alugueis
WHERE aluguel_id = 1;

Esse código substitui NULL por 0, evitando que cálculos posteriores falhem.

Ícone de sugestão Para saber mais:

Sugestão de conteúdo para você mergulhar ainda mais sobre o tema:

O link está em inglês, mas você pode usar a tradução automática do navegador

Qualquer dúvida que surgir, compartilhe no fórum. Abraços e bons estudos!

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!