コード例 #1
0
        public async Task <IActionResult> SelectPlan(PlanSelectModel model, string returnUrl)
        {
            model.PlanTypeOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.PlanType));
            model.PlanPeriodOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.PlanPeriod));

            if (HttpMethods.IsGet(Request.Method))
            {
                ModelState.Clear();
            }
            else if (HttpMethods.IsPost(Request.Method))
            {
                if (ModelState.IsValid)
                {
                    var member = await HttpContext.GetMemberAsync();

                    returnUrl = XQueryHelpers.RemoveQueryString(returnUrl, "modalUrl") ?? Url.Content("~/");
                    returnUrl = Url.IsLocalUrl(returnUrl) ? returnUrl : throw new InvalidOperationException("The supplied URL is not local.");

                    ViewData["Redirect"] = QueryHelpers.AddQueryString(returnUrl, "modalUrl",
                                                                       Url.Action(nameof(CashIn), new
                    {
                        reference  = member.UserCode,
                        type       = TransactionType.Subscription,
                        planType   = model.PlanType,
                        planPeriod = model.PlanPeriod,
                        returnUrl  = Url.Action("Index", "Home", new { area = "Portal" })
                    }));
                }
            }

            return(PartialView(model));
        }
コード例 #2
0
        public Task PrepareModelAsync(TransactionListModel model, IPageable <Transaction> transactions)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (transactions == null)
            {
                throw new ArgumentNullException(nameof(transactions));
            }

            foreach (var transaction in transactions)
            {
                var transactionModel = new TransactionModel
                {
                    Transaction = transaction
                };
                model.Items.Add(transactionModel);
            }

            model.ModeOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Mode, defaultText: "All"));
            model.StatusOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Status, defaultText: "All"));
            model.ProcessorOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Processor, defaultText: "All"));
            model.TypeOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Type, defaultText: "All"));

            model.Page       = transactions.Page;
            model.PageSize   = transactions.PageSize;
            model.PageFrom   = transactions.PageFrom;
            model.PageTo     = transactions.PageTo;
            model.TotalPages = transactions.TotalPages;
            model.TotalItems = transactions.TotalItems;

            return(Task.CompletedTask);
        }
コード例 #3
0
        public async Task PrepareModelAsync(OrderListModel model, IPageable <Order> orders)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (orders == null)
            {
                throw new ArgumentNullException(nameof(orders));
            }

            foreach (var order in orders)
            {
                var orderModel = new OrderModel();
                await PrepareModelAsync(orderModel, order);

                model.Items.Add(orderModel);
            }

            model.StatusOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Status, defaultText: "All"));

            model.Page       = orders.Page;
            model.PageSize   = orders.PageSize;
            model.PageFrom   = orders.PageFrom;
            model.PageTo     = orders.PageTo;
            model.TotalPages = orders.TotalPages;
            model.TotalItems = orders.TotalItems;
        }
コード例 #4
0
        public async Task PrepareModelAsync(ProductEditModel model, Product product, User seller)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }

            if (seller == null)
            {
                throw new ArgumentNullException(nameof(seller));
            }

            if (product != null)
            {
                model        = _mapper.Map(product, model);
                model.Images = product.Images.ToList();
                model.TagNames.AddRange(product.Tags.Select(x => x.Name));
            }
            else
            {
                model.Published = true;
                model.Stock     = ProductStock.InStock;
            }

            model.StockOptions.AddRange(SelectListHelper.GetEnumSelectList <ProductStock>(selectedEnum: model.Stock));

            var categoryNames = (await _categoryService.ListAsync(new CategoryFilter {
                SellerId = seller.Id
            })).Select(x => x.Name).Distinct();
            var tagNames      = (await _tagService.ListAsync(new TagFilter {
                SellerId = seller.Id
            })).Select(x => x.Name).Distinct();

            tagNames = categoryNames.Concat(tagNames).Distinct(StringComparer.InvariantCultureIgnoreCase);

            model.TagOptions.AddRange(SelectListHelper.GetSelectList(tagNames, x => new SelectListItem <string>(text: x, value: x)));
        }
