예제 #1
0
        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());
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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);
        }
예제 #4
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));
        }
예제 #5
0
 /// <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);
 }