public async Task <IActionResult> Post(SaqueDTO Saque) { var userId = User.FindFirstValue(ClaimTypes.Name); ContaCorrente cc = await _repo.GetContaByAgenciaConta(Saque.Agencia, Saque.Conta); if (cc == null) { return(BadRequest("Não existe a conta na agência inserida!")); } if (cc.UserId != int.Parse(userId)) { return(Unauthorized()); } if (cc.Saldo <= 0) { return(Ok("Saldo negativo.")); } if (Saque.Saque <= 0) { return(BadRequest("O valor do saque terá que ser maior que zero!")); } cc.Saldo -= Saque.Saque; _repo.Update(cc); if (await _repo.SaveChangeAsync()) { return(Ok("Novo saldo: R$" + cc.Saldo)); } return(BadRequest()); }
/// <summary> /// Realiza o saque do valor requisitado. /// </summary> /// <param name="saqueDTO">Objeto com o valor do saque requisitado.</param> /// <returns></returns> public Dictionary <TipoNota, int> RealizaSaque(SaqueDTO saqueDTO) { var resultado = new Dictionary <TipoNota, int>(); var resto = saqueDTO.ValorRequisitado; // Caso utilizasse List<TipoNota> no lugar de flags, poderia usar foreach, // no entanto, como a quantidade de tipos de notas não é um valor que se altera // de forma comum decidi por essa abordagem para economizar memória e processamento. if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cem) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Cem); resultado.Add(TipoNota.Cem, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Cem; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cinquenta) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Cinquenta); resultado.Add(TipoNota.Cinquenta, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Cinquenta; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Vinte) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Vinte); resultado.Add(TipoNota.Vinte, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Vinte; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Dez) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Dez); resultado.Add(TipoNota.Dez, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Dez; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cinco) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Cinco); resultado.Add(TipoNota.Cinco, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Cinco; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Dois) != 0) { var quantidadeNotas = (int)Math.Truncate(resto / (int)TipoNota.Dois); resultado.Add(TipoNota.Dois, quantidadeNotas); resto -= quantidadeNotas * (int)TipoNota.Dois; } return(resultado); }
/// <summary> /// Verifica se o valor pode ser sacado com as notas disponíveis. /// </summary> /// <param name="saqueDTO">Objeto com o valor do saque requisitado.</param> /// <returns></returns> public bool ValorRequisitadoValido(SaqueDTO saqueDTO) { var resto = saqueDTO.ValorRequisitado; if (resto == 0m) { return(false); } // Caso utilizasse List<TipoNota> no lugar de flags, poderia usar foreach, // no entanto, como a quantidade de tipos de notas não é um valor que se altera // de forma comum decidi por essa abordagem para economizar memória e processamento. if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cem) != 0) { resto = resto % (int)TipoNota.Cem; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cinquenta) != 0) { resto = resto % (int)TipoNota.Cinquenta; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Vinte) != 0) { resto = resto % (int)TipoNota.Vinte; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Dez) != 0) { resto = resto % (int)TipoNota.Dez; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Cinco) != 0) { resto = resto % (int)TipoNota.Cinco; } if ((this.ConfiguracaoSaque.NotasDisponiveis & TipoNota.Dois) != 0) { resto = resto % (int)TipoNota.Dois; } return(resto == 0); }
public IActionResult Index(SaqueViewModel saqueViewModel) { SaqueService saqueService = new SaqueService(); SaqueDTO saqueDTO = new SaqueDTO { ValorRequisitado = saqueViewModel.ValorRequisitado }; if (!saqueService.EstaNoLimite(saqueDTO)) { saqueViewModel.Erro = @"O valor informado passou do limite de R$ 1.500,00."; return(View(saqueViewModel)); } if (!saqueService.ValorRequisitadoValido(saqueDTO)) { saqueViewModel.Erro = @"O valor informado é inválido. Favor informar um valor múltiplo de 2, 5, 10, 20, 50 ou 100."; return(View(saqueViewModel)); } saqueViewModel.ValoresSaque = saqueService.RealizaSaque(saqueDTO); return(View(saqueViewModel)); }
/// <summary> /// Faz a validação se o valor /// requisitado do saque está dentro do limite permitido. /// </summary> /// <param name="saqueDTO">Objeto com o valor do saque requisitado.</param> /// <returns></returns> public bool EstaNoLimite(SaqueDTO saqueDTO) { return(saqueDTO.ValorRequisitado <= this.ConfiguracaoSaque.ValorLimiteSaque); }