public ActionResult Create(FoodCardRecharge foodcardrecharge)
        {
            if (ModelState.IsValid)
            {
                var foodCard = db.FoodCards.Find(foodcardrecharge.FoodCard_id);
                foodCard.CurrentBalance += foodcardrecharge.Amount;
                db.Entry(foodCard).State = EntityState.Modified;

                var rechargeFor = db.UserAccounts.Where(p =>
                    p.FoodCard_id == foodcardrecharge.FoodCard_id &&
                    p.User_id == foodcardrecharge.OperateFor);

                if (rechargeFor.Count() == 0)
                {
                    var useraccount = new UserAccount() {
                        User_id = foodcardrecharge.OperateFor,
                        FoodCard_id = foodcardrecharge.FoodCard_id,
                        Balance = foodcardrecharge.Amount
                    };

                    db.UserAccounts.Add(useraccount);
                }
                else if (rechargeFor.Count() == 1)
                {
                    var userAccount = rechargeFor.First();
                    userAccount.Balance += foodcardrecharge.Amount;
                    db.Entry(userAccount).State = EntityState.Modified;
                }
                else
                {
                    throw new Exception(string.Format("Invalid user account, user id: {0}, foodcard id: {1}.",
                                                      foodcardrecharge.OperateFor,
                                                      foodcardrecharge.FoodCard_id));
                }

                db.FoodCardRecharges.Add(foodcardrecharge);
                db.SaveChanges();

                return RedirectToAction("Index");
            }

            ViewBag.OperateFor = new SelectList(db.Users, "User_id", "UserName", foodcardrecharge.OperateFor);
            ViewBag.Operator = new SelectList(db.Users, "User_id", "UserName", foodcardrecharge.Operator);
            ViewBag.FoodCard_id = new SelectList(db.FoodCards, "FoodCard_id", "FoodCardName", foodcardrecharge.FoodCard_id);
            return View(foodcardrecharge);
        }
        public ActionResult Create(UserConsume userconsume)
        {
            var today = Utilities.ToDateWithTimeZone(DateTime.Now.ToUniversalTime(), Utilities.ChinaTimeZoneId);
            userconsume.ConsumeDate = today;

            var register = db.LunchRegisters
                .Include(p => p.User)
                .Include(p => p.UserConsumes)
                .Where(p => p.User_id == userconsume.User_id && p.LunchDate == today.Date);

            if (register.Count() == 1)
            {
                userconsume.Register_id = register.First().LunchRegister_id;
                if (ModelState.IsValid)
                {
                    var foodCard = db.FoodCards.Find(userconsume.FoodCard_id);
                    foodCard.CurrentBalance -= userconsume.Amount;
                    db.Entry(foodCard).State = EntityState.Modified;

                    // charge on user account
                    var consumeOn = db.UserAccounts.Where(p =>
                    p.FoodCard_id == userconsume.FoodCard_id &&
                    p.User_id == userconsume.User_id);

                    if (consumeOn.Count() == 0)
                    {
                        var useraccount = new UserAccount()
                        {
                            User_id = userconsume.User_id,
                            FoodCard_id = userconsume.FoodCard_id,
                            Balance = -userconsume.Amount
                        };

                        db.UserAccounts.Add(useraccount);
                    }
                    else if (consumeOn.Count() == 1)
                    {
                        var userAccount = consumeOn.First();
                        userAccount.Balance -= userconsume.Amount;
                        db.Entry(userAccount).State = EntityState.Modified;
                    }
                    else
                    {
                        throw new Exception(string.Format("Invalid user account, user id: {0}, foodcard id: {1}.",
                                                          userconsume.User_id,
                                                          userconsume.FoodCard_id));
                    }

                    db.UserConsumes.Add(userconsume);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
            }
            else
            {
                ModelState.AddModelError("User_id", "Invalid Lunch registeration");
            }

            ViewBag.User_id = new SelectList(db.Users, "User_id", "UserName", userconsume.User_id);
            ViewBag.FoodCard_id = new SelectList(db.FoodCards, "FoodCard_id", "FoodCardName", userconsume.FoodCard_id);
            return View(userconsume);
        }
        public ActionResult Edit(UserConsume userconsume)
        {
            if (ModelState.IsValid)
            {
                var originalConsume = db.UserConsumes.Find(userconsume.UserConsume_id);
                var originFoodcard = db.FoodCards.Find(originalConsume.FoodCard_id);

                var originUserAccount = db.UserAccounts.Where(p =>
                    p.FoodCard_id == originalConsume.FoodCard_id &&
                    p.User_id == originalConsume.User_id);

                var userAccount = db.UserAccounts.Where(p =>
                    p.FoodCard_id == userconsume.FoodCard_id &&
                    p.User_id == userconsume.User_id);

                if (originUserAccount.Count() == 0)
                {
                    var useraccount = new UserAccount()
                    {
                        User_id = originalConsume.User_id,
                        FoodCard_id = originalConsume.FoodCard_id,
                        Balance = -originalConsume.Amount
                    };

                    db.UserAccounts.Add(useraccount);
                }

                if (userAccount.Count() == 0)
                {
                    var useraccount = new UserAccount()
                    {
                        User_id = userconsume.User_id,
                        FoodCard_id = userconsume.FoodCard_id,
                        Balance = -userconsume.Amount
                    };

                    db.UserAccounts.Add(useraccount);
                }

                var currentUserAccount = originUserAccount.First();
                var targetUserAccount = userAccount.First();

                // switch to another card
                if (originalConsume.FoodCard_id != userconsume.FoodCard_id)
                {
                    originFoodcard.CurrentBalance += originalConsume.Amount;
                    db.Entry(originFoodcard).State = EntityState.Modified;

                    var newFoodcard = db.FoodCards.Find(userconsume.FoodCard_id);
                    newFoodcard.CurrentBalance -= userconsume.Amount;
                    db.Entry(newFoodcard).State = EntityState.Modified;

                    currentUserAccount.Balance += originalConsume.Amount;
                    targetUserAccount.Balance -= userconsume.Amount;
                    db.Entry(currentUserAccount).State = EntityState.Modified;
                    db.Entry(targetUserAccount).State = EntityState.Modified;
                }
                else
                {
                    // same card, different amount
                    if (originalConsume.Amount != userconsume.Amount)
                    {
                        originFoodcard.CurrentBalance += originalConsume.Amount;
                        originFoodcard.CurrentBalance -= userconsume.Amount;
                        db.Entry(originFoodcard).State = EntityState.Modified;

                        currentUserAccount.Balance += originalConsume.Amount;
                        currentUserAccount.Balance -= userconsume.Amount;
                        db.Entry(currentUserAccount).State = EntityState.Modified;
                    }
                }

                originalConsume.Amount = userconsume.Amount;
                originalConsume.FoodCard_id = userconsume.FoodCard_id;

                db.Entry(originalConsume).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("Index");
            }
            ViewBag.User_id = new SelectList(db.Users, "User_id", "UserName", userconsume.User_id);
            return View(userconsume);
        }
        public ActionResult DeleteConfirmed(int id)
        {
            var userconsume = db.UserConsumes.Find(id);
            var foodCard = db.FoodCards.Find(userconsume.FoodCard_id);

            // charge on user account
            var consumeOn = db.UserAccounts.Where(p =>
            p.FoodCard_id == userconsume.FoodCard_id &&
            p.User_id == userconsume.User_id);

            if (consumeOn.Count() == 0)
            {
                var useraccount = new UserAccount()
                {
                    User_id = userconsume.User_id,
                    FoodCard_id = userconsume.FoodCard_id,
                    Balance = userconsume.Amount
                };

                db.UserAccounts.Add(useraccount);
            }
            else if (consumeOn.Count() == 1)
            {
                var userAccount = consumeOn.First();
                userAccount.Balance += userconsume.Amount;
                db.Entry(userAccount).State = EntityState.Modified;
            }
            else
            {
                throw new Exception(string.Format("Invalid user account, user id: {0}, foodcard id: {1}.",
                                                  userconsume.User_id,
                                                  userconsume.FoodCard_id));
            }

            foodCard.CurrentBalance += userconsume.Amount;

            db.Entry(foodCard).State = EntityState.Modified;
            db.UserConsumes.Remove(userconsume);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        public ActionResult DeleteConfirmed(int id)
        {
            var foodcardrecharge = db.FoodCardRecharges.Find(id);
            var foodcard = db.FoodCards.Find(foodcardrecharge.FoodCard_id);
            foodcard.CurrentBalance -= foodcardrecharge.Amount;

            var rechargeFor = db.UserAccounts.Where(p =>
                    p.FoodCard_id == foodcardrecharge.FoodCard_id &&
                    p.User_id == foodcardrecharge.OperateFor);

            if (rechargeFor.Count() == 0)
            {
                var useraccount = new UserAccount()
                {
                    User_id = foodcardrecharge.OperateFor,
                    FoodCard_id = foodcardrecharge.FoodCard_id,
                    Balance = -foodcardrecharge.Amount
                };

                db.UserAccounts.Add(useraccount);
            }
            else if (rechargeFor.Count() == 1)
            {
                var userAccount = rechargeFor.First();
                userAccount.Balance -= foodcardrecharge.Amount;
                db.Entry(userAccount).State = EntityState.Modified;
            }
            else
            {
                throw new Exception(string.Format("Invalid user account, user id: {0}, foodcard id: {1}.",
                                                  foodcardrecharge.OperateFor,
                                                  foodcardrecharge.FoodCard_id));
            }

            db.Entry(foodcard).State = EntityState.Modified;
            db.FoodCardRecharges.Remove(foodcardrecharge);
            db.SaveChanges();
            return RedirectToAction("Index");
        }