public void CreateDebitTransaction(AccountTransaction transaction) { if (transaction.Type == TransactionType.Debit) { if (!CreateTransaction(transaction)) { return; } } if (transaction.Currency.Equals(transaction.TransferCurrency)) { // If FX is not needed, just move the money to the holding account. ledger.Post(AccountTransfer.NewBuilder() .From(transaction.From) .To(config.GetHoldAccount(transaction.Currency)) .WithAmount( transaction.Amount, transaction.Currency) .Build()); } else { // With FX. // Create two transfers to account for FX. // 1) DB customer, credit FX in the customer account currency. // 2) DB FX, credit hold account in the settlement account currency. // Note that we are not accounting for the spread with this // transaction pair, it goes 'nowhere'. ledger.Post( AccountTransfer.NewBuilder() .From(transaction.From) .To(config.GetFxAccount(transaction.Currency)) .WithAmount( transaction.Amount, transaction.Currency) .Build(), AccountTransfer.NewBuilder() .From(config.GetFxAccount(transaction.TransferCurrency)) .To(config.GetHoldAccount(transaction.TransferCurrency)) .WithAmount( transaction.TransferAmount, transaction.TransferCurrency) .Build()); } }
/// <summary> /// Adds new transaction to the account. /// </summary> /// <param name="transaction"> transaction to add</param> /// <returns>true if transaction has been created, false if duplicate</returns> public bool CreateTransaction(AccountTransaction transaction) { if (transactionsById.ContainsKey(transaction.Id)) { return(false); } if (transaction.Amount > balanceAvailable) { throw new TransferException(StatusCode.FailureInsufficientFunds, "Balance exceeded"); } transactions.Insert(0, transaction); transactionsById.Add(transaction.Id, transaction); balanceAvailable -= transaction.Amount; return(true); }
internal Account( string currency, double balanceAvailable, double balanceCurrent, AccountTransaction transaction) { this.currency = currency; this.transactions = new List <AccountTransaction>(); this.transactionsById = new Dictionary <string, AccountTransaction>(); this.balanceAvailable = balanceAvailable; this.balanceCurrent = balanceCurrent; if (transaction != null) { transactions.Add(transaction); transactionsById.Add(transaction.Id, transaction); } }
private bool CreateTransaction(AccountTransaction transaction) { return(accounts[config.LookupAccount(transaction.From)] .CreateTransaction(transaction)); }