/// <summary> /// Realiza o agendamento de um aluguel de veiculo /// </summary> /// <param name="agendamentoInput"></param> /// <param name="ctx"></param> /// <returns></returns> public async Task <Result <AgendamentoOutputModel> > AgendarAluguelVeiculo(AgendamentoInputModel agendamentoInput, CancellationToken ctx) { var listaInconsistencias = ValidarRegrasAgendamento(agendamentoInput.Placa, agendamentoInput.DataRetirada, agendamentoInput.DataDevolucao); if (listaInconsistencias.Any()) { return(Result <AgendamentoOutputModel> .Error(listaInconsistencias)); } var veiculo = await _veiculoRepository.ObterPorPlaca(agendamentoInput.Placa, ctx); if (veiculo == null) { var notification = new List <Notification> { new Notification(nameof(Veiculo), MensagensInfo.Veiculo_PlacaNaoEncontrada) }; return(Result <AgendamentoOutputModel> .Error(notification)); } TimeSpan diferencaDatas = agendamentoInput.DataDevolucao.Subtract(agendamentoInput.DataRetirada); var totalHoras = diferencaDatas.TotalHours > 0 ? diferencaDatas.TotalHours : 1; var valorTotal = CalcularValorTotalAgendamento(totalHoras, veiculo.ValorHora); var agendamento = new Agendamento(veiculo.Placa, veiculo.ValorHora, totalHoras, valorTotal, veiculo.Categoria, GerarCodigoReserva()); await _agendamentoRepository.Salvar(agendamento, ctx); var output = _mapper.Map <Agendamento, AgendamentoOutputModel>(agendamento); return(Result <AgendamentoOutputModel> .Ok(output)); }
public async Task <IActionResult> AgendarVeiculo(AgendamentoInputModel agendamentoInput, CancellationToken ctx) { var result = await _veiculoApplication.AgendarAluguelVeiculo(agendamentoInput, ctx); if (result.Valid) { return(Created($"/veiculos/{agendamentoInput.Placa}/agendamentos", result.Object)); } return(UnprocessableEntity(result.Notifications)); }
public async Task <IActionResult> SimularAgendamentoVeiculo([FromRoute] string placa, [FromQuery] DateTime dataRetirada, [FromQuery] DateTime dataDevolucao, CancellationToken ctx) { var input = new AgendamentoInputModel { DataDevolucao = dataDevolucao, DataRetirada = dataRetirada, Placa = placa }; var result = await _veiculoApplication.SimularAluguelVeiculo(input, ctx); if (result.Valid) { return(Ok(result.Object)); } return(UnprocessableEntity(result.Notifications)); }
/// <summary> /// Realiza a simulação de um agendamento /// </summary> /// <param name="agendamentoInput"></param> /// <param name="ctx"></param> /// <returns></returns> public async Task <Result <SimulacaoAgendamentoModel> > SimularAluguelVeiculo(AgendamentoInputModel agendamentoInput, CancellationToken ctx) { var listaInconsistencias = ValidarRegrasAgendamento(agendamentoInput.Placa, agendamentoInput.DataRetirada, agendamentoInput.DataDevolucao); if (listaInconsistencias.Any()) { return(Result <SimulacaoAgendamentoModel> .Error(listaInconsistencias)); } var veiculo = await _veiculoRepository.ObterPorPlaca(agendamentoInput.Placa, ctx); if (veiculo == null) { var notification = new List <Notification> { new Notification(nameof(Veiculo), MensagensInfo.Veiculo_PlacaNaoEncontrada) }; return(Result <SimulacaoAgendamentoModel> .Error(notification)); } TimeSpan diferencaDatas = agendamentoInput.DataDevolucao.Subtract(agendamentoInput.DataRetirada); var totalHoras = diferencaDatas.TotalHours > 0 ? diferencaDatas.TotalHours : 1; var simulacao = new SimulacaoAgendamentoModel { Placa = veiculo.Placa, ValorHora = veiculo.ValorHora, ValorTotal = CalcularValorTotalAgendamento(totalHoras, veiculo.ValorHora), TotalHoras = totalHoras }; return(Result <SimulacaoAgendamentoModel> .Ok(simulacao)); }