Esempio n. 1
0
 public CheckoutLogic(IMyMentorRepository repository, ICurrencyRetriver currencyRetriver, IStatefull state, IExpressCheckoutManager payPalExpressCheckoutManager)
 {
     _repository = repository;
     _currencyRetriver = currencyRetriver;
     _state = state;
     _payPalExpressCheckoutManager = payPalExpressCheckoutManager;
 }
        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);
        }
        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();
        }
        private ParseObject ValidateContentItem(ShoppoingCartItemModel cartItemModel, IMyMentorRepository repository, StringsManager stringManager, out Purchase existingPurchase, out string previosDemoId)
        {
            ParseObject result = new ParseObject("");
            previosDemoId = "";
            var isAdmin = Session.GetLoggedInUser() == null || Session.GetLoggedInUserRoleName() == Roles.Administrators.ToString();
            var isLesson = cartItemModel.ContentItemType.Contains("lesson");
            var isDemo = cartItemModel.ContentItemType.Contains("demo");

            var contentItemActive = true;
            var canBeOrderedByTeacher = true;
            var currentUserId = Session.GetLoggedInUser().ObjectId;

            var contentItemOwner = false;

            if (isLesson)
            {
                if (LessonInvalid(cartItemModel, repository, stringManager, out existingPurchase, currentUserId, ref contentItemActive, ref canBeOrderedByTeacher, ref contentItemOwner, out result)) return null;
            }
            else
            {
                if (BundleInvalid(cartItemModel, repository, stringManager, currentUserId, ref contentItemActive, ref canBeOrderedByTeacher, ref contentItemOwner,out existingPurchase, out result)) return null;
            }

            if (!isAdmin && !contentItemOwner & !contentItemActive)
            {
                cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.ContentItemNotActive);
                return null;
            }

            if (!isAdmin && !canBeOrderedByTeacher)
            {
                cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.OrderByTeacherNotAllowed);
                return null;
            }
            return result;
        }
 private double GetPriceWithCoupon(Purchase purchase, Coupon[] userCoupons, IMyMentorRepository repository, CurrencyDto userCurrency)
 {
     Coupon couponForItem = null;
     var usedCoupons = userCoupons.Where(x => x.State != CouponStates.UnUsed.ToString());
     if (purchase.ClipKey != null)
     {
         couponForItem = usedCoupons.FirstOrDefault(x => x.Clip != null && x.Clip.ObjectId == purchase.ClipKey.ObjectId);
     }
     else if (purchase.BundleKey != null)
     {
         couponForItem = usedCoupons.FirstOrDefault(x => x.Bundle != null && x.Bundle.ObjectId == purchase.BundleKey.ObjectId);
     }
     if (couponForItem != null)
     {
         var priceInNis = couponForItem.TeacherCouponFeeNIS + couponForItem.SiteCouponFeeNIS;
         return CurrencyConverter.ConvertFromNis(priceInNis, userCurrency, repository);
     }
     return -1;
 }
        private void SetPurchases(CheckoutViewModel model, Purchase[] userPurchases, Coupon[] userCoupons, IMyMentorRepository repository, CurrencyDto currencyDto)
        {
            model.PurchasesForUser = userPurchases.Select(purchase => new CheckoutPurchaseViewModel
            {
                Id = purchase.ObjectId,
                ContentTitlePart1 = GetTitle1(purchase),
                ContentTitlePart2 = GetTitle2(purchase),
                ContentName_he_il = GetName_he_il(purchase),
                ContentName_en_us = GetName_en_us(purchase),
                HasUnUsedCouopn = CheckUnUsedCouponsForPurchase(purchase, userCoupons),
                IncludingSupport = purchase.IncludingSupport,
                RegularPrice = GetPrice(purchase, repository, currencyDto),
                RegularPriceString = GetPrice(purchase, repository, currencyDto).ToCurrency(model.UserCurrency),
                PriceWithCoupon = GetPriceWithCoupon(purchase, userCoupons, repository, currencyDto),
                PriceWithCouponString = GetPriceWithCoupon(purchase, userCoupons, repository, currencyDto).ToCurrency(model.UserCurrency),
                IsLesson = purchase.ClipKey != null,
                ContentId = purchase.ClipKey != null ? purchase.ClipKey.ObjectId : purchase.BundleKey.ObjectId,
                CurrencyId = purchase.UserCurrency.ObjectId,
                Coupon = CheckCouponForPurchase(purchase, userCoupons),
                TeacherInfo = new TeacherInfo
                {
                    Teacher = GetTeacher(purchase),
                    Agent = GetAgent(purchase).ConvertToParseUserDto(),
                    TeacherAdminData = GetTeacherAdminData(purchase),
                    AgentAdminData = GetAgetAdminData(purchase)
                },

            }).ToArray();
        }
        private void SetTotals(CheckoutViewModel model, IMyMentorRepository repository, CurrencyDto currencyDto)
        {
            var loggedInUser = Session.GetLoggedInUser();
            var userAdminData = Task.Run(() => loggedInUser.GetPointerObject<UserAdminData>("adminData")).Result;

            var currentBalance = userAdminData.Balance;
            var minimumTransaction = repository.FindGlobalTeacherCommission().MinimumTransaction;
            var basketPrice = model.PurchasesForUser.Sum(x => x.RegularPrice);
            var basketPriceWithCoupon = model.PurchasesForUser.Sum(x =>
            {
                if (x.HasCoupon)
                    return x.PriceWithCoupon;
                return x.RegularPrice;
            });


            var paymentTransactionWithCoupon = currentBalance < 0
                ? basketPriceWithCoupon - currentBalance
                : basketPriceWithCoupon >= currentBalance ? basketPriceWithCoupon - currentBalance : 0;
            var paymentTransactionNis = CurrencyConverter.ConvertToNis(paymentTransactionWithCoupon,currencyDto,repository);
            paymentTransactionWithCoupon = paymentTransactionNis < minimumTransaction ? 0 : paymentTransactionWithCoupon;

            var reduceFromBalance = basketPriceWithCoupon == 0 || paymentTransactionWithCoupon > basketPriceWithCoupon || currentBalance <= 0 ? 0 : basketPriceWithCoupon - paymentTransactionWithCoupon;

            model.BasketPrice = basketPrice.ToCurrency(currencyDto);
            model.BasketPriceWithCouopn = basketPriceWithCoupon.Equals(basketPrice) ? string.Empty : basketPriceWithCoupon.ToCurrency(currencyDto);
            model.BasketPriceWithCouopnForCalc = basketPriceWithCoupon;
            model.Balance = currentBalance.ToCurrency(currencyDto);
            model.BalanceForCalc = currentBalance;
            model.ReduceFromBalance = reduceFromBalance.ToCurrency(currencyDto);
            model.PaymentTransaction = paymentTransactionWithCoupon.ToCurrency(currencyDto);
            model.PaymentTransactionForCalc = paymentTransactionWithCoupon;
            model.RequiresPayment = paymentTransactionWithCoupon > 0;
        }
 private IEnumerable<Purchase> FindPurchasesForUser(IMyMentorRepository repository)
 {
     var loggedInUser = Session.GetLoggedInUser();
     string issuedFor = loggedInUser.ObjectId;
     return repository.FindUserPurchasesForCheckout(issuedFor).ToArray();
 }
        private async Task<MyAccountViewModel> GetMyAccountVm(MyAccountRequest request, IMyMentorRepository repository)
        {                        
            var model = new MyAccountViewModel {MyAccountRequest = request};
            var isAdmin = Session.GetLoggedInUserRoleName() == RoleNames.ADMINISTRATORS || !string.IsNullOrEmpty(Session.GetImpersonatingUserName());
            var currentUser = Session.GetLoggedInUser();
            var isFirstTimeInPage = Request.QueryString.AllKeys.All(x => x.ToLower() != "uid" && x.ToLower() != "pn");
            var userManager = new MyMentorUserManager(repository, Session, HttpContext);

            if (isAdmin && currentUser.Username != request.Uid && !isFirstTimeInPage)
            {
                if (!string.IsNullOrEmpty(request.Uid))
                {
                    var user = await repository.FindUserByUserName(request.Uid);
                    if (user != null)
                    {
                        model.ErrorMessage = string.Empty;
                        model.UserName = user.UserName;
                        model.UserDispalyName =string.Concat(user.GetLocalizedField("FirstName") ," ", user.GetLocalizedField("LastName"));
                        model.MyAccountRequest.Uid = user.ObjectId;

                        if (Session.GetImpersonatingUserName() != model.UserName)
                            await userManager.ImpersonateUser(user.UserName);
                        else
                            userManager.StopImpersonation();
                    }
                    else
                    {
                        model.ErrorMessage = MyMentorResources.userNameDoesNotExist;
                    }
                }
                else
                {
                    userManager.StopImpersonation();
                }
            }
            else
            {
                model.UserName = currentUser.Username;
                model.UserDispalyName = currentUser.GetFullName(Language.CurrentLanguageCode);
                model.MyAccountRequest.Uid = currentUser.ObjectId;
            }

            return model;
        }
        private  void AddCoupons(string eventId, IEnumerable<CouponTypeDto> couponTypes, IEnumerable<SupportTypeDto> supportTypes, IMyMentorRepository repository, EntityDto[] entities, IEnumerable<CouponStatusDto> couponStatuses, List<AccountStatementViewModel> accountStatementVm, string nisCurrencySymbol)
        {
            IEnumerable<Coupon> coupons = Task.Run(() => repository.FindCouponsInEvent(eventId)).Result;

            foreach (var coupon in coupons)
            {
                var asvm = new AccountStatementViewModel();
                asvm.Id = coupon.ObjectId;
                asvm.Type = entities.FindEntityName(EntityKeys.Coupons);
                asvm.UserName = coupon.IssuedBy.GetFullName(Language.CurrentLanguageCode);
                asvm.DueDate = coupon.CreatedAt.HasValue ? coupon.CreatedAt.Value : DateTime.MinValue;
                asvm.TransActionDate = coupon.CreatedAt.HasValue ? coupon.CreatedAt.Value : DateTime.MinValue;
                asvm.Item = coupon.GetItemName(entities);
                asvm.Status = couponStatuses.First(x => x.CouponStatusCode.ToLower() == coupon.CouponStatus.ToLower()).GetLocalizedField("CouponStatus");
                asvm.Amount = coupon.GetFormattedAmount();
                asvm.AmountNis = coupon.GetFormattedAmountNis();
                asvm.Balance = coupon.GetFormattedBalance();
                asvm.BalanceNis = coupon.GetFormattedBalanceNis();
                asvm.Remarks = coupon.CouponType;
                asvm.AmountClassName = "azure";
                asvm.CreatedAt = coupon.CreatedAt.Value;
                asvm.Coupon = GetCouponView(coupon, couponTypes, supportTypes, couponStatuses, nisCurrencySymbol);
                accountStatementVm.Add(asvm);
            }
        }
        private  void GetLessons(ContentItemsRequest request, LessonsViewModel model, IMyMentorRepository repository)
        {
            model.SelectedResidenceId = request.category6;
            model.SelectedCityId = request.category8;
            var resideces = repository.FindAllResidences();
            var selectedResidence =
                (resideces).SingleOrDefault(res => res.Id == request.category6);

            var selectedCity =
                (resideces).SingleOrDefault(res => res.Id == request.category8);

            model.SelectedResidenceName = selectedResidence != null
                ? selectedResidence.Name
                : string.Empty;

            model.SelectedCityName = selectedCity != null
                ? selectedCity.Name
                : string.Empty;

            model.LessonFilters[1].SelectedValue = request.category2;
            model.LessonFilters[4].SelectedValue =HttpUtility.UrlDecode( request.category5);
            model.SelecteDate = request.category7;
            model.SortBy = request.SortBy;
            model.LessonDisplayMode = LessonDisplayMode.Lessons;

             GetContentItems(model, request);
        }
        private  void GetBundles(ContentItemsRequest request, LessonsViewModel model, IMyMentorRepository repository)
        {
            var currencyRetriver = new CurrencyRetriver(HttpContext, Session, repository);
            var defaultCurrency = repository.FindDefaultCurrency();
            var currentUserId = Session.GetLoggedInUser() != null ? Session.GetLoggedInUser().ObjectId : string.Empty;

            model.LessonDisplayMode = LessonDisplayMode.Bundles;
            var findBundlesResult =  repository.FindBundlesByClipId(request.clipId);
            if (!findBundlesResult.ClipToBundle.Any())
            {
                request.clipId = null;
                GetLessons(request, model, repository);
                return;
            }

            model.BundlesViewModel.ContentItem = findBundlesResult.SelectedClip.ToDto();
            model.BundlesViewModel.Bundles = findBundlesResult.ClipToBundle.Select(o => o.Key).ToDto().ToArray();

            CurrencyDto sourceCurrency = model.BundlesViewModel.ContentItem.Currency ?? defaultCurrency;
            CurrencyDto targetCurrency = currencyRetriver.GetCurrent();

            model.BundlesViewModel.ContentItem.ConvertedPrice = CurrencyConverter.Convert(float.Parse(model.BundlesViewModel.ContentItem.Price), sourceCurrency, targetCurrency).ToCurrency(currencyRetriver.GetCurrent());
            model.BundlesViewModel.ContentItem.ConvertedPriceWithSupport = CurrencyConverter.Convert(float.Parse(model.BundlesViewModel.ContentItem.PriceWithSupport), sourceCurrency, targetCurrency).ToCurrency(currencyRetriver.GetCurrent());

            foreach (var bundleViewModel in model.BundlesViewModel.Bundles)
            {
                sourceCurrency = bundleViewModel.Currency.ConvertToCurrencyDto() ?? defaultCurrency;
                Bundle bundle = findBundlesResult.ClipToBundle.First(ctb => ctb.Key.ObjectId == bundleViewModel.ObjectId).Key;
                bundleViewModel.Clips = findBundlesResult.ClipToBundle[bundle].ToDto();
                bundleViewModel.ConvertedPrice = CurrencyConverter.Convert(float.Parse(bundleViewModel.Price), sourceCurrency, targetCurrency).ToCurrency(currencyRetriver.GetCurrent());
                bundleViewModel.ConvertedSupportPrice = CurrencyConverter.Convert(float.Parse(bundleViewModel.SupportPrice), sourceCurrency, targetCurrency).ToCurrency(currencyRetriver.GetCurrent());
                bundleViewModel.IsActive = bundle.GetPointerObject<ClipStatus>("status").Status == LessonStatus.Active.ToLower();

                float allClipsPrices = 0;
                foreach (var clip in bundleViewModel.Clips)
                {
                    sourceCurrency = clip.Currency ?? defaultCurrency;
                    var convertedClipPrice = CurrencyConverter.Convert(float.Parse(clip.Price), sourceCurrency, targetCurrency);
                    clip.ConvertedPrice = convertedClipPrice.ToCurrency(currencyRetriver.GetCurrent());
                    clip.ConvertedPriceWithSupport = CurrencyConverter.Convert(float.Parse(clip.PriceWithSupport), sourceCurrency, targetCurrency).ToCurrency(currencyRetriver.GetCurrent());
                    allClipsPrices += convertedClipPrice;
                    clip.ExistsInMultipleBundles = findBundlesResult.ClipToBundle.Count(x => x.Value.Select(_ => _.ObjectId).Contains(clip.ObjectId)) > 1;
                    clip.SelectedContentItem = clip.ObjectId == model.BundlesViewModel.ContentItem.ObjectId;
                    SetDisplayIncludeInActiveBundle(clip, currentUserId);
                }
                bundleViewModel.ConvertedPriceWithoutDiscount = allClipsPrices.ToCurrency(currencyRetriver.GetCurrent());
            }
        }