コード例 #5
0
        public Task PrepareModelAsync(BannerListModel model, IPageable <Banner> banners)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (banners == null)
            {
                throw new ArgumentNullException(nameof(banners));
            }

            foreach (var banner in banners)
            {
                var bannerModel = new BannerModel
                {
                    Banner = banner
                };
                model.Items.Add(bannerModel);
            }

            var imageSize     = model.Filter.Size.GetValueOrDefault();
            var imageSizeInfo = AttributeHelper.GetMemberAttribute <ImageSizeAttribute>(typeof(BannerSize).GetMember(imageSize.ToString())[0]);

            model.ImageWidth  += imageSizeInfo.Width;
            model.ImageHeight += imageSizeInfo.Height;

            model.SizeOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Size, defaultText: "All"));

            model.Page       = banners.Page;
            model.PageSize   = banners.PageSize;
            model.PageFrom   = banners.PageFrom;
            model.PageTo     = banners.PageTo;
            model.TotalPages = banners.TotalPages;
            model.TotalItems = banners.TotalItems;

            return(Task.CompletedTask);
        }
コード例 #6
0
        public Task PrepareModelAsync(StoreEditModel model, User user)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }

            model = _mapper.Map(user, model);

            model.StoreDeliveryRequiredOptions.AddRange(SelectListHelper.GetBoolSelectList("Required", "Not Required", selectedBool: model.StoreDeliveryRequired));
            model.StoreStatusOptions.AddRange(SelectListHelper.GetEnumSelectList <StoreStatus>(selectedEnum: model.StoreStatus));

            model.StoreThemeModeOptions.AddRange(SelectListHelper.GetEnumSelectList <ThemeMode>(selectedEnum: model.StoreThemeMode));
            model.StoreThemeStyleOptions.AddRange(SelectListHelper.GetEnumSelectList <ThemeStyle>(selectedEnum: model.StoreThemeStyle));

            model.StoreCategorySelections.AddRange(user.StoreCategory.ExpandEnum());
            model.StoreCategoryOptions.AddRange(SelectListHelper.GetEnumSelectList <StoreCategory>(selectedEnum: user.StoreCategory));

            return(Task.CompletedTask);
        }
コード例 #7
0
        public async Task PrepareModelAsync(UserListModel model, IPageable <User> users, Func <UserModel, User, Task> prepareChildModel = null)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (users == null)
            {
                throw new ArgumentNullException(nameof(users));
            }

            foreach (var user in users)
            {
                var userModel = new UserModel
                {
                    User = user
                };

                if (prepareChildModel != null)
                {
                    await prepareChildModel(userModel, user);
                }

                model.Items.Add(userModel);
            }

            model.StoreCategoryOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.StoreCategory, defaultText: "All"));
            model.StoreSetupOptions.AddRange(SelectListHelper.GetBoolSelectList("Completed", "Not Completed", selectedBool: model.Filter.StoreSetup, defaultText: "Any"));

            model.Page       = users.Page;
            model.PageSize   = users.PageSize;
            model.PageFrom   = users.PageFrom;
            model.PageTo     = users.PageTo;
            model.TotalPages = users.TotalPages;
            model.TotalItems = users.TotalItems;
        }
