Exemplo n.º 1
0
        public async Task <IActionResult> Create(CreateCouponViewModel model)
        {
            var team = await _dbContext.Teams
                       .Include(t => t.Coupons)
                       .FirstOrDefaultAsync(t => t.Slug == TeamSlug);

            var coupon = new Coupon
            {
                Name            = model.Name,
                Code            = model.Code,
                DiscountAmount  = model.DiscountAmount,
                DiscountPercent = model.DiscountPercent / 100,
                ExpiresAt       = model.ExpiresAt,
                Team            = team
            };

            if (team.Coupons.Any(a => a.Code != null && a.Code.Equals(coupon.Code, StringComparison.OrdinalIgnoreCase)))
            {
                ErrorMessage = $"Coupon Code {coupon.Code} is already in use. Please select a new one.";
                return(RedirectToAction("Index"));
            }

            team.Coupons.Add(coupon);
            await _dbContext.SaveChangesAsync();

            return(RedirectToAction("Index"));
        }
Exemplo n.º 2
0
        private async Task GetCouponDiscountCalculations(
            double price, 
            double supportPrice, 
            CurrencyDto contentItemCurrency, 
            CurrencyDto currentCurrency, 
            ParseUser teacher, 
            CreateCouponViewModel cuponViewModel)
        {
            cuponViewModel.TeacherData.TeacherId = teacher.ObjectId;
            cuponViewModel.TeacherData.TeacherFullName = teacher.GetFullName(Language.CurrentLanguageCode);
            var  priceIncludingSupport = CurrencyConverter.Convert(price + supportPrice, contentItemCurrency, currentCurrency);
            price = CurrencyConverter.Convert(price, contentItemCurrency, currentCurrency);

            await GetTeacherCommission(cuponViewModel);
            var teacherCommissionAmount = price * cuponViewModel.TeacherData.TeacherCommissionRate;
            var teacherCommissionAmountWithSupport = priceIncludingSupport * cuponViewModel.TeacherData.TeacherCommissionRate;

            cuponViewModel.ContentItemDetails.OriginalPrice = price;
            cuponViewModel.ContentItemDetails.PriceIncludignSupport = priceIncludingSupport;
            cuponViewModel.ContentItemDetails.FormattedOriginalPrice = price.ToCurrency(currentCurrency);
            cuponViewModel.ContentItemDetails.FormattedSupportPrice = priceIncludingSupport.ToCurrency(currentCurrency);
            cuponViewModel.ContentItemDetails.Currency = contentItemCurrency;

            cuponViewModel.TeacherData.TeacherDiscountPrice = price - teacherCommissionAmount;
            cuponViewModel.TeacherData.TeacherDiscountPriceWithSupport = priceIncludingSupport - teacherCommissionAmountWithSupport;
            cuponViewModel.TeacherData.FormattedTeacherDiscountPrice = (price - teacherCommissionAmount).ToCurrency(currentCurrency);
            cuponViewModel.TeacherData.FormattedTeacherDiscountPriceWithSupport = (priceIncludingSupport - teacherCommissionAmountWithSupport).ToCurrency(currentCurrency);
        }
Exemplo n.º 3
0
        private static void UpdateCouponAccountStatementsAndEvent(
            CreateCouponViewModel createCouponVm,
            IMyMentorRepository repository,
            IEnumerable<AccountStatement> accountStatementsToUpdate,
            EventDto eventsDto)
        {
            var accountStatementsWithCreditOrDebit = accountStatementsToUpdate.Where(x => x.Credit > 0 || x.Debit > 0).ToArray();
            var couponUpdate = ParseObject.CreateWithoutData<Coupon>(createCouponVm.CouponId);
            couponUpdate.CouponStatus = BL.Consts.CouponStatus.Active;

            // update account statements
            repository.BulkSave(accountStatementsWithCreditOrDebit.Union(new ParseObject[] { couponUpdate }));

            // set users balance
            foreach (var accountStatement in accountStatementsWithCreditOrDebit)
            {
                var user = Task.Run(() => repository.FindUsersById(new[] {accountStatement.User.ObjectId})).Result.SingleOrDefault();
                if (user != null)
                {
                    var userAdminData = user.GetPointerObject<UserAdminData>("adminData");
                    if (userAdminData != null)
                    {
                        userAdminData.Balance = accountStatement.Balance;
                        userAdminData.BalanceNis = CurrencyConverter.ConvertToNis(accountStatement.Balance,accountStatement.Currency.ConvertToCurrencyDto(),repository);
                        Task.Run(() => userAdminData.SaveAsync()).Wait();
                    }
                }
            }

            eventsDto.EventStatus = EventStatus.EventPaymentCompleted;
            Task.Run(() => repository.CreateUpdateEvent(eventsDto)).Wait();
        }
Exemplo n.º 4
0
        private async Task<string> CreateUpdateEvent(CreateCouponViewModel couponVm, string eventStatus, IMyMentorRepository 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 await repository.CreateUpdateEvent(eventDto);
        }
