public ActionResult VerifyEmailAddress(string GUID)
        {
            var user = userRepository.Users.Where(uid => uid.GUID == GUID).FirstOrDefault();
            if (user != null)
            {
                bool resUser = userRepository.ActiveEmialVerification(user);
                //Session["ChangePassword"] = "******";
                if (resUser)
                {
                    //create a session for the user.
                    var pass = Encryption.DecryptStringAES(user.Password, rand);
                    if (authProvider.Authenticate(user.Email, pass, userRepository))
                    {
                        Session["user"] = userRepository.GetUserByEmailAddress(user.Email);
                        //Session["folderss"] = null;

                        User userObj = (User)Session["user"];
                        var accountObj = accRepository.Accounts.FirstOrDefault(x => x.ID == userObj.AccountID);
                        Session["account"] = accountObj;
                        var folders = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                        Session["folderss"] = folders;

                        List<NotificationListViewModel> notificationList = new List<NotificationListViewModel>();
                        HelperFunctions HF = new HelperFunctions();
                        notificationList = HF.generateNotificationList(accountObj);
                        if (notificationList.Count > 0)
                            Session["notifications"] = notificationList;
                        else
                            Session["notifications"] = null;
                    }

                    ViewBag.VerifiedMessageSucess = "You have successfully activated your user account."; ViewBag.VerifiedMessageFail = "";
                }
                else { ViewBag.VerifiedMessageFail = "Failed to activate your account."; ViewBag.VerifiedMessageSucess = ""; }
            }
            else
            {
                ViewBag.VerifiedMessageFail = "Sorry, We couldn't find your account.";
                ViewBag.VerifiedMessageSucess = "";
            }
            return View();
        }
        public void CheckAcccountStatus(Account accountObj)
        {
            var folderList = CCFolderRepository.CCFolders.Where(f => f.AccountGUID == accountObj.AccountGUID).ToList();

            accountObj.isOverFlow = false;

            foreach (var fold in folderList)
            {
                int FolderItemCount = CCItemRepository.CCContacts.Where(i => i.FolderID == fold.FolderID).Count();

                LimitationsViewModel limitationsObj = new LimitationsViewModel();
                HelperFunctions HF = new HelperFunctions();
                limitationsObj = HF.updateAccountLimitations(accountObj);

                if ((FolderItemCount > limitationsObj.maxItemCountPerFolder) | (fold.isOverFlow == true))
                {
                    accountObj.isOverFlow = true;
                }
            }
            accountRepo.SaveAccount(accountObj);
        }
        public ActionResult EditFolder(CCFolder folderObj)
        {
            User userObj = (User)Session["user"];
            Account accountObj = (Account)Session["account"];
            CCFolder folderResponse;
            int folderType = folderObj.Type;

            if (ModelState.IsValid && accountObj != null)
            {
                folderObj.AccountGUID = accountObj.AccountGUID;
                folderObj.IsPaused = false;
                folderObj.isOverFlow = false;
                if (folderObj.Type == 3)
                    folderObj.isCrimeDiary = true;
                //Save Folder
                folderResponse = CCFolderRepository.SaveFolder(folderObj);

                var folders = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                TempData["SelectedMenu"] = "Manage";
                TempData["SelectedSubMenu"] = "ManageFolders";

                if (folderObj.FolderID > 0)
                {
                    var fields = CCFieldRepository.CCFolderFields.Where(u => u.FolderID == folderObj.FolderID & u.AccountGUID == accountObj.AccountGUID).ToList();
                    if (fields.Count == 0)
                    {
                        //Save default field
                        List<string> needtosave = new List<string>();
                        List<CCFolderField> savedobj = new List<CCFolderField>();

                        if (folderType == 1) {
                            if (accountObj.PlanID == 1)
                            {
                                needtosave = FieldsConfigHelper.GetFieldForContactSimple();
                            }
                            else if (accountObj.PlanID == 2)
                            {
                                needtosave = FieldsConfigHelper.GetFieldForContactBusiness();
                            }
                            else
                            {
                                needtosave = FieldsConfigHelper.GetFieldForContactFull();
                            }
                        }
                        else if (folderType == 2) { needtosave = FieldsConfigHelper.GetFieldForAppointmentSimple(); }
                        else if (folderType == 3) { needtosave = FieldsConfigHelper.GetFieldForCrimeDiaryAppointment(); }
                        else { }

                        foreach (var field in needtosave)
                        {
                            CCFolderField folderField = new CCFolderField();
                            folderField.FieldName = FieldsConfigHelper.GetRealName(field);
                            folderField.FieldType = FieldsConfigHelper.GetVariableType(field);
                            folderField.FolderID = folderObj.FolderID;
                            folderField.FieldCaption = field;
                            folderField.Restriction = "none";
                            folderField.AccountGUID = accountObj.AccountGUID;
                            folderField.isActive = true;
                            savedobj.Add(folderField);
                        }

                        var resp = CCFieldRepository.SaveFolderFieldsObj(savedobj);

                    }

                    // create note into grops
                    var alreadyExist = CCGroupRepository.CCGroups.Where(fid => fid.FolderID == folderResponse.FolderID & fid.GroupName == "Note" & fid.AccountGUID == accountObj.AccountGUID).ToList();

                    if (alreadyExist.Count == 0)
                    {
                        CCGroup objGroup = new CCGroup();
                        objGroup.GroupName = "Note";
                        objGroup.FolderID = folderResponse.FolderID;
                        objGroup.AccountGUID = accountObj.AccountGUID;
                        var user = CCGroupRepository.SaveGroup(objGroup);
                    }

                    // create default group
                    var isDefaultGrpExist = CCGroupRepository.CCGroups.Where(fid => fid.FolderID == folderResponse.FolderID & fid.GroupName == "Default" & fid.AccountGUID == accountObj.AccountGUID).ToList();

                    if (isDefaultGrpExist.Count == 0)
                    {
                        // add default group
                        CCGroup objGroup = new CCGroup();
                        objGroup.GroupName = "Default";
                        objGroup.FolderID = folderResponse.FolderID;
                        objGroup.AccountGUID = accountObj.AccountGUID;
                        var grp = CCGroupRepository.SaveGroup(objGroup);

                        if (grp.GroupID != 0)
                        {
                            // added all default field
                            var defaultfields = CCFieldRepository.CCFolderFields.Where(u => u.FolderID == folderObj.FolderID & u.AccountGUID == accountObj.AccountGUID).ToList();
                            int i = 1;
                            foreach (var fieldItem in defaultfields)
                            {
                                CCGroupField objgrpfield = new CCGroupField();
                                objgrpfield.FieldID = fieldItem.FieldID;
                                objgrpfield.FieldOrder = i++;
                                objgrpfield.FolderID = grp.FolderID;
                                objgrpfield.GroupID = grp.GroupID;
                                objgrpfield.AccountGUID = accountObj.AccountGUID;
                                var aa = CCGroupFieldRepository.SaveGroupField(objgrpfield);
                            }
                        }
                    }

                    // create default layout
                    var isDefaultLayoutExist = CCLayoutRepository.CCLayouts.Where(fid => fid.FolderID == folderResponse.FolderID & fid.LayoutName == "Default" & fid.AccountGUID == accountObj.AccountGUID).ToList();

                    if (isDefaultLayoutExist.Count == 0)
                    {
                        // add default layout
                        CCLayout layout = new CCLayout();
                        layout.LayoutName = "Default";
                        layout.FolderID = folderObj.FolderID;
                        layout.AccountGUID = accountObj.AccountGUID;
                        var resLayout = CCLayoutRepository.Savelayout(layout);

                        // add default group into default layout
                        var defaultExistGrp = CCGroupRepository.CCGroups.Where(fid => fid.FolderID == folderResponse.FolderID & fid.GroupName == "Default" & fid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();
                        if (defaultExistGrp != null)
                        {
                            CCLayoutGroup objLayoutGroup = new CCLayoutGroup();
                            objLayoutGroup.GroupID = defaultExistGrp.GroupID;
                            objLayoutGroup.GroupOrder = 1;
                            objLayoutGroup.FolderID = resLayout.FolderID;
                            objLayoutGroup.LayoutID = resLayout.LayoutID;
                            objLayoutGroup.AccountGUID = accountObj.AccountGUID;
                            var aa = CCLayoutGroupRepository.SavelayoutGroup(objLayoutGroup);
                        }
                    }

                }

                var folderList = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                Session["folderss"] = folderList;

                LimitationsViewModel limitationsObjMain = (LimitationsViewModel)Session["limitations"];
                HelperFunctions HF = new HelperFunctions();
                limitationsObjMain = HF.updateAccountLimitations(accountObj);
                Session["limitations"] = limitationsObjMain;

                return RedirectToAction("ManageFolders", "Folder");
            }
            else
            {
                var folderList = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                Session["folderss"] = folderList;

                LimitationsViewModel limitationsObjMain = (LimitationsViewModel)Session["limitations"];
                HelperFunctions HF = new HelperFunctions();
                limitationsObjMain = HF.updateAccountLimitations(accountObj);
                Session["limitations"] = limitationsObjMain;

                return View(folderObj);
            }
        }
        public ActionResult DeleteSubscriptions(long id)
        {
            Account accountObj = (Account)Session["account"];
            var selectedSubscription = CCConnectinRepository.CCSubscriptions.Where(sid => sid.ConnectionID == id & sid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();
            bool resp = false;
            if (selectedSubscription != null)
            {
                resp = CCConnectinRepository.DeleteSubscription(id);
            }

            LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObj = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObj;

            if(resp)
                return Json("success", JsonRequestBehavior.AllowGet);
            else
                return Json("fail", JsonRequestBehavior.AllowGet);

            //return RedirectToAction("ViewConnections", "Folder", new { id = selectedSubscription.FolderID });
        }
        public ActionResult DeleteContact(long id, long fid, long pid)
        {
            bool res = false;
            Account accountObj = (Account)Session["account"];

            var allFields = CCFieldValueRepository.CCFieldValues.Where(cid => cid.ItemID == id & cid.AccountGUID == accountObj.AccountGUID).ToList();

            if (allFields.Count > 0)
            {
                foreach (var cid in allFields)
                {
                    // res = CCFieldValueRepository.DeleteFieldValue(cid.ValueID);
                }
            }

            var contact = CCItemRepository.CCContacts.Where(cid => cid.ItemID == id & cid.AccountGUID == accountObj.AccountGUID).FirstOrDefault().ItemID;

            if (contact != null)
            {
                bool deletecontact = CCItemRepository.DeleteContact(contact);
            }

            var folderDetails = CCFolderRepository.CCFolders.FirstOrDefault(f => f.FolderID == fid);

            LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObj = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObj;

            if (folderDetails.isOverFlow == true)
            {
                if (limitationsObj.folderList.Where(f => f.fold.FolderID == id).FirstOrDefault().itemCount <= limitationsObj.maxItemCountPerFolder)
                {
                    folderDetails.isOverFlow = false;
                    folderDetails = CCFolderRepository.SaveFolder(folderDetails);
                }
            }
            return RedirectToAction("Items", "Folder", new { ID = fid });
        }
        public ActionResult SelectFolderoptionss(SelectFolderViewModel model)
        {
            TempData["SelectedMenu"] = "Manage";
            TempData["SelectedSubMenu"] = "ManageFolders";
            Account accountObj = (Account)Session["account"];
            int type = 1;
            CCFolder folderDetails = null;
            folderDetails = CCFolderRepository.FolderDetails(model.PrimarySourceId);
            if (folderDetails != null) { type = folderDetails.Type; }
            else { type = 1; }

            User userObj = (User)Session["user"];

            var connection = new CorporateContacts.Domain.Entities.CCConnection();
            connection.FolderID = model.PrimarySourceId;
            connection.FolderName = model.SelectedFolderName;
            connection.Owner = model.SelectedFolderOwnerInfo;
            if (type == 1) { connection.Type = "Contact"; }
            else { connection.Type = "Calendar"; }
            connection.CredentialsID = model.CredentialID;
            connection.AllowAdditions = false;
            connection.IgnoreExisting = model.IgnoreExisting;
            connection.SyncDirection = model.SyncDirection;
            connection.CategoryFilterUsed = model.CategoryFilterUsed;
            connection.CopyPhotos = model.CopyPhotos;
            connection.TurnOffReminders = model.TurnOffReminders;
            connection.SourceID = model.SelectedFolderId;
            connection.Frequency = 1440;
            connection.IsRunning = false;
            connection.IsPaused = false;
            connection.SecondaryAccount = Session["secondaryAccount"] as string;
            string accessTypes = string.Empty;
            if (Session["accessType"] != null) { accessTypes = Session["accessType"].ToString(); }
            if (string.IsNullOrEmpty(accessTypes)) { connection.AccessType = 0; }
            else { connection.AccessType = Int32.Parse(accessTypes); }
            string format = "yyyy-MM-dd HH:mm";
            connection.LastSyncTime = ((DateTime)(System.Data.SqlTypes.SqlDateTime.MinValue)).ToString(format);
            if (model.CategoryFilterUsed == false) { connection.CategoryFilterValues = string.Empty; }
            else { connection.CategoryFilterValues = model.CategoryFilterValues; }
            if (model.TagAllSubject == true) { connection.SubjectTag = model.SubjectTag; }
            else { connection.SubjectTag = string.Empty; }
            connection.tagSubject = model.TagAllSubject;
            connection.AccountGUID = accountObj.AccountGUID;
            connection = CCConnectinRepository.SaveSubscription(connection);

            if (connection != null)
            {
                var foldertag = new CorporateContacts.Domain.Entities.CCConnection();
                var tagname = connection.FolderName + "[" + connection.ConnectionID + "]";
                foldertag.Tag = tagname;
                foldertag.ConnectionID = connection.ConnectionID;

                CCConnectinRepository.SaveSubscriptionTag(foldertag);
            }

            var res = CCFieldMappingsRepository.SaveAllMappingFields(connection.FolderID, connection.ConnectionID, accountObj.AccountGUID);

            LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObj = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObj;

            return RedirectToAction("ViewConnections", "Folder", new { id = connection.FolderID });
        }
        public ActionResult ImportContacts(long id)
        {
            User userObj = (User)Session["user"];
            Account accountObj = (Account)Session["account"];

            var folderName = CCFolderRepository.CCFolders.FirstOrDefault(fid => fid.FolderID == id & fid.AccountGUID == accountObj.AccountGUID).Name;
            ViewBag.foldername = folderName;

            if (Request.Files.Count > 0)
            {
                var file = Request.Files[0];

                if (file != null && file.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    string fileExtension = System.IO.Path.GetExtension(path);

                    if (fileExtension == ".xls" || fileExtension == ".xlsx")
                    {
                        ViewBag.MessageExtention = "";

                        file.SaveAs(path);

                        ItemsImporter importcontact = new ItemsImporter(CCFieldRepository, CCFieldValueRepository, CCItemRepository);

                        LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];

                        long maxItemImportCount = limitationsObj.maxItemCountPerFolder - limitationsObj.folderList.Where(f => f.fold.FolderID == id).FirstOrDefault().itemCount;

                        long numberOfContacts = importcontact.ImportInputContacts(id, accountObj.AccountGUID, path, fileExtension, maxItemImportCount);

                        if (System.IO.File.Exists(path))
                        {
                            System.IO.File.Delete(path);
                        }

                        if (numberOfContacts == -2)
                        {
                            ViewBag.MessageItemImportExceed = "The number of contacts to be imported exceeds the Max Item per Folder Count";
                            //ViewBag.Message = "";
                            //ViewBag.MessagePass = "";
                        }
                        else if (numberOfContacts > 0)
                        {
                            ViewBag.MessagePass = "******" + (numberOfContacts - 1) + " contacts were imported.";
                            //ViewBag.Message = "";
                            //ViewBag.MessageItemImportExceed = "";
                        }
                        else
                        {
                            ViewBag.Message = "No matching fields were found in the imported file. O contacts imported.";
                            //ViewBag.MessagePass = "";
                            //ViewBag.MessageItemImportExceed = "";
                        }

                    }

                    else
                    {
                        ViewBag.MessageExtention = "Please select the .xls or .xlsx file";
                        //ViewBag.MessagePass = "";
                        //ViewBag.MessageItemImportExceed = "";
                        //ViewBag.Message = "";
                    }

                }
            }

            LimitationsViewModel limitationsObjMain = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObjMain = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObjMain;

            return View(id);
            //  return RedirectToAction("ImportContacts");
        }
        public ActionResult ImportBulkConnections(ImportConnectionListModel model)
        {
            long fid = model.selectedFolderID;

            User userObj = (User)Session["user"];
            Account accountObj = (Account)Session["account"];
            long numberOfConnections = 0;

            var folderName = CCFolderRepository.CCFolders.FirstOrDefault(f => f.FolderID == fid & f.AccountGUID == accountObj.AccountGUID).Name;
            ViewBag.foldername = folderName;
            ConnectionImportListSummaryModel connSummary = new ConnectionImportListSummaryModel();

            if (Request.Files.Count > 0)
            {
                var file = Request.Files[0];

                if (file != null && file.ContentLength > 0)
                {
                    var fileName = Path.GetFileName(file.FileName);
                    var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                    string fileExtension = System.IO.Path.GetExtension(path);

                    if (fileExtension == ".xls" || fileExtension == ".xlsx")
                    {
                        ViewBag.MessageExtention = "";

                        file.SaveAs(path);

                        LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];

                        long maxConnectionImportCount = limitationsObj.availableCconnectionCount;

                        ConnectionImporter importConnection = new ConnectionImporter(CCConnectinRepository, CCFolderRepository, CCCredentialRepository, CCFieldMappingsRepository);
                        connSummary = importConnection.ImportConnections(fid, accountObj.AccountGUID, path, fileExtension, model.SelectedCredentialID, model.SelectedImporsanationOrDelegation, model.SyncDirection, maxConnectionImportCount);

                        if (System.IO.File.Exists(path))
                        {
                            System.IO.File.Delete(path);
                        }

                        //if (numberOfConnections > 0)
                        //{
                        //    ViewBag.MessagePass = "******" + (numberOfConnections - 1) + " contacts were imported.";
                        //    ViewBag.Message = "";
                        //}
                        //else
                        //{
                        //    ViewBag.Message = "No matching fields were found in the imported file. O contacts imported.";
                        //    ViewBag.MessagePass = "";
                        //}
                    }
                    else
                    {
                        ViewBag.MessageExtention = "Please select the .xls or .xlsx file";
                    }
                }
            }

            LimitationsViewModel limitationsObjMain = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObjMain = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObjMain;

            Session["newConnections"] = connSummary;

            return RedirectToAction("ViewConnections", "Folder", new { id = fid });
        }
        public ActionResult AddContact(AddContactViewModel objContact)
        {
            Account accountObj = (Account)Session["account"];
            string timeZone = (string)Session["timeZone"];
            int type = 1;
            ItemsImporter importcontact = new ItemsImporter(CCFieldRepository, CCFieldValueRepository, CCItemRepository);
            CCFolder folderDetails = null;
            folderDetails = CCFolderRepository.FolderDetails(objContact.FolderID);
            if (folderDetails != null) { type = folderDetails.Type; }
            else { type = 1; }
            bool res = importcontact.ImportSingleContact(objContact, type, accountObj.AccountGUID, timeZone);

            LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObj = HF.updateAccountLimitations(accountObj);
            Session["limitations"] = limitationsObj;

            if (res) return RedirectToAction("Items", "Folder", new { id = objContact.FolderID });
            else { return RedirectToAction("AddContact", "Folder", new { id = objContact.FolderID, state = 1 }); }
        }
        public ActionResult ImpersonatedAccount(long AccID)
        {
            if (Session["SysAdminDetails"] != null)
            {
                TempData["SelectedMenu"] = "AccImpersontation";

                var userObj = CCUserRepository.GetUserByEmailAddress(CCUserRepository.Users.First(U => U.AccountID == AccID).Email);
                Session["user"] = userObj;
                var accountObj = CCAccRepository.Accounts.FirstOrDefault(x => x.ID == userObj.AccountID);
                Session["account"] = accountObj;
                var timeZone = CCAccRepository.Accounts.Where(aid => aid.ID == userObj.AccountID).FirstOrDefault().TimeZone;
                Session["timeZone"] = timeZone;
                var folders = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                Session["folderss"] = folders;

                List<NotificationListViewModel> notificationList = new List<NotificationListViewModel>();

                CronJobController CJC = new CronJobController();
                Session["account"] = CJC.checkAccountTrialExpiryForAccount(accountObj);

                HelperFunctions HF = new HelperFunctions();
                notificationList = HF.generateNotificationList(accountObj);

                HF.CheckAcccountStatus(accountObj);

                if (notificationList.Count > 0)
                    Session["notifications"] = notificationList;
                else
                    Session["notifications"] = null;

                if (((DateTime)(accountObj.TrialEnds) - (DateTime)(DateTime.Now.Date)).TotalDays < CCGlobalValues.trialPeriod)
                {
                    TrialDataModel trialObj = new TrialDataModel();
                    trialObj.hasPurchased = accountObj.HasPurchased;
                    trialObj.createdDate = accountObj.CreatedDate;
                    trialObj.trialEndDate = accountObj.TrialEnds;
                    trialObj.showPurchaseOptions = true;
                    Session["trialData"] = trialObj;
                }

                ImpersonateAccountsSysAdminModel model = new ImpersonateAccountsSysAdminModel();

                var AccountsInfo = CCAccRepository.Accounts.Where(A => A.ID == AccID).FirstOrDefault();

                model.SelectedAccountInfo = AccountsInfo;
                model.FolderCount = CCFolderRepository.CCFolders.Where(F => F.AccountGUID == AccountsInfo.AccountGUID).Count();
                model.ConnectionCount = CCConnectionRepository.CCSubscriptions.Where(C => C.AccountGUID == AccountsInfo.AccountGUID).Count();
                model.UserCount = CCUserRepository.Users.Where(U => U.AccountID == AccountsInfo.ID).Count();
                model.SubscriptionCount = 0;
                model.ItemsCount = CCItemRepository.CCContacts.Where(I => I.AccountGUID == AccountsInfo.AccountGUID).Count();
                model.SelectedAccountOwner = CCUserRepository.Users.First(U => U.AccountID == AccountsInfo.ID).FullName;

                //Sync Graph Data

                List<string> SyncDates = new List<string>();
                List<double> SyncDateUsage = new List<double>();

                DateTime startDate = DateTime.Now.Date.AddDays(-1);

                for (int i = 6; i > -1; i--)
                {
                    SyncDates.Add((startDate.AddDays(-i)).ToShortDateString());
                }

                for (int i = 0; i < SyncDates.Count(); i++)
                {
                    DateTime syncDateStart = DateTime.Parse(SyncDates[i]);
                    DateTime syncDateEnd = syncDateStart.AddHours(23).AddMinutes(59);

                    SyncDateUsage.Add(CCSyncItemsRepository.CCSyncItems.Where(SI => SI.LastUpdated >= syncDateStart && SI.LastUpdated <= syncDateEnd).Count());
                }

                model.SyncDates = SyncDates;
                model.SyncDateUsage = SyncDateUsage;

                return View(model);
            }
            else
            {
                return RedirectToAction("Login", "Login");
            }
        }
        public int checkToFreezeAccount(Account acc)
        {
            var folderList = CCFolderRepository.CCFolders.Where(f => f.AccountGUID == acc.AccountGUID).ToList();

            foreach(var fold in folderList)
            {
                int FolderItemCount = CCItemRepository.CCContacts.Where(i => i.FolderID == fold.FolderID).Count();

                LimitationsViewModel limitationsObj = new LimitationsViewModel();
                HelperFunctions HF = new HelperFunctions();
                limitationsObj = HF.updateAccountLimitations(acc);

                if ((FolderItemCount > limitationsObj.maxItemCountPerFolder) | (fold.isOverFlow == true))
                {
                    return 1;
                }
            }
            return 0;
        }
        public ActionResult Login(LogOnViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (authProvider.Authenticate(model.EmailAddress, model.Password, this.userRepository))
                {
                    var userObj = userRepository.GetUserByEmailAddress(model.EmailAddress);
                    Session["user"] = userObj;
                    var accountObj = accRepository.Accounts.FirstOrDefault(x => x.ID == userObj.AccountID);
                    Session["account"] = accountObj;
                    var timeZone = accRepository.Accounts.Where(aid => aid.ID == userObj.AccountID).FirstOrDefault().TimeZone;
                    Session["timeZone"] = timeZone;
                    Session["SysAdminDetails"] = null;

                    List<NotificationListViewModel> notificationList = new List<NotificationListViewModel>();

                    CronJobController CJC = new CronJobController();
                    Session["account"] = CJC.checkAccountTrialExpiryForAccount(accountObj);

                    //save details into error table
                    //SaveLogonDetails(model.EmailAddress);

                    if ( userObj.UserType == "Admin" || userObj.UserType == "Standard")
                    {
                        if (userObj.EmailVerified == true)
                        {
                            //get the folders
                            var folders = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();
                            Session["folderss"] = folders;

                            HelperFunctions HF = new HelperFunctions();
                            notificationList = HF.generateNotificationList(accountObj);

                            HF.CheckAcccountStatus(accountObj);

                            if(notificationList.Count>0)
                                Session["notifications"] = notificationList;
                            else
                                Session["notifications"] = null;

                            return Redirect(returnUrl ?? Url.Action("Index", "Admin"));
                        }
                        else
                        {
                            return Redirect(returnUrl ?? Url.Action("ResendVerification", "SignUp", new { uid = userObj.ID }));
                        }
                    }
                    else if (userObj.UserType == "SystemAdmin")
                    {
                        HelperFunctions HF = new HelperFunctions();
                        notificationList = HF.generateNotificationList(accountObj);
                        if (notificationList.Count > 0)
                            Session["notifications"] = notificationList;

                        Session["SysAdminDetails"] = userRepository.GetUserByEmailAddress(model.EmailAddress);

                        return Redirect(returnUrl ?? Url.Action("Index", "CorporateContactsAdmin"));
                    }
                    else
                    {
                        return Redirect(returnUrl ?? Url.Action("SetupSync", "User"));
                    }
                }
                else
                {
                    //save details into error table
                    //SaveLogonDetails(model.EmailAddress);
                    ModelState.AddModelError("", "Incorrect username or password");
                    return View();

                }
            }
            else
            {
                return View();
            }
        }
        public ActionResult Index()
        {
            TempData["SelectedMenu"] = "Summary";
            TempData["SelectedSubMenu"] = "";
            TempData["SelectedSubMenuFolder"] = "";
            User userObj = (User)Session["user"];
            Account accountObj = (Account)Session["account"];
            if (userObj != null)
            {
                //if (accountObj.isOverFlow == true)
                //{
                //    return RedirectToAction("BillingOptions", "Admin", new { id = 1 });
                //}

                LimitationsViewModel limitationsObj = new LimitationsViewModel();
                HelperFunctions HF = new HelperFunctions();
                limitationsObj = HF.updateAccountLimitations(accountObj);
                Session["limitations"] = limitationsObj;

                if (userObj.isPasswordChange == false)
                {
                    return RedirectToAction("ChangePassword", "Admin");
                }

                if (Session["trialData"] == null)
                {
                    if (accountObj.HasPurchased == false)
                    {
                        if ((((DateTime)(accountObj.TrialEnds) - (DateTime)(DateTime.Now.Date)).TotalDays > (CCGlobalValues.trialPeriod - 2)) | (((DateTime)(accountObj.TrialEnds) - (DateTime)(DateTime.Now.Date)).TotalDays < 2))
                        {
                            TrialDataModel trialObj = new TrialDataModel();
                            trialObj.hasPurchased = accountObj.HasPurchased;
                            trialObj.createdDate = accountObj.CreatedDate;
                            trialObj.trialEndDate = accountObj.TrialEnds;
                            trialObj.showPurchaseOptions = true;
                            Session["trialData"] = trialObj;

                            return RedirectToAction("Index", "Admin");
                        }
                        else if (((DateTime)(accountObj.TrialEnds) - (DateTime)(DateTime.Now.Date)).TotalDays < CCGlobalValues.trialPeriod)
                        {
                            TrialDataModel trialObj = new TrialDataModel();
                            trialObj.hasPurchased = accountObj.HasPurchased;
                            trialObj.createdDate = accountObj.CreatedDate;
                            trialObj.trialEndDate = accountObj.TrialEnds;
                            trialObj.showPurchaseOptions = true;
                            Session["trialData"] = trialObj;
                        }
                    }
                }

                if (accountObj.HasPurchased == true & Session["trialData"] != null)
                {
                    Session["trialData"] = null;
                }

                AdminViewModel ObjModel = new AdminViewModel();
                List<AdminDashboardViewModel> objDash = new List<AdminDashboardViewModel>();
                List<List<ConnectionInforViewModel>> connectionInforByConnction = new List<List<ConnectionInforViewModel>>();

                if (CCFolderRepository.CCFolders != null) { }
                var allFolders = CCFolderRepository.CCFolders.Where(guid => guid.AccountGUID == accountObj.AccountGUID).ToList();

                ObjModel.noOfFolders = CCFolderRepository.CCFolders.Where(F => F.AccountGUID == accountObj.AccountGUID).Count();
                ObjModel.noOfConnections = CCConnectionRepository.CCSubscriptions.Where(C => C.AccountGUID == accountObj.AccountGUID).Count();
                ObjModel.noOfUsers = CCUserRepository.Users.Where(U => U.AccountID == userObj.AccountID).Count();
                //ObjModel.noOfSubscriptionsPurchased = 0;
                ObjModel.noOfTotalItems = CCItemRepository.CCContacts.Where(I => I.AccountGUID == accountObj.AccountGUID & I.isDeleted == false).Count();

                // get saved quantity
                var accDetails = accountRepo.Accounts.Where(aguid => aguid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();
                var planLeval = planRepository.Plans.Where(pid => pid.ID == accDetails.PlanID).FirstOrDefault().PlanLevel;

                    var featureQuality = featureRepository.Features.Where(pid => pid.PlanLevel == planLeval & pid.Type == "Max Items per Folder").FirstOrDefault();
                    var savedQuality = purchRepository.Purchases.Where(fid => fid.FeatureID == featureQuality.ID && fid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();

                    if (savedQuality != null)
                    {
                        var quantitySaved = (savedQuality.Quantity) / (featureQuality.Quantity);
                        ObjModel.NoOfConnection = quantitySaved * 5;
                        ObjModel.noOfSubscriptionsPurchased = quantitySaved;
                        //limitationsObj.availableCconnectionCount = (int)ObjModel.NoOfConnection - (int)ObjModel.noOfConnections;
                        //limitationsObj.maxItemCountPerFolder = featureQuality.Quantity;
                        //if (featureRepository.Features.Where(pid => pid.PlanLevel == planLeval & pid.Type == "Sync Calendar").FirstOrDefault().Quantity == 0)
                        //    limitationsObj.isCalendarSyncAvailable = false;
                        //else
                        //    limitationsObj.isCalendarSyncAvailable = true;
                    }
                    else
                    {
                        ObjModel.NoOfConnection = 0;
                        ObjModel.noOfSubscriptionsPurchased = 0;
                    }

                foreach (var folder in allFolders)
                {
                    AdminDashboardViewModel dash = new AdminDashboardViewModel();
                    List<ConnectionInforViewModel> connectionInforByFolder = new List<ConnectionInforViewModel>();

                    dash.FolderName = folder.Name;
                    dash.FolderID = folder.FolderID;
                    dash.FolderType = folder.Type;
                    dash.NumberOfItems = CCContactRepository.CCContacts.Where(fid => fid.FolderID == folder.FolderID & fid.AccountGUID == accountObj.AccountGUID & fid.isDeleted == false).Count();
                    dash.NumberOfConnections = CCConnectionRepository.CCSubscriptions.Where(fid => fid.FolderID == folder.FolderID & fid.AccountGUID == accountObj.AccountGUID).Count();

                    if (folder.IsPaused == false)
                    {
                        dash.IsPaused = false;
                    }
                    else
                    {
                        dash.IsPaused = true;
                    }
                    objDash.Add(dash);

                    var connections = CCConnectionRepository.CCSubscriptions.Where(fid => fid.FolderID == folder.FolderID & fid.AccountGUID == accountObj.AccountGUID);
                    foreach (var conn in connections)
                    {
                        ConnectionInforViewModel connectionInfor = new ConnectionInforViewModel();
                        connectionInfor.FolderName = folder.Name;
                        connectionInfor.ConnctionFolderName = conn.FolderName;
                        connectionInfor.ConnectionID = conn.ConnectionID;

                        if (DateTime.Parse(conn.LastSyncTime) < DateTime.Parse("1902-01-01 00:00"))
                        {
                            connectionInfor.LastSyncTime = "Never";
                        }
                        else
                        {

                            DateTime timeUtc = DateTime.Parse(conn.LastSyncTime);
                            DateTime cstTime = new DateTime();
                            try
                            {
                                TimeZoneInfo cstZone = TimeZoneInfo.FindSystemTimeZoneById(accountObj.TimeZone.ToString());
                                cstTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, cstZone);
                                Console.WriteLine("The date and time are {0} {1}.",
                                                  cstTime,
                                                  cstZone.IsDaylightSavingTime(cstTime) ?
                                                          cstZone.DaylightName : cstZone.StandardName);
                            }
                            catch (TimeZoneNotFoundException)
                            {
                                Console.WriteLine("Timezone conversion error");
                            }
                            catch (InvalidTimeZoneException)
                            {
                                Console.WriteLine("conn.LastSyncTime");
                            }

                            connectionInfor.LastSyncTime = cstTime.ToString();

                            //connectionInfor.LastSyncTime = conn.LastSyncTime;
                        }
                        connectionInfor.Type = conn.Type;
                        connectionInfor.FolderID = folder.FolderID;
                        if (conn.IsRunning == null) { connectionInfor.IsRunning = false; }
                        else if (conn.IsRunning == false) { connectionInfor.IsRunning = false; }
                        else if (conn.IsRunning == true) { connectionInfor.IsRunning = true; }
                        if (conn.IsPaused == false)
                        {
                            connectionInfor.IsPaused = false;
                            connectionInfor.rowClass = "notPaused ";
                        }
                        else
                        {
                            connectionInfor.IsPaused = true;
                            connectionInfor.rowClass = "Paused ";
                        }
                        connectionInforByFolder.Add(connectionInfor);

                    }

                    connectionInforByConnction.Add(connectionInforByFolder);

                }
                var assemblyVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
                ViewBag.version = assemblyVersion;
                Session["version"] = assemblyVersion;
                ObjModel.FoldersInfor = objDash;
                ObjModel.ConnectionsInfor = connectionInforByConnction;
                return View(ObjModel);
            }
            return View();
        }
        public ActionResult SaveFeatures(string plan, int quantities, string couponID)
        {
            User userObj = (User)Session["user"];
            Account accountObj = (Account)Session["account"];
            int planLevel = Int32.Parse(plan);
            int existingPlanID = accountObj.PlanID;
            string purchaseType = "Upgrade";

            ////Delete old purchasedfeature
            //var purchasedfeatures = purchRepository.Purchases.Where(p => p.AccountGUID == accountObj.AccountGUID).ToList();
            //foreach (var purch in purchasedfeatures)
            //{
            //    bool res = purchRepository.DeleteFPurchasedFeature(purch.ID);

            //}

            //var featuresForPlan = featureRepository.Features.Where(pl => pl.PlanLevel == planLevel).ToList();

            //// save default feature
            //var featuresForDefaultPlan = featureRepository.Features.Where(pl => pl.PlanLevel == planLevel && pl.Price == 0).ToList();

            //foreach (var feat in featuresForDefaultPlan)
            //{
            //    PurchasedFeatures objFeature = new PurchasedFeatures();
            //    objFeature.AccountGUID = accountObj.AccountGUID;
            //    objFeature.FeatureID = feat.ID;
            //    objFeature.ExpiryDate = DateTime.UtcNow;
            //    objFeature.Enabled = true;

            //    if (feat.Type == "Max Items per Folder")
            //    {
            //        objFeature.Quantity = (feat.Quantity) * quantities;
            //    }
            //    else
            //    {
            //        objFeature.Quantity = feat.Quantity;
            //    }

            //    purchRepository.SavePurchase(objFeature);
            //}

            ////Ajust Folder Fields START

            //List<string> needtosave = new List<string>();
            //List<CCFolderField> savedobj = new List<CCFolderField>();
            //List<CCFolderField> activeFields = new List<CCFolderField>();
            //List<CCFolderField> needToInActive = new List<CCFolderField>();

            //List<String> objFields = new List<string>();

            //if(planLevel == 10)
            //    objFields = FieldsConfigHelper.GetFieldForAppointmentSimple();
            //else if(planLevel == 20)
            //    objFields = FieldsConfigHelper.GetFieldForContactBusiness();
            //else
            //    objFields = FieldsConfigHelper.GetFieldForContactFull();

            //var folderListForAccount = CCFolderRepository.CCFolders.Where(F => F.AccountGUID == accountObj.AccountGUID).ToList();

            //foreach (var fold in folderListForAccount)
            //{
            //    needtosave = CCFieldRepository.IsAvailableField(objFields, fold.FolderID);

            //    foreach (var field in needtosave)
            //    {
            //        CCFolderField folderField = new CCFolderField();
            //        folderField.FieldName = FieldsConfigHelper.GetRealName(field);
            //        folderField.FieldType = FieldsConfigHelper.GetVariableType(field);
            //        folderField.FolderID = fold.FolderID;
            //        folderField.FieldCaption = field;
            //        folderField.Restriction = "none";
            //        folderField.AccountGUID = accountObj.AccountGUID;
            //        folderField.isActive = true;
            //        savedobj.Add(folderField);
            //    }

            //    foreach (var field in objFields)
            //    {
            //        CCFolderField folderField = CCFieldRepository.CCFolderFields.Where(f => f.FieldCaption == field & f.AccountGUID == accountObj.AccountGUID & f.FolderID == fold.FolderID).FirstOrDefault();
            //        activeFields.Add(folderField);
            //    }

            //    var resp = CCFieldRepository.SaveFolderFieldsObj(savedobj);

            //    var fieldList = CCFieldRepository.CCFolderFields.Where(f => f.AccountGUID == accountObj.AccountGUID & f.FolderID == fold.FolderID).ToList();

            //    var toInActiveList = fieldList.Except(activeFields).ToList();

            //    int flag = 0;

            //    foreach (var f1 in fieldList)
            //    {
            //        flag = 0;
            //        foreach (var f2 in activeFields)
            //        {
            //            try
            //            {
            //                if (f2.FieldID == f1.FieldID)
            //                {
            //                    if (f1.isActive != false)
            //                    {
            //                        flag = 1;
            //                        break;
            //                    }
            //                    else
            //                    {
            //                        flag = 2;
            //                        break;
            //                    }

            //                }
            //            }
            //            catch (Exception ex)
            //            { }

            //        }

            //        if (flag == 0)
            //        {
            //            f1.isActive = false;
            //            CCFieldRepository.SaveFolderFields(f1);
            //        }

            //        else if (flag == 2)
            //        {
            //            f1.isActive = true;
            //            CCFieldRepository.SaveFolderFields(f1);
            //        }
            //    }

            //    // add field into default group
            //    var defaultGrp = CCGroupRepository.CCGroups.Where(fid => fid.FolderID == fold.FolderID & fid.GroupName == "Default" & fid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();

            //    if (defaultGrp != null)
            //    {
            //        foreach (var field in resp)
            //        {
            //            long grpFieldOrder = 0;
            //            // get group fileds last order
            //            var groupFieldOrder = CCGroupFieldRepository.CCGroupsFields.Where(gid => gid.GroupID == defaultGrp.GroupID & gid.AccountGUID == accountObj.AccountGUID).OrderByDescending(grp => grp.FieldOrder).FirstOrDefault();
            //            if (groupFieldOrder != null) { grpFieldOrder = groupFieldOrder.FieldOrder; }

            //            CCGroupField objgrpfield = new CCGroupField();
            //            objgrpfield.FieldID = field.FieldID;
            //            objgrpfield.FieldOrder = grpFieldOrder + 1;
            //            objgrpfield.FolderID = defaultGrp.FolderID;
            //            objgrpfield.GroupID = defaultGrp.GroupID;
            //            objgrpfield.AccountGUID = accountObj.AccountGUID;
            //            var aa = CCGroupFieldRepository.SaveGroupField(objgrpfield);
            //        }
            //    }
            //}

            ////Ajust Folder Fields END

            //// change the plain id
            var planid = planRepository.Plans.FirstOrDefault(pl => pl.PlanLevel == planLevel).ID;

            var currentAccount = accountRepo.Accounts.FirstOrDefault(ac => ac.ID == userObj.AccountID);

            //Account account = new Account();
            //account = currentAccount;
            //existingPlanID = account.PlanID;
            //account.PlanID = planid;

            var account = saveFeaturesCommon(plan, quantities);

            account.HasPurchased = true;

            if (currentAccount.TrialEnds <= DateTime.Now.Date & currentAccount.HasPurchased == false & currentAccount.isOverFlow == true)
            {
                account.isOverFlow = false;
            }

            Session["trialData"] = null;

            if (existingPlanID > planid)
            {
                purchaseType = "Downgrade";
            }

            if (accountObj.isPaymentIssue == true)
            {
                account.isPaymentIssue = false;
            }

            account = accountRepo.SaveAccount(account);

            LimitationsViewModel limitationsObj = (LimitationsViewModel)Session["limitations"];
            HelperFunctions HF = new HelperFunctions();
            limitationsObj = HF.updateAccountLimitations(account);
            Session["limitations"] = limitationsObj;

            HF.CheckAcccountStatus(account);

            //Reset Sync Times
            var ConnectionList = CCConnectionRepository.CCSubscriptions.Where(con => con.AccountGUID == account.AccountGUID).ToList();

            foreach (var con in ConnectionList)
            {
                con.ResetAtNextSync = true;
                CCConnectionRepository.SaveSubscription(con);
            }

            var folderDetails = CCFolderRepository.CCFolders.Where(f => f.AccountGUID == account.AccountGUID).ToList();

            foreach (var fold in folderDetails)
            {
                if (fold.isOverFlow == true)
                {
                    if (limitationsObj.folderList.Where(f => f.fold.FolderID == fold.FolderID).FirstOrDefault().itemCount <= limitationsObj.maxItemCountPerFolder)
                    {
                        fold.isOverFlow = false;
                        CCFolderRepository.SaveFolder(fold);
                    }
                }
            }

            Session["account"] = account;

            //var featureQuality = featureRepository.Features.Where(pid => pid.PlanLevel == planLevel & pid.Type == "Max Items per Folder").FirstOrDefault();
            //var savedQuality = purchRepository.Purchases.Where(fid => fid.FeatureID == featureQuality.ID && fid.AccountGUID == accountObj.AccountGUID).FirstOrDefault();

            //if (savedQuality != null)
            //{
            //    var quantitySaved = (savedQuality.Quantity) / (featureQuality.Quantity);
            //    limitationsObj.availableCconnectionCount = (int)(quantitySaved * 5) - (int)CCConnectionRepository.CCSubscriptions.Where(C => C.AccountGUID == accountObj.AccountGUID).Count();
            //    limitationsObj.maxItemCountPerFolder = featureQuality.Quantity;
            //    if (featureRepository.Features.Where(pid => pid.PlanLevel == planLevel & pid.Type == "Sync Calendar").FirstOrDefault().Quantity == 0)
            //        limitationsObj.isCalendarSyncAvailable = false;
            //    else
            //        limitationsObj.isCalendarSyncAvailable = true;
            //}

            List<NotificationListViewModel> notificationList = new List<NotificationListViewModel>();
            notificationList = HF.generateNotificationList(account);
            if (notificationList.Count > 0)
                Session["notifications"] = notificationList;
            else
                Session["notifications"] = null;

            var currentAccountDetails = accountRepo.Accounts.FirstOrDefault(aid => aid.ID == userObj.AccountID);

            if (currentAccountDetails.StripeCustomerID != null)
            {
                ChargeFromExistingDetails(existingPlanID, quantities, couponID);
            }

            if (account != null)
            {
                if (currentAccountDetails.StripeCustomerID == null)
                {
                    return Json("SucessNew", JsonRequestBehavior.AllowGet);
                }
                else
                {
                    return Json("Sucess", JsonRequestBehavior.AllowGet);
                }

            }
            else
            {
                return Json("Fail", JsonRequestBehavior.AllowGet);
            }
        }