public void RemoveScheduledTransaction(ScheduledTransaction scheduledTransaction) { if (ScheduledTransactions.Remove(scheduledTransaction)) { RaiseDatabaseChanged(); } }
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); }
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); } }
public ScheduledTransaction?GetScheduledTransactionById(int?id) { if (id == null) { return(null); } return(ScheduledTransactions.FirstOrDefault(item => item.Id == id)); }
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); }
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); } }
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(); } }
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); } }
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() }); }