Exemplo n.º 5
0
 private  void SendErrorEmail(CreateCouponViewModel createCouponVm, string description)
 {
     var adminEmail = new SystemConfiguration().AdminEmergencyEmail;
     var mailTemplate = new MailTemplate(Language.CurrentCulture);           
     var username = Session.GetLoggedInUser().Username;
     var errorEmail = mailTemplate.GetCouponErrorEmail(description, createCouponVm.EventId, createCouponVm.PaymentId, username);
     var subject = string.Format(MyMentorResources.errorCreatingCoupon,username,createCouponVm.EventId);
     Mailer.SendMail(adminEmail, errorEmail, subject);
 }
Exemplo n.º 6
0
        private  void CheckThatDiscountPriceIsValid(double discountPrice, CreateCouponViewModel createCouponVM)
        {
            var loggedInUserRoleName = Session.GetLoggedInUserRoleName();
            var isCurrentUserManager = loggedInUserRoleName == RoleNames.ADMINISTRATORS;
            var couponForCurrentTeacher = Session.GetLoggedInUser().ObjectId == createCouponVM.CouponStudentDetails.StudentUserId;
           
            if (loggedInUserRoleName == RoleNames.TEACHERS && discountPrice == 0)
            {
                createCouponVM.CouponErrors.PriceError = string.Empty;
                return;                
            }

            if (!isCurrentUserManager)
            {
                if ((!couponForCurrentTeacher && discountPrice ==0)|| discountPrice < 0)
                {
                    createCouponVM.CouponErrors.PriceError = MyMentorResources.couponPriceIsZero;
                }
                else if ((discountPrice / createCouponVM.GetCountentPrice()) > 0.9)
                {
                    createCouponVM.CouponErrors.PriceError = MyMentorResources.couponDiscountToolittle;
                }
                else
                {
                    createCouponVM.CouponErrors.PriceError = string.Empty;
                }
            }
        }
Exemplo n.º 7
0
        private async Task CreatePaymentTransaction(IMyMentorRepository repository, CreateCouponViewModel createCouponVm)
        {
            var currencyRetriever =  new CurrencyRetriver(HttpContext, Session, repository);
            var globalCommissionsTable =  repository.FindGlobalTeacherCommission();

            var maam                        = globalCommissionsTable.Maam;
            var paysMaam                    = createCouponVm.TeacherData.LivesInIsrael;
            var paymentTransaction          = createCouponVm.TeacherData.AmountForPayment;            

            var gapToPay                    = createCouponVm.TeacherData.GapToPay;
            var offsetFromBalance           = gapToPay > paymentTransaction ? gapToPay - paymentTransaction : 0;
            var maamPaymentCredit           = paysMaam ? (paymentTransaction * maam)/(100 + maam) : 0;
            var maamFromBalance             = paysMaam ? offsetFromBalance * maam / (100 + maam) : 0;
            var maamHitkabel                = maamFromBalance + maamPaymentCredit;
            var amountForSiteAccountCredit  = createCouponVm.TeacherData.GapToPay - maamHitkabel;
            
            var transactionUsers            = GetTransactionUsers(createCouponVm.TeacherData,globalCommissionsTable,repository);
            var teacher                     = transactionUsers.Single(x => x.ObjectId == createCouponVm.TeacherData.TeacherId);
            var siteAccount                 = transactionUsers.Single(x => x.ObjectId == globalCommissionsTable.SiteAccountId);
            var maamAccount                 = transactionUsers.Single(x => x.ObjectId == globalCommissionsTable.MaamAccountId);
            var maamBalanceAccount          = transactionUsers.Single(x=>x.ObjectId == globalCommissionsTable.MaamBalanceAccountId);
            var agentAccount                = transactionUsers.SingleOrDefault(x => x.ObjectId == createCouponVm.TeacherData.AgentId);

            var accountStatementBuilder     = new AccountStatementBuilder(repository, currencyRetriever)
            {
                CouponId = createCouponVm.CouponId,
                EventId = createCouponVm.EventId
            };

            var accountStatements = new List<AccountStatementDto>();
            var teacherAccountCreditStatement = TeacherAccountCreditStatement(createCouponVm, accountStatementBuilder, paymentTransaction, accountStatements, teacher, currencyRetriever);
            SiteAccountCreditStatement(createCouponVm, accountStatementBuilder, amountForSiteAccountCredit, accountStatements, siteAccount, currencyRetriever);

            if (paysMaam)
            {
                 VatCreditStatement(createCouponVm, maamPaymentCredit, accountStatementBuilder, accountStatements,teacherAccountCreditStatement, maam, maamFromBalance, maamAccount, maamBalanceAccount, currencyRetriever);
            }

            if (!string.IsNullOrEmpty(createCouponVm.TeacherData.AgentId))
            {
                AgentCreditStatement(createCouponVm, repository, agentAccount, teacher, siteAccount, globalCommissionsTable, accountStatementBuilder, accountStatements, currencyRetriever);
            }

            for (int i = 0; i < accountStatements.Count(); i++)
            {
                accountStatements[i].Order = i;
            }

            createCouponVm.AccountStatements = accountStatements.ToArray();
            await CreateUpdateEvent(createCouponVm, EventStatus.EventStarted, repository);
        }
