Beispiel #1
0
 public void RemoveScheduledTransaction(ScheduledTransaction scheduledTransaction)
 {
     if (ScheduledTransactions.Remove(scheduledTransaction))
     {
         RaiseDatabaseChanged();
     }
 }
Beispiel #2
0
        public IEnumerable <AccountBalance> CalculateSimulatedAccountBalances(DateTime beginDate, DateTime endDate, Account acct)
        {
            var result                = new List <AccountBalance>();
            var postedDetails         = GetTransactionDetails(endDate, acct).ToList();
            var postedTransactionIds  = postedDetails.Select(t => t.TransactionId).Distinct().ToList();
            var postedTransactions    = Transactions.Where(t => postedTransactionIds.Contains(t.Id)).ToList();
            var simulatedTransactions = ScheduledTransactions.Where(t => t.FromAccountId == acct.Id || t.ToAccountId == acct.Id).SelectMany(t => t.Simulate(beginDate, endDate)).ToList();

            // remove simulated transactions that have hit
            for (int i = simulatedTransactions.Count - 1; i >= 0; i--)
            {
                var simulatedTransaction = simulatedTransactions[i];

                if (simulatedTransaction.ScheduledTransactionId.HasValue)
                {
                    if (
                        postedTransactions.Any(
                            t =>
                            t.Date == simulatedTransaction.Date &&
                            t.ScheduledTransactionId == simulatedTransaction.ScheduledTransactionId))
                    {
                        simulatedTransactions.RemoveAt(i);
                    }
                }
            }

            var simulatedDetails             = simulatedTransactions.SelectMany(t => t.Details.Where(td => td.AccountId == acct.Id)).ToList();
            var priorPostedTransactionIds    = Transactions.Where(t => t.Date < beginDate && postedTransactionIds.Contains(t.Id)).Select(t => t.Id);
            var priorPostedDetails           = postedDetails.Where(t => priorPostedTransactionIds.Contains(t.TransactionId));
            var priorSimulatedTransactionIds = simulatedTransactions.Where(t => t.Date < beginDate).Select(t => t.Id);
            var priorSimulatedDetails        = simulatedDetails.Where(t => priorSimulatedTransactionIds.Contains(t.TransactionId));
            var balance = priorPostedDetails.Sum(t => t.CreditAmount - t.DebitAmount) +
                          priorSimulatedDetails.Sum(t => t.CreditAmount - t.DebitAmount);


            postedTransactions.RemoveAll(t => priorPostedTransactionIds.Contains(t.Id));
            postedDetails.RemoveAll(t => priorPostedDetails.Contains(t));
            simulatedTransactions.RemoveAll(t => priorSimulatedTransactionIds.Contains(t.Id));
            simulatedDetails.RemoveAll(t => priorSimulatedDetails.Contains(t));

            while (beginDate <= endDate)
            {
                var currentPostedTransactionIds    = postedTransactions.Where(t => t.Date == beginDate).Select(t => t.Id);
                var currentSimulatedTransactionIds = simulatedTransactions.Where(t => t.Date == beginDate).Select(t => t.Id);
                var currentDetails          = postedDetails.Where(t => currentPostedTransactionIds.Contains(t.TransactionId));
                var currentSimulatedDetails = simulatedDetails.Where(t => currentSimulatedTransactionIds.Contains(t.TransactionId));

                balance += (currentDetails.Sum(t => t.CreditAmount - t.DebitAmount) +
                            currentSimulatedDetails.Sum(t => t.CreditAmount - t.DebitAmount));

                result.Add(new AccountBalance()
                {
                    Date = beginDate, Balance = balance, Transactions = simulatedTransactions.Where(t => t.Date == beginDate).Union(postedTransactions.Where(t => t.Date == beginDate)).ToList()
                });

                beginDate = beginDate.AddDays(1);
            }

            return(result);
        }