Esempio n. 13
0
 private static void UpdatePaymentNotRecieved(EventDto eventsDto, IMyMentorRepository repository)
 {
     //payment was not recieved
     eventsDto.EventStatus = EventStatus.PaymentNotReceived;
     repository.CreateUpdateEvent(eventsDto);
 }
Esempio n. 14
0
        private AccountStatement AddStatementToUpdate(IMyMentorRepository repository, AccountStatementDto missingAccountStatement, AccountStatementBuilder accountStatementBuilder)
        {
            var asCurrency = repository.FindAllCurrencies(missingAccountStatement.CurrencyId);
            var statement = missingAccountStatement;
            var transactionCode = repository.FindTransactionTypesById(statement.TransactionTypeId).TransactionCode;
            AccountStatementDto accountStatementDto = null;
            var user = Task.Run(() => repository.FindUserWithAdminData(statement.UserId)).Result;

            accountStatementDto = Task.Run(() => accountStatementBuilder.SetAccountStatement(user,
               statement.Credit,
               statement.Debit,
               transactionCode,
               statement.DueDate,
               asCurrency.Single(),
               validationToken: statement.ValidationToken)).Result;

            //UserAdminData adminData;
            //using (var t = Task.Run(() => user.GetPointerObject<UserAdminData>("adminData")))
            //{
            //    adminData = t.Result;
            //}
            //adminData.Balance = accountStatementDto.Balance;
            //adminData.SaveAsync();
            return accountStatementDto.ConvertToAccountStatementDomain();
        }
        private AccountStatementViewModel[] GetStatementsByEventId(string eventId, IMyMentorRepository repository, EntityDto[] entities, 
            IEnumerable<CouponStatusDto> couponStatuses, EventTypeDto[] eventTypes, 
            IEnumerable<TransactionTypeDto> transactionTypes, IEnumerable<CouponTypeDto> couponTypes, 
            IEnumerable<SupportTypeDto> supportTypes, string nisCurrencySymbol)
        {
            var accountStatementVm = new List<AccountStatementViewModel>();
            var clipStatuses = repository.FindClipStatuses();            
            var purchaseStatuses = repository.FindPurchaseStatues().ToArray();

            Event eventrecord = null;
            eventrecord = Task.Run(() => repository.FindEventById(eventId)).Result;

            if (eventrecord == null)
            {
                return new AccountStatementViewModel[0];
            }

            var eventType = eventTypes.FirstOrDefault(x => x.EventTypeKey == eventrecord.EventType);
            var action = eventType != null ? eventType.GetLocalizedField("EventType") : string.Empty;

            // add event
            AddEvent(entities, nisCurrencySymbol, accountStatementVm, eventrecord, action);

            // add coupons
            AddCoupons(eventId, couponTypes, supportTypes, repository, entities, couponStatuses, accountStatementVm, nisCurrencySymbol);

            IEnumerable<Purchase> purchases = repository.FindPurchasesByEventId(eventId);

            // add account statements
            IEnumerable<AccountStatement> accountStatements =  Task.Run(() => repository.FindAccountStatementsByEventId(eventId)).Result;
            var accountStatementViewModels = 
                GetAccountStatements(
                accountStatements, entities, 
                eventTypes, transactionTypes, 
                couponTypes, supportTypes, 
                couponStatuses, nisCurrencySymbol,
                purchases, clipStatuses, purchaseStatuses);
            accountStatementVm.AddRange(accountStatementViewModels);
            
            // add purchases                       
            foreach (var purchase in purchases)
            {
                accountStatementVm.Add(new AccountStatementViewModel
                {
                    Id = purchase.ObjectId,
                    Type = entities.FindEntityName(EntityKeys.Purchases),                    
                    UserName = purchase.UserKey.GetFullName(Language.CurrentLanguageCode),
                    CreatedAt = purchase.UpdatedAt.HasValue ? purchase.UpdatedAt.Value : DateTime.MinValue,
                    DueDate = purchase.UpdatedAt.HasValue ? purchase.UpdatedAt.Value : DateTime.MinValue,
                    Item = purchase.GetItemName(entities),
                    Status = purchaseStatuses.Single(x=>x.StatusCode.ToLower() == purchase.PurchaseStatusCode.ToLower()).GetLocalizedField("purchaseStatus"),
                    Amount = purchase.GetFormattedPrice(),
                    AmountNis = purchase.GetFormattedPriceNis(),
                    AmountClassName = "azure",
                    Remarks = purchase.GetLocalizedField("purchaseRemarks"),
                    Lesson = GetLessonPurchaseView(purchase.ClipKey, purchases, nisCurrencySymbol, clipStatuses, purchaseStatuses, purchase.Event.ObjectId),
                    Bundle = GetBundlePurchaseView(purchase.BundleKey, purchases, nisCurrencySymbol, clipStatuses, purchaseStatuses,purchase.Event.ObjectId),
                    EventData = GetEventData(purchase.Event),
                    Action = action
                });    
            }
            
            return accountStatementVm.ToArray();
        }
        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;
        }