Exemplo n.º 8
0
        private Coupon CreateCouponRecord(CreateCouponViewModel createCouponVm, string loggedInUserId, CouponFeesDto couponFees, string couponType, string eventId, string couponStatus)
        {
            createCouponVm.CouponValidUntil = DateTime.Now.AddDays(7).ToString("dd/MM/yyyy");

            var coupon = new Coupon
            {
                CouponStatus = couponStatus,
                IssuedBy = ParseObject.CreateWithoutData<ParseUser>(loggedInUserId),
                IssuedFor = ParseObject.CreateWithoutData<ParseUser>(createCouponVm.CouponStudentDetails.StudentUserId),
                IssueDate = DateTime.Now,
                Clip = !string.IsNullOrEmpty(createCouponVm.ContentItemDetails.ClipId) ? ParseObject.CreateWithoutData<Clip>(createCouponVm.ContentItemDetails.ClipId) : null,
                Bundle = !string.IsNullOrEmpty(createCouponVm.ContentItemDetails.BundleId) ? ParseObject.CreateWithoutData<Bundle>(createCouponVm.ContentItemDetails.BundleId) : null,
                Currency = ParseObject.CreateWithoutData<Currency>(createCouponVm.ContentItemDetails.Currency.ObjectId),
                ClipArray = createCouponVm.ContentItemDetails.BundleClipIds,
                IncludingSupport = createCouponVm.IncludesSupport,
                OriginalPrice = couponFees.OriginalPrice,
                OriginalPriceNIS = couponFees.OriginalPriceNIS,
                SiteCouponFee = couponFees.SiteCouponFee,
                SiteCouponFeeNIS = couponFees.SiteCouponFeeNIS,
                TeacherCouponFee = couponFees.TeacherCouponFee,
                TeacherCouponFeeNIS = couponFees.TeacherCouponFeeNIS,
                CouponType = couponType,
                IssueEvent = eventId != null ? ParseObject.CreateWithoutData<Event>(eventId) : null
            };
            return coupon;
        }
Exemplo n.º 9
0
        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);
        }
Exemplo n.º 10
0
        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);
            }
        }
Exemplo n.º 11
0
        public async Task<ActionResult> PaymentValidationSuccess(string paymentId, string token, string payerId)
        {

            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                var paymentSuccess = true;

                // check if session is still active
                var createCouponVm = Session.GetCouponData();
                if (createCouponVm == null)
                {
                    createCouponVm = new CreateCouponViewModel
                    {
                        CouponErrors = {GeneralError = MyMentorResources.createCouponGeneralError}
                    };
                    return Json(createCouponVm, JsonRequestBehavior.AllowGet);
                }

                if (Session.PaymentSubmitted().HasValue)
                {
                    return Json(createCouponVm, JsonRequestBehavior.AllowGet);
                }

                // pay with paypal
                try
                {
                    // only after payment Id is updated, proceed to payment
                    var ppManager = new ExpressCheckoutManager();
                    var paymnet = ppManager.ExecutePayment(payerId, paymentId);
                    Session.SetPaymentSubmitted();
                    createCouponVm.PaymentData = paymnet.ConvertToJson();
                    await CreateUpdateEvent(createCouponVm, EventStatus.EventStarted, repository);
                }
                catch (Exception ex)
                {
                    paymentSuccess = false;

                    if (ex is PaymentsException)
                    {
                        var ppException = ex as PaymentsException;                        
                        SendErrorEmail(createCouponVm, MyMentorResources.couponErrPaymentFailedDbError);                        
                        mLogger.Log(LogLevel.Error, ppException.Details.message);
                    }
                    else
                    {
                        //SendErrorEmail(createCouponVm, ex.Message);
                        mLogger.Log(LogLevel.Error, ex);
                    }
                    createCouponVm.CouponErrors.GeneralError = MyMentorResources.createCouponGeneralError;
                }

                // write payment transaction to parse  db
                try
                {
                    if (paymentSuccess)
                    {
                        await ExecutePaymentTransaction(repository, createCouponVm);
                    }
                    else
                    {
                        createCouponVm.PaymentId = string.Empty;
                        await CreateUpdateEvent(createCouponVm, EventStatus.PaymentNotReceived, repository);
                        await DeleteCoupon(createCouponVm, repository);
                    }
                }
                catch (Exception e)
                {
                    SendErrorEmail(createCouponVm, MyMentorResources.couponErrPaymentSuccessDbError);                    
                    mLogger.Log(LogLevel.Error, e);
                }

                return Json(createCouponVm, JsonRequestBehavior.AllowGet);
            }
        }
Exemplo n.º 12
0
        public async Task<ActionResult> GetSecondPageDataAfterPaymentCancelation()
        {
            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                var createCouponVm = Session.GetCouponData();

                try
                {
                    await DeleteCoupon(createCouponVm, repository);
                    await CreateUpdateEvent(createCouponVm, EventStatus.EventCanceledByUser, repository);
                }
                catch (Exception e)
                {
                    mLogger.Log(LogLevel.Error, e);
                    if (createCouponVm == null)
                    {
                        createCouponVm = new CreateCouponViewModel();
                    }
                    createCouponVm.CouponErrors.GeneralError = MyMentorResources.createCouponGeneralError;
                    SendErrorEmail(createCouponVm, MyMentorResources.couponErrUserCancelDbErrpr);
                }

                return Json(createCouponVm, JsonRequestBehavior.AllowGet);
            }
        }