Beispiel #3
0
        public void Remove(ModelBase obj)
        {
            if (obj is Account)
            {
                Accounts.Remove(obj as Account);

                var transactionIds = Transactions.SelectMany(t => t.Details).Where(t => t.AccountId == ((Account)obj).Id).Select(t => t.TransactionId);

                foreach (var transId in transactionIds)
                {
                    Remove(Transactions.FirstOrDefault(t => t.Id == transId));
                }

                foreach (var schedTrans in ScheduledTransactions.Where(t => t.FromAccountId == ((Account)obj).Id || t.ToAccountId == ((Account)obj).Id).ToList())
                {
                    Remove(schedTrans);
                }
            }
            else if (obj is Transaction)
            {
                Transactions.Remove(obj as Transaction);

                foreach (var detail in TransactionDetails.Where(t => t.TransactionId == ((Transaction)obj).Id).ToList())
                {
                    Remove(detail);
                }
            }
            else if (obj is TransactionDetail)
            {
                TransactionDetails.Remove(obj as TransactionDetail);
            }
            else if (obj is Receipt)
            {
                Receipts.Remove(obj as Receipt);
            }
            else if (obj is ScheduledTransaction)
            {
                ScheduledTransactions.Remove(obj as ScheduledTransaction);

                foreach (var detail in ScheduledTransactionDetails.Where(t => t.ScheduledTransactionId == ((ScheduledTransaction)obj).Id).ToList())
                {
                    Remove(detail);
                }
            }
            else if (obj is ScheduledTransactionDetail)
            {
                ScheduledTransactionDetails.Remove(obj as ScheduledTransactionDetail);
            }
            else if (obj is Category)
            {
                Categories.Remove(obj as Category);
            }
            else if (obj is Product)
            {
                Products.Remove(obj as Product);
            }
        }
Beispiel #4
0
        public ScheduledTransaction?GetScheduledTransactionById(int?id)
        {
            if (id == null)
            {
                return(null);
            }

            return(ScheduledTransactions.FirstOrDefault(item => item.Id == id));
        }
Beispiel #5
0
        public void ProcessScheduledTransactions()
        {
            using (DeferEvents())
            {
                var utcNow = DateTime.UtcNow.Date;
                var date   = utcNow.AddDays(5);

                foreach (var scheduledTransaction in ScheduledTransactions.ToList())
                {
                    ProcessScheduledTransaction(scheduledTransaction, date);
                }
            }
        }
        public Core.Database ToDatabase2()
        {
            var db = new Core.Database
            {
                Accounts   = Accounts,
                Categories = Categories,
            };

            db.Payees.AddRange(Payees.Select(p => new Core.Payee
            {
                Id   = p.Id,
                Name = p.Name,
                DefaultCategoryId = p.DefaultCategory?.Id,
            }));

            db.Transactions.AddRange(Transactions.Select(t => new Core.Transaction
            {
                AccountId           = t.Account?.Id,
                Amount              = t.Amount,
                CategoryId          = t.Category?.Id,
                CheckedDate         = t.CheckedDate,
                Comment             = t.Comment,
                Id                  = t.Id,
                LinkedTransactionId = t.LinkedTransaction?.Id,
                PayeeId             = t.Payee?.Id,
                ReconciliationDate  = t.ReconciliationDate,
                ValueDate           = t.ValueDate,
            }));

            db.ScheduledTransactions.AddRange(ScheduledTransactions.Select(t => new Core.ScheduledTransaction
            {
                AccountId         = t.Account?.Id,
                Amount            = t.Amount,
                CategoryId        = t.Category?.Id,
                CreditedAccountId = t.CreditedAccount?.Id,
                Id   = t.Id,
                Name = t.Name,
                NextOccurenceDate  = t.NextOccurenceDate,
                PayeeId            = t.Payee?.Id,
                RecurrenceRuleText = t.RecurrenceRuleText,
                StartDate          = t.StartDate,
                Comment            = t.Comment,
            }));

            return(db);
        }
