public static IEnumerable <Transaction> Simulate(this ScheduledTransaction scheduledTransaction, DateTime beginDate, DateTime endDate)
        {
            var result = new List <Transaction>();

            if (!scheduledTransaction.IsEnabled)
            {
                return(result);
            }

            var currentDate = scheduledTransaction.Frequency.BeginDate.Date;

            while (currentDate <= endDate)
            {
                if (!scheduledTransaction.DisabledDates.Contains(currentDate))
                {
                    var trans = new Transaction()
                    {
                        Date = currentDate,
                        Id   = Guid.NewGuid(),
                        Memo = scheduledTransaction.Memo,
                        ScheduledTransactionId = scheduledTransaction.Id
                    };

                    foreach (var detail in scheduledTransaction.Details)
                    {
                        trans.Details.Add(new TransactionDetail()
                        {
                            Id = Guid.NewGuid(), Reference = detail.Reference, AccountId = scheduledTransaction.FromAccountId, DebitAmount = detail.Amount, TransactionId = trans.Id
                        });
                        trans.Details.Add(new TransactionDetail()
                        {
                            Id = Guid.NewGuid(), Reference = detail.Reference, AccountId = scheduledTransaction.ToAccountId, CreditAmount = detail.Amount, TransactionId = trans.Id
                        });
                    }

                    result.Add(trans);
                }

                if (scheduledTransaction.Frequency.IsDaily)
                {
                    currentDate = currentDate.AddDays(scheduledTransaction.Frequency.Value);
                }
                else if (scheduledTransaction.Frequency.IsWeekly)
                {
                    currentDate = currentDate.AddDays(scheduledTransaction.Frequency.Value * 7);
                }
                else if (scheduledTransaction.Frequency.IsMonthly)
                {
                    currentDate = currentDate.AddMonths(scheduledTransaction.Frequency.Value);
                }
            }

            return(result);
        }
        public void AddScheduledTransaction()
        {
            var db      = new Database();
            var account = new Account();

            db.SaveAccount(account);

            var scheduledTransaction = new ScheduledTransaction
            {
                Account            = account,
                Amount             = 1,
                RecurrenceRuleText = "FREQ=daily",
                Name      = "test",
                StartDate = DateTime.UtcNow,
            };

            // Act
            db.SaveScheduledTransaction(scheduledTransaction);

            // Assert
            Assert.Equal(5, db.Transactions.Count);
        }
        public JsonResult Action(ScheduledTransactionsActionModel model)
        {
            JsonResult json   = new JsonResult();
            var        result = false;

            if (model.ID > 0) // we are trying to edit a record
            {
                var scheduledTransaction = scheduledTransactionsServices.GetScheduledTransactionsByID(model.ID);

                scheduledTransaction.TransactionName = model.TransactionName;
                scheduledTransaction.Recipient       = model.Recipient;
                scheduledTransaction.Price           = model.Price;
                scheduledTransaction.Data            = model.Data;

                result = scheduledTransactionsServices.UpdateScheduledTransaction(scheduledTransaction);
            }
            else  // we are trying to create a record
            {
                ScheduledTransaction scheduledTransaction = new ScheduledTransaction();

                scheduledTransaction.TransactionName = model.TransactionName;
                scheduledTransaction.Recipient       = model.Recipient;
                scheduledTransaction.Price           = model.Price;
                scheduledTransaction.Data            = model.Data;

                result = scheduledTransactionsServices.SaveScheduledTransaction(scheduledTransaction);
            }

            if (result)
            {
                json.Data = new { Success = true };
            }
            else
            {
                json.Data = new { Success = false, Message = "Unable to perform action on Scheduled Transaction" };
            }

            return(json);
        }
        private void ApplyScheduledTransactionExecute(ScheduledTransaction schedTrans)
        {
            //var scheduledTransaction = o as ScheduledTransaction;

            //var win = new SaveWindow();
            //var winVm = new SaveWindowVM();
            //var control = new ReceiptEntry();
            //var vm = control.DataContext as ReceiptEntryVM;
            //var existingTransaction = o as Transaction;

            //var vendorAccounts = new ObservableCollection<AccountVM>();
            //var paymentAccounts = new ObservableCollection<AccountVM>();

            //foreach (var account in Repository.Accounts)
            //{
            //    var accountVM = new AccountVM() { Id = account.Id, Name = account.Name };

            //    vendorAccounts.Add(accountVM);
            //    paymentAccounts.Add(accountVM);
            //}

            //vm.VendorAccounts = vendorAccounts;
            //vm.PaymentAccounts = paymentAccounts;

            //if (existingTransaction != null)
            //{
            //    // TODO:
            //}
            //else
            //{
            //    vm.Id = Guid.NewGuid();
            //    vm.SelectedPaymentAccountId = scheduledTransaction.FromAccountId;
            //    vm.SelectedVendorAccountId = scheduledTransaction.ToAccountId;
            //    vm.IsSpecificDate = true;
            //    vm.Memo = scheduledTransaction.Memo;

            //    foreach (var detail in scheduledTransaction.Details)
            //    {
            //        vm.LineItems.Add(new ReceiptEntryLineItemVM() { Amount = detail.Amount, Item = detail.Reference });
            //    }
            //}

            //winVm.Save += (s, e) =>
            //{
            //    // map vm to model
            //    if (existingTransaction != null) // update existing
            //    {

            //    }
            //    else // insert new
            //    {
            //        if (vm.IsSpecificDate)
            //        {
            //            var receipt = new Receipt() { Id = vm.Id };
            //            var transaction = new Transaction() { Id = Guid.NewGuid(), Date = vm.Date, Memo = vm.Memo, ReceiptId = receipt.Id, ScheduledTransactionId = scheduledTransaction.Id };

            //            Repository.Receipts.Add(receipt);
            //            Repository.Transactions.Add(transaction);

            //            foreach (var lineItemVM in vm.LineItems)
            //            {
            //                var payFromDetail = new TransactionDetail() { Id = Guid.NewGuid(), TransactionId = transaction.Id, AccountId = vm.SelectedPaymentAccountId, DebitAmount = lineItemVM.Amount, Reference = lineItemVM.Item };
            //                var payToDetail = new TransactionDetail() { Id = Guid.NewGuid(), TransactionId = transaction.Id, AccountId = vm.SelectedVendorAccountId, CreditAmount = lineItemVM.Amount, Reference = lineItemVM.Item };

            //                Repository.TransactionDetails.Add(payFromDetail);
            //                Repository.TransactionDetails.Add(payToDetail);

            //                transaction.Details.Add(payFromDetail);
            //                transaction.Details.Add(payToDetail);
            //            }
            //        }
            //    }

            //    Repository.UpdateAccountBalances(DateTime.Now.Date);

            //    win.Close();
            //};

            //win.DataContext = winVm;
            //win.WindowContents = control;
            //win.ShowDialog();
        }
        public bool DeleteScheduledTransaction(ScheduledTransaction scheduledTransaction)
        {
            context.Entry(scheduledTransaction).State = System.Data.Entity.EntityState.Deleted;

            return(context.SaveChanges() > 0);
        }
        public bool SaveScheduledTransaction(ScheduledTransaction scheduledTransaction)
        {
            context.ScheduledTransactions.Add(scheduledTransaction);

            return(context.SaveChanges() > 0);
        }
        public JsonResult Action(DebtCardsActionModel model)
        {
            JsonResult json = new JsonResult();

            var result = false;

            if (model.ID > 0) //we are trying to edit a record
            {
                var debtCards = debtCardServices.GetDebtCardsByID(model.ID);

                debtCards.Name              = model.Name;
                debtCards.Limit             = model.Limit;
                debtCards.PlannedTimeRefund = model.PlannedTimeRefund;

                result = debtCardServices.UpdateDebtCards(debtCards);

                ScheduledTransaction          scheduledTransaction          = new ScheduledTransaction();
                ScheduledTransactionsServices scheduledTransactionsServices = new ScheduledTransactionsServices();
                BalanceListingModel           balanceModel      = new BalanceListingModel();
                BalanceController             balanceController = new BalanceController();

                balanceModel = balanceController.GetBalances();

                DebtCardsListingModel debtsCardModel = new DebtCardsListingModel();
                debtsCardModel.DebtCards    = debtCardServices.GetAllDebtCards();
                debtsCardModel.Transactions = transactionsServices.SearchTransactions("", null, 0, "", 0, null);

                foreach (var debts in debtsCardModel.DebtCards)
                {
                    float remaning = debts.Limit;
                    foreach (var transactions in debtsCardModel.Transactions)
                    {
                        if (transactions.BudgetsName == debts.Name)
                        {
                            remaning    = remaning - transactions.Price;
                            debts.Price = remaning;
                        }
                    }
                    scheduledTransaction.Price = debts.Price;
                }

                scheduledTransaction.TransactionName = "Spłata karty";
                scheduledTransaction.Recipient       = "Bank";
                scheduledTransaction.Data            = model.PlannedTimeRefund;

                scheduledTransactionsServices.UpdateScheduledTransaction(scheduledTransaction);
            }
            else //we are trying to create a record
            {
                DebtCard debtCards = new DebtCard();

                debtCards.Name              = model.Name;
                debtCards.Limit             = model.Limit;
                debtCards.PlannedTimeRefund = model.PlannedTimeRefund;

                result = debtCardServices.SaveDebtCards(debtCards);

                //Create Scheduled Transactions
                ScheduledTransaction          scheduledTransaction          = new ScheduledTransaction();
                ScheduledTransactionsServices scheduledTransactionsServices = new ScheduledTransactionsServices();
                BalanceListingModel           balanceModel      = new BalanceListingModel();
                BalanceController             balanceController = new BalanceController();

                balanceModel = balanceController.GetBalances();
                DebtCardsListingModel debtsCardModel = new DebtCardsListingModel();
                debtsCardModel.DebtCards    = debtCardServices.GetAllDebtCards();
                debtsCardModel.Transactions = transactionsServices.SearchTransactions("", null, 0, "", 0, null);
                foreach (var debts in debtsCardModel.DebtCards)
                {
                    float remaning = debts.Limit;
                    foreach (var transactions in debtsCardModel.Transactions)
                    {
                        if (transactions.BudgetsName == debts.Name)
                        {
                            remaning    = remaning - transactions.Price;
                            debts.Price = remaning;
                        }
                    }
                    if (debts.Price == 0)
                    {
                        scheduledTransaction.Price = debts.Price;
                    }
                    else
                    {
                        scheduledTransaction.Price = debts.Price;
                    }
                }

                scheduledTransaction.TransactionName = "Spłata karty";
                scheduledTransaction.Recipient       = "Bank";
                scheduledTransaction.Data            = model.PlannedTimeRefund;

                scheduledTransactionsServices.SaveScheduledTransaction(scheduledTransaction);
            }

            if (result)
            {
                json.Data = new { Success = true };
            }
            else
            {
                json.Data = new { Success = false, Message = "Unable to perform action on DebtCard." };
            }

            return(json);
        }