public AccountTransactionViewModel(IWorkspace workspace, AccountTransaction model, AccountTransactionDocument document)
 {
     Model = model ?? AccountTransaction.Null;
     _document = document;
     _workspace = workspace;
     _accountTransactionType =
         AccountTransactionTypes.SingleOrDefault(x => x.Id == Model.AccountTransactionTypeId);
 }
        public AccountTransactionDocument CreateDocument(Account account, string description, decimal amount, decimal exchangeRate, IList <Account> accounts)
        {
            // <pex>
            if (account == null)
            {
                throw new ArgumentNullException("account");
            }
            if (account.AccountTypeId != MasterAccountTypeId)
            {
                throw new ArgumentException("Account Type should match Master Account Type");
            }
            // </pex>

            var result = new AccountTransactionDocument {
                Name = Name
            };

            foreach (var accountTransactionType in TransactionTypes)
            {
                var transaction = AccountTransaction.Create(accountTransactionType);
                transaction.Name = description;
                transaction.UpdateAmount(amount, exchangeRate);
                transaction.UpdateAccounts(MasterAccountTypeId, account.Id);
                if (accounts != null && accounts.Count > 0)
                {
                    if (transaction.SourceAccountTypeId != MasterAccountTypeId &&
                        transaction.SourceTransactionValue.AccountId == 0)
                    {
                        Account ac =
                            accounts.FirstOrDefault(x => x.AccountTypeId == transaction.SourceAccountTypeId);
                        if (ac != null)
                        {
                            transaction.SetSourceAccount(ac.AccountTypeId, ac.Id);
                        }
                    }
                    if (transaction.TargetAccountTypeId != MasterAccountTypeId &&
                        transaction.TargetTransactionValue.AccountId == 0)
                    {
                        Account ac =
                            accounts.FirstOrDefault(x => x.AccountTypeId == transaction.TargetAccountTypeId);
                        if (ac != null)
                        {
                            transaction.SetTargetAccount(ac.AccountTypeId, ac.Id);
                        }
                    }
                }
                result.AccountTransactions.Add(transaction);
            }
            return(result);
        }
        public AccountTransactionDocument CreateDocument(Account account, string description, decimal amount, decimal exchangeRate, IList <AccountData> accounts, IList <ForeignCurrency> currencies)
        {
            var result = new AccountTransactionDocument {
                Name = Name, DocumentTypeId = Id
            };

            foreach (var accountTransactionType in TransactionTypes)
            {
                var transaction = AccountTransaction.Create(accountTransactionType);
                var amountRate  = GetExchangeRate(accountTransactionType.ForeignCurrencyId, currencies);
                amount = amount * amountRate;
                transaction.UpdateAmount(amount, exchangeRate, accounts);
                transaction.UpdateAccount(MasterAccountTypeId, account.Id);
                if (accounts != null && accounts.Count > 0)
                {
                    if (transaction.SourceAccountTypeId != MasterAccountTypeId &&
                        transaction.SourceTransactionValue.AccountId == 0)
                    {
                        var ac = accounts.FirstOrDefault(x => x.AccountTypeId == transaction.SourceAccountTypeId);
                        if (ac != null)
                        {
                            transaction.SetSourceAccount(ac.AccountTypeId, ac.AccountId);
                        }
                    }

                    if (transaction.TargetAccountTypeId != MasterAccountTypeId &&
                        transaction.TargetTransactionValue.AccountId == 0)
                    {
                        var ac = accounts.FirstOrDefault(x => x.AccountTypeId == transaction.TargetAccountTypeId);
                        if (ac != null)
                        {
                            transaction.SetTargetAccount(ac.AccountTypeId, ac.AccountId);
                        }
                    }
                }
                if (!string.IsNullOrEmpty(description))
                {
                    transaction.UpdateDescription(description);
                }
                result.AccountTransactions.Add(transaction);
            }
            return(result);
        }
 private static void ReverseTransaction(AccountTransaction transaction)
 {
     var ti = transaction.SourceAccountTypeId;
     var tv = transaction.SourceTransactionValue;
     transaction.SourceAccountTypeId = transaction.TargetAccountTypeId;
     transaction.SourceTransactionValue = transaction.TargetTransactionValue;
     transaction.TargetAccountTypeId = ti;
     transaction.TargetTransactionValue = tv;
     transaction.IsReversed = true;
 }
        public static AccountTransaction Create(AccountTransactionType template)
        {
            // <pex>
            if (template == null)
                throw new ArgumentNullException("template");
            // </pex>

            var result = new AccountTransaction
                             {
                                 Name = template.Name,
                                 AccountTransactionTypeId = template.Id,
                                 SourceTransactionValue = new AccountTransactionValue { AccountId = template.DefaultSourceAccountId, AccountTypeId = template.SourceAccountTypeId, Name = template.Name },
                                 TargetTransactionValue = new AccountTransactionValue { AccountId = template.DefaultTargetAccountId, AccountTypeId = template.TargetAccountTypeId, Name = template.Name },
                                 SourceAccountTypeId = template.SourceAccountTypeId,
                                 TargetAccountTypeId = template.TargetAccountTypeId
                             };

            return result;
        }
        public static AccountTransaction Create(AccountTransactionTemplate template)
        {
            var result = new AccountTransaction
                             {
                                 Name = template.Name,
                                 AccountTransactionTemplateId = template.Id,
                                 SourceTransactionValue = new AccountTransactionValue(),
                                 TargetTransactionValue = new AccountTransactionValue()
                             };

            if (result.SourceTransactionValue != null)
            {
                result.SourceTransactionValue.AccountId = template.DefaultSourceAccountId;
                result.SourceTransactionValue.Name = template.Name;
            }

            if (result.TargetTransactionValue != null)
            {
                result.TargetTransactionValue.AccountId = template.DefaultTargetAccountId;
                result.TargetTransactionValue.Name = template.Name;
            }

            result.SourceAccountTemplateId = template.SourceAccountTemplateId;
            result.TargetAccountTemplateId = template.TargetAccountTemplateId;

            result.DynamicPart = null;
            if (template.DefaultSourceAccountId == 0) result.DynamicPart = true;
            if (template.DefaultTargetAccountId == 0) result.DynamicPart = false;

            return result;
        }
        public static AccountTransaction Create(AccountTransactionTemplate template)
        {
            var result = new AccountTransaction
                             {
                                 Name = template.Name,
                                 AccountTransactionTemplateId = template.Id,
                                 SourceTransactionValue = new AccountTransactionValue { IsSource = true, AccountId = template.DefaultSourceAccountId, Name = template.Name },
                                 TargetTransactionValue = new AccountTransactionValue { IsSource = false, AccountId = template.DefaultTargetAccountId, Name = template.Name },
                                 SourceAccountTemplateId = template.SourceAccountTemplateId,
                                 TargetAccountTemplateId = template.TargetAccountTemplateId
                             };

            return result;
        }