/// <summary>
        /// Add new tag
        /// </summary>
        /// <param name="expense">Expense saving model</param>
        /// <param name="userIdentity">Owner</param>
        /// <returns>Result message</returns>
        public Enums.Messages AddExpense(ExpenseModels.SaveExpenseModel expense, string userIdentity)
        {
            using (var context = new ExpenseDatabaseContext())
            {
                //find tag. You can edit just yours tags
                var tag = context.Tags.FirstOrDefault(x => x.TagId == expense.Tag);
                var user = context.Users.FirstOrDefault(x => x.Login == userIdentity);
                // check user account
                if (user == null)
                {
                    return Enums.Messages.UserNotRegistrate;
                }
                // new expense will add
                if (tag != null)
                {
                    context.Expenses.Add(new Expense()
                                             {
                                                 Amount = expense.Amount,
                                                 DateOfMakingExpense = expense.DateOfMakingExpense.ToUniversalTime(),
                                                 Description = expense.Description,
                                                 Tag = tag,
                                                 User = user
                                             });

                    return context.SaveChanges() >= 1 ? Enums.Messages.Good : Enums.Messages.ErorWriteInDatabase;
                }

                return Enums.Messages.ErorWriteInDatabase;
            }
        }
        public ActionResult NewExpense(ExpenseModels.SaveExpenseModel model)
        {
            if (ModelState.IsValid)
            {
                if (new ExpenseGeneralFunction().AddExpense(model, User.Identity.Name) == Enums.Messages.Good)
                {
                    ViewBag.Mess = "Expense added";

                    return View(new ExpenseModels.CreateExpenseModel(User.Identity.Name));
                }
            }

            return View(new ExpenseModels.CreateExpenseModel()
            {
                DateOfMakingExpense = model.DateOfMakingExpense,
                Amount = model.Amount,
                Description = model.Description,
                Tags = new TagGeneralFunction().AllUserTags(User.Identity.Name),
                Tag = model.Tag
            });
        }
        /// <summary>
        /// Edit expense
        /// </summary>
        /// <param name="model">edit model</param>
        /// <param name="userIdentity">user account</param>
        /// <returns>result message</returns>
        public Enums.Messages EditExpense(ExpenseModels.DisplayExpenseModel model, string NewTag, string userIdentity)
        {
            using (var context = new ExpenseDatabaseContext())
            {
                // find expense. You can edit just yours expenses
                var expense = context.Expenses.FirstOrDefault(x => x.ExpenseId == model.Id && x.User.Login == userIdentity);
                // seach new tag
                var tag = context.Tags.FirstOrDefault(x => !x.IsDelete && x.Name == NewTag);
                if (expense != null)
                {
                    // if tag didn't find , than create new tag
                    if (tag == null)
                    {
                        tag = (new Tag()
                                   {
                                       Name = NewTag,
                                       User = expense.User
                                   });
                        context.Tags.Add(tag);
                    }

                    // save data
                    expense.Amount = model.Amount;
                    expense.Tag = tag;
                    expense.Description = model.Description;
                    expense.DateOfMakingExpense = model.DateOfMakingExpense;

                    return context.SaveChanges() >= 1 ? Enums.Messages.Good : Enums.Messages.ErorWriteInDatabase;
                }

                return Enums.Messages.RecordNotFound;
            }
        }
        public ActionResult EditExpense(ExpenseModels.DisplayExpenseModel model, string NewTag)
        {
            new ExpenseGeneralFunction().EditExpense(model, NewTag, User.Identity.Name);

            return RedirectToAction("ShowExpenses", "Expense");
        }
        public ActionResult ShowExpenses(ExpenseModels.RequestStatisticModel model)
        {
            // select all Expenses
            var extenseHelper = new ExpenseGeneralFunction();
            var allUserExtenses = extenseHelper.AllUserExpenses(User.Identity.Name, model.BeginOfPeriod.ToUniversalTime(),
                                                                               model.EndOfPeriod.ToUniversalTime());
            // spent sum
            decimal totalAmount = 0;

            // create info by tags
            var statTags = extenseHelper.ExpenseByTag(allUserExtenses, ref totalAmount);

            // create new model, that contain all needing data
            return View(new ExpenseModels.DisplayStatisticModel()
            {
                StatisticsByTag = statTags,
                AllExpenses = allUserExtenses,
                TotalAmount = totalAmount,
                BeginOfPeriod = model.BeginOfPeriod,
                EndOfPeriod = model.EndOfPeriod
            });
        }