private void CreateRandomTransactions(List <SampleTransaction> list, double inflation) { // Now pick randomly from the list to mix things up nicely and spread across 10 year range. Random rand = new Random(); DateTime today = DateTime.Today; DateTime first = today.AddYears(-Years); DateTime start = new DateTime(first.Year, 1, 1); // start in January TimeSpan span = today - first; int totalDays = (int)span.TotalDays; double monthlyInflation = (inflation / 12); money.BeginUpdate(); Transactions transactions = money.Transactions; Accounts accounts = money.Accounts; Payees payees = money.Payees; Categories categories = money.Categories; while (list.Count > 0) { int i = rand.Next(0, list.Count); SampleTransaction st = list[i]; list.RemoveAt(i); SampleAccount sa = st.Account; Account a = accounts.FindAccount(sa.Name); Payee p = payees.FindPayee(st.Payee.Name, true); SampleCategory sc = st.Category; Category c = money.Categories.GetOrCreateCategory(sc.Name, sc.Type); if (c.Type == CategoryType.None) { c.Type = sc.Type; } if (c.Root.Type == CategoryType.None) { c.Root.Type = sc.Type; } int daysFromStart = rand.Next(0, totalDays); DateTime date = start + TimeSpan.FromDays(daysFromStart); // spread evenly around the average decimal amount = 0; if (rand.Next(2) == 1) { // above average amount = (decimal)rand.Next(sc.Average * 100, sc.Max * 100) / 100; } else { // below average amount = (decimal)rand.Next(sc.Min * 100, sc.Average * 100) / 100; } // add inflation amount = Inflate(amount, (int)(daysFromStart / 30), (decimal)monthlyInflation); Transaction t = transactions.NewTransaction(a); t.Payee = p; t.Category = c; t.Date = date; t.Amount = amount; transactions.AddTransaction(t); } money.EndUpdate(); // now trigger UI update foreach (Account a in money.Accounts.GetAccounts()) { money.Rebalance(a); } // only have to do this because we hid all update events earlier by doing BeginUpdate/EndUpdate on money object. // trigger payee update money.Payees.BeginUpdate(false); money.Payees.EndUpdate(); // trigger category update money.Categories.BeginUpdate(false); money.Categories.EndUpdate(); }
private void CreateRandomTransactions(List <SampleTransaction> list, double inflation) { // Now pick randomly from the list to mix things up nicely and spread across 10 year range. Random rand = new Random(); DateTime today = DateTime.Today; DateTime first = today.AddYears(-Years); DateTime start = new DateTime(first.Year, 1, 1); // start in January TimeSpan span = today - first; int totalDays = (int)span.TotalDays; double monthlyInflation = (inflation / 12); money.BeginUpdate(this); Transactions transactions = money.Transactions; Accounts accounts = money.Accounts; Payees payees = money.Payees; Categories categories = money.Categories; int nextCheck = 2800; while (list.Count > 0) { int i = rand.Next(0, list.Count); SampleTransaction st = list[i]; list.RemoveAt(i); SampleAccount sa = st.Account; Account a = accounts.FindAccount(sa.Name); Payee p = payees.FindPayee(st.Payee.Name, true); SampleCategory sc = st.Category; Category c = money.Categories.GetOrCreateCategory(sc.Name, sc.Type); if (c.Type == CategoryType.None) { c.Type = sc.Type; } if (c.Root.Type == CategoryType.None) { c.Root.Type = sc.Type; } int daysFromStart = rand.Next(0, totalDays); DateTime date = start + TimeSpan.FromDays(daysFromStart); // spread evenly around the average decimal amount = 0; if (rand.Next(2) == 1) { // above average amount = (decimal)rand.Next(sc.Average * 100, sc.Max * 100) / 100; } else { // below average amount = (decimal)rand.Next(sc.Min * 100, sc.Average * 100) / 100; } // add inflation amount = Inflate(amount, (int)(daysFromStart / 30), (decimal)monthlyInflation); Transaction t = transactions.NewTransaction(a); t.Payee = p; t.Category = c; t.Date = date; t.Amount = RoundCents(amount); if (st.Payee.Type == PaymentType.Check) { t.Number = nextCheck.ToString(); nextCheck++; } transactions.AddTransaction(t); } // now pay the credit cards once a month from a checking account. Account checking = this.checking; if (checking != null) { foreach (var acct in accounts.GetAccounts()) { if (acct.Type == AccountType.Credit) { // here we know transactions are sorted by date. DateTime endOfMonth = start.AddMonths(1); decimal balance = 0; foreach (var t in money.Transactions.GetTransactionsFrom(acct)) { balance += t.Amount; if (t.Date >= endOfMonth) { if (balance != 0) { Transaction payment = transactions.NewTransaction(checking); payment.Date = endOfMonth; payment.Amount = RoundCents(balance); transactions.AddTransaction(payment); money.Transfer(payment, acct); balance = 0; endOfMonth = endOfMonth.AddMonths(1); } } } } } } money.EndUpdate(); }