Exemplo n.º 13
0
        private static IEnumerable<AccountStatementDto> GetMissingAccountStatements(
            CreateCouponViewModel createCouponVm,
            EventDto eventsDto)
        {
            var accountStatementsInEvent = createCouponVm.AccountStatements;

            AccountStatement[] storedAccountStatements = Task.Run(() => new ParseQuery<AccountStatement>()
                    .WhereEqualTo("event", ParseObject.CreateWithoutData<Event>(eventsDto.ObjectId))
                    .FindAsync()).Result.ToArray();

            var storedAccountStatementsDto = storedAccountStatements.Select(x => x.ConvertToAccountStatementDto());
            IEnumerable<AccountStatementDto> missingAccountStatements = accountStatementsInEvent.Except(storedAccountStatementsDto);
            return missingAccountStatements;
        }
Exemplo n.º 14
0
        private CouponDiscountType GetDiscountType(CreateCouponViewModel createCouponViewModel, double discountPrice)
        {
            var isAdminDiscount = Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS;
            var isCouponForCurrentTeacher = Session.GetLoggedInUser().ObjectId == createCouponViewModel.CouponStudentDetails.StudentUserId;
             
            var teacherDiscountPrice = createCouponViewModel.GetCountentPrice() * (1 - createCouponViewModel.TeacherData.TeacherCommissionRate);

            if (isAdminDiscount)
            {
                return CouponDiscountType.Admin;
            }
            if (isCouponForCurrentTeacher)
            {
                return CouponDiscountType.Regular;
            }
            return teacherDiscountPrice <= discountPrice ? CouponDiscountType.Regular : CouponDiscountType.Special;
        }
Exemplo n.º 15
0
        public async Task<ActionResult> GetFirstPageData(string contentItemType, string contentItemId)
        {
            Session.ClearPaymentSubmitted();
            var cuponViewModel = new CreateCouponViewModel();
            using (var repository = RepositoryFactory.GetInstance(Session))
            {

                var currencyRetriever = new CurrencyRetriver(HttpContext, Session, repository);
                var stringsManager = new StringsManager(repository);

                var currentCurrency = currencyRetriever.GetCurrent();
                string portalNamePart1;
                string portalNamePart2;
                double price;
                double supportPrice;

                CurrencyDto contentItemCurrency;
                ParseUser teacher;

                if (contentItemType == "lesson")
                {
                    var clipDetailsDto = (repository.FindClipDetails(contentItemId));
                    portalNamePart1 = clipDetailsDto.GetLocalizedField("portalNamePart1");
                    portalNamePart2 = clipDetailsDto.GetLocalizedField("portalNamePart2");

                    teacher = clipDetailsDto.Teacher;

                    price = Convert.ToDouble(clipDetailsDto.Price);
                    supportPrice = Convert.ToDouble(clipDetailsDto.SupportPrice);
                    contentItemCurrency = clipDetailsDto.Currency.ConvertToCurrencyDto();
                    cuponViewModel.ContentItemDetails.ClipId = clipDetailsDto.ObjectId;
                }
                else
                {
                    var bundle = await repository.FindBundleById(contentItemId);
                    portalNamePart1 = bundle.GetLocalizedField("bundleName");
                    portalNamePart2 = string.Empty;

                    teacher = bundle.Teacher;

                    price = bundle.Price;
                    supportPrice = bundle.SupportPrice;
                    contentItemCurrency = bundle.Currency.ConvertToCurrencyDto();
                    cuponViewModel.ContentItemDetails.BundleId = bundle.ObjectId;
                    cuponViewModel.ContentItemDetails.BundleClipIds = bundle.ClipsInBundle.Select(o => o.ObjectId).ToArray();
                }

                cuponViewModel.HelpText = stringsManager.GetLocalizedString(Strings.CouponHelp);
                cuponViewModel.ContentItemDetails.NamePart1 = portalNamePart1;
                cuponViewModel.ContentItemDetails.NamePart2 = portalNamePart2;
                cuponViewModel.TeacherData.TeacherEmailAddress = teacher.GetString("email");
                cuponViewModel.TeacherData.Balance = teacher.GetPointerValue<double>("adminData", "balance");
                cuponViewModel.TeacherData.Currency = (teacher.GetPointerObject<Currency>("currency")).ConvertToCurrencyDto();
                cuponViewModel.TeacherData.LivesInIsrael = teacher.LivesInIsrael(repository);
                var agent = teacher.GetPointerObject<UserAdminData>("adminData").GetPointerObject<ParseUser>("agent");
                cuponViewModel.TeacherData.AgentId =agent != null ? agent.ObjectId : string.Empty;

                await GetCouponDiscountCalculations(price, supportPrice, contentItemCurrency, currentCurrency, teacher, cuponViewModel);
                Session.SetCouponData(cuponViewModel);
                return Json(cuponViewModel, JsonRequestBehavior.AllowGet);
            }
        }
