예제 #1
0
 static GlobalWebData()
 {
     manager = new DataManager();
     ledger = null;
 }
예제 #2
0
        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();
            }
        }