/// <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"); }