Beispiel #1
0
        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());
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
        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);
            }
        }
Beispiel #4
0
 private bool CreateTransaction(AccountTransaction transaction)
 {
     return(accounts[config.LookupAccount(transaction.From)]
            .CreateTransaction(transaction));
 }