Exemplo n.º 16
0
        private async Task<Coupon> CreateCoupon(
            CreateCouponViewModel createCouponVm, 
            double studentPrice, 
            double teacherCommissionRate, 
            string couponType, 
            CouponDiscountType discountType,             
            string couponStatus, 
            string eventId = null)
        {
            try
            {
                
                var includesSupport = createCouponVm.IncludesSupport;
                var itemPrice = createCouponVm.ContentItemDetails.OriginalPrice;

                double teacherCouponFee = 0;
                double siteCouponFee = 0;

                if (discountType == CouponDiscountType.Admin)
                {
                    teacherCouponFee = studentPrice*teacherCommissionRate;
                    siteCouponFee = (1 - teacherCommissionRate)*studentPrice;
                }
                else if (discountType == CouponDiscountType.Regular)
                {
                    teacherCouponFee = itemPrice * teacherCommissionRate - (itemPrice - studentPrice);
                    siteCouponFee = itemPrice*(1 - teacherCommissionRate);
                }
                else if (discountType == CouponDiscountType.Special)
                {
                    teacherCouponFee = 0;
                    siteCouponFee = studentPrice;
                }
               
                var couponFees = new CouponFeesDto
                {
                    OriginalPrice = ConvertToContentItemCurrency(createCouponVm.ContentItemDetails.Currency, itemPrice),
                    OriginalPriceNIS = ConvertToNis(itemPrice),
                    SiteCouponFee = ConvertToContentItemCurrency(createCouponVm.ContentItemDetails.Currency,siteCouponFee),
                    SiteCouponFeeNIS = ConvertToNis(siteCouponFee),
                    TeacherCouponFee =  ConvertToContentItemCurrency(createCouponVm.ContentItemDetails.Currency,teacherCouponFee),
                    TeacherCouponFeeNIS = ConvertToNis(teacherCouponFee)
                };
               return CreateCouponRecord(createCouponVm, Session.GetLoggedInUser().ObjectId, couponFees, couponType, eventId, couponStatus);                
            }
            catch (Exception ex)
            {
                //SendErrorEmail(createCouponVm, "cannot create coupon, general error " + ex.Message);
                createCouponVm.CouponErrors.GeneralError = ex.Message;
                mLogger.Log(LogLevel.Error, ex);
            }
            return null;
        }
Exemplo n.º 17
0
        private void AgentCreditStatement(CreateCouponViewModel createCouponVm, IMyMentorRepository repository, ParseUser agentAccount, ParseUser teacher, ParseUser siteAccount, CommissionsDto globalCommissionsTable, AccountStatementBuilder accountStatementBuilder, List<AccountStatementDto> accountStatements, CurrencyRetriver currencyRetriever)
        {
            if (agentAccount == null)
            {
                //agent user not found ,send email
                //var missingAgent = teacher.GetPointerObject<UserAdminData>("adminData").GetPointerObject<ParseUser>("agent");
                SendErrorEmail(createCouponVm,MyMentorResources.couponErrAgentNotFound);
               // Mailer.SendAgentNotFound(missingAgent.Username,teacher.Username,createCouponVm.EventId);
                return;
            }

            var userAdminData = agentAccount.GetPointerObject<UserAdminData>("adminData");
            var acpAgentCommission = userAdminData.AcpTeacherCommission == Global.NoCommission ? 
                globalCommissionsTable.AgentCommission :
                userAdminData.AcpTeacherCommission;

            var agentSugOsek         = agentAccount.GetPointerObject<SugOsek>("sugOsek");
            var agentGetVat          = agentSugOsek.GetVat ? 1: 0;
            var agentPayVat          = agentSugOsek.PayVat ? 1 :0;
          
            var teacherSugOsek       = teacher.GetPointerObject<SugOsek>("sugOsek");
            var teacherPayVat        = teacherSugOsek.PayVat? 1: 0;            
            var maamFlag             = teacherPayVat == agentGetVat  ? 0 : 1;
            var teachertCurrency     = teacher.GetPointerObject<Currency>("currency").ConvertToCurrencyDto();
            var agentCurrency        = agentAccount.GetPointerObject<Currency>("currency").ConvertToCurrencyDto();
            var emlatHamaraFlag      = agentCurrency.ObjectId != teachertCurrency.ObjectId;
            var conversionCommission = globalCommissionsTable.ConversionCommission;
            var maam                 = globalCommissionsTable.Maam;
            var gapToPay             = createCouponVm.TeacherData.GapToPay;
            var totalCommission      = (gapToPay + (maamFlag * ((-gapToPay/(100 +maam)* maam * teacherPayVat)+(gapToPay*maam/100 *agentGetVat)))) * acpAgentCommission;            
            var agentIncludingVat    = agentSugOsek.GetVat ? maam : 0;
            double emlatHamara;
            
            // זיכוי סוכן
            var agentCreditAccountStatement = accountStatementBuilder.SetAccountStatement(
                agentAccount,
                totalCommission,
                0,
                TransactionType.CouponAgentCommission,
                DateTime.Now,
                currencyRetriever.GetCurrent(),
                includingVAT: agentIncludingVat);
            accountStatements.Add(agentCreditAccountStatement);
            createCouponVm.AgentBalance = agentAccount.GetPointerObject<UserAdminData>("adminData").Balance;

            // חיוב סוכן בעמלת המרה
            if (emlatHamaraFlag)
            {
                emlatHamara = totalCommission*conversionCommission;
                var agentDebitAccountStatement = accountStatementBuilder.SetAccountStatement(
                    agentAccount,
                    0,
                    emlatHamara,
                    TransactionType.CouponAgentExCommission,
                    DateTime.Now,
                    currencyRetriever.GetCurrent(),
                    includingVAT: agentIncludingVat);

                accountStatements.Add(agentDebitAccountStatement);
                createCouponVm.AgentBalance = agentAccount.GetPointerObject<UserAdminData>("adminData").Balance;
            }

            //חיוב האתר בעמלת הסוכן
            maamFlag = 0 == teacherPayVat ? 0 : 1;
            totalCommission = (gapToPay + (maamFlag * ((-gapToPay / (100 + maam) * maam * teacherPayVat) + (gapToPay * maam / 100 * 0)))) * acpAgentCommission;
            var siteAccountDebitStatement = accountStatementBuilder.SetAccountStatement(
                siteAccount,
                0,
                totalCommission,
                TransactionType.CouponAgentCommission,
                DateTime.Now,
                currencyRetriever.GetCurrent());
            accountStatements.Add(siteAccountDebitStatement);
            createCouponVm.SiteAccountBalance = siteAccount.GetPointerObject<UserAdminData>("adminData").Balance;

            if (emlatHamaraFlag)
            {
                //זיכוי האתר בעמלת המרה של הסוכן
                emlatHamara = totalCommission*conversionCommission;
                siteAccountDebitStatement = accountStatementBuilder.SetAccountStatement(
                    siteAccount,
                    emlatHamara,
                    0,
                    TransactionType.CouponAgentExCommission,
                    DateTime.Now,
                    currencyRetriever.GetCurrent());
                accountStatements.Add(siteAccountDebitStatement);
                createCouponVm.SiteAccountBalance = siteAccount.GetPointerObject<UserAdminData>("adminData").Balance; ;
            }
        }