Esempio n. 17
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);
        }
 private void SetBundleClips(Purchase[] userPurchases, CheckoutViewModel model, IMyMentorRepository repository)
 {
     var bundleIds = userPurchases.Where(x => x.BundleKey != null).Select(x => x.BundleKey.ObjectId).ToArray();
     model.LessonsForBundles = repository.FindClipsForBundle(bundleIds);
 }
Esempio n. 19
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; ;
            }
        }
        private void SetCoupons(Coupon[] userCoupons, Purchase[] userPurchases, CurrencyDto currencyDto, IMyMentorRepository repository, CheckoutViewModel model)
        {
            var coupnIdToContentId = userCoupons.ToDictionary(x => x.ObjectId, x => x.Bundle != null ? x.Bundle.ObjectId : x.Clip.ObjectId);
            var unUsedCouponids = coupnIdToContentId
                .Where(x => !userPurchases.Any(p => p.BundleKey != null ? p.BundleKey.ObjectId == x.Value : p.ClipKey.ObjectId == x.Value))
                .Select(x => x.Key);
            var unUsedCoupons = userCoupons.Where(x => unUsedCouponids.Contains(x.ObjectId)).Union(userCoupons.Where(x => x.State == CouponStates.UnUsed.ToString()));
            var couponNameTemplate = MyMentorResources.checkoutCouponTitleTemplate;

            foreach (var coupon in unUsedCoupons)
            {
                var lessonOrBundle = coupon.Bundle != null ? MyMentorResources.checkoutBundle : MyMentorResources.checkoutLesson;
                var itemName = coupon.Bundle != null
                    ? coupon.Bundle.GetLocalizedField("bundleName")
                    : coupon.Clip.GetLocalizedField("name");
                var originalPrice = CurrencyConverter.ConvertFromNis(coupon.OriginalPriceNIS, currencyDto, repository).ToCurrency(currencyDto);
                var yourPrice = CurrencyConverter.ConvertFromNis(coupon.SiteCouponFeeNIS + coupon.TeacherCouponFeeNIS, currencyDto, repository).ToCurrency(currencyDto);
                var expiration = coupon.IssueDate.AddDays(10).ToString("dd/MM/yyyy");
                model.CouponsForUser.Add(coupon.ObjectId, string.Format(couponNameTemplate, lessonOrBundle, itemName, originalPrice, yourPrice, expiration));
            }
        }