コード例 #8
0
        public async Task <IActionResult> CashIn(CashInModel model, string returnUrl)
        {
            var processors = EnumHelper.GetEnumValues <TransactionProcessor>().ToList();

            if (model.Type == TransactionType.Deposit ||
                model.Type == TransactionType.Withdrawal ||
                model.Type == TransactionType.Subscription)
            {
                processors.Remove(TransactionProcessor.Internal);
                model.ProcessorHide = true;
            }

            model.ProcessorOptions.AddRange(SelectListHelper.GetEnumSelectList(
                                                enums: processors, getText: x =>
            {
                if (x == TransactionProcessor.Internal)
                {
                    return("Pay with Wallet");
                }
                else if (x == TransactionProcessor.External)
                {
                    return($"Pay with Card/MoMo");
                }
                else
                {
                    throw new InvalidOperationException();
                }
            }, selectedEnum: model.Processor));

            var transactionReferenceObject = default(object);
            var transactionDataList        = new Dictionary <string, object>();
            var transactionMemberId        = default(long);
            var transactionAccountBalance  = default(decimal);
            var transactionAccountName     = default(string);
            var transactionAccountEmail    = default(string);
            var transactionAccountNumber   = default(string);

            if (model.Type == TransactionType.Subscription)
            {
                var member = await _userService.FindByCodeAsync(model.Reference);

                var requestQuery = Request.Query.ToDictionary(x => x.Key, x => x.Value.ToString() as object);
                var planType     = requestQuery.ValueOrDefault <PlanType>("planType");
                var planPeriod   = requestQuery.ValueOrDefault <PlanPeriod>("planPeriod");
                var planRate     = _appSettings.PlanRates.ElementAt((int)planType);
                var planAmount   = planRate * (int)planPeriod;

                var paymentFee = model.Processor == TransactionProcessor.External ? Math.Round(((_appSettings.PaymentRate * 100) * planAmount) / 100, 2, MidpointRounding.AwayFromZero) : 0;

                model.Amount = planAmount;
                model.Fee    = paymentFee;

                transactionMemberId       = member.Id;
                transactionAccountName    = member.FullName;
                transactionAccountEmail   = member.Email;
                transactionAccountNumber  = member.PhoneNumber;
                transactionAccountBalance = member.Balance;
                transactionDataList.Add("PlanType", planType);
                transactionDataList.Add("PlanPeriod", planPeriod);
                transactionReferenceObject = member;
            }
            else if (model.Type == TransactionType.Order)
            {
                var order = await _orderService.GetAsync(new OrderFilter { OrderCode = model.Reference ?? string.Empty });

                var orderAmount = order.TotalAmount;

                var paymentFee = model.Processor == TransactionProcessor.External ? Math.Round(((_appSettings.PaymentRate * 100) * orderAmount) / 100, 2, MidpointRounding.AwayFromZero) : 0;

                model.Amount = orderAmount;
                model.Fee    = paymentFee;

                transactionMemberId        = order.Customer.Id;
                transactionAccountName     = order.Customer.FullName;
                transactionAccountEmail    = order.Customer.Email;
                transactionAccountNumber   = order.Customer.PhoneNumber;
                transactionAccountBalance  = order.Customer.Balance;
                transactionReferenceObject = order;
            }
            else if (model.Type == TransactionType.Deposit)
            {
                var member = await _userService.FindByCodeAsync(model.Reference);

                var depositAmount = model.Amount;

                var paymentFee = model.Processor == TransactionProcessor.External ? Math.Round(((_appSettings.PaymentRate * 100) * depositAmount) / 100, 2, MidpointRounding.AwayFromZero) : 0;

                model.Amount = depositAmount;
                model.Fee    = paymentFee;

                transactionMemberId        = member.Id;
                transactionAccountName     = member.FullName;
                transactionAccountEmail    = member.Email;
                transactionAccountNumber   = member.PhoneNumber;
                transactionAccountBalance  = member.Balance;
                transactionReferenceObject = member;
            }

            if (HttpMethods.IsGet(Request.Method))
            {
                ModelState.Clear();
            }
            else
            {
                if (ModelState.IsValid)
                {
                    var transaction = new Transaction
                    {
                        Reference = model.Reference,
                        Type      = model.Type,
                        Processor = model.Processor,
                        Amount    = model.Amount,
                        Fee       = model.Fee,

                        Title       = $"Payment for {model.Type.GetEnumText()}.",
                        Description = $"Payment for {model.Type.GetEnumText()}.",
                        Logo        = Url.ContentLink(Url.Content("~/img/logo.png")),

                        MemberId       = transactionMemberId,
                        AccountName    = transactionAccountName,
                        AccountEmail   = transactionAccountEmail,
                        AccountNumber  = transactionAccountNumber,
                        AccountBalance = transactionAccountBalance,

                        TransactionCode   = await _paymentProcessor.GenerateTransactionCodeAsync(),
                        AuthorizationCode = await _paymentProcessor.GetAuthorizationCodeAsync(),

                        IpAddress = await HttpContext.GetIpAddressAsync(),
                        UserAgent = Request.Headers["User-Agent"],

                        RedirectUrl = Url.ContentLink(returnUrl),
                        CallbackUrl = Url.ContentLink(Url.Action(nameof(CashInCallback), "Account")),
                    };

                    foreach (var transactionData in transactionDataList)
                    {
                        transaction.SetValue(transactionData.Key, transactionData.Value);
                    }

                    if (transaction.Type == TransactionType.Order)
                    {
                        var order = (Order)transactionReferenceObject;

                        if (order.Status == OrderStatus.Cancelled || order.Paid)
                        {
                            ModelState.AddModelError(string.Empty, "The order may have been paid, cancelled or deleted.");
                            return(PartialView(model));
                        }
                    }

                    if (transaction.Processor == TransactionProcessor.Internal && transaction.Type == TransactionType.Order)
                    {
                        var order    = (Order)transactionReferenceObject;
                        var transfer = await _userService.TransferAsync(order.Customer, order.Seller, transaction.Amount);

                        if (transfer.Success)
                        {
                            transaction.Status = TransactionStatus.Succeeded;
                            transaction.Issuer = "USE";
                            transaction.Mode   = PaymentMode.Virtual;

                            await _transactionService.CreateAsync(transaction);

                            // TODO: Repetition, This code has properly been repeated elsewhere. Take note!
                            var orderStatus = order.Seller.StoreDeliveryRequired ?
                                              EnumHelper.GetEnumValues <OrderStatus>().NextOrDefault(order.Status, OrderStatus.Complete) : OrderStatus.Complete;

                            order.Status = orderStatus;
                            order.Paid   = true;
                            order.PaidOn = DateTimeOffset.UtcNow;

                            await _orderService.UpdateAsync(order);

                            await _userService.DepositAsync(order.Seller, transaction.Amount);

                            // Prepare order model
                            var orderModel = new OrderModel();
                            await _appService.PrepareModelAsync(orderModel, order);

                            // Send order placed email to the seller.
                            await _messageService.SendStoreOrderEmailAsync(orderModel);

                            // Send order status email to the customer.
                            await _messageService.SendCustomerOrderEmailAsync(orderModel);

                            TempData.AddAlert(AlertMode.Notify, AlertType.Success, "Payment successful!");
                            ViewData["Redirect"] = returnUrl;
                        }
                        else
                        {
                            ModelState.AddModelError(string.Empty, transfer.Message);
                        }
                    }
                    else
                    {
                        await _paymentProcessor.ProcessAsync(transaction);

                        if (transaction.Status == TransactionStatus.Pending)
                        {
                            await _transactionService.CreateAsync(transaction);

                            ViewData["Redirect"] = transaction.CheckoutUrl;
                        }
                        else
                        {
                            ModelState.AddModelError(string.Empty, "Unable to process payment.");
                        }
                    }
                }
            }

            return(PartialView(model));
        }