Exemplo n.º 18
0
        private  void SendEmails(CreateCouponViewModel createCouponVm,IMyMentorRepository repository)
        {            
            var couponEmail = GetEmailTemplate(createCouponVm,repository);                        
            var teacherEmail = createCouponVm.TeacherData.TeacherEmailAddress;
            var teacherFullName = createCouponVm.TeacherData.TeacherFullName;
            var currentUserFullName = Session.GetLoggedInUser().GetFullName(Language.CurrentLanguageCode);
            var fullName = teacherFullName == currentUserFullName ? teacherFullName : currentUserFullName;

            var subject = string.Format(MyMentorResources.couponEmailSubject, fullName, createCouponVm.CouponId);
            Mailer.SendMail(createCouponVm.CouponStudentDetails.StudentEmailAddress, couponEmail, subject, teacherEmail);            
        }
Exemplo n.º 19
0
        private static void VatCreditStatement(CreateCouponViewModel createCouponVm, double maamPaymentCredit, AccountStatementBuilder accountStatementBuilder, List<AccountStatementDto> accountStatements, AccountStatementDto teacherAccountCreditStatement, double maam, double maamFromBalance, ParseUser maamAccount, ParseUser maamBalanceAccount, CurrencyRetriver currencyRetriever)
        {
            if (maamPaymentCredit > 0)
            {
                // add record for mamm account
                var maamAccountCreditStatement =  accountStatementBuilder.SetAccountStatement(
                   maamAccount,
                    maamPaymentCredit,
                    0,
                    TransactionType.CouponVatCredit,
                    DateTime.Now,
                    currencyRetriever.GetCurrent());
                
                accountStatements.Add(maamAccountCreditStatement);
                createCouponVm.MaamAccountBalance = maamAccount.GetPointerObject<UserAdminData>("adminData").Balance;
                if (teacherAccountCreditStatement != null)
                {
                    teacherAccountCreditStatement.IncludingVat = maam;
                }
            }

            if (maamFromBalance > 0)
            {
                // add record for mamm balance account מעמ יתרות
                var maamBalanceAccountCreditStatement =  accountStatementBuilder.SetAccountStatement(
                   maamBalanceAccount,
                    maamFromBalance,
                    0,
                    TransactionType.CouponVatCredit,
                    DateTime.Now,
                    currencyRetriever.GetCurrent());

                accountStatements.Add(maamBalanceAccountCreditStatement);
                createCouponVm.MaamBalanceAccountBalance = maamBalanceAccount.GetPointerObject<UserAdminData>("adminData").Balance;
            }
        }
