public AccountViewModel()
 {
     Account         = new Account();
     Accounts        = new List <Account>();
     Metrics         = new AccountMetrics();
     RebalanceReport = new AccountRebalanceReport();
 }
        public AccountMetrics GetMetrics()
        {
            try
            {
                //TODO: Needs Refactoring
                AccountMetrics metrics              = new AccountMetrics();
                AccountManager accountManager       = new AccountManager();
                BillManager    billManager          = new BillManager();
                List <Account> accounts             = GetAllAccounts();
                var            poolAccount          = GetPoolAccount();
                var            requiredSavingsDict  = _calc.GetRequiredSavingsDict();
                var            totalRequiredSavings = 0.0m;

                foreach (var savings in requiredSavingsDict)
                {
                    try
                    {
                        totalRequiredSavings += savings.Value;
                    }
                    catch (Exception e)
                    {
                        Logger.Instance.Error(e);
                    }
                }

                if (!accounts.Any())
                {
                    return(metrics);
                }

                metrics.LargestBalance  = accounts.Max(a => a.Balance);
                metrics.SmallestBalance = accounts.Min(a => a.Balance);
                metrics.AverageBalance  = accounts.Sum(a => a.Balance) / accounts.Count;
                var incomeTransactions      = _db.Transactions.Where(t => t.Type == TransactionTypesEnum.Income);
                var oldestIncomeTransaction = incomeTransactions.OrderBy(t => t.Date).FirstOrDefault();
                var daysAgo = 0;
                if (oldestIncomeTransaction != null)
                {
                    daysAgo = (DateTime.Today - oldestIncomeTransaction.Date).Days;
                }
                var monthsAgo = daysAgo / 30 < 1 ? 1 : daysAgo / 30;


                if (incomeTransactions.Any())
                {
                    metrics.MonthlySurplus = (incomeTransactions.Sum(t => t.Amount) / monthsAgo) - (accounts.Sum(a => a.PaycheckContribution) * 2);
                }
                metrics.LargestSurplus  = accounts.Max(a => a.BalanceSurplus);
                metrics.SmallestSurplus = accounts.Min(a => a.BalanceSurplus);
                var surplusAccounts = accounts.Where(a => a.BalanceSurplus > 0).ToList().Count; if (surplusAccounts > 0)
                {
                    metrics.AverageSurplus = accounts.Sum(a => a.BalanceSurplus) / surplusAccounts;
                }

                var cashBalance         = accounts.Sum(a => a.Balance) + poolAccount.Balance;
                var outstandingExpenses = billManager.GetOutstandingExpenseTotal();

                metrics.CashBalance       = cashBalance;
                metrics.AccountingBalance = cashBalance - totalRequiredSavings;

                var totalSurplus = accounts.Sum(a => a.BalanceSurplus) + poolAccount.Balance;
                metrics.SpendableCash             = totalSurplus > 0 ? totalSurplus : 0.0m; // Account balance surplus = account balance - balance limit (balance limit is 0, surplus = balance - required savings).  Balance limit allows the account to "fill up" to the limit
                metrics.OutstandingExpenses       = outstandingExpenses;
                metrics.PoolBalance               = accountManager.GetPoolAccount().Balance;
                metrics.OutstandingAccountDeficit = accounts.Where(a => a.BalanceSurplus < 0).Sum(a => a.BalanceSurplus);

                return(metrics);
            }
            catch (Exception e)
            {
                Logger.Instance.Error(e);
                return(null);
            }
        }
 public AccountViewModel()
 {
     Account = new Account();
     Metrics = new AccountMetrics();
 }
Exemple #4
0
 public TransactionMetrics()
 {
     AccountMetrics    = new AccountMetrics();
     CreditCardMetrics = new CreditCardMetrics();
 }