private void ReverseTransfer(Transaction t) { MyMoney.BeginUpdate(); decimal amount = -t.Amount; t.IsBudgeted = false; t.Transfer.Transaction.IsBudgeted = false; this.MyMoney.RemoveTransaction(t); MyMoney.EndUpdate(); }
private void CreateInvestmentSamples(SampleData data, Account a) { money.BeginUpdate(); Transactions transactions = money.Transactions; for (int year = DateTime.Now.Year - 10; year <= DateTime.Now.Year; year++) { foreach (SampleSecurity ss in data.Securities) { // Get or Create the security Security stock = money.Securities.FindSecurity(ss.Name, true); stock.SecurityType = ss.SecurityType; stock.Symbol = ss.Symbol; // keep track of how much we own so we never go negative. decimal owned = 0; IList <int> selectedDays = GetRandomDaysInTheYearForTransactions(); foreach (var day in selectedDays) { // Create a new Transaction Transaction t = money.Transactions.NewTransaction(a); // the date the purchase or sale was done t.Date = new DateTime(year, 1, 1).AddDays(day); //----------------------------------------------------- // Create the matching Investment transaction Investment i = t.GetOrCreateInvestment(); i.Transaction = t; i.Security = stock; // Is this a BUY or SELL i.Type = InvestmentType.Buy; // How many unit bought or sold i.Units = rand.Next(1000); if (owned > 0 && rand.Next(2) == 1) { i.Type = InvestmentType.Sell; i.Units = rand.Next((int)owned); // don't sell more than we currently own. owned -= i.Units; } else { owned += i.Units; } // What price i.UnitPrice = Convert.ToDecimal(rand.Next(ss.PriceRangeLow, ss.PriceRangeHight)); // add some pennies (decimal value) decimal penies = rand.Next(99); penies /= 100; i.UnitPrice = i.UnitPrice + penies; // Calculate the Payment or Deposit amount t.Amount = i.Units * i.UnitPrice * (i.Type == InvestmentType.Buy ? -1 : 1); t.Payee = money.Payees.FindPayee(ss.Name, true); t.Category = money.Categories.InvestmentStocks; if (i.Type == InvestmentType.Sell) { t.Amount = t.Amount * 1.10M; // Improve the outcome of profit, sell at the 10% higher random } //----------------------------------------------------- // Finally add the new transaction money.Transactions.AddTransaction(t); } } } money.EndUpdate(); }
public void Create() { string temp = Path.Combine(Path.GetTempPath(), "MyMoney"); Directory.CreateDirectory(temp); string path = Path.Combine(temp, "SampleData.xml"); ProcessHelper.ExtractEmbeddedResourceAsFile("Walkabout.Database.SampleData.xml", path); SampleDatabaseOptions options = new SampleDatabaseOptions(); options.Owner = Application.Current.MainWindow; options.SampleData = path; if (options.ShowDialog() == false) { return; } string zipPath = Path.Combine(temp, "SampleStockQuotes.zip"); ProcessHelper.ExtractEmbeddedResourceAsFile("Walkabout.Database.SampleStockQuotes.zip", zipPath); string quoteFolder = Path.Combine(temp, "StockQuotes"); if (Directory.Exists(quoteFolder)) { Directory.Delete(quoteFolder, true); } System.IO.Compression.ZipFile.ExtractToDirectory(zipPath, temp); foreach (var file in Directory.GetFiles(quoteFolder)) { var target = Path.Combine(this.stockQuotePath, Path.GetFileName(file)); if (!File.Exists(target)) { File.Copy(file, target, true); } } path = options.SampleData; double inflation = options.Inflation; SampleData data = null; XmlSerializer s = new XmlSerializer(typeof(SampleData)); using (XmlReader reader = XmlReader.Create(path)) { data = (SampleData)s.Deserialize(reader); } foreach (SampleSecurity ss in data.Securities) { var history = StockQuoteHistory.Load(quoteFolder, ss.Symbol); if (history != null) { this.quotes[ss.Symbol] = history; this.manager.DownloadLog.AddHistory(history); } } int totalFrequency = data.GetTotalFrequency(); List <SampleTransaction> list = new List <SampleTransaction>(); List <Account> brokerageAccounts = new List <Account>(); foreach (SampleAccount sa in data.Accounts) { // Create all the accounts. Accounts accounts = money.Accounts; Account a = accounts.FindAccount(sa.Name); if (a == null) { a = accounts.AddAccount(sa.Name); } a.Type = sa.Type; if (a.Type == AccountType.Checking) { this.checking = a; } a.TaxStatus = sa.TaxStatus; // Create this many transactions int count = sa.Frequency; // by scaling the payee frequencies to match the above desired count. double ratio = (double)count / (double)totalFrequency; if (a.Type == AccountType.Brokerage || a.Type == AccountType.Retirement) { brokerageAccounts.Add(a); } else { // create flat list of all payees to choose from so it fits the histogram List <SamplePayee> payees = new List <SamplePayee>(); foreach (SamplePayee payee in data.Payees) { switch (payee.Type) { case PaymentType.Debit: case PaymentType.Check: if (sa.Type != AccountType.Checking) { continue; } break; case PaymentType.Credit: if (sa.Type != AccountType.Credit) { continue; } break; } foreach (SampleCategory sc in payee.Categories) { int newFrequency = (int)(sc.Frequency * ratio); for (int i = 0; i < newFrequency; i++) { list.Add(new SampleTransaction() { Account = sa, Payee = payee, Category = sc }); } } } } } money.BeginUpdate(this); // create the securities and stock splits foreach (var sec in data.Securities) { Security stock = money.Securities.FindSecurity(sec.Name, true); if (sec.Splits != null) { foreach (var split in sec.Splits) { var exists = money.StockSplits.FindStockSplitByDate(stock, split.Date); if (exists == null) { StockSplit stockSplit = money.StockSplits.NewStockSplit(); stockSplit.Security = stock; stockSplit.Date = split.Date; stockSplit.Numerator = split.Numerator; stockSplit.Denominator = split.Denominator; } } } } money.EndUpdate(); CreateRandomTransactions(list, inflation); AddPaychecks(options.Employer, options.PayCheck, inflation); // now with any spare cash we can buy stocks. CreateInvestmentSamples(data, brokerageAccounts); // 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(); money.OnLoaded(); }