Exemplo n.º 20
0
        private  string GetEmailTemplate(CreateCouponViewModel createCouponVm,IMyMentorRepository repository)
        {
            var currenctUserFullName = Session.GetLoggedInUser().GetFullName(Language.CurrentLanguageCode);
            var teacherFullName = createCouponVm.TeacherData.TeacherFullName;

            var currencyRetriever = new CurrencyRetriver(HttpContext, Session, repository);

            var itemType = repository.FindEntities().Single(x => x.EntityCode == EntityKeys.Coupons.ToString());
            var mailTemplate = new MailTemplate(Language.CurrentCulture);
          
            var emailData = new CouponEmailData();
            emailData.TeacherFullName =currenctUserFullName == teacherFullName ? createCouponVm.TeacherData.TeacherFullName:currenctUserFullName;
            emailData.CouponNumber = createCouponVm.CouponId;
            emailData.Event = createCouponVm.EventId;
            emailData.ItemNamePart1 = createCouponVm.ContentItemDetails.NamePart1;
            emailData.ItemNamePart2 = createCouponVm.ContentItemDetails.NamePart2;
            emailData.ItemType = itemType.GetLocalizedField("EntityName");
            emailData.OriginalPriceWithCurrency = createCouponVm.ContentItemDetails.FormattedOriginalPrice;
            emailData.StudentPriceWithCurrency = createCouponVm.CouponDiscountPrice.ToCurrency(currencyRetriever.GetCurrent());
            emailData.ValidUntil = createCouponVm.CouponValidUntil;
            emailData.PurchaseDate = DateTime.Now.ToString("dd/MM/yyyy");
            if (!string.IsNullOrEmpty(createCouponVm.EventId))
            {
                emailData.Event = string.Format(MyMentorResources.couponLetterEventPlaceholder, createCouponVm.EventId);
            }            
           
            var mailForStudent = mailTemplate.GetCouponEmail(emailData);
            return mailForStudent;
        }
Exemplo n.º 21
0
        private void SiteAccountCreditStatement(CreateCouponViewModel createCouponVm, AccountStatementBuilder accountStatementBuilder, double amountForSiteAccountCredit, List<AccountStatementDto> accountStatements, ParseUser siteAccount, CurrencyRetriver currencyRetriever)
        {
            var siteAccountCreditStatement =  accountStatementBuilder.SetAccountStatement(
                siteAccount,
                amountForSiteAccountCredit,
                0,
                TransactionType.CouponSiteCredit,
                DateTime.Now,
                currencyRetriever.GetCurrent());

            createCouponVm.SiteAccountBalance = siteAccount.GetPointerObject<UserAdminData>("adminData").Balance;
            accountStatements.Add(siteAccountCreditStatement);
        }
Exemplo n.º 22
0
        private async Task GetTeacherCommission(CreateCouponViewModel cuponViewModel)
        {
            using (var repository = RepositoryFactory.GetInstance(Session))
            {
                var teacher = Task.Run(() => repository.FindUser(cuponViewModel.TeacherData.TeacherId)).Result;
                var globalCommissionRecord = repository.FindGlobalTeacherCommission();

                cuponViewModel.TeacherData.TeacherCommissionRate = teacher.TcpTeacherCommission!= 999
                    ? teacher.TcpTeacherCommission
                    : globalCommissionRecord.TeacherCommission;
                ;
                cuponViewModel.TeacherData.MinimumTransaction = globalCommissionRecord.MinimumTransaction;
            }
        }
Exemplo n.º 23
0
        private  AccountStatementDto TeacherAccountCreditStatement(CreateCouponViewModel createCouponVm, AccountStatementBuilder accountStatementBuilder, 
            double paymentTransaction, List<AccountStatementDto> accountStatements, ParseUser teacher, CurrencyRetriver currencyRetriever)
        {
            var currentCurrencyDto = currencyRetriever.GetCurrent();
            // add creding + debit record for teacher            
            var teacherAccountCreditStatement =  accountStatementBuilder.SetAccountStatement(
                teacher,
                paymentTransaction, 
                0,
                TransactionType.CouponBuyerPayment,
                DateTime.Now,
                currentCurrencyDto);

            var teacherAccountDebitStatement =  accountStatementBuilder.SetAccountStatement(
                teacher, 
                0,
                createCouponVm.TeacherData.GapToPay, 
                TransactionType.CouponBuyerDebit,
                DateTime.Now,
                currentCurrencyDto);

            createCouponVm.TeacherData.Balance = teacher.GetPointerObject<UserAdminData>("adminData").Balance;
            accountStatements.AddRange(new[]
            {
                teacherAccountCreditStatement,
                teacherAccountDebitStatement,
            });
            return teacherAccountCreditStatement;
        }
Exemplo n.º 24
0
 private async Task DeleteCoupon(CreateCouponViewModel createCouponVm, ParseRepository repository)
 {
     try
     {
         await repository.DeleteCoupon(createCouponVm.CouponId);
         createCouponVm.DeleteCouponData();
     }
     catch (Exception ex)
     {
         mLogger.Log(LogLevel.Error, ex);                
     }
 }
Exemplo n.º 25
0
        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);
        }
