/// <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));
        }
Exemple #2
0
        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));
        }
Exemple #3
0
        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));
        }