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; } } }