public async Task <CriarMovimentacaoBancariaDto> CriarMovimentacaoBancariaAsync(CriarMovimentacaoBancariaDto dto, CancellationToken cancellationToken)
        {
            if (dto is null)
            {
                dto = new CriarMovimentacaoBancariaDto();
                dto.AddError("A movimentação bancária é obrigatória e não pode ser nula.");
                return(dto);
            }

            var movimentacaoBancaria = await GetMovimentacaoBancariaAsync(dto, cancellationToken);

            if (movimentacaoBancaria.IsValid())
            {
                await _movimentacaoBancariaRepository.AddAsync(movimentacaoBancaria, cancellationToken);

                await _hiperAcademiaContext.SaveChangesAsync(cancellationToken);
            }

            return(dto);
        }
 protected abstract Task <MovimentacaoBancaria> GetMovimentacaoBancariaAsync(CriarMovimentacaoBancariaDto dto, CancellationToken cancellationToken);
 public async Task <IActionResult> PostAsync(CriarMovimentacaoBancariaDto dto, CancellationToken cancellationToken)
 {
     dto.ContaBancariaId = (await GetContaBancariaPadraoAsync(cancellationToken)).IdExterno;
     return(TratarRetorno(await _depositoServices.CriarMovimentacaoBancariaAsync(dto, cancellationToken)));
 }
        protected override async Task <MovimentacaoBancaria> GetMovimentacaoBancariaAsync(CriarMovimentacaoBancariaDto dto, CancellationToken cancellationToken)
        {
            var contaBancaria = await _contaBancariaRepository.GetContaBancariaAsync(dto.ContaBancariaId, cancellationToken);

            var deposito = new DepositoBuilder()
                           .WithContaBancaria(contaBancaria)
                           .WithData(DateTime.Now)
                           .WithValor(dto.Valor)
                           .Build();

            return(deposito);
        }
        protected override async Task <MovimentacaoBancaria> GetMovimentacaoBancariaAsync(CriarMovimentacaoBancariaDto dto, CancellationToken cancellationToken)
        {
            var contaBancaria = await _contaBancariaRepository.GetContaBancariaAsync(dto.ContaBancariaId, cancellationToken);

            var saque = new SaqueBuilder()
                        .WithContaBancaria(contaBancaria)
                        .WithData(DateTime.Now)
                        .WithValor(dto.Valor)
                        .Build();

            if (saque.IsValid())
            {
                var saldo = await _contaBancariaRepository.GetSaldoAsync(dto.ContaBancariaId, cancellationToken);

                if ((saldo - dto.Valor) <= default(decimal))
                {
                    saque.AddError("O valor informado é menor que o saldo da conta.");
                }
            }

            return(saque);
        }