public void PersistNewItem_Entity_Persisted()
        {
            var entity = new StubEntity();
            entity.Date = DateTime.Now;
            entity.Integer = 2;
            entity.Text1 = "text1";
            entity.Text2 = "text2";
            entity.Text3 = "text3";

            var unitOfWork = new MemoryUnitOfWork();
            var target = new ParseRepository<StubEntity>(unitOfWork);

            target.Add(entity);
            unitOfWork.Commit();
        }
        public void FindAll_Filter_EntitiesFiltered()
        {
            var unitOfWork = new MemoryUnitOfWork();
            var target = new ParseRepository<StubEntity>(unitOfWork);

            foreach (var toRemove in target.FindAll())
            {
                target.Remove(toRemove);
                unitOfWork.Commit();
            }

            var entity1 = new StubEntity();
            entity1.Date = DateTime.Now;
            entity1.Text1 = "text1";
            entity1.Text2 = "text2";
            entity1.Text3 = "text3";

            var entity2 = new StubEntity();
            entity2.Date = DateTime.Now;
            entity2.Text1 = "text1";
            entity2.Text2 = "text2";
            entity2.Text3 = "text4";

            target.Add(entity1);
            target.Add(entity2);
            unitOfWork.Commit();

            var text1 = "text1";
            var actual = target.FindAll(0, 1, (b) => b.Text1 == text1 && b.Text2 == "text2" && b.Text3 == "text3");

            Assert.AreEqual(1, actual.Count());
            var first = actual.First();
            Assert.AreEqual("text3", first.Text3);

            actual = target.FindAll(0, 1, (b) => b.Text1 == text1 && b.Text2 == "text2" && b.Text3 == "text4");

            Assert.AreEqual(1, actual.Count());
            first = actual.First();
            Assert.AreEqual("text4", first.Text3);

            first = target.FindFirst((b) => b.Text1 == text1 && b.Text2 == "text2" && b.Text3 == "text3");
            Assert.AreEqual("text3", first.Text3);
        }
        private UserAdminData UpdateUserPurchasesCount(ParseRepository repository, ShoppoingCartItemModel cartItemModel)
        {
            var currentUser = Session.GetLoggedInUser();
               // var itemCount = repository.FindUserPurchases(currentUser.ObjectId).Count();
            var adminData = currentUser.GetPointerObject<UserAdminData>("adminData");
            adminData.PurchaseCount = adminData.PurchaseCount + 1;
            //Task.Run(() => adminData.SaveAsync()).Wait();

            Session.SetLoggedInUser(currentUser);

            cartItemModel.UserPurchaseCount = adminData.PurchaseCount;
            return adminData;
        }
        /// <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 bool EnsurePurchaseFor(string purchaseFor, ParseRepository repository)
 {
     var parseUserDto = Task.Run(() => repository.FindUserByUserName(purchaseFor)).Result;
     return parseUserDto != null;
 }
        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 FileContentResult DownloadDemoClip(string clipId)
 {
     IMyMentorRepository repository = new ParseRepository(new WebCacheProvider(HttpContext.ApplicationInstance.Context));
     var clipUrl =  repository.FindDemoClipURI(clipId);
     var streamer = new FileStreamer(HttpContext);
     
     var stream = streamer.GetTempFileUrl(clipUrl);
     return File(stream, "audio/mpeg3");
 }
        public ActionResult Register()
        {
            WorldIsRetriverFactory.GetWorldId(HttpContext, Session);

            var model = new RegisterViewModel();
            var repository = new ParseRepository(new WebCacheProvider(HttpContext.ApplicationInstance.Context));
            model.DeviceTypes =  repository.FindDeviceTypes();
            model.Countries = repository.FindCountriesNameAndId();

            ViewBag.DeviceUnSupportedText =  Strings.GetLocalizedString(Strings.UnSupportedDevice);
            return View(model);
        }
        public async Task<ActionResult> Register(RegisterViewModel model)
        {
            var repository = new ParseRepository(new WebCacheProvider(HttpContext.ApplicationInstance.Context));
            model.DeviceTypes =  repository.FindDeviceTypes();
            model.Countries = repository.FindCountriesNameAndId();
            if (ModelState.IsValid)
            {
                Exception logException = default(Exception);
                var userManager = new MyMentorUserManager(repository, Session);
                try
                {
                    model.CountryOfResidenceTitle = model.Countries[model.CountryOfResidence];


                    model.ContentTypeId = WorldIsRetriverFactory.GetWorldId(HttpContext, Session);
                    model.CurrencyId = (repository.FindResidenceById(model.CountryOfResidence)).CurrencyId;
                    await userManager.RegisterUser(model);

                    var parseUser = await userManager.Login(model.UserName, model.Password, Session);

                    Mailer.SendRegistrationSuccess(parseUser);
                    model.ShowSuccessMessage = true;
                    ViewBag.TeacherSuccessMessage = Strings.GetLocalizedString(Strings.RegistrationSuccessTeacher);
                    ViewBag.TeacherSuccessMessage = string.Format(ViewBag.TeacherSuccessMessage, model.FirstName);
                    ViewBag.StudentSuccessMessage = Strings.GetLocalizedString(Strings.RegistrationSuccessStudent);
                    ViewBag.StudentSuccessMessage = string.Format(ViewBag.StudentSuccessMessage, model.FirstName);
                }
                catch (ParseException ex)
                {
                    if (ex.Code == ParseException.ErrorCode.UsernameTaken)
                    {
                        ModelState.AddModelError("UserName", MyMentorResources.userExistsInTheSystem);
                    }
                    if (ex.Code == ParseException.ErrorCode.InvalidEmailAddress)
                    {
                        ModelState.AddModelError("UserName", MyMentorResources.illegalEmailAddress);
                    }
                    logException = ex;
                }
                catch (Exception ex)
                {
                    logException = ex;
                    mLogger.Log(LogLevel.Error, ex);

                    ModelState.AddModelError("_FORM", MyMentorResources.registrationGeneralError);
                }
                finally
                {
                    userManager.Dispose();
                }

                if (logException != null)
                {
                    await ParseLogger.Log("register new user", logException.ToString());
                }
            }
            else
            {
                var isCaptchaError = ModelState["CaptchaInputText"].Errors.Count > 0;
                ViewBag.IsCaptchaError = isCaptchaError;
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }
 private async Task DeleteCoupon(CreateCouponViewModel createCouponVm, ParseRepository repository)
 {
     try
     {
         await repository.DeleteCoupon(createCouponVm.CouponId);
         createCouponVm.DeleteCouponData();
     }
     catch (Exception ex)
     {
         mLogger.Log(LogLevel.Error, ex);                
     }
 }
 private void SetPurchases(ParseRepository repository, ParseUser user)
 {
     var userPurchases = repository.FindUserPurchases(user.ObjectId);
     var userAdminData = user.GetPointerObject<UserAdminData>("adminData");
     userAdminData.PurchaseCount = userPurchases.Count(x => x.BundleKey != null || x.ClipKey != null);
     Task.Run(() => userAdminData.SaveAsync()).Wait();
 }
        private async Task<CreateCouponViewModel> GetSubmitFirstPageViewData(string email, ParseRepository repository)
        {
            var createCouponVm = Session.GetCouponData();

            var student = await repository.FindUserMinimalData(email);
            if (student != null)
            {
                createCouponVm.CouponStudentDetails.StudentUserId = student.ObjectId;
                createCouponVm.CouponStudentDetails.StudentEmailAddress = student.Email;
                createCouponVm.CouponStudentDetails.StudentFullName = string.Concat(student.GetLocalizedField("firstName"), " ", student.GetLocalizedField("lastName"));
                createCouponVm.CouponStudentDetails.UserName = student.Username;
                createCouponVm.CouponErrors.UserError = string.Empty;
            }
            else
            {
                createCouponVm.CouponErrors.UserError = MyMentorResources.couponUserNotFoundError;
            }
            return createCouponVm;
        }
        private async Task ExecutePaymentTransaction(ParseRepository repository, CreateCouponViewModel createCouponVm)
        {
            var globalCommissionsTable =  repository.FindGlobalTeacherCommission();
            var transactionUsers = GetTransactionUsers(createCouponVm.TeacherData,globalCommissionsTable,repository);

            var siteAccount = transactionUsers.Single(x => x.ObjectId == globalCommissionsTable.SiteAccountId);
            var siteAccountAdminData = siteAccount.GetPointerObject<UserAdminData>("adminData");
            var maamAccount = transactionUsers.Single(x => x.ObjectId == globalCommissionsTable.MaamAccountId);
            var maamAccountAdminData = maamAccount.GetPointerObject<UserAdminData>("adminData");
            var teacherAccount = transactionUsers.Single(x => x.ObjectId == createCouponVm.TeacherData.TeacherId);
            var teacherAccountAdminData = teacherAccount.GetPointerObject<UserAdminData>("adminData");
            
            var agentAccount = transactionUsers.SingleOrDefault(x => x.ObjectId == createCouponVm.TeacherData.AgentId);
            var agentAccountAdminData = agentAccount != null ? agentAccount.GetPointerObject<UserAdminData>("adminData") : null;
            var maamBalance = transactionUsers.Single(x => x.ObjectId == globalCommissionsTable.MaamBalanceAccountId);
            var maamBalanceAdminData = maamBalance.GetPointerObject<UserAdminData>("adminData");
            
            siteAccountAdminData.Balance = createCouponVm.SiteAccountBalance;
            siteAccountAdminData.BalanceNis = CurrencyConverter.ConvertToNis(siteAccountAdminData.Balance, siteAccount.GetPointerObject<Currency>("currency").ConvertToCurrencyDto(), repository);

            maamAccountAdminData.Balance = createCouponVm.MaamAccountBalance;
            maamAccountAdminData.BalanceNis = CurrencyConverter.ConvertToNis(maamAccountAdminData.Balance, maamAccount.GetPointerObject<Currency>("currency").ConvertToCurrencyDto(), repository); ;

            teacherAccountAdminData.Balance = createCouponVm.TeacherData.Balance;
            teacherAccountAdminData.BalanceNis = CurrencyConverter.ConvertToNis(teacherAccountAdminData.Balance, teacherAccount.GetPointerObject<Currency>("currency").ConvertToCurrencyDto(), repository);

            maamBalanceAdminData.Balance = createCouponVm.MaamBalanceAccountBalance;
            maamBalanceAdminData.BalanceNis = CurrencyConverter.ConvertToNis(maamBalanceAdminData.Balance, maamBalance.GetPointerObject<Currency>("currency").ConvertToCurrencyDto(), repository);
           
            if (agentAccountAdminData != null)
            {
                agentAccountAdminData.Balance = createCouponVm.AgentBalance;
                agentAccountAdminData.BalanceNis = CurrencyConverter.ConvertToNis(agentAccountAdminData.Balance, agentAccount.GetPointerObject<Currency>("currency").ConvertToCurrencyDto(), repository); ;
            }        

            var couponUpdate = ParseObject.CreateWithoutData<Coupon>(createCouponVm.CouponId);
            couponUpdate.CouponStatus = BL.Consts.CouponStatus.Active;

            var validAccountStatements = createCouponVm.AccountStatements.Where(x => x.Credit > 0 || x.Debit > 0)
                       .ToArray()
                       .ConvertToAccountStatementDomain();

            var batchUpdates = new ParseObject[]
            {               
                couponUpdate,
                siteAccountAdminData,
                maamAccountAdminData,
                teacherAccountAdminData,
                agentAccountAdminData,
                maamBalanceAdminData
            };
            var finalEventupdate = CreateUpdateEventRecord(createCouponVm, EventStatus.EventPaymentCompleted, repository);
            var parseObjectsToUpdate = new List<ParseObject>();
            parseObjectsToUpdate.AddRange(validAccountStatements);
            parseObjectsToUpdate.AddRange(batchUpdates);
            parseObjectsToUpdate.Add(finalEventupdate);

            await ParseObject.SaveAllAsync(parseObjectsToUpdate);
            
            createCouponVm.EventId = finalEventupdate.ObjectId;
            SendEmails(createCouponVm,repository);
        }
        private async Task StartPaymentProcess(double amountForPayment, string currentUrl, CreateCouponViewModel createCuponVm, ParseRepository repository)
        {
            var currencyRetriever = new CurrencyRetriver(HttpContext, Session, repository);
            var paymentOk = true;
            try
            {
                var itemNameLabel = string.IsNullOrEmpty(createCuponVm.ContentItemDetails.BundleId)
                    ? MyMentorResources.paypalCuponFor
                    : MyMentorResources.paypalCuponForBundle;
                var itemName = string.Concat(itemNameLabel, createCuponVm.ContentItemDetails.NamePart1, " ", createCuponVm.ContentItemDetails.NamePart2);
                var ppManager = new ExpressCheckoutManager(currentUrl);
               
                var paypalCurrencyCode = createCuponVm.TeacherData.Currency.PaypalCode;
                amountForPayment = CurrencyConverter.Convert(amountForPayment,currencyRetriever.GetCurrent(),createCuponVm.TeacherData.Currency);
                var validationResponse = ppManager.CouponSpecialDiscountPaymentValidation(itemName, amountForPayment, paypalCurrencyCode);
                
                createCuponVm.PaymentApprovalUrl = validationResponse.ValidationUrl;
                createCuponVm.PaymentId = validationResponse.PaymentId;

                //update paymentid in the event record
                createCuponVm.EventId =
                    await
                        CreateUpdateEvent(createCuponVm, EventStatus.EventStarted, repository);
            }
            catch (Exception ex)
            {
                paymentOk = false;
                mLogger.Log(LogLevel.Error, ex);
            }

            if (!paymentOk)
            {
                await DeleteCoupon(createCuponVm, repository);
                await CreateUpdateEvent(createCuponVm, EventStatus.EventErrorResolved, repository);
            }
        }
        private Event CreateUpdateEventRecord(CreateCouponViewModel couponVm, string eventStatus, ParseRepository repository)
        {
            var json = new JavaScriptSerializer();
            CurrencyDto currentCurrency = null;
            var eventDto = new EventDto
            {
                ObjectId = couponVm.EventId,
                EventStatus = eventStatus,
                EventType = EventTypes.CouponPurchase,
                UserId = couponVm.TeacherData.TeacherId,
                CouponId = couponVm.CouponId,
                PaymentData = couponVm.PaymentData,
                EventData = json.Serialize(couponVm),
                PaymentAmount = couponVm.TeacherData.AmountForPayment,
                PaymentAmountNIS = ConvertToNis(couponVm.TeacherData.AmountForPayment, out currentCurrency),
            };

            eventDto.PaymentCurrency = currentCurrency;
            return eventDto.ConvertToDomain();
        }
        private async Task CreateAdminOrSelfCoupons(double discountPrice, CreateCouponViewModel createCouponVm,
            CouponDiscountType discountType, ParseRepository repository)
        {
            var couponType = discountPrice == 0 ? CouponTypes.SelfCoupon : CouponTypes.ManagerDiscount;
            var coupon = await CreateCoupon(
                createCouponVm,
                discountPrice,
                createCouponVm.TeacherData.TeacherCommissionRate,
                couponType,
                discountType,
                BL.Consts.CouponStatus.Active);
            await coupon.SaveAsync();
            createCouponVm.CouponId = coupon.ObjectId;

            if (string.IsNullOrEmpty(createCouponVm.CouponId))
            {
                createCouponVm.CouponErrors.GeneralError = MyMentorResources.generalError;
            }
            SendEmails(createCouponVm,repository);
        }