public async Task <ServiceResult> GetAccountBalance()
        {
            try
            {
                if (_accountId <= 0)
                {
                    return(new ServiceResult {
                        StatusCode = StatusCodes.Status400BadRequest, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto {
                            Message = Messages.Account_InvalidAccountId
                        })
                    });
                }

                Account account = await _accountRepo.GetAsync(_accountId);

                if (account == null)
                {
                    return(new ServiceResult {
                        StatusCode = StatusCodes.Status404NotFound, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto {
                            Message = Messages.Account_AccountNotFound
                        })
                    });
                }

                IEnumerable <Transaction> payments = await _transRepo.GetAllAsync(t => t.AccountId == _accountId && t.TransactionType == TransactionTypeEnum.Withdrawal, orderBy : q => q.OrderByDescending(t => t.Date));

                IEnumerable <Transaction> deposits = await _transRepo.GetAllAsync(t => t.AccountId == _accountId && t.TransactionType == TransactionTypeEnum.Deposit, orderBy : q => q.OrderByDescending(t => t.Date));

                AccountBalanceResultDto result = new AccountBalanceResultDto
                {
                    AccountId                = _accountId,
                    OpeningBalance           = await _accountRepo.GetAccountOpeningBalanceAsync(_accountId),
                    ProcessedPaymentsBalance = await _accountRepo.GetAccountProcessedBalanceAsync(_accountId),
                    ClosingBalance           = await _accountRepo.GetAccountBalanceAsync(_accountId),
                    PendingdPaymentsBalance  = await _accountRepo.GetAccountPendingBalanceAsync(_accountId),
                    Payments = _mapper.Map <List <PaymentTransactionResultDto> >(payments),
                    Deposits = _mapper.Map <List <DepositTransactionResultDto> >(deposits),
                };
                return(new ServiceResult {
                    StatusCode = StatusCodes.Status200OK, ContentResult = JsonConvert.SerializeObject(result, new DecimalFormatConverter())
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex.Message, $"An error has occurred executing GetAccountBalance for Account {_accountId}");
                return(new ServiceResult {
                    StatusCode = StatusCodes.Status500InternalServerError, ContentResult = JsonConvert.SerializeObject(new ErrorResponseDto {
                        Message = ex.Message
                    })
                });
            }
        }
        public async Task Integration_GetAccountBalance_Expect70000()
        {
            Account newAccount = new Account {
                Name = "Test Account"
            };

            _context.Accounts.Add(newAccount);
            _context.SaveChanges();
            // 10 Deposits of 1000
            for (int i = 0; i < 10; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 1000,
                    TransactionStatus = TransactionStatusEnum.Processed,
                    TransactionType   = TransactionTypeEnum.Deposit,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1)
                });
            }
            // 2 Pending Payments
            for (int i = 0; i < 2; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 1000,
                    TransactionStatus = TransactionStatusEnum.Pending,
                    TransactionType   = TransactionTypeEnum.Withdrawal,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1)
                });
            }
            // 1 Procesed Payment
            _context.Transactions.Add(new Transaction
            {
                AccountId         = newAccount.Id,
                Amount            = 1000,
                TransactionStatus = TransactionStatusEnum.Processed,
                TransactionType   = TransactionTypeEnum.Withdrawal,
                Date           = new DateTime(2020, 1, 1),
                CreationDate   = new DateTime(2020, 1, 1),
                LastUpdateDate = new DateTime(2020, 1, 1)
            });
            // 2 Closed Payments
            for (int i = 0; i < 3; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 100000,
                    TransactionStatus = TransactionStatusEnum.Closed,
                    TransactionType   = TransactionTypeEnum.Withdrawal,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1),
                    ClosedReason   = Messages.Payment_NotEnoughFundsReason
                });
            }
            _context.SaveChanges();

            var response = await _client.GetAsync($"/api/account/balance/{newAccount.Id}");

            response.StatusCode.Should().Be(System.Net.HttpStatusCode.OK);
            var responseString = await response.Content.ReadAsStringAsync();

            AccountBalanceResultDto accountBalanceResult = JsonConvert.DeserializeObject <AccountBalanceResultDto>(responseString);

            accountBalanceResult.Should().NotBeNull();
            accountBalanceResult.OpeningBalance.Should().Be(10000);
            accountBalanceResult.ProcessedPaymentsBalance.Should().Be(1000);
            accountBalanceResult.PendingdPaymentsBalance.Should().Be(2000);
            accountBalanceResult.ClosingBalance.Should().Be(7000);
            accountBalanceResult.Deposits.Should().HaveCount(10);
            accountBalanceResult.Payments.Should().HaveCount(6);
            accountBalanceResult.Payments.Where(p => p.TransactionStatus == TransactionStatusEnum.Pending.ToString()).Should().HaveCount(2);
            accountBalanceResult.Payments.Where(p => p.TransactionStatus == TransactionStatusEnum.Closed.ToString()).Should().HaveCount(3);
            accountBalanceResult.Payments.Where(p => p.TransactionStatus == TransactionStatusEnum.Processed.ToString()).Should().HaveCount(1);
        }
        public async Task Unit_GetAccountBalance_Expect70000()
        {
            Account newAccount = new Account {
                Name = "Test Account"
            };

            _context.Accounts.Add(newAccount);
            _context.SaveChanges();
            // 10 Deposits of 1000
            for (int i = 0; i < 10; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 1000,
                    TransactionStatus = TransactionStatusEnum.Processed,
                    TransactionType   = TransactionTypeEnum.Deposit,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1)
                });
            }
            // 2 Pending Payments
            for (int i = 0; i < 2; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 1000,
                    TransactionStatus = TransactionStatusEnum.Pending,
                    TransactionType   = TransactionTypeEnum.Withdrawal,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1)
                });
            }
            // 1 Procesed Payment
            _context.Transactions.Add(new Transaction
            {
                AccountId         = newAccount.Id,
                Amount            = 1000,
                TransactionStatus = TransactionStatusEnum.Processed,
                TransactionType   = TransactionTypeEnum.Withdrawal,
                Date           = new DateTime(2020, 1, 1),
                CreationDate   = new DateTime(2020, 1, 1),
                LastUpdateDate = new DateTime(2020, 1, 1)
            });
            // 2 Closed Payments
            for (int i = 0; i < 3; i++)
            {
                _context.Transactions.Add(new Transaction
                {
                    AccountId         = newAccount.Id,
                    Amount            = 100000,
                    TransactionStatus = TransactionStatusEnum.Closed,
                    TransactionType   = TransactionTypeEnum.Withdrawal,
                    Date           = new DateTime(2020, 1, 1),
                    CreationDate   = new DateTime(2020, 1, 1),
                    LastUpdateDate = new DateTime(2020, 1, 1),
                    ClosedReason   = Messages.Payment_NotEnoughFundsReason
                });
            }
            _context.SaveChanges();

            AccountBalanceService balanceService = new AccountBalanceService(_mockLogger.Object, newAccount.Id, _mapper, _accountRepo, _transRepo);
            ServiceResult         result         = await balanceService.GetAccountBalance();

            result.Should().NotBeNull();
            AccountBalanceResultDto balance = JsonConvert.DeserializeObject <AccountBalanceResultDto>(result.ContentResult);

            balance.Should().NotBeNull();
            balance.AccountId.Should().Be(newAccount.Id);
            balance.OpeningBalance.Should().Be(10000);
            balance.ProcessedPaymentsBalance.Should().Be(1000);
            balance.PendingdPaymentsBalance.Should().Be(2000);
            balance.ClosingBalance.Should().Be(7000);
            balance.Deposits.Count().Should().Be(10);
            balance.Payments.Count().Should().Be(6);
        }