コード例 #9
0
        public async Task PrepareModelAsync(ProductListModel model, IPageable <Product> products, User seller, User customer = null)
        {
            if (model == null)
            {
                throw new ArgumentNullException(nameof(model));
            }
            if (products == null)
            {
                throw new ArgumentNullException(nameof(products));
            }

            foreach (var product in products)
            {
                var productModel = new ProductModel();

                await PrepareModelAsync(productModel, product);

                if (customer != null)
                {
                    productModel.IsAddedToCart = await _cartService.GetQuery(new CartFilter { CustomerId = customer.Id, SellerId = seller.Id, ProductId = product.Id, Type = CartType.Cart }).AnyAsync();

                    productModel.IsAddedToWishlist = await _cartService.GetQuery(new CartFilter { CustomerId = customer.Id, SellerId = seller.Id, ProductId = product.Id, Type = CartType.Wishlist }).AnyAsync();
                }

                // NOTE: "StoreController.cs" with the line number 299 for code changes.
                productModel.ReviewEvaluation = await _reviewService.EvaluateAsync(new ReviewFilter
                {
                    Approved  = true,
                    SellerId  = seller.Id,
                    ProductId = product.Id
                });

                model.Items.Add(productModel);
            }

            model.LowestMinPrice  = 0;
            model.HighestMaxPrice = (int)Math.Min(_appSettings.CurrencyMaxValue, int.MaxValue);

            model.SortOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Sort, defaultText: "Any"));
            model.StockOptions.AddRange(SelectListHelper.GetEnumSelectList(selectedEnum: model.Filter.Stock, defaultText: "All"));
            model.PublishedOptions.AddRange(SelectListHelper.GetBoolSelectList("Published", "Unpublished", selectedBool: model.Filter.Published, defaultText: "All"));

            model.RatingOptions.AddRange(SelectListHelper.GetSelectList(Enumerable.Range(1, 4).Reverse(),
                                                                        (x) => new SelectListItem <int>(text: $"{"star".ToQuantity(x)} or more", value: x.ToString(), selected: x == model.Filter.Rating)));

            model.DiscountOptions.AddRange(SelectListHelper.GetSelectList(Enumerable.Range(1, 4).Select(x => x * 20).Reverse(),
                                                                          (x) => new SelectListItem <int>(text: $"{x}% or more", value: x.ToString(), selected: x == model.Filter.Discount)));

            var categories = await _categoryService.ListAsync(new CategoryFilter()
            {
                SellerId = seller.Id, Published = true
            });

            model.CategoryOptions.AddRange(SelectListHelper.GetSelectList(categories, x => new SelectListItem <Category>(text: x.Name, value: x.Slug, x.Slug == model.Filter.Search), defaultText: "All"));

            model.Page       = products.Page;
            model.PageSize   = products.PageSize;
            model.PageFrom   = products.PageFrom;
            model.PageTo     = products.PageTo;
            model.TotalPages = products.TotalPages;
            model.TotalItems = products.TotalItems;
        }