//
        // GET: /Contract/
        public ActionResult Edit(Guid? id, Guid? userId)
        {
            ViewData["selectedTab"] = (int)0;

            var model = new UserContract();

            if ((id.HasValue) && (id != Guid.Empty))
            {
                model = db.UserContracts.FirstOrDefault(c => c.Id == id.Value);
                ViewBag.Contract = new SelectList(db.Contracts, "Id", "Name", model.Contract.Id);
                //ViewBag.ContractType = new SelectList(db.ContractTypes, "Id", "Name", model.Contract.ContractType);
            }
            else
            {
                var user = db.Users.First(u => u.Id == userId.Value);
                model.User = user;
                model.Actief = false;
                model.StartDate = DateTime.Now;
                model.EndDate = model.StartDate.AddDays(1);

                model.eId = Utilities.GetRandomSalt(5);
                model.ContractId = new Guid("18a77083-3b99-4ef9-8fbc-93a3e64009d0");
                //ViewBag.ContractType = new SelectList(db.ContractTypes, "Id", "Name", model.Contract.ContractType);
            }

            return View(model);
        }
        public ActionResult DeleteConfirmed(UserContract userContract, FormCollection collection)
        {
            try
            {
                var contract = db.UserContracts.FirstOrDefault(c => c.Id == userContract.Id);
                if (contract != null)
                {
                    db.UserContracts.Remove(contract);
                    db.SaveChanges();
                }
                //return RedirectToAction("Edit", "User", new { id = userContract.UserId });
                return BreadCrum.RedirectToPreviousAction(Session, ControllerName);

            }
            catch (Exception ex)
            {
                return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
            }
        }
        public ActionResult Register(FormCollection collection, UserContract userContract)
        {
            try
            {
                var translation = TranslationDictionary;
                if (!ModelState.IsValid)
                {
                    return View(userContract);
                }

                var valid = true;
                if (collection["Password"] != collection["PasswordConfirm"] || string.IsNullOrEmpty(collection["Password"]))
                {
                    ModelState.AddModelError("User.UserPassword.Password", "!");
                    valid = false;
                }

                //if (string.IsNullOrEmpty(collection["UserName"]))
                //{
                //    ModelState.AddModelError("User.UserPassword.UserName", "!");
                //    valid = false;
                //}

                if (string.IsNullOrEmpty(userContract.User.Firstname))
                {
                    ModelState.AddModelError("User.FirstName", "!");
                    valid = false;
                }

                if (string.IsNullOrEmpty(userContract.User.Lastname))
                {
                    ModelState.AddModelError("User.LastName", "!");
                    valid = false;
                }

                if (string.IsNullOrEmpty(userContract.User.EmailAddress))
                {
                    ModelState.AddModelError("User.EmailAddress", "!");
                    valid = false;
                }

                if (string.IsNullOrEmpty(userContract.Uri))
                {
                    ModelState.AddModelError("Uri", "!");
                    valid = false;
                }

                if (!valid)
                    return View(userContract);

                if (userContract.Contract == null)
                {
                    var contract = db.Contracts.SingleOrDefault(row => row.Id.Equals(userContract.ContractId));
                    userContract.Contract = contract;
                }

                if (!userContract.eId.HasValue())
                {
                    userContract.eId = Utilities.GetRandomSalt(5);
                }
                if (userContract.User.UserRole == null)
                {
                    var role = db.UserRoles.SingleOrDefault(row => row.Id.Equals(userContract.User.UserRoleId));
                    userContract.User.UserRole = role;
                }

                var password = collection["Password"];
                var userName = userContract.User.EmailAddress;//collection["UserName"];
                var userPassword = db.UserPasswords.SingleOrDefault(row => row.UserName == userName);
                if (userPassword != null)
                {
                    ModelState.AddModelError("","User already exists".TranslateString(ref translation));
                    return View();
                }
                userPassword = new UserPassword()
                {
                    Id = Guid.NewGuid(),
                    Password = password,
                    UserName = userContract.User.EmailAddress,//userName,
                    FullName = userContract.User.ContactFullName,
                    UserId = userContract.UserId,
                    IsAccountAdmin = true,
                    IsReset = false,
                    EmailAddress = userContract.User.EmailAddress
                };
                userContract.User.UserPasswords.Add(userPassword);

                if (userContract.Id == Guid.Empty)
                {
                    userContract.Id = Guid.NewGuid();
                }
                db.UserContracts.Add(userContract);
                db.SaveChanges();
                db.UserContracts.Remove(userContract);
                db.SaveChanges();
                ClientTools.SendUserRegisteredMail("NL", userPassword.Id);

                return RedirectToAction("LogIn");
            }
            catch (DbEntityValidationException ex)
            {
                ModelState.AddModelError("", ex);
                return View(userContract);
                throw ex;
            }
        }
        public ActionResult Register()
        {
            var defaultContractId = ReadAppSetting("DefaultContractId");
            if (string.IsNullOrWhiteSpace(defaultContractId))
            {
                return RedirectToAction("Index", "Home");
            }
            var contractId = new Guid(defaultContractId);
            var contract = db.Contracts.SingleOrDefault(row => row.Id.Equals(contractId));

            var defaultResellerId = ReadAppSetting("DefaultResellerId");
            if (string.IsNullOrWhiteSpace(defaultResellerId))
            {
                return RedirectToAction("Index", "Home");
            }
            var resellerId = new Guid(defaultResellerId);
            var reseller = db.Users.SingleOrDefault(row => row.Id.Equals(resellerId));

            var user = new User();
            var userContract = new UserContract();

            user.Id = Guid.NewGuid();
            user.UserRole = db.UserRoles.SingleOrDefault(row => row.Name.Equals("Klant"));
            user.ReselerId = resellerId;
            user.eId = Utilities.GetRandomSalt(5);

            userContract.Id = Guid.NewGuid();
            userContract.eId = Utilities.GetRandomSalt(6);
            userContract.UserId = user.Id;
            userContract.User = user;
            userContract.User.UserRoleId = user.UserRole.Id;
            userContract.User.UserRole = user.UserRole;
            userContract.Contract = contract;
            userContract.ContractId = userContract.Contract.Id;
            userContract.Actief = true;
            userContract.StartDate = DateTime.Now;
            userContract.EndDate = DateTime.Now.AddMonths(1);
            userContract.Name = userContract.Contract.Name;

            return View(userContract);
        }
        public ActionResult Edit(Guid? id, Guid? userId, FormCollection collection, UserContract userContract)
        {
            //Save Action
            //If id == null then insert
            try
            {
                ViewData["selectedTab"] = int.Parse(collection.GetValue("selectedTab").AttemptedValue);
                collection.Remove("selectedTab");
                var addNewUserContract = !id.HasValue || (id == Guid.Empty);
                if (ModelState.IsValid)
                {
                    if (!addNewUserContract)
                    {
                        if (!userContract.eId.HasValue())
                        {
                            userContract.eId = Utilities.GetRandomSalt(5);
                        }
                        db.Entry(userContract).State = EntityState.Modified;

                        db.SaveChanges();
                        return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
                        //return RedirectToAction("Edit", new { id = model.Id, userId = model.UserId });
                        //return View(model);
                    }
                    else
                    {
                        userContract.Id = Guid.NewGuid();
                        if (!userContract.eId.HasValue())
                        {
                            userContract.eId = Utilities.GetRandomSalt(5);
                        }
                        db.UserContracts.Add(userContract);
                        db.SaveChanges();

                        return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
                        //return RedirectToAction("Edit", new { id = model.Id, userId = model.UserId });
                    }
                }
            }
            catch (Exception ex)
            {
                //return RedirectToAction("Edit", new { id = Guid.Empty, userId = userId });
            }
            var user = db.Users.Find(userContract.UserId);
            userContract.User = user;

            return View(userContract);

            //ViewBag.Contract = new SelectList(db.Contracts, "Id", "Name", userContract.Contract);
            //return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
        }
        public ActionResult PayProduct(Guid licenseTypeId, Guid userId, string returnUrl)
        {
            var contract = db.Contracts.SingleOrDefault(row => row.ContractTypeId == licenseTypeId);
            Session["ReturnUrl"] = returnUrl;
            var newUserContract = new UserContract()
            {
                Id = Guid.NewGuid(),
                ContractId = contract.Id,
                UserId = userId,
                StartDate =  DateTime.Now,
                EndDate =  DateTime.Now.AddYears(-1),
                Name =  contract.Name
            };
            db.UserContracts.Add(newUserContract);
            db.SaveChanges();

            return RedirectToAction("Index", new { licenseId = newUserContract.Id }); //check if UserContract.Id is still needed
        }
 private void BuildRecipeByWeekDayPro(UserContract userContract)
 {
     for (var i = 1; i <= 7; i++)
     {
         var userContractUri = new UserContractUri()
         {
             Id = Guid.NewGuid(),
             UserContractId = userContract.Id,
             Uri = userContract.Uri,
             Name = "noname",
             Enabled = false,
             RandomFunction = 0,
         };
         userContract.UserContractUris.Add(userContractUri);
         var userContractRedirect = new UserContractRedirect()
         {
             Id = Guid.NewGuid(),
             UserContractUri = userContractUri.Id,
             Enabled = true
         };
         userContractRedirect.DayOfTheWeekValue = i;
         userContractUri.UserContractRedirects.Add(userContractRedirect);
     }
 }
        private void WriteLog(Dictionary<string, string> userAgent, string resultUri, UserContract userContract, UserContractUri userContractUri = null,
                              UserContractRedirect userContractRedirect = null)
        {
            var host = Request.UserHostAddress;
            var userContractLog = new UserContractLog
                {
                    Id = Guid.NewGuid(),
                    DateTime = DateTime.Now,
                    Host = host,
                    ResultUri = resultUri,
                    UserContractId = userContract.Id,
                    UserAgent = userAgent.Aggregate("", (current, key) => current + string.Format("{0}:{1};", key.Key, key.Value))
                };

            if (userContractUri != null)
            {
                userContractLog.UserContractUri = userContractUri.Id;
            }

            if (userContractRedirect != null)
            {
                userContractLog.UserContractRedirect = userContractRedirect.Id;
            }

            db.UserContractLogs.Add(userContractLog);
            db.SaveChanges();
        }
 private void BuildRecipeByRandom4(UserContract userContract)
 {
     var userContractUri = new UserContractUri()
     {
         Id = Guid.NewGuid(),
         UserContractId = userContract.Id,
         Uri = userContract.Uri,
         Name = "noname",
         Enabled = false,
         RandomFunction = 3,
     };
     userContract.UserContractUris.Add(userContractUri);
     var userContractRedirect = new UserContractRedirect
     {
         Id = Guid.NewGuid(),
         UserContractUri = userContractUri.Id,
         Enabled = true,
         DateTimeValueStart = userContract.StartDate,
         DateTimeValueStop = userContract.EndDate
     };
     userContractUri.UserContractRedirects.Add(userContractRedirect);
     var randomUri = new RandomUri()
     {
         Id = Guid.NewGuid(),
         Uri = userContract.Uri,
         UserContractUriId = userContractUri.Id,
         RandomParameter = 1,
     };
     userContractUri.RandomUris.Add(randomUri);
 }
 private void BuildRecipeByTime(UserContract userContract)
 {
     var userContractUri = new UserContractUri()
     {
         Id = Guid.NewGuid(),
         UserContractId = userContract.Id,
         Uri = userContract.Uri,
         Name = "noname",
         Enabled = false,
         RandomFunction = 0,
     };
     userContract.UserContractUris.Add(userContractUri);
     var userContractRedirect = new UserContractRedirect()
     {
         Id = Guid.NewGuid(),
         UserContractUri = userContractUri.Id,
         Enabled = true
     };
     userContractUri.UserContractRedirects.Add(userContractRedirect);
 }
 private void BuildRecipeByDate(UserContract userContract)
 {
     var userContractUri = new UserContractUri()
     {
         Id = Guid.NewGuid(),
         UserContractId = userContract.Id,
         Uri = userContract.Uri,
         Name = "noname",
         Enabled = false,
         RandomFunction = 0,
     };
     userContract.UserContractUris.Add(userContractUri);
     var userContractRedirect = new UserContractRedirect()
     {
         Id = Guid.NewGuid(),
         UserContractUri = userContractUri.Id,
         Enabled = true
     };
     userContractRedirect.DateTimeValueStart = DateTime.Now;
     userContractUri.UserContractRedirects.Add(userContractRedirect);
     db.SaveChanges();
 }
        public ActionResult Edit(UserContract usercontract)
        {
            if (ModelState.IsValid)
            {
                var contractRecipe = db.ContractRecipes.Find(usercontract.ContractRecipeId);
                if (contractRecipe != null)
                {
                    //to be sure, set all redirects on enabled, the UI has no access to this field and it's used in the engine
                    foreach (var userContractUri in usercontract.UserContractUris)
                    {
                        foreach (var redirect in userContractUri.UserContractRedirects)
                        {
                            redirect.Enabled = true;
                        }
                    }
                    switch (contractRecipe.Code)
                    {
                        case (2):
                        {
                            foreach (var userContractUri in usercontract.UserContractUris)
                            {
                                foreach (var userContractRedirect in userContractUri.UserContractRedirects)
                                {
                                    if (userContractRedirect.DateTimeValueStart.HasValue)
                                    {
                                        userContractRedirect.DateTimeValueStop =
                                            userContractRedirect.DateTimeValueStart;
                                        userContractRedirect.DateTimeValueStop =
                                            userContractRedirect.DateTimeValueStop + TimeSpan.FromHours(24);
                                    }
                                }
                            }
                            break;
                        }
                        case (11):
                        {
                            for (int i = 1; i <= 7; i++)
                            {
                                var UserContractUrisList = usercontract.UserContractUris.Where(
                                    row => row.UserContractRedirects.First().DayOfTheWeekValue == i).ToList();
                                bool active = false;
                                foreach (var userContractUri in UserContractUrisList)
                                {
                                    if (userContractUri.Actief)
                                        active = true;
                                }

                                foreach (var userContractUri in UserContractUrisList)
                                {
                                    userContractUri.Actief = active;
                                }
                            }
                            break;
                        }
                        case (10):
                        {
                            bool active = false;
                            foreach (var userContractUri in usercontract.UserContractUris)
                            {
                                if (userContractUri.Actief)
                                    active = true;
                            }

                            foreach (var userContractUri in usercontract.UserContractUris)
                            {
                                userContractUri.Actief = active;
                            }
                            break;
                        }
                    }
                }
                db.Entry(usercontract).State = EntityState.Modified;
                foreach (var userContractUri in usercontract.UserContractUris)
                {
                    db.Entry(userContractUri).State = EntityState.Modified;
                    foreach (var userContractRedirect in userContractUri.UserContractRedirects)
                    {
                        db.Entry(userContractRedirect).State = EntityState.Modified;
                    }
                    foreach (var randomUri in userContractUri.RandomUris)
                    {
                        db.Entry(randomUri).State = EntityState.Modified;
                    }
                }
                try
                {
                    db.SaveChanges();
                }
                catch (DbEntityValidationException e)
                {
                    foreach (var eve in e.EntityValidationErrors)
                    {
                        Console.WriteLine(
                            "Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
                            eve.Entry.Entity.GetType().Name, eve.Entry.State);
                        foreach (var ve in eve.ValidationErrors)
                        {
                            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                                ve.PropertyName, ve.ErrorMessage);
                        }
                    }
                    throw;
                }
                //return RedirectToAction("Index", new {userId = usercontract.UserId});
                return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
            }
            ViewBag.ContractId = new SelectList(db.Contracts, "Id", "Name", usercontract.ContractId);
            ViewBag.UserId = new SelectList(db.Users, "Id", "Firstname", usercontract.UserId);
            ViewBag.ContractRecipeId = new SelectList(db.ContractRecipes, "Id", "Name");
            return View(usercontract);
        }
        //protected override void Dispose(bool disposing)
        //{
        //    db.Dispose();
        //    base.Dispose(disposing);
        //}
        public ActionResult CreateRecipe(Guid? recipeId, Guid? userId, Guid? defaultContractId)
        {
            ViewBag.userId = userId;

            if (!recipeId.HasValue)
            {
                return View(db.ContractRecipes.ToList());
            }

            var adefaultContractId = ReadAppSetting("DefaultContractId");
            var userContract = new UserContract()
            {
                Id = Guid.NewGuid(),
                ContractId = new Guid(defaultContractId.HasValue ? defaultContractId.ToString() : adefaultContractId),
                UserId = userId ?? User.Id,
                StartDate = DateTime.Now,
                EndDate = DateTime.Now.AddYears(1),
                Uri = "http://www.tag4s.com",
                ContractRecipeId = recipeId.Value,
                Enabled = false,
                eId = Utilities.GetRandomSalt(5),
            };
            //aici, in functie de recipe.code, trebuie umplut contractul cum trebuie.
            var contractRecipe = db.ContractRecipes.Find(recipeId);
            switch (contractRecipe.Code)
            {
                case 1:
                    BuildRecipeByDate(userContract);
                    break;
                case 2:
                    BuildRecipeByDate(userContract);
                    break;
                case 3:
                    BuildRecipeByWeekDay(userContract);
                    break;
                case 4:
                    BuildRecipeByRandom1(userContract);
                    break;
                case 5:
                    BuildRecipeByRandom2(userContract);
                    break;
                case 6:
                    BuildRecipeByTime(userContract);
                    break;
                case 7:
                    BuildRecipeByRandom3(userContract);
                    break;
                case 8:
                    BuildRecipeByRandom4(userContract);
                    break;
                case 9:
                    break;
                case 10:
                    BuildRecipeByDate(userContract);
                    break;
                case 11:
                    BuildRecipeByWeekDayPro(userContract);
                    break;
                case 14:
                    BuildRecipeByTime(userContract);
                    break;
            }
            db.UserContracts.Add(userContract);
            try
            {
                db.SaveChanges();
            }
            catch (DbEntityValidationException e)
            {
                throw;
            }
            return RedirectToAction("Edit", new {userContract.Id});
        }
 public ActionResult Create(UserContract usercontract)
 {
     if (ModelState.IsValid)
     {
         usercontract.Id = Guid.NewGuid();
         db.UserContracts.Add(usercontract);
         db.SaveChanges();
         return BreadCrum.RedirectToPreviousAction(Session, ControllerName);
     }
     ViewBag.ContractId = new SelectList(db.Contracts, "Id", "Name", usercontract.ContractId);
     ViewBag.UserId = new SelectList(db.Users, "Id", "Firstname", usercontract.UserId);
     ViewBag.ContractRecipeId = new SelectList(db.ContractRecipes, "Id", "Name");
     return View(usercontract);
 }
        public List<UserContractParametersModel> BuildRecipeByRule(UserContract userContract)
        {
            var result = new List<UserContractParametersModel>();

            foreach (var userContractUri in userContract.UserContractUris)
            {
                var userContractUriId = userContractUri.Id;
                var id =
                    userContract.UserContractUris.SingleOrDefault(row => row.Id == userContractUriId)
                        .UserContractRedirects.FirstOrDefault()
                        .Id;

                var model = new UserContractParametersModel();

                model.UserContractUri = userContractUri;

                //get parameters with possible values
                var parameters =
                    db.RuleParameters.Select(row => new ContractRedirectParameterModel {RuleParameter = row}).ToList();
                model.ParameterModel = parameters;
                foreach (var parameter in model.ParameterModel)
                {
                    var list =
                        db.RuleParameterValues.Where(row => row.RuleParameterId == parameter.RuleParameter.Id)
                            .ToList()
                            .Select(row => new SelectListItem {Text = row.Name, Value = row.Id.ToString()}).ToList();
                    list.Insert(0, new SelectListItem {Selected = true, Text = "...", Value = Guid.Empty.ToString()});
                    parameter.RuleParameterValues = list;
                }

                var redirects =
                    db.RedirectTypes.Select(row => new ContractRedirectRedirectTypeModel {RedirectType = row}).ToList();
                model.RedirectTypeModel = redirects;
                foreach (var redirect in model.RedirectTypeModel)
                {
                    var list =
                        db.RedirectTypeValues.Where(row => row.RedirectTypeId == redirect.RedirectType.Id)
                            .ToList()
                            .Select(row => new SelectListItem {Text = row.Name, Value = row.Id.ToString()}).ToList();
                    list.Insert(0, new SelectListItem {Selected = true, Text = "...", Value = Guid.Empty.ToString()});
                    redirect.RedirectTypeValues = list;
                }

                if (id != Guid.Empty)
                {
                    model.UserContract = userContract;
                    if (model.UserContract != null)
                    {
                        //get the selectedvalues
                        foreach (
                            var ruleParameterValue in
                                userContractUri
                                    .UserContractRedirects.FirstOrDefault()
                                    .RuleParameterValues)
                        {
                            var parameter =
                                model.ParameterModel.FirstOrDefault(
                                    row => row.RuleParameter.Id == ruleParameterValue.RuleParameterId);
                            if (parameter != null)
                            {
                                parameter.SelectedValue = ruleParameterValue;
                                var singleOrDefault =
                                    parameter.RuleParameterValues.SingleOrDefault(
                                        row => row.Value == parameter.SelectedValue.Id.ToString());
                                if (singleOrDefault != null)
                                    singleOrDefault.Selected = true;
                            }
                        }

                        //get the selectedvalues
                        foreach (
                            var redirectTypeValue in
                                userContractUri
                                    .UserContractRedirects.FirstOrDefault()
                                    .RedirectTypeValues)
                        {
                            var redirect =
                                model.RedirectTypeModel.FirstOrDefault(
                                    row => row.RedirectType.Id == redirectTypeValue.RedirectTypeId);
                            if (redirect != null)
                            {
                                redirect.SelectedValue = redirectTypeValue;
                                var singleOrDefault =
                                    redirect.RedirectTypeValues.SingleOrDefault(
                                        row => row.Value == redirect.SelectedValue.Id.ToString());
                                if (singleOrDefault != null)
                                    singleOrDefault.Selected = true;
                            }
                        }
                    }
                }
                result.Add(model);
            }

            return result;
        }