1
resposta

[Sugestão] Sugestão de lógica do negócio

Creio que temos uma chance de melhoria nesta procedure, pois ela tem o intuíto de calcular apenas os dias úteis para demonstração do valor total, porém os parâmetros da procedure ainda necessita que o próprio usuário faça as contas, inutilizando todo o algoritmo imposto, fazemos um contador que considera apenas os dias úteis, mas no momento de calcular o valor total, temos o cálculo dos dias inseridos pelo usuário.

Além do bug apontado pelo aluno Matheus, eu adicionei e modifiquei para que tenhamos um contador dos dias corridos (para passar pelo loop) e um contador de dias úteis, para somar apenas quando não for sábado ou domingo. Depois, coloquei este último contador no cálculo do valor total, com isso, usuário pode apenas colocar o valor total dos dias hospedado que o retorno já vai ser o correto. Abaixo a procedure que montei

USE `insight_places`;
DROP procedure IF EXISTS `insight_places`.`novo_aluguel_42`;
DELIMITER $$
USE `insight_places`$$
CREATE DEFINER=`root`@`localhost` PROCEDURE `novo_aluguel_42`
(v_aluguel varchar(10), v_cliente_nome varchar(150), v_hospedagem varchar(10),
v_data_inicio date, v_dias integer, v_preco_unitario decimal(10,2))
BEGIN
    declare v_cliente varchar(10);
    declare v_dias_uteis integer; -- Contador para cálculo do preço total
    declare v_dias_corridos integer; -- Contador geral
    declare v_dia_semana integer;
    declare v_data_final date;
    declare v_num_clientes integer;
    declare v_preco_total decimal(10,2);
    declare v_mensagem varchar(100);
    declare exit handler for 1452
    begin
        set v_mensagem = 'Problema de chave estrangeira associado a alguma entidade da base';
        select v_mensagem;
    end;
    set v_num_clientes = (select count(*) from clientes where nome = v_cliente_nome);
    case
    when v_num_clientes = 0 then
        set v_mensagem = 'Nome de cliente não localizado na base para inclusão';
        select v_mensagem;
    when v_num_clientes = 1 then
        -- set v_data_final = (select v_data_inicio + interval v_dias day);
        set v_dias_uteis = 0;
        set v_dias_corridos = 0;
        set v_data_final = v_data_inicio;
        while v_dias_corridos < v_dias do
            set v_dia_semana = dayofweek(v_data_final);
            if (v_dia_semana <> 7 and v_dia_semana <> 1) then
                set v_dias_uteis = v_dias_uteis + 1;
            end if;
            set v_data_final = (select v_data_final + interval 1 day);
            set v_dias_corridos = v_dias_corridos + 1;
        end while;
        set v_preco_total = v_dias_uteis * v_preco_unitario; -- Contanto apenas os dias úteis e não os dias que o usuário inserir
        select cliente_id into v_cliente from clientes where nome = v_cliente_nome;
        insert into reservas values(v_aluguel, v_cliente, v_hospedagem, v_data_inicio,
        v_data_final, v_preco_total);
        set v_mensagem = 'Reserva incluída na base com sucesso!';
        select v_mensagem;
    when v_num_clientes > 1 then
        set v_mensagem = 'Não é possível utilizar este nome para a inclusão, mais de 1 cliente na base';
        select v_mensagem;
    end case;
END$$
DELIMITER ;
1 resposta

Ei, Gabriel! Tudo bem?

Ótima melhoria na procedure! Agradeço por você compartilhar com a gente, essas interações nos ajudam muito na melhoria contínua de nossos conteúdos. Você identificou bem o problema e propôs uma solução eficiente, separando os contadores de dias corridos e dias úteis. Isso realmente torna o cálculo mais automático e preciso, evitando que o usuário precise fazer ajustes manuais.

Só um detalhe para reforçar: como você está usando dayofweek(), vale lembrar que no MySQL:

  • 1 = Domingo

  • 7 = Sábado

Conteúdos relacionados

Este conteúdo podE abrir em inglês e se preferir ler em português, recomendo que utilize o tradutor automático do navegador.

Continue se dedicando aos estudos e qualquer dúvida, compartilhe no fórum.

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