public void SetSourceOfMoneyAndDestinationOfMoney(FinancialOperationViewModel financialOperationVm)
        {
            var bankAccount = _unitOfWork.BankAccountRepo
                              .GetWhere(ba => ba.Id == financialOperationVm.FinancialOperation.BankAccountId).FirstOrDefault();

            var subCategory = _unitOfWork.CategoryRepo
                              .GetWhere(sc => sc.Id == financialOperationVm.FinancialOperation.SubCategoryId).FirstOrDefault();

            var targetAccount = _unitOfWork.BankAccountRepo
                                .GetWhere(ba => ba.Id == financialOperationVm.FinancialOperation.TargetBankAccountId).FirstOrDefault();

            if (financialOperationVm.FinancialOperation.IsExpense)
            {
                financialOperationVm.FinancialOperation.SourceOfMoney = bankAccount.AccountName;

                financialOperationVm.FinancialOperation.DestinationOfMoney =
                    subCategory.CategoryName;
            }
            if (financialOperationVm.FinancialOperation.IsIncome)
            {
                financialOperationVm.FinancialOperation.SourceOfMoney =
                    subCategory.CategoryName;

                financialOperationVm.FinancialOperation.DestinationOfMoney =
                    targetAccount.AccountName;
            }
            if (financialOperationVm.FinancialOperation.IsTransfer)
            {
                financialOperationVm.FinancialOperation.SourceOfMoney =
                    bankAccount.AccountName;

                financialOperationVm.FinancialOperation.DestinationOfMoney =
                    targetAccount.AccountName;
            }
        }
        public FinancialOperationViewModel CreateViewModelWithAll(bool isExpense, bool isIncome, string userId)
        {
            FinancialOperationViewModel financialOperationVm = new FinancialOperationViewModel();

            financialOperationVm.ListOfFinancialOperations =
                _unitOfWork.FinancialOperatiosRepo.GetWhereWithIncludes(fo => fo.Id > 0 &&
                                                                        fo.UserId == userId &&
                                                                        fo.IsExpense == isExpense &&
                                                                        fo.IsIncome == isIncome &&
                                                                        fo.IsTransfer == (!isExpense && !isIncome)
                                                                        , fo => fo.SubCategory, fo => fo.SubCategory.ParentCategory)
                .OrderByDescending(fo => fo.DateTime)
                .ToList();
            financialOperationVm.FinancialOperation = new FinancialOperation()
            {
                IsExpense  = isExpense,
                IsIncome   = isIncome,
                IsTransfer = !isExpense && !isIncome,
                UserId     = userId
            };
            financialOperationVm.UserId = userId;

            AddSelectListsToViewModel(financialOperationVm, financialOperationVm.FinancialOperation.IsExpense);
            return(financialOperationVm);
        }
        public ActionResult Create(FinancialOperationViewModel financialOperationVm)
        {
            var userId = User.Identity.GetUserId();

            financialOperationVm.FinancialOperation.UserId = userId;
            financialOperationVm.UserId = userId;

            if (ModelState.IsValid)
            {
                _unitOfWork.FinancialOperationService.SetSourceOfMoneyAndDestinationOfMoney(financialOperationVm);

                if (financialOperationVm.FinancialOperation.IsTransfer &&
                    financialOperationVm.FinancialOperation.SourceOfMoney == financialOperationVm.FinancialOperation.DestinationOfMoney)
                {
                    financialOperationVm.ErrorMessage = "Source account cannot be equal to Target account";
                }
                else
                {
                    _unitOfWork.FinancialOperatiosRepo.Create(financialOperationVm.FinancialOperation);

                    _unitOfWork.BankAccountLogic.CalculateBalanceOfAllAccountsAndUpdateThem(userId, financialOperationVm.FinancialOperation);
                    _unitOfWork.Complete();
                    return(RedirectToAction(_unitOfWork.FinancialOperationService.ChooseActionToGo(financialOperationVm)));
                }
            }
            _unitOfWork.FinancialOperationService.AddSelectListsToViewModel(financialOperationVm, financialOperationVm.FinancialOperation.IsExpense);

            return(View(financialOperationVm));
        }
        // GET: FinancialOperations - Incomes
        public ActionResult IncomesIndex()
        {
            bool IsExpense = false;
            bool IsIncome  = true;
            var  userId    = User.Identity.GetUserId();
            FinancialOperationViewModel financialOperationVm = _unitOfWork.FinancialOperationService.CreateViewModelWithAll(IsExpense, IsIncome, userId);

            return(View("Index", financialOperationVm));
        }
        // GET: FinancialOperations - HistoryChooseAccount
        public ActionResult HistoryChooseAccount()
        {
            FinancialOperationViewModel financialOperationVm = new FinancialOperationViewModel();
            var userId = User.Identity.GetUserId();

            financialOperationVm.UserId = userId;
            _unitOfWork.FinancialOperationService.AddSelectListsToViewModel(financialOperationVm, true);

            return(View("HistoryChooseAccount", financialOperationVm));
        }
        // GET: FinancialOperations - History
        public ActionResult History(FinancialOperationViewModel financialOperationVm)
        {
            if (financialOperationVm.FinancialOperation.BankAccountId == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }

            _unitOfWork.FinancialOperationService.FulfillHistoryViewModelWithFinancialOperationAndListOfFinancialOperations(financialOperationVm);

            return(View("History", financialOperationVm));
        }
 public string ChooseActionToGo(FinancialOperationViewModel financialOperationVm)
 {
     if (financialOperationVm.FinancialOperation.IsExpense)
     {
         return("ExpensesIndex");
     }
     if (financialOperationVm.FinancialOperation.IsIncome)
     {
         return("IncomesIndex");
     }
     return("TransfersIndex");
 }
        public void AddSelectListsToViewModel(FinancialOperationViewModel financialOperationVm, bool isExpense)
        {
            var bankaccounts  = _unitOfWork.BankAccountRepo.GetWhere(ba => ba.Id > 0 && ba.UserId == financialOperationVm.UserId);
            var subcategories = _unitOfWork.CategoryRepo.
                                GetWhere(sc => sc.Id > 0 &&
                                         sc.UserId == financialOperationVm.UserId &&
                                         sc.IsExpense == isExpense &&
                                         sc.IsIncome == !isExpense &&
                                         sc.ParentCategoryId != null);
            var categories = _unitOfWork.CategoryRepo.
                             GetWhere(sc => sc.Id > 0 && sc.UserId == financialOperationVm.UserId && sc.IsExpense == isExpense && sc.IsIncome == !isExpense && sc.ParentCategory == null);

            financialOperationVm.SelectListOfBankAccounts  = new SelectList(bankaccounts, "Id", "AccountName");
            financialOperationVm.SelectListOfSubCategories = new SelectList(subcategories, "Id", "CategoryName");
            financialOperationVm.ListOfCategories          = categories;
        }
        // GET: FinancialOperations/Details/5
        public ActionResult Details(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            FinancialOperationViewModel financialOperationVm = new FinancialOperationViewModel();

            financialOperationVm.FinancialOperation =
                _unitOfWork.FinancialOperatiosRepo.GetWhereWithIncludes(fo => fo.Id == id, fo => fo.SubCategory, fo => fo.SubCategory.ParentCategory).FirstOrDefault();

            if (financialOperationVm.FinancialOperation == null)
            {
                return(HttpNotFound());
            }
            return(View(financialOperationVm));
        }
        // GET: FinancialOperations/Delete/5
        public ActionResult Delete(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            FinancialOperationViewModel financialOperationVm = new FinancialOperationViewModel();

            financialOperationVm.FinancialOperation =
                _unitOfWork.FinancialOperatiosRepo.GetWhere(fo => fo.Id == id).FirstOrDefault();

            if (financialOperationVm.FinancialOperation == null)
            {
                return(HttpNotFound());
            }
            return(View(financialOperationVm));
        }
        public ActionResult Edit(FinancialOperationViewModel financialOperationVm)
        {
            if (ModelState.IsValid)
            {
                _unitOfWork.FinancialOperationService.SetSourceOfMoneyAndDestinationOfMoney(financialOperationVm);

                var userId = User.Identity.GetUserId();
                financialOperationVm.FinancialOperation.UserId = userId;

                _unitOfWork.FinancialOperatiosRepo.Update(financialOperationVm.FinancialOperation);

                _unitOfWork.BankAccountLogic.CalculateBalanceOfAllAccountsAndUpdateThem(userId, financialOperationVm.FinancialOperation);
                _unitOfWork.Complete();
                return(RedirectToAction(_unitOfWork.FinancialOperationService.ChooseActionToGo(financialOperationVm)));
            }
            _unitOfWork.FinancialOperationService.AddSelectListsToViewModel(financialOperationVm, financialOperationVm.FinancialOperation.IsExpense);
            return(View(financialOperationVm));
        }
        public ActionResult DeleteConfirmed(int id)
        {
            FinancialOperationViewModel financialOperationVm =
                new FinancialOperationViewModel
            {
                FinancialOperation = _unitOfWork.FinancialOperatiosRepo
                                     .GetWhereWithIncludes(fo => fo.Id == id)
                                     .FirstOrDefault()
            };

            _unitOfWork.FinancialOperatiosRepo.Delete(financialOperationVm.FinancialOperation);

            var userId = User.Identity.GetUserId();

            _unitOfWork.Complete();

            _unitOfWork.BankAccountLogic.CalculateBalanceOfAllAccountsAndUpdateThem(userId);
            _unitOfWork.Complete();
            return(RedirectToAction(_unitOfWork.FinancialOperationService.ChooseActionToGo(financialOperationVm)));
        }
        // GET: FinancialOperations/Edit/5
        public ActionResult Edit(int?id)
        {
            if (id == null)
            {
                return(new HttpStatusCodeResult(HttpStatusCode.BadRequest));
            }
            FinancialOperationViewModel financialOperationVm = new FinancialOperationViewModel();

            financialOperationVm.FinancialOperation =
                _unitOfWork.FinancialOperatiosRepo.GetWhere(fo => fo.Id == id).FirstOrDefault();

            if (financialOperationVm.FinancialOperation == null)
            {
                return(HttpNotFound());
            }

            var userId = User.Identity.GetUserId();

            financialOperationVm.UserId = userId;
            _unitOfWork.FinancialOperationService.AddSelectListsToViewModel(financialOperationVm, financialOperationVm.FinancialOperation.IsExpense);
            return(View(financialOperationVm));
        }
        public FinancialOperationViewModel FulfillHistoryViewModelWithFinancialOperationAndListOfFinancialOperations(FinancialOperationViewModel financialOperationVm)
        {
            financialOperationVm.FinancialOperation.BankAccount = _unitOfWork.BankAccountRepo
                                                                  .GetWhere(ba => ba.Id == financialOperationVm.FinancialOperation.BankAccountId).FirstOrDefault();

            financialOperationVm.ListOfFinancialOperations = new List <FinancialOperation>();

            List <FinancialOperation> expensesList = _unitOfWork.FinancialOperatiosRepo.GetWhere(fo =>
                                                                                                 fo.BankAccountId == financialOperationVm.FinancialOperation.BankAccountId);

            expensesList.ForEach(expense => expense.AmountOfMoney *= (-1));

            List <FinancialOperation> incomesList = _unitOfWork.FinancialOperatiosRepo
                                                    .GetWhere(fo => fo.TargetBankAccountId == financialOperationVm.FinancialOperation.BankAccountId);

            financialOperationVm.ListOfFinancialOperations.AddRange(expensesList);
            financialOperationVm.ListOfFinancialOperations.AddRange(incomesList);
            financialOperationVm.ListOfFinancialOperations = financialOperationVm.ListOfFinancialOperations.OrderByDescending(fo => fo.DateTime.Date).ToList();

            return(financialOperationVm);
        }