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 ;