static GlobalWebData() { manager = new DataManager(); ledger = null; }
public void ImportXml() { DataManager dataMgr = new DataManager(); Ledger ledger = dataMgr.Load( false, false ); string addedBy = System.Environment.MachineName; Dictionary<int, IAccount> accountMapping = new Dictionary<int, IAccount>(); provider.New(); try { int totalRows = 0; Dictionary<string, IAccount> accounts = new Dictionary<string, IAccount>(); Dictionary<string, UvMoney.OnlineServices.OrderedOnlineTransactionList> orderedLists = new Dictionary<string, UvMoney.OnlineServices.OrderedOnlineTransactionList>(); foreach( Account account in ledger.Accounts ) { //Console.WriteLine( "Account: {0}", account.Name ); // Add account rows IAccount accountRow = provider.NewAccount(); // Note: LINQ-to-SQL doesn't seem to support identity insert... // accountRow.Id = account.Id; accountRow.Name = account.Name; accountRow.OnlineSource = account.OnlineSource; // Remap obsolete AccountTypes: switch( account.AccountType ) { case AccountType.Checking: accountRow.AccountType = AccountType.Asset; accountRow.SubAccountType = SubAccountType.Checking; break; case AccountType.Savings: accountRow.AccountType = AccountType.Asset; accountRow.SubAccountType = SubAccountType.Savings; break; case AccountType.CreditCard: accountRow.AccountType = AccountType.Liability; accountRow.SubAccountType = SubAccountType.CreditCard; break; default: accountRow.AccountType = account.AccountType; accountRow.SubAccountType = SubAccountType.Unset; break; } accountRow.StartingDate = account.StartingDate; accountRow.StartingBalance = account.StartingBalance; accountMapping.Add( account.Id, accountRow ); // Save accounts in a hash table for later if( account.OnlineSource != null ) { accounts.Add( account.OnlineSource, accountRow ); orderedLists.Add( account.OnlineSource, new UvMoney.OnlineServices.OrderedOnlineTransactionList() ); } } provider.CommitChanges(); int pendingRows = 0; // Import data from XML file into database foreach( Transaction trans in ledger.Transactions ) { //Console.WriteLine( "Transaction: {0}", trans.ToString() ); if( trans.Id < 1 ) throw new ApplicationException( "Transaction does not have a valid Id." ); ITransaction transRow = provider.NewTransaction(); // Note: LINQ-to-SQL doesn't seem to support identity insert... transRow.TransactionDate = trans.TransactionDate; transRow.Amount = trans.Amount; transRow.Payee = trans.Payee; transRow.Memo = trans.Memo; transRow.IsGenerated = trans.IsGenerated; transRow.IsVoided = trans.IsVoided; foreach( LineItem lineitem in trans.LineItems ) { //Console.WriteLine( "LineItem: {0}", lineitem.ToString() ); if( lineitem.Id < 1 ) throw new ApplicationException( "LineItem does not have a valid Id." ); ILineItem itemRow = transRow.NewLineItem(); // Note: LINQ-to-SQL doesn't seem to support identity insert... itemRow.SetAccount( accountMapping[lineitem.Account.Id] ); itemRow.Amount = lineitem.Amount; itemRow.Category = lineitem.Category; itemRow.IsReconciled = lineitem.IsReconciled; itemRow.Memo = lineitem.Memo; itemRow.Number = lineitem.Number; itemRow.TransactionType = lineitem.TransactionType; if( lineitem.OnlineTransaction != null ) { UvMoney.Online.OnlineTransaction otrans = lineitem.OnlineTransaction; if( !orderedLists.ContainsKey( otrans.OnlineSource ) ) orderedLists.Add( otrans.OnlineSource, new UvMoney.OnlineServices.OrderedOnlineTransactionList() ); UvMoney.OnlineServices.OrderedOnlineTransactionList orderedList = orderedLists[otrans.OnlineSource]; orderedList.AddWithSequence( otrans ); IOnlineRecord record = provider.NewOnlineRecord(); record.SetLineItem( itemRow ); record.OnlineSource = otrans.OnlineSource; record.OnlineSourceId = 1; record.BankId = otrans.BankId; record.Date = otrans.Date; // Sequence is computed after adding to ordered list: record.Sequence = otrans.Sequence; record.Number = otrans.Number; record.Amount = otrans.Amount; record.Description = otrans.Description; itemRow.SetOnlineRecord( record ); } } // Commit batches of rows, which speeds up the overall // process considerably. // (As opposed to committing each individual transaction.) totalRows++; pendingRows++; if( pendingRows >= 100 ) { Console.WriteLine( "Imported {0} transactions", totalRows ); provider.CommitChanges(); pendingRows = 0; } } provider.CommitChanges(); // Import any missing transactions foreach( OnlineTransaction otrans in ledger.MissingTransactions ) { // Don't import everything so we can test UvMoneyDownloader // if( otrans.Date >= new DateTime( 2008, 8, 28 ) ) continue; if( !orderedLists.ContainsKey( otrans.OnlineSource ) ) orderedLists.Add( otrans.OnlineSource, new UvMoney.OnlineServices.OrderedOnlineTransactionList() ); UvMoney.OnlineServices.OrderedOnlineTransactionList orderedList = orderedLists[otrans.OnlineSource]; orderedList.AddWithSequence( otrans ); IAccount dbaccount = (IAccount)accounts[otrans.OnlineSource]; ITransaction dbtrans = provider.NewTransaction(); dbtrans.TransactionDate = otrans.Date; dbtrans.Amount = Math.Abs( otrans.Amount ); dbtrans.Payee = otrans.Description; dbtrans.IsGenerated = true; ILineItem dblineitem = dbtrans.NewLineItem(); dblineitem.SetAccount( dbaccount ); dblineitem.SetTransaction( dbtrans ); if( otrans.Amount <= 0 ) dblineitem.TransactionType = TransactionType.Credit; else dblineitem.TransactionType = TransactionType.Debit; dblineitem.Amount = Math.Abs( otrans.Amount ); dblineitem.Number = otrans.Number; dblineitem.Memo = dbtrans.Memo; IOnlineRecord dbrecord = provider.NewOnlineRecord(); dbrecord.SetLineItem( dblineitem ); dbrecord.OnlineSource = otrans.OnlineSource; dbrecord.BankId = (otrans.BankId != null) ? otrans.BankId : ""; dbrecord.Date = otrans.Date; dbrecord.Amount = otrans.Amount; dbrecord.Number = otrans.Number; dbrecord.Description = otrans.Description; dblineitem.SetOnlineRecord( dbrecord ); // Add second line item // (transactions always have at least 2 line items; one debit, one credit) dblineitem = dbtrans.NewLineItem(); dblineitem.SetTransaction( dbtrans ); if( otrans.Amount <= 0 ) { // to expenses dblineitem.TransactionType = TransactionType.Debit; dblineitem.SetAccount( provider.GetAccount( 2 ) ); } else { // from income dblineitem.TransactionType = TransactionType.Credit; dblineitem.SetAccount( provider.GetAccount( 1 ) ); } dblineitem.Amount = Math.Abs( otrans.Amount ); dblineitem.Number = otrans.Number; dblineitem.Memo = dbtrans.Memo; provider.CommitChanges(); } Console.WriteLine( "Finished importing {0} transactions", totalRows ); } finally { provider.Close(); } }