Esempio n. 21
0
        private ParseUser[] GetTransactionUsers(TeacherData teacherData, CommissionsDto globalCommissionsTable, IMyMentorRepository repository)
        {
           var users= repository.FindUsersById(new[]
            {
                teacherData.TeacherId, 
                teacherData.AgentId, 
                globalCommissionsTable.MaamAccountId,
                globalCommissionsTable.MaamBalanceAccountId,
                globalCommissionsTable.SiteAccountId,
            });

            return users;
        }
 private double GetPrice(Purchase purchase, IMyMentorRepository repository, CurrencyDto userCurrency)
 {
     var price = purchase.Price + purchase.SupportPrice;
     return CurrencyConverter.Convert(price, purchase.UserCurrency.ConvertToCurrencyDto(), userCurrency);
 }
Esempio n. 23
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);            
        }
        private static bool LessonInvalid(ShoppoingCartItemModel cartItemModel, IMyMentorRepository repository, 
            StringsManager stringManager, out Purchase existingPurchase, string currentUserId, 
            ref bool contentItemActive, ref bool canBeOrderedByTeacher, ref bool contentItemOwner, out ParseObject result)
        {
            Clip lesson = null;
            lesson = Task.Run(() => new ParseQuery<Clip>()
                .Include("status")
                .Include("currency")
                .GetAsync(cartItemModel.ContentItemId)).Result;

            existingPurchase = repository.FindPurchaseByContentIdAndUserId(lesson.ObjectId, currentUserId );
            contentItemActive = lesson.IsActive();
            canBeOrderedByTeacher = lesson.CanBeOrderedByTeacher(currentUserId);
            result = lesson;
            contentItemOwner = lesson.Teacher.ObjectId == currentUserId;

            if (existingPurchase == null)
            {
                return false;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.LessonPurchased ||
                existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.LessonIsActive)
            {
                if (existingPurchase.ClipKind == ClipPurchaseTypes.Lesson)
                {
                    cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.LessonAlreadyPurchased);
                }
                if (existingPurchase.ClipKind == ClipPurchaseTypes.Demo)
                {
                    cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.DemoAlreadyOrdered);
                }
                return true;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.DemoOrdered ||
                existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.DemoIsActive)
            {
                if (existingPurchase.ClipKind == ClipPurchaseTypes.Demo)
                {
                    cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.DemoAlreadyOrdered);
                }
                return true;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.LessonIsInBaskert)
            {
                cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.LessonAlreadyInBasket);
                return true;
            }
            return false;
        }