Exemplo n.º 26
0
        public async Task <PaymentGatewayResult <IPaymentCoupon> > CreateCouponAsync(CreateCouponViewModel model)
        {
            try
            {
                var options = new CouponCreateOptions();

                if (model.Duration != "repeating")
                {
                    model.DurationInMonths = null;
                }

                model.Currency       = "usd";
                model.MaxRedemptions = model.MaxRedemptions > 0 ? model.MaxRedemptions : null;
                model.PercentOff     = model.PercentOff > 0 ? model.PercentOff : null;
                model.AmountOff      = model.AmountOff > 0 ? model.AmountOff * 100 : null;

                options = _mapper.Map <CouponCreateOptions>(model);

                var coupon = await _couponService.CreateAsync(options);

                if (coupon.PercentOff != null)
                {
                    if (coupon.Duration == "once")
                    {
                        coupon.Object = coupon.PercentOff + "% off " + coupon.Duration;
                    }
                    else if (coupon.Duration == "forever")
                    {
                        coupon.Object = coupon.PercentOff + "% off " + coupon.Duration;
                    }

                    else if (coupon.Duration == "repeating")
                    {
                        if (coupon.DurationInMonths == 1)
                        {
                            coupon.Object = coupon.PercentOff + "% off every Year for 1 month";
                        }
                        else
                        {
                            coupon.Object = coupon.PercentOff + "% off every Year for " + coupon.DurationInMonths + " months";
                        }
                    }
                }

                if (coupon.AmountOff != null)
                {
                    if (coupon.Duration == "once")
                    {
                        coupon.Object = "$" + coupon.AmountOff + " off once";
                    }

                    else if (coupon.Duration == "forever")
                    {
                        coupon.Object = "$" + coupon.AmountOff + " off " + coupon.Duration;
                    }

                    else if (coupon.Duration == "repeating")
                    {
                        if (coupon.DurationInMonths == 1)
                        {
                            coupon.Object = coupon.Currency.ToUpper() + coupon.AmountOff + " off every Year for 1 month";
                        }
                        else
                        {
                            coupon.Object = "$" + coupon.AmountOff + " off every Year for " + coupon.DurationInMonths + " months";
                        }
                    }
                }
                return(PaymentGatewayResult <IPaymentCoupon> .Success(_mapper.Map <IPaymentCoupon>(coupon)));
            }
            catch (StripeException e)
            {
                return(PaymentGatewayResult <IPaymentCoupon> .Failed(e));
            }
        }
Exemplo n.º 27
0
        //public async Task FixRecords()
        //{
        //    var results =
        //        (await new ParseQuery<AccountStatement>().WhereEqualTo("currency", ParseObject.CreateWithoutData<Currency>("PrOfDBWHGg")).FindAsync()).ToArray();
        //    foreach (var result in results)
        //    {
        //        result["currency"] = ParseObject.CreateWithoutData<Currency>("K67StSNEYs");
        //        await result.SaveAsync();
        //    }            
        //}

        private void HandlePaymentRequiredRecovery(CreateCouponViewModel createCouponVm, EventDto eventsDto,
            IMyMentorRepository repository, CurrencyRetriver currencyRetriever, CurrencyDto currentCurrency)
        {
            if (createCouponVm.PaymentRequired && string.IsNullOrEmpty(createCouponVm.PaymentData))
            {
                var coupon = ParseObject.CreateWithoutData<Coupon>(createCouponVm.CouponId);
                coupon.CouponStatus = BL.Consts.CouponStatus.Pending;
                coupon.SaveAsync();
                UpdatePaymentNotRecieved(eventsDto, repository);
                return;
            }

            var accountStatementBuilder = new AccountStatementBuilder(repository, currencyRetriever)
            {
                CouponId = createCouponVm.CouponId,
                EventId = createCouponVm.EventId
            };

            var missingAccountStatements = GetMissingAccountStatements(createCouponVm, eventsDto);
            var accountStatementsByUser = missingAccountStatements.GroupBy(x=>x.UserId);
            var accountStatementsToUpdate = new List<AccountStatement>();
            foreach (var accountStatementByUser in accountStatementsByUser)
            {
                var user = Task.Run(() =>
                {
                    var userId = accountStatementByUser.Key;
                    return repository.FindUserWithAdminData(userId);
                }).Result;

                foreach (var accountStatement in accountStatementByUser)
                {
                    var transactionCode = repository.FindTransactionTypesById(accountStatement.TransactionTypeId).TransactionCode;
                    var asCurrency = repository.FindAllCurrencies(accountStatement.CurrencyId);
                    var accountStatementDto = Task.Run(() => accountStatementBuilder.SetAccountStatement(user,
                           accountStatement.Credit,
                           accountStatement.Debit,
                           transactionCode,
                           accountStatement.DueDate,
                           asCurrency.Single(),
                           validationToken: accountStatement.ValidationToken)).Result;
                    accountStatementDto.Order = accountStatement.Order;
                    accountStatementsToUpdate.Add(accountStatementDto.ConvertToAccountStatementDomain());
                }
            }            

            UpdateCouponAccountStatementsAndEvent(createCouponVm, repository, accountStatementsToUpdate, eventsDto);
        }