public static string GetWorldId(HttpContextBase httpContext, HttpSessionStateBase session)
 {
     using (var reposotory = RepositoryFactory.GetInstance(session))
     {
         var contentTypeRetriver = new WorldContentTypeRetriver(httpContext, reposotory);
         var worldId = contentTypeRetriver.GetWorldContentTypeId();
         if (string.IsNullOrEmpty(worldId))
         {
             httpContext.Response.Redirect("/");
         }
         return worldId;
     }
 }
        public async Task<ActionResult> Index()
        {
            var model = new HomePageViewModel();
            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                var worldRetriver = new WorldContentTypeRetriver(HttpContext, repository);

                await MyMentorUserManager.LoginWithAuthCookie(Session, HttpContext, repository);

                model.BannerName = worldRetriver.GetContentTypeName();
                model.ContentWorlds = worldRetriver.GetWorldsByRole(Session.GetLoggedInUser(),Session.GetLoggedInUserRoleName());             
                return View("index", model);
            }
        }
        public string GetContentTypeDisplayName()
        {
            var worldRetriver = new WorldContentTypeRetriver(HttpContext);
            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                IEnumerable<WorldContentTypeDto> result = null;

                result = repository.FindWorlds();

                var selectedWorld = result.SingleOrDefault(item => item.FixedId == worldRetriver.GetContentTypeName());
                string displayName = string.Empty;
                if (selectedWorld != null)
                {
                    displayName = selectedWorld.GetLocalizedField("value");
                    displayName = string.Concat(MyMentorResources.lblWorldDisplayName, " ", displayName);
                }
                return displayName;
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="cartItemModel"></param>
        /// <param name="contentItem"></param>
        /// <param name="repository"></param>
        /// <param name="purchase"></param>
        /// <param name="existingPurchase"></param>
        /// <returns>update shopping cart</returns>
        private Purchase AddToCartInternal(ShoppoingCartItemModel cartItemModel, ParseObject contentItem, ParseRepository repository, Purchase existingPurchase, string previosDemoId)
        {
            var currentUser = Session.GetLoggedInUser();
            var isLessson = cartItemModel.ContentItemType.Contains("lesson");
            var isDemo = cartItemModel.ContentItemType.Contains("demo");

            var includingSupport = cartItemModel.ContentItemType.Contains("support");
            var defaultCurrency = repository.FindDefaultCurrency();
            var worldRetriever = new WorldContentTypeRetriver(HttpContext, repository);

            CurrencyDto contentItemCurrency = null;
            CurrencyDto userCurrency = null;
            userCurrency = Task.Run(() => currentUser.GetPointerObject<Currency>("currency")).Result.ConvertToCurrencyDto();

            float contentItemPrice;
            float contentItemSupportPrice;
            string purchaseStatusCode;
            var clips = new List<string>();
            string clipId = "1";
            string bundleId = "";
            string objectId = "";

            if (isLessson)
            {
                var clip = (Clip)contentItem;
                var isAdminOrCurrenctUser = clip.Teacher.ObjectId == currentUser.ObjectId || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;
                clipId = clip.ObjectId;
                contentItemCurrency = clip.Currency.ConvertToCurrencyDto();
                contentItemPrice = clip.Price;
                contentItemSupportPrice = includingSupport ? clip.SupportPrice : 0;
                purchaseStatusCode = isAdminOrCurrenctUser ? PurchaseStatusCodes.LessonIsActive : PurchaseStatusCodes.LessonIsInBaskert;
            }
            else
            {
                var bundle = (Bundle)contentItem;
                bundleId = bundle.ObjectId;
                contentItemCurrency = bundle.Currency.ConvertToCurrencyDto();
                contentItemPrice = bundle.Price;
                contentItemSupportPrice = includingSupport ? bundle.SupportPrice : 0;
                purchaseStatusCode = PurchaseStatusCodes.PackageIsInBasket;
                clips = bundle.ClipsInBundle.Select(x => x.ObjectId).ToList();
            }
            PurchaseDto purchaseDto = null;

            if (isDemo)
            {
                purchaseDto = new PurchaseDto
                {
                    ObjectId = existingPurchase != null ? existingPurchase.ObjectId : null,
                    ClipId = clipId,
                    BundleId = bundleId,
                    ClipKind = ClipPurchaseTypes.Demo,
                    PurchaseStatusCode = PurchaseStatusCodes.DemoOrdered,
                    PurchaseStatusDate = DateTime.Now,
                    UserKey = currentUser.ObjectId,
                    WorldId = worldRetriever.GetWorldContentTypeId()
                };
            }
            else
            {
                if (!string.IsNullOrEmpty(previosDemoId))
                {
                    objectId = previosDemoId;
                }
                if (existingPurchase != null)
                {
                    objectId = existingPurchase.ObjectId;
                }

                purchaseDto = new PurchaseDto
                {
                    ObjectId = objectId,
                    ClipId = clipId,
                    BundleId = bundleId,
                    ClipKind = isLessson ? ClipPurchaseTypes.Lesson : ClipPurchaseTypes.Bundle,
                    UserCurrencyId = currentUser.GetPointerObjectId("currency"),
                    Price = CurrencyConverter.Convert(contentItemPrice, contentItemCurrency, userCurrency),
                    PriceNIS = CurrencyConverter.Convert(contentItemPrice, contentItemCurrency, defaultCurrency),
                    OriginalItemPrice = contentItemPrice,
                    OriginalItemCurrency = contentItemCurrency.ObjectId,
                    PurchaseStatusCode = purchaseStatusCode,
                    PurchaseStatusDate = DateTime.Now,
                    SupportPrice = CurrencyConverter.Convert(contentItemSupportPrice, contentItemCurrency, userCurrency),
                    SupportPriceNIS = CurrencyConverter.Convert(contentItemSupportPrice, contentItemCurrency, defaultCurrency),
                    OriginalSupportPrice = contentItemSupportPrice,
                    UserKey = currentUser.ObjectId,
                    WorldId = worldRetriever.GetWorldContentTypeId(),
                    ClipIds = clips.ToArray(),
                    IncludingSupport = includingSupport
                };
            }

               // repository.AddPurchase(purchaseDto);

            return purchaseDto.ConvertToDomain();
        }
        private CheckoutViewModel GetCheckoutViewModel(Purchase[] userPurchases, IMyMentorRepository repository)
        {
            var loggedInUser = Session.GetLoggedInUser();
            var model = new CheckoutViewModel();

            CurrencyDto currencyDto = Task.Run(() => loggedInUser.GetPointerObject<BL.Models.Currency>("currency")).Result.ConvertToCurrencyDto();
            model.UserCurrency = currencyDto;

            var worldRetriver = new WorldContentTypeRetriver(HttpContext, repository);
            var world = worldRetriver.GetWorldContentTypeId();

            string issuedFor = loggedInUser.ObjectId;
            var userCoupons = repository.FindCoupon(issuedFor, world).ToArray();

            UpdateDuplicateRecords(ref userCoupons, ref userPurchases);

            SetPurchases(model, userPurchases, userCoupons, repository, currencyDto);

            SetCoupons(userCoupons, userPurchases, currencyDto, repository, model);

            SetTotals(model, repository, currencyDto);

            model.PurchaseFor = loggedInUser.Username;

            return model;
        }
        public ActionResult CompleteCheckout(CheckoutViewModel model)
        {
            ActionResult actionResult;
            if (EnsureLoggedOnUser(out actionResult)) return actionResult;
            var checkoutViewModel = new CheckoutViewModel();
            var loggedInUser = Session.GetLoggedInUser();

            try
            {
                using (var repository = RepositoryFactory.GetInstance(Session))
                {
                    var userPurchases = FindPurchasesForUser(repository).ToArray();
                    var userHistoricalPurchases = repository.FindHistoricalUserPurchases(Session.GetLoggedInUser().ObjectId).ToArray();
                    var worldId = new WorldContentTypeRetriver(HttpContext, repository).GetWorldContentTypeId();
                    string paymentUrl;

                    checkoutViewModel = GetCheckoutViewModel(userPurchases, repository);
                    checkoutViewModel.PurchaseFor = model.PurchaseFor;
                    SetBundleClips(userPurchases, checkoutViewModel, repository);

                    var currencyRetriver = new CurrencyRetriver(HttpContext, Session, repository);
                    var sessionState = new SessionState();
                    var indexUrl = HttpContext.Request.Url.ToString().ToLower().Replace("completecheckout", "index") + string.Format("/?purchaseFor={0}", model.PurchaseFor);
                    var expressCheckoutManager = new ExpressCheckoutManager(indexUrl);
                    var logic = new CheckoutLogic(repository, currencyRetriver, sessionState, expressCheckoutManager);

                    logic.ExecuteCompleteCheckout(loggedInUser, checkoutViewModel, worldId, userHistoricalPurchases, out paymentUrl);
                    if (!string.IsNullOrEmpty(paymentUrl))
                    {
                        return Redirect(paymentUrl);
                    }
                }
            }
            catch
            {
                checkoutViewModel.ErrorMessage = Strings.GetLocalizedString(Strings.ShoppingCartPaymentFailure);
            }
            return View("Index", checkoutViewModel);
        }
        public async Task<ActionResult> AddCouponFromContentItem(string id)
        {
            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                var worldRetriver = new WorldContentTypeRetriver(HttpContext, repository);
                var world = worldRetriver.GetWorldContentTypeId();
                var purchase = await repository.FindPurchase(id);
                var issuedFor = Session.GetLoggedInUser().ObjectId;
                var userCoupons = repository.FindCoupon(issuedFor, world).Where(x => x.State == CouponStates.UnUsed.ToString()).ToArray();
                Coupon couponForItem = null;

                if (purchase.ClipKey != null)
                {
                    couponForItem = userCoupons.SingleOrDefault(x => x.Clip != null && x.Clip.ObjectId == purchase.ClipKey.ObjectId);
                }
                if (purchase.BundleKey != null)
                {
                    couponForItem = userCoupons.SingleOrDefault(x => x.Bundle != null && x.Bundle.ObjectId == purchase.BundleKey.ObjectId);
                }

                if (couponForItem != null)
                {
                    return await AddCoupon(couponForItem.ObjectId);
                }
            }

            return RedirectToAction("Index");
        }
        public async Task<ActionResult> UpdateStudent(StudentDetailsViewModel model)
        {
            var repository = RepositoryFactory.GetInstance(Session);
            try
            {
                var registerAsTeacher = model.RegisterAsTeacher;

                ViewBag.IsAdmin = (Session.GetLoggedInUser() != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

                IEnumerable<UserGroup> groups = (repository.FindGroups()).ToArray();
                IEnumerable<UserGroup> subGroups = (repository.FindSubGroups()).ToArray();
                var sugLessonPublishingStatus = repository.FindUserPublishingStatus();
                var userStatuses = repository.FindUserStatus();
                var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
                
                model.UserRole = RoleNames.STUDENTS;
                model.DeviceTypes = repository.FindDeviceTypes();
                model.Countries = repository.FindCountries();

                model.UserPrefferences.ContentTypes = worldContentTypeRetriever.GetContentTypes(Session.GetLoggedInUser(), Session.GetImpersonatingUserName());
                model.UserPrefferences.Currencies = repository.FindCurrencies();
                model.UserPrefferences.Languages = repository.FindInterfaceLanguages();
                model.Groups = groups;
                model.SubGroups = subGroups;
                model.SugLessonPublishingStatus = sugLessonPublishingStatus;
                model.UserStatusValues = userStatuses;
               // var selectedCountry = model.Countries.FirstOrDefault(country => country.Key == model.CountryOfResidence);
               // model.CountryOfResidence = selectedCountry;
                try
                {
                    await new MyMentorUserManager(repository, Session).UpdateStudent(model);
                    model.UpdateSuccess = true;
                }
                catch (Exception ex)
                {
                    mLogger.Log(LogLevel.Error, ex.ToString);
                    model.UpdateSuccess = false;
                }

                if (model.UpdateSuccess != null)
                {
                    if (registerAsTeacher)
                    {
                        ViewBag.UpdateStudentMessage = model.UpdateSuccess.Value ?
                             Strings.GetLocalizedString(Strings.RegistrationSuccessStudentBucomesTeacher) :
                             Strings.GetLocalizedString(Strings.UpdateStudentFail);

                        if (model.UpdateSuccess.Value) ViewBag.UpdateStudentMessage = string.Format(ViewBag.UpdateStudentMessage, model.FirstName);
                    }
                    else
                    {
                        ViewBag.UpdateStudentMessage = model.UpdateSuccess.Value ?
                             Strings.GetLocalizedString(Strings.UpdateStudentSuccess) :
                             Strings.GetLocalizedString(Strings.UpdateStudentFail);
                    }

                }

                SetUserPrefferences(model.UserPrefferences);

                return View(model);
            }
            finally 
            {
                repository.Dispose();
            }
        }
        public ActionResult UpdateStudent()
        {
            // await ParseUser.LogInAsync("*****@*****.**", "123456");
            ParseUser user = Session.GetLoggedInUser();
            StudentDetailsViewModel model = new StudentDetailsViewModel();
            ViewBag.IsAdmin = (user != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

            if (user == null) return RedirectToAction("Login");

            var repository = new ParseRepository(new WebCacheProvider(HttpContext.ApplicationInstance.Context));
            var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
            var contentTypes =  worldContentTypeRetriever.GetContentTypes(user, Session.GetLoggedInUserRoleName());
            var currencies = repository.FindCurrencies();
            var uiLanguages =  repository.FindInterfaceLanguages();
            IEnumerable<UserGroup> groups = ( repository.FindGroups()).ToArray();
            IEnumerable<UserGroup> subGroups = ( repository.FindSubGroups()).ToArray();
            var sugLessonPublishingStatus = repository.FindUserPublishingStatus();
            var userStatuses = repository.FindUserStatus();

            model.DeviceTypes =  repository.FindDeviceTypes();
            model.Countries = repository.FindCountries();
            model.UserPrefferences.ContentTypes = contentTypes;
            model.UserPrefferences.Currencies = currencies;
            model.UserPrefferences.Languages = uiLanguages;
            model.Groups = groups;
            model.SubGroups = subGroups;
            model.SugLessonPublishingStatus = sugLessonPublishingStatus;
            model.UserStatusValues = userStatuses;

            model.FirstName = user.GetString("firstName_he_il");// user.Keys.Contains("firstName") ? user["firstName"] as string : string.Empty;
            model.LastName = user.GetString("lastName_he_il");// user.Keys.Contains("lastName") ? user["lastName"] as string : string.Empty;
            model.Email = user.Keys.Contains("email") ? user["email"] as string : string.Empty;
            model.Phone = user.Keys.Contains("phoneNumber") ? user["phoneNumber"] as string : string.Empty;
            model.Email = user.Keys.Contains("email") ? user["email"] as string : string.Empty;
            model.MailRecipientAddress = user.GetString("mailRecipientAddress");
            model.UserPrefferences.SelectedContentType = user.GetPointerObjectId("contentType");
                       
            model.UserPrefferences.SelectedCurrency = user.GetPointerObjectId("currency");
            model.UserPrefferences.SelectedLanguage = user.GetPointerObjectId("interfaceLanguage");
            
            model.CountryOfResidence = user.GetPointerObjectId("residenceCountry");

            model.SelectedDeviceType = user.Keys.Contains("deviceType") && (user["deviceType"] as ParseObject) != null ? (user["deviceType"] as ParseObject).FetchIfNeededAsync().Result.ObjectId : string.Empty;
            model.SelectedDeviceType = model.DeviceTypes.FirstOrDefault(deviceType => deviceType.Key.Split(new [] { '|' })[0] == model.SelectedDeviceType).Key;

            ViewBag.DeviceUnSupportedText =  Strings.GetLocalizedString(Strings.UnSupportedDevice);

            var userAdminData =  user.GetPointerObject<UserAdminData>("adminData");
            if (userAdminData != null)
            {
                model.AdminData.TCPTeacherCommission = userAdminData.TcpTeacherCommission.ToString("n2");
                model.AdminData.AgentUserName =userAdminData.Agent!=null? userAdminData.Agent.Username:string.Empty;
                model.AdminData.ACPAgentCommission = userAdminData.AcpTeacherCommission.ToString("n2");
                model.AdminData.STRCommissionRatio = userAdminData.StrCommissionRatio;
                model.AdminData.UserPublishingStatus = userAdminData.GetPointerObjectId("userPublishingStatus");
                model.AdminData.UserStatus = userAdminData.GetPointerObjectId("userStatus");
                model.AdminData.LockCountry = userAdminData.LockCountry;
                model.AdminData.LockCurrency = userAdminData.LockCurrency;
                model.AdminData.AdminRemarks = userAdminData.AdminRemarks;
                if (userAdminData.Group != null)
                {
                    var savedSelectedGroup = userAdminData.Group.ObjectId;
                    var selectedSubGroup = subGroups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                    var selectedGroup = groups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                    if (selectedSubGroup != null)
                    {
                        selectedGroup = groups.Single(o => o.ObjectId == selectedSubGroup.Parent.ObjectId);
                    }

                    model.AdminData.Group = selectedGroup != null ? selectedGroup.ObjectId : string.Empty;
                    model.AdminData.SubGroup = selectedSubGroup != null ? selectedSubGroup.ObjectId : string.Empty;
                }
            }

            model.Messages.CountryLocked = Strings.GetLocalizedString(Strings.CountryLocked);
            model.Messages.SugOsekLocked = Strings.GetLocalizedString(Strings.SugOsekLocked);
            model.Messages.CurrencyLocked = Strings.GetLocalizedString(Strings.CurrencyLocked);
            model.Messages.SugNirutLocked = Strings.GetLocalizedString(Strings.SugNirutLocked);
            model.Messages.AgentNotFound = Strings.GetLocalizedString(Strings.AgentNotFound);
            if (user.GetStatus() == UserStatusStrings.AppUser)
            {
                model.AppUserMessage = string.Format(MyMentorResources.appUserMoreDetails, user.GetFullName(Language.CurrentLanguageCode));
            }
            return View(model);
        }
        public ActionResult Update(string regAsTeacher = null)
        {
            var repository = RepositoryFactory.GetInstance(Session);
            try
            {
                ParseUser user = Session.GetLoggedInUser();
                ViewBag.IsAdmin = (user != null && !string.IsNullOrEmpty(Session.GetImpersonatingUserName())) || Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;

                if (user == null) return RedirectToAction("Login");

                var worldContentTypeRetriever = new WorldContentTypeRetriver(HttpContext, repository);
                var model = new UserDetailsViewModel();
                model.IsTeacher = user.GetBool("registerAsTeacher");

                if (!model.IsTeacher && regAsTeacher == null)
                {
                    return RedirectToAction("UpdateStudent");
                }

                user["registerAsTeacher"] = true;
                var residences = repository.FindAllResidences();
                var sugTavs = repository.FindSugTav();
                var sugTagmuls = repository.FindSugTagmul();
                var sugNirut = repository.FindSugNirut();
                var sugMehira = repository.FindSugMehira();
                var sugLanguages = repository.FindLanguages();
                var sugLessonPublishingStatus = repository.FindUserPublishingStatus();

                var userResidence = residences.FirstOrDefault(obj => obj.Name.Equals(user.GetString("residenceCountry")));
                var deviceTypes = repository.FindDeviceTypes();
                var contentTypes = worldContentTypeRetriever.GetContentTypes(user, Session.GetLoggedInUserRoleName());

                var currencies = repository.FindCurrencies();
                var uiLanguages = repository.FindInterfaceLanguages();
                var userStatuses = repository.FindUserStatus();
                IEnumerable<UserGroup> groups = (repository.FindGroups()).ToArray();
                IEnumerable<UserGroup> subGroups = (repository.FindSubGroups()).ToArray();
                var sugOseks = repository.FindAllSugOsek();

                model.SugTav = sugTavs;
                model.SaleStatus = sugMehira;
                model.SugTagmuls = sugTagmuls.ConvertToSugTagmul(userResidence != null && userResidence.Israel);
                model.SugNiruts = sugNirut;
                model.SugMehiras = sugMehira;
                model.SugLanguages = sugLanguages;
                model.SugLessonPublishingStatus = sugLessonPublishingStatus;

                model.Groups = groups;
                model.SubGroups = subGroups;
                model.DeviceTypes = deviceTypes;
                model.UserPrefferences.ContentTypes = contentTypes;
                model.UserPrefferences.Currencies = currencies;
                model.UserPrefferences.Languages = uiLanguages;
                model.UserStatusValues = userStatuses;
                model.SugOseks = sugOseks;

                model.SelectedSugTav = user.GetPointerObjectId("sugTav");
                model.Residence = user.GetPointerObjectId("residence");
                model.SelectedSugTagmul = user.GetPointerObjectId("sugTagmul");
                model.SelectedSugNirut = user.GetPointerObjectId("sugNirut");
                model.SelectedSugMehiras = user.GetPointerObjectId("sugMehira");
                model.TeachingLanguage1 = user.GetPointerObjectId("teachingLanguage1");
                model.TeachingLanguage2 = user.GetPointerObjectId("teachingLanguage2");
                model.TeachingLanguage3 = user.GetPointerObjectId("teachingLanguage3");
                model.UserPrefferences.SelectedContentType = user.GetPointerObjectId("contentType");
                model.UserPrefferences.SelectedCurrency = user.GetPointerObjectId("currency");
                model.UserPrefferences.SelectedLanguage = user.GetPointerObjectId("interfaceLanguage");
                model.SelectedSugOsek = user.GetPointerObjectId("sugOsek");
                //   model.SelectedUserStatus = currentUserStatus.ObjectId;

                model.FirstName = user.GetString("firstName_he_il").Trim();
                model.LastName = user.GetString("lastName_he_il").Trim();
                model.GovId = user.GetString("govId");
                model.FirstNameEnglish = user.GetString("firstName_en_us").Trim();
                model.LastNameEnglish = user.GetString("lastName_en_us").Trim();
                model.Email = user.GetString("email");
                model.Phone = user.GetString("phoneNumber");
                model.MailRecipientAddress = user.GetString("mailRecipientAddress");
                model.OtherTeachingLocation = user.GetString("otherTeachingLocation");
                model.TeachesFromYear = user.GetString("teachesFromYear");
                model.TeacherHomePage = user.GetString("teacherHomePage");
                model.CityOfResidence = user.GetString("cityOfResidence_he_il");
                model.CityOfResidence_en_us = user.GetString("cityOfResidence_en_us");
                model.SelectedSaleStatus = user.GetString("saleStatus");
                model.TeacherDescription = user.GetString("teacherDescription");
                model.TeacherDescriptionEnglish = user.GetString("teacherDescription_en_us");

                model.SelectedDeviceType = user.GetPointerObjectId("deviceType");
                model.SelectedDeviceType = model.DeviceTypes.FirstOrDefault(deviceType => deviceType.Key.Split(new char[] { '|' })[0] == model.SelectedDeviceType).Key;

                model.PaymentDetails.AccountNumber = user.GetString("bankAccountNumber");
                model.PaymentDetails.IRSNumber = user.GetString("irsFileNumber");
                model.PaymentDetails.VATNumber = user.GetString("vatFileNumber");
                model.PaymentDetails.BankName = user.GetString("bankName");
                model.PaymentDetails.BankBranch = user.GetString("bankBranch");
                model.PaymentDetails.BeneficiaryFulllName = user.GetString("beneficiaryFulllName");
                model.PaymentDetails.PayPalEmail = user.GetString("paypalEmail");

                model.LessonCost = user.GetNullableInt("lessonCost");
                model.ExtraFeeForStudentHouse = user.GetNullableInt("extraFeeForStudentHouse");

                model.Ashkenaz = user.GetBool("isAshkenazVersion");
                model.Morocco = user.GetBool("isMorocoVersion");
                model.Sefaradi = user.GetBool("isSepharadiVersion");
                model.Yemen = user.GetBool("isYemenVersion");
                model.OtherTeachingNosah = user.GetBool("isOtherTeachingNosah");

                model.TeachesAtHome = user.GetBool("teachesAtHome");
                model.TeachesAtStudentHouse = user.GetBool("teachesAtStudentHome");
                model.ShowContanctDetails = user.GetBool("showContactDetails");

                var userAdminData = user.GetPointerObject<UserAdminData>("adminData");
                var agentUser = userAdminData.GetPointerObject<ParseUser>("agent");
                if (userAdminData != null)
                {
                    model.AdminData.TCPTeacherCommission = userAdminData.TcpTeacherCommission.ToString("n2");
                    model.AdminData.AgentUserName = agentUser != null ? agentUser.Username : string.Empty;
                    model.AdminData.ACPAgentCommission = userAdminData.AcpTeacherCommission.ToString("n2");
                    model.AdminData.STRCommissionRatio = userAdminData.StrCommissionRatio;
                    model.AdminData.UserPublishingStatus = userAdminData.GetPointerObjectId("userPublishingStatus");
                    model.AdminData.UserStatus = userAdminData.GetPointerObjectId("userStatus");

                    model.AdminData.LockCountry = userAdminData.LockCountry;
                    model.AdminData.LockCurrency = userAdminData.LockCurrency;
                    model.AdminData.LockSugNirut = userAdminData.LockSugNirut;
                    model.AdminData.LockSugOsek = userAdminData.LockSugOsek;
                    model.AdminData.OriginalTaxPercent = userAdminData.OriginalTaxPercent;
                    model.AdminData.AdminRemarks = userAdminData.AdminRemarks;

                    if (userAdminData.Group != null)
                    {
                        var savedSelectedGroup = userAdminData.Group.ObjectId;
                        var selectedSubGroup = subGroups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                        var selectedGroup = groups.SingleOrDefault(o => o.ObjectId == savedSelectedGroup);
                        if (selectedSubGroup != null)
                        {
                            selectedGroup = groups.Single(o => o.ObjectId == selectedSubGroup.Parent.ObjectId);
                        }

                        model.AdminData.Group = selectedGroup != null ? selectedGroup.ObjectId : string.Empty;
                        model.AdminData.SubGroup = selectedSubGroup != null ? selectedSubGroup.ObjectId : string.Empty;
                    }
                }

                model.PictureUrl = user.Keys.Contains("picture") ? ((ParseFile)user["picture"]).Url.ToString() : MentorSystem.DEFAULT_PROFILE_IMAGE;
                var residenceTitle = residences.FirstOrDefault(residence => residence.Id == model.Residence);
                if (residenceTitle != null)
                    model.ResidenceTitle = !string.IsNullOrEmpty(model.Residence) ? residenceTitle.Name : string.Empty;

                var residenceCountry = GetResidenceCountry(residences, model.Residence);

                model.ResidenceCountry = residenceCountry.Name;
 
                ViewBag.DeviceUnSupportedText = Strings.GetLocalizedString(Strings.UnSupportedDevice);
                model.Messages.CountryLocked = Strings.GetLocalizedString(Strings.CountryLocked);
                model.Messages.SugOsekLocked = Strings.GetLocalizedString(Strings.SugOsekLocked);
                model.Messages.CurrencyLocked = Strings.GetLocalizedString(Strings.CurrencyLocked);
                model.Messages.SugNirutLocked = Strings.GetLocalizedString(Strings.SugNirutLocked);
                model.Messages.AgentNotFound = Strings.GetLocalizedString(Strings.AgentNotFound);
                return View("Update", model);
            }
            finally 
            {
                
                repository.Dispose();
            }
           
        }
        public async Task<ActionResult> AddUpdateBundleData(BundleUpdateViewModel model)
        {
            var repository = RepositoryFactory.GetInstance(Session);
            try
            {
                var contentTypeRetriver = new WorldContentTypeRetriver(HttpContext,repository);
                var worldContentTypeId = contentTypeRetriver.GetWorldContentTypeId();

                var isNewBundle = model.ObjectId == null;
                var clipsIds = model.BundleClips.Select(o => o.Id).ToArray();
                if (!clipsIds.Any())
                {
                    return Json(new ServiceObjectResponse
                    {
                        Status = ServiceObjectResponse.Failure,
                        StatusReason = MyMentorResources.updateBundleNoLessonsSelected
                    });
                }

                ValidateBundlePrice(model);

                var teacher = await repository.FindUserByName(model.TeacherName);
                model.TeacherId = teacher.ObjectId;
                new NameManager(repository, Session).SetPortalBundleName(_worldId, model, teacher.ConvertToParseUserDto());

                if (isNewBundle)
                {
                    model.ObjectId = await AddBundle(model, worldContentTypeId);
                }
                else
                {
                    await UpdateBundle(model);
                }                
                lock (locker)
                {                    
                    Task.Run(() => repository.UpdateClipsInBundle(model.GetBundle(), clipsIds)).Wait();
                    var context = System.Web.HttpContext.Current;
                    new WebCacheProvider(context).ClearCachedItem(CacheKeys.ClipToBundle);                   
                }

                return Json(new ServiceObjectResponse
                {
                    Status = ServiceObjectResponse.Success,
                });
            }
            catch (Exception ex)
            {
                if (ex is DuplicateNameException ||
                    ex is StatusChangeException ||
                    ex is BundlePriceException)
                {
                    return Json(new ServiceObjectResponse
                    {
                        Status = ServiceObjectResponse.Failure,
                        StatusReason = ex.Message
                    });
                }

                mLogger.Log(LogLevel.Error, ex);
                return Json(new ServiceObjectResponse
                {
                    Status = ServiceObjectResponse.Failure,
                    StatusReason = MyMentorResources.errCanotAddBundleGeneral
                });
            }
            finally
            {
                repository.Dispose();
            }
        }