Esempio n. 25
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;
        }
        private static bool BundleInvalid(ShoppoingCartItemModel cartItemModel, IMyMentorRepository repository, StringsManager stringManager, string currentUserId, ref bool contentItemActive, ref bool canBeOrderedByTeacher, ref bool contentItemOwner, out Purchase existingPurchase, out ParseObject result)
        {
            Bundle bundle = Task.Run(() => repository.FindMinimalBundleById(cartItemModel.ContentItemId)).Result;

            existingPurchase = repository.FindPurchaseByContentIdAndUserId(cartItemModel.ContentItemId, currentUserId);
            contentItemActive = bundle.IsActive();
            canBeOrderedByTeacher = bundle.CanBeOrderedByTeacher(currentUserId);
            result = bundle;
            contentItemOwner = currentUserId == bundle.Teacher.ObjectId;

            if (existingPurchase == null)
            {
                return false;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.PackagePurchased ||
                existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.PackageIsActive)
            {
                if (existingPurchase.ClipKind == ClipPurchaseTypes.Bundle)
                {
                    cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.BundleAlreadyPurchased);
                }
                return true;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.DemoOrdered ||
                existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.DemoIsActive)
            {
                if (existingPurchase.ClipKind == ClipPurchaseTypes.Demo)
                {
                    cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.DemoAlreadyOrdered);
                }
                return true;
            }

            if (existingPurchase.PurchaseStatusCode == PurchaseStatusCodes.PackageIsInBasket)
            {
                cartItemModel.ErrorMessage = stringManager.GetLocalizedString(Strings.BundleAlreadyInBasket);
                return true;
            }

            return false;
        }
Esempio 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);
        }