Beispiel #7
0
        public void Add(ModelBase obj)
        {
            if (obj is Account)
            {
                Accounts.Add(obj as Account);
            }
            else if (obj is Transaction)
            {
                Transactions.Add(obj as Transaction);

                foreach (var detail in ((Transaction)obj).Details)
                {
                    Add(detail);
                }
            }
            else if (obj is TransactionDetail)
            {
                TransactionDetails.Add(obj as TransactionDetail);
            }
            else if (obj is Receipt)
            {
                Receipts.Add(obj as Receipt);
            }
            else if (obj is ScheduledTransaction)
            {
                ScheduledTransactions.Add(obj as ScheduledTransaction);

                foreach (var detail in ((ScheduledTransaction)obj).Details)
                {
                    Add(detail);
                }
            }
            else if (obj is ScheduledTransactionDetail)
            {
                ScheduledTransactionDetails.Add(obj as ScheduledTransactionDetail);
            }
            else if (obj is Category)
            {
                Categories.Add(obj as Category);
            }
            else if (obj is Product)
            {
                Products.Add(obj as Product);
            }
        }
Beispiel #8
0
        public void SaveScheduledTransaction(ScheduledTransaction scheduledTransaction)
        {
            using (DeferEvents())
            {
                var existingTransaction = ScheduledTransactions.FirstOrDefault(item => item.Id == scheduledTransaction.Id);
                if (existingTransaction == null)
                {
                    scheduledTransaction.Id = GenerateId(ScheduledTransactions, item => item.Id);
                }

                AddOrReplace(ScheduledTransactions, existingTransaction, scheduledTransaction);

                if (scheduledTransaction.NextOccurenceDate == null)
                {
                    ProcessScheduledTransactions();
                }

                RaiseDatabaseChanged();
            }
        }
Beispiel #9
0
 public bool Exists(ModelBase obj)
 {
     if (obj is Account)
     {
         return(Accounts.Contains(obj));
     }
     else if (obj is Transaction)
     {
         return(Transactions.Contains(obj));
     }
     else if (obj is TransactionDetail)
     {
         return(TransactionDetails.Contains(obj));
     }
     else if (obj is Receipt)
     {
         return(Receipts.Contains(obj));
     }
     else if (obj is ScheduledTransaction)
     {
         return(ScheduledTransactions.Contains(obj));
     }
     else if (obj is ScheduledTransactionDetail)
     {
         return(ScheduledTransactionDetails.Contains(obj));
     }
     else if (obj is Category)
     {
         return(Categories.Contains(obj));
     }
     else if (obj is Product)
     {
         return(Products.Contains(obj));
     }
     else
     {
         return(false);
     }
 }
Beispiel #10
0
        public AccountBalance CalculateSimulatedAccountBalance(DateTime upToDate, Account acct)
        {
            var postedDetails        = GetTransactionDetails(upToDate, acct);
            var postedTransactionIds = postedDetails.Select(t => t.TransactionId).Distinct().ToList();
            var postedTransactions   = Transactions.Where(t => postedTransactionIds.Contains(t.Id)).ToList();

            var scheduledTransactions = ScheduledTransactions.Where(t => t.FromAccountId == acct.Id || t.ToAccountId == acct.Id);
            var simulatedTransactions = scheduledTransactions.SelectMany(t => t.Simulate(upToDate, upToDate)).ToList();

            // remove simulated transactions that have hit
            for (int i = simulatedTransactions.Count - 1; i >= 0; i--)
            {
                var simulatedTransaction = simulatedTransactions[i];

                if (simulatedTransaction.ScheduledTransactionId.HasValue)
                {
                    if (
                        postedTransactions.Any(
                            t =>
                            t.Date == simulatedTransaction.Date &&
                            t.ScheduledTransactionId == simulatedTransaction.ScheduledTransactionId))
                    {
                        simulatedTransactions.RemoveAt(i);
                    }
                }
            }

            var simulatedDetails = simulatedTransactions.SelectMany(t => t.Details.Where(td => td.AccountId == acct.Id));

            var balance = postedDetails.Sum(t => t.CreditAmount - t.DebitAmount) +
                          simulatedDetails.Sum(t => t.CreditAmount - t.DebitAmount);

            return(new AccountBalance()
            {
                Balance = balance, Date = upToDate, Transactions = postedTransactions.Where(t => t.Date == upToDate).Union(simulatedTransactions.Where(t => t.Date == upToDate)).ToList()
            });
        }