/// <summary>
        /// Updates the balance for the given currency and Account ID
        /// </summary>
        /// <param name="currency"></param>
        /// <param name="accountId"></param>
        /// <param name="volume"></param>
        /// <param name="orderId"> </param>
        /// <param name="fee"> </param>
        /// <param name="isPending"> </param>
        /// <returns></returns>
        private decimal UpdateBalanceAfterTrade(Currency currency, AccountId accountId, decimal volume, string orderId,
                                                decimal fee, bool isPending)
        {
            Balance balance = _balanceRepository.GetBalanceByCurrencyAndAccountId(currency, accountId);

            if (balance != null)
            {
                if (!isPending)
                {
                    balance.AddAvailableBalance(volume);
                    balance.AddCurrentBalance(volume);
                }
                else
                {
                    balance.ConfirmPendingTransaction(orderId, PendingTransactionType.Order, volume);
                }
                if (fee != 0.0M)
                {
                    balance.AddAvailableBalance(-fee);
                    balance.AddCurrentBalance(-fee);
                }
                _fundsPersistenceRepository.SaveOrUpdate(balance);
                return(balance.CurrentBalance);
            }
            return(0);
        }
        public void SavePendingTransactionsTest_SavesObjectsToPendingTransactionsList_ChecksIfTheyAreAsExpected()
        {
            Balance balance = new Balance(new Currency("LTC", true), new AccountId(1), 5000, 5000);

            _persistanceRepository.SaveOrUpdate(balance);
            bool addPendingTransaction = balance.AddPendingTransaction("withdrawid123", PendingTransactionType.Withdraw, -500);

            Assert.IsTrue(addPendingTransaction);

            _persistanceRepository.SaveOrUpdate(balance);

            Balance retrievedBalance = _balanceRepository.GetBalanceByCurrencyAndAccountId(balance.Currency, balance.AccountId);

            Assert.IsNotNull(retrievedBalance);

            Assert.AreEqual(4500, retrievedBalance.AvailableBalance);
            Assert.AreEqual(5000, retrievedBalance.CurrentBalance);
            Assert.AreEqual(500, retrievedBalance.PendingBalance);

            retrievedBalance.ConfirmPendingTransaction("withdrawid123", PendingTransactionType.Withdraw, -500);

            _persistanceRepository.SaveOrUpdate(retrievedBalance);
            retrievedBalance = _balanceRepository.GetBalanceByCurrencyAndAccountId(balance.Currency, balance.AccountId);
            Assert.IsNotNull(retrievedBalance);
            Assert.AreEqual(4500, retrievedBalance.AvailableBalance);
            Assert.AreEqual(4500, retrievedBalance.CurrentBalance);
            Assert.AreEqual(0, retrievedBalance.PendingBalance);
        }
        public bool WithdrawalExecuted(Withdraw withdraw)
        {
            // Set Withdraw status to confirm and update in database
            withdraw.StatusConfirmed();
            _fundsPersistenceRepository.SaveOrUpdate(withdraw);
            Balance balance = _balanceRepository.GetBalanceByCurrencyAndAccountId(withdraw.Currency, withdraw.AccountId);

            if (balance != null)
            {
                bool addResponse = balance.ConfirmPendingTransaction(withdraw.WithdrawId,
                                                                     PendingTransactionType.Withdraw,
                                                                     -(withdraw.Amount + withdraw.Fee));
                if (addResponse)
                {
                    _fundsPersistenceRepository.SaveOrUpdate(balance);
                    return(_transactionService.CreateWithdrawTransaction(withdraw, balance.CurrentBalance));
                }
            }
            throw new InvalidOperationException("Balance not found for the given withdraw");
        }