Exemplo n.º 1
0
        public async Task <IActionResult> Sacar(SaqueRequest saque)
        {
            if (!_statusService.Ativo())
            {
                return(new UnauthorizedObjectResult("Caixa está no modo Inativo."));
            }
            if (saque.Valor < 0 || saque.Valor > 10000)
            {
                return(new BadRequestObjectResult("Valor não pode ser Sacado."));
            }
            var valorSolicitado = saque.Valor;
            var response        = new SaqueResponse(valorSolicitado);
            var saldoCliente    = ObterSaldoCliente();

            if (saldoCliente < valorSolicitado)
            {
                return(new BadRequestObjectResult("Saldo Insuficiente."));
            }

            var cedulaInicial = ObterMaiorCedula();

            if (cedulaInicial == null)
            {
                return(new BadRequestObjectResult("Cedulas Insuficiente."));
            }

            var maiorCedula                = cedulaInicial.Valor;
            var quantidadeCedula           = 0;
            var quantidadeCedulaDisponivel = cedulaInicial.Quantidade;

            while (true)
            {
                if (maiorCedula == 0)
                {
                    return(new BadRequestObjectResult("Valor Solicitado não pode ser sacado."));
                }
                if (valorSolicitado >= maiorCedula && quantidadeCedulaDisponivel > 0)
                {
                    valorSolicitado            -= maiorCedula;
                    quantidadeCedulaDisponivel -= 1;
                    quantidadeCedula           += 1;
                }
                else
                {
                    if (quantidadeCedula > 0)
                    {
                        response.Composicao.Add(new ComposicaoViewModel()
                        {
                            Quantidade = quantidadeCedula,
                            Valor      = maiorCedula
                        });
                    }
                    quantidadeCedula = 0;
                    if (valorSolicitado == 0)
                    {
                        response.Composicao.ForEach(item => { SubtrairNota(item); });
                        //Chama serviço da conta do cliente para subtrair valor
                        return(new OkObjectResult(response));
                    }
                    var maiorValor = ObterProximoMaiorValor(maiorCedula);
                    maiorCedula = maiorValor == null ? 0 : maiorValor.Valor;
                    quantidadeCedulaDisponivel = maiorValor == null ? 0 : maiorValor.Quantidade;
                }
            }
        }