protected async Task <Address> PrepareAddress(SubmitReturnRequestModel model, IFormCollection form)
        {
            string pickupAddressId = form["pickup_address_id"];
            var    address         = new Address();

            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
            {
                if (!string.IsNullOrEmpty(pickupAddressId))
                {
                    address = _workContext.CurrentCustomer.Addresses.FirstOrDefault(a => a.Id == pickupAddressId);
                }
                else
                {
                    var customAttributes = await _addressViewModelService.ParseCustomAddressAttributes(form);

                    var customAttributeWarnings = await _addressViewModelService.GetAttributeWarnings(customAttributes);

                    foreach (var error in customAttributeWarnings)
                    {
                        ModelState.AddModelError("", error);
                    }
                    await TryUpdateModelAsync(model.NewAddress, "ReturnRequestNewAddress");

                    address = model.NewAddress.ToEntity();
                    model.NewAddressPreselected = true;
                    address.CustomAttributes    = customAttributes;
                    address.CreatedOnUtc        = DateTime.UtcNow;
                }
            }
            return(address);
        }
        /// <summary>
        /// Prepare the submit return request model
        /// </summary>
        /// <param name="model">Submit return request model</param>
        /// <param name="subscription">Subscription</param>
        /// <returns>Submit return request model</returns>
        public virtual SubmitReturnRequestModel PrepareSubmitReturnRequestModel(SubmitReturnRequestModel model, Subscription subscription)
        {
            if (subscription == null)
            {
                throw new ArgumentNullException("subscription");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.SubscriptionId           = subscription.Id;
            model.AllowFiles               = _subscriptionSettings.ReturnRequestsAllowFiles;
            model.CustomSubscriptionNumber = subscription.CustomSubscriptionNumber;

            //return reasons
            model.AvailableReturnReasons = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTREASONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel
                    {
                        Id   = rrr.Id,
                        Name = rrr.GetLocalized(x => x.Name)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTACTIONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel
                    {
                        Id   = rra.Id,
                        Name = rra.GetLocalized(x => x.Name)
                    });
                }
                return(actions);
            });

            //returnable articles
            var subscriptionItems = subscription.SubscriptionItems.Where(oi => !oi.Article.NotReturnable);

            foreach (var subscriptionItem in subscriptionItems)
            {
                var subscriptionItemModel = PrepareSubmitReturnRequestSubscriptionItemModel(subscriptionItem);
                model.Items.Add(subscriptionItemModel);
            }

            return(model);
        }
Example #3
0
        /// <summary>
        /// Prepare the submit return request model
        /// </summary>
        /// <param name="model">Submit return request model</param>
        /// <param name="order">Order</param>
        /// <returns>Submit return request model</returns>
        public virtual SubmitReturnRequestModel PrepareSubmitReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }

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

            model.OrderId           = order.Id;
            model.AllowFiles        = _orderSettings.ReturnRequestsAllowFiles;
            model.CustomOrderNumber = order.CustomOrderNumber;

            //return reasons
            model.AvailableReturnReasons = _cacheManager.Get(string.Format(NopModelCacheDefaults.ReturnRequestReasonsModelKey, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel
                    {
                        Id   = rrr.Id,
                        Name = _localizationService.GetLocalized(rrr, x => x.Name)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = _cacheManager.Get(string.Format(NopModelCacheDefaults.ReturnRequestActionsModelKey, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel
                    {
                        Id   = rra.Id,
                        Name = _localizationService.GetLocalized(rra, x => x.Name)
                    });
                }
                return(actions);
            });

            //returnable products
            var orderItems = order.OrderItems.Where(oi => !oi.Product.NotReturnable);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = PrepareSubmitReturnRequestOrderItemModel(orderItem);
                model.Items.Add(orderItemModel);
            }

            return(model);
        }
Example #4
0
        public virtual SubmitReturnRequestModel PrepareSubmitReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId    = order.Id;
            model.AllowFiles = _orderSettings.ReturnRequestsAllowFiles;

            //return reasons
            model.AvailableReturnReasons = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTREASONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel
                    {
                        Id   = rrr.Id,
                        Name = rrr.GetLocalized(x => x.Name)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTACTIONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel
                    {
                        Id   = rra.Id,
                        Name = rra.GetLocalized(x => x.Name)
                    });
                }
                return(actions);
            });

            //returnable products
            var orderItems = order.OrderItems.Where(oi => !oi.Product.NotReturnable);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = PrepareSubmitReturnRequestOrderItemModel(orderItem);
                model.Items.Add(orderItemModel);
            }

            return(model);
        }
        public ActionResult ReturnRequestSubmit(int orderId, SubmitReturnRequestModel model, FormCollection form)
        {
            var order = _orderService.GetOrderById(orderId);
            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
                return new HttpUnauthorizedResult();

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
                return RedirectToRoute("HomePage");

            int count = 0;
            foreach (var orderItem in order.OrderItems)
            {
                int quantity = 0; //parse quantity
                foreach (string formKey in form.AllKeys)
                    if (formKey.Equals(string.Format("quantity{0}", orderItem.Id), StringComparison.InvariantCultureIgnoreCase))
                    {
                        int.TryParse(form[formKey], out quantity);
                        break;
                    }
                if (quantity > 0)
                {
                    var rr = new ReturnRequest
                    {
                        StoreId = _storeContext.CurrentStore.Id,
                        OrderItemId = orderItem.Id,
                        Quantity = quantity,
                        CustomerId = _workContext.CurrentCustomer.Id,
                        ReasonForReturn = model.ReturnReason,
                        RequestedAction = model.ReturnAction,
                        CustomerComments = model.Comments,
                        StaffNotes = string.Empty,
                        ReturnRequestStatus = ReturnRequestStatus.Pending,
                        CreatedOnUtc = DateTime.UtcNow,
                        UpdatedOnUtc = DateTime.UtcNow
                    };
                    _workContext.CurrentCustomer.ReturnRequests.Add(rr);
                    _customerService.UpdateCustomer(_workContext.CurrentCustomer);
                    //notify store owner here (email)
                    _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, orderItem, _localizationSettings.DefaultAdminLanguageId);

                    count++;
                }
            }

            model = PrepareReturnRequestModel(model, order);
            if (count > 0)
                model.Result = _localizationService.GetResource("ReturnRequests.Submitted");
            else
                model.Result = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted");

            return View(model);
        }
        /// <returns>A task that represents the asynchronous operation</returns>
        public virtual async Task<IActionResult> ReturnRequest(int orderId)
        {
            var order = await _orderService.GetOrderByIdAsync(orderId);
            if (order == null || order.Deleted || (await _workContext.GetCurrentCustomerAsync()).Id != order.CustomerId)
                return Challenge();

            if (!await _orderProcessingService.IsReturnRequestAllowedAsync(order))
                return RedirectToRoute("Homepage");

            var model = new SubmitReturnRequestModel();
            model = await _returnRequestModelFactory.PrepareSubmitReturnRequestModelAsync(model, order);
            return View(model);
        }
        public ActionResult ReturnRequest(int orderId)
        {
            var order = _orderService.GetOrderById(orderId);
            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
                return new HttpUnauthorizedResult();

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
                return RedirectToRoute("HomePage");

            var model = new SubmitReturnRequestModel();
            model = PrepareReturnRequestModel(model, order);
            return View(model);
        }
Example #8
0
        /// <summary>
        /// Prepare the submit return request model
        /// </summary>
        /// <param name="model">Submit return request model</param>
        /// <param name="order">Order</param>
        /// <returns>Submit return request model</returns>
        public virtual SubmitReturnRequestModel PrepareSubmitReturnRequestModel(SubmitReturnRequestModel model,
                                                                                Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }

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

            model.OrderId           = order.Id;
            model.AllowFiles        = _orderSettings.ReturnRequestsAllowFiles;
            model.CustomOrderNumber = order.CustomOrderNumber;

            //return reasons
            model.AvailableReturnReasons = _returnRequestService.GetAllReturnRequestReasons()
                                           .Select(rrr => new SubmitReturnRequestModel.ReturnRequestReasonModel
            {
                Id   = rrr.Id,
                Name = _localizationService.GetLocalized(rrr, x => x.Name)
            }).ToList();

            //return actions
            model.AvailableReturnActions = _returnRequestService.GetAllReturnRequestActions()
                                           .Select(rra => new SubmitReturnRequestModel.ReturnRequestActionModel
            {
                Id   = rra.Id,
                Name = _localizationService.GetLocalized(rra, x => x.Name)
            })
                                           .ToList();

            //returnable products
            var orderItems = _orderService.GetOrderItems(order.Id, isNotReturnable: false);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = PrepareSubmitReturnRequestOrderItemModel(orderItem);
                model.Items.Add(orderItemModel);
            }

            return(model);
        }
Example #9
0
        public virtual IActionResult ReturnRequest(int orderId)
        {
            var order = _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(Challenge());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            var model = new SubmitReturnRequestModel();

            model = _returnRequestModelFactory.PrepareSubmitReturnRequestModel(model, order);
            return(View(model));
        }
        public virtual ActionResult ReturnRequest(int subscriptionId)
        {
            var subscription = _subscriptionService.GetOrderById(subscriptionId);

            if (subscription == null || subscription.Deleted || _workContext.CurrentCustomer.Id != subscription.CustomerId)
            {
                return(new HttpUnauthorizedResult());
            }

            if (!_subscriptionProcessingService.IsReturnRequestAllowed(subscription))
            {
                return(RedirectToRoute("HomePage"));
            }

            var model = new SubmitReturnRequestModel();

            model = _returnRequestModelFactory.PrepareSubmitReturnRequestModel(model, subscription);
            return(View(model));
        }
        public virtual async Task <IActionResult> ReturnRequest(string orderId, string errors = "")
        {
            var order = await _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(Challenge());
            }

            if (!await _orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            var model = new SubmitReturnRequestModel();

            model = await _returnRequestViewModelService.PrepareReturnRequest(model, order);

            model.Error = errors;
            return(View(model));
        }
Example #12
0
        public ActionResult ReturnRequest(int orderId)
        {
            var order = _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(new HttpUnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToAction("Index", "Home"));
            }
            CustomerNavigationModel navModel = new CustomerNavigationModel();

            ViewData["NavModel"] = navModel;
            var model = new SubmitReturnRequestModel();

            model       = PrepareReturnRequestModel(model, order);
            ViewBag.Msg = new MessageModel();
            return(View(model));
        }
Example #13
0
        public async Task <IActionResult> ReturnRequest(int id /* orderId */)
        {
            var order = await _db.Orders
                        .Include(x => x.OrderItems)
                        .ThenInclude(x => x.Product)
                        .FindByIdAsync(id);

            if (order == null || Services.WorkContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(new UnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("Homepage"));
            }

            var model = new SubmitReturnRequestModel();

            model = await PrepareReturnRequestModelAsync(model, order);

            return(View(model));
        }
Example #14
0
        protected SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId = order.Id;

            //return reasons
            if (_orderSettings.ReturnRequestReasons != null)
            {
                foreach (var rrr in _orderSettings.ReturnRequestReasons)
                {
                    model.AvailableReturnReasons.Add(new SelectListItem()
                    {
                        Text  = rrr,
                        Value = rrr
                    });
                }
            }

            //return actions
            if (_orderSettings.ReturnRequestActions != null)
            {
                foreach (var rra in _orderSettings.ReturnRequestActions)
                {
                    model.AvailableReturnActions.Add(new SelectListItem()
                    {
                        Text  = rra,
                        Value = rra
                    });
                }
            }

            //products
            var orderProductVariants = _orderService.GetAllOrderProductVariants(order.Id, null, null, null, null, null, null);

            foreach (var opv in orderProductVariants)
            {
                var opvModel = new SubmitReturnRequestModel.OrderProductVariantModel()
                {
                    Id            = opv.Id,
                    ProductId     = opv.ProductVariant.ProductId,
                    ProductSeName = opv.ProductVariant.Product.GetSeName(),
                    AttributeInfo = opv.AttributeDescription,
                    Quantity      = opv.Quantity
                };

                //product name
                if (!String.IsNullOrEmpty(opv.ProductVariant.GetLocalized(x => x.Name)))
                {
                    opvModel.ProductName = string.Format("{0} ({1})", opv.ProductVariant.Product.GetLocalized(x => x.Name), opv.ProductVariant.GetLocalized(x => x.Name));
                }
                else
                {
                    opvModel.ProductName = opv.ProductVariant.Product.GetLocalized(x => x.Name);
                }
                model.Items.Add(opvModel);

                //unit price
                switch (order.CustomerTaxDisplayType)
                {
                case TaxDisplayType.ExcludingTax:
                {
                    var opvUnitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(opv.UnitPriceExclTax, order.CurrencyRate);
                    opvModel.UnitPrice = _priceFormatter.FormatPrice(opvUnitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                }
                break;

                case TaxDisplayType.IncludingTax:
                {
                    var opvUnitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(opv.UnitPriceInclTax, order.CurrencyRate);
                    opvModel.UnitPrice = _priceFormatter.FormatPrice(opvUnitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                }
                break;
                }
            }

            return(model);
        }
        protected virtual SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId = order.Id;

            //return reasons
            model.AvailableReturnReasons = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTREASONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel()
                    {
                        Id   = rrr.Id,
                        Name = rrr.GetLocalized(x => x.Name)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTACTIONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel()
                    {
                        Id   = rra.Id,
                        Name = rra.GetLocalized(x => x.Name)
                    });
                }
                return(actions);
            });

            //products
            var orderItems = _orderService.GetAllOrderItems(order.Id, null, null, null, null, null, null);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = new SubmitReturnRequestModel.OrderItemModel
                {
                    Id            = orderItem.Id,
                    ProductId     = orderItem.Product.Id,
                    ProductName   = orderItem.Product.GetLocalized(x => x.Name),
                    ProductSeName = orderItem.Product.GetSeName(),
                    AttributeInfo = orderItem.AttributeDescription,
                    Quantity      = orderItem.Quantity
                };
                model.Items.Add(orderItemModel);

                //unit price
                if (order.CustomerTaxDisplayType == TaxDisplayType.IncludingTax)
                {
                    //including tax
                    var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                }
                else
                {
                    //excluding tax
                    var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                }
            }

            return(model);
        }
        public virtual async Task <IActionResult> ReturnRequestSubmit(int orderId, SubmitReturnRequestModel model, IFormCollection form)
        {
            var order = await _orderService.GetOrderByIdAsync(orderId);

            if (order == null || order.Deleted || (await _workContext.GetCurrentCustomerAsync()).Id != order.CustomerId)
            {
                return(Challenge());
            }

            if (!await _orderProcessingService.IsReturnRequestAllowedAsync(order))
            {
                return(RedirectToRoute("Homepage"));
            }

            var count = 0;

            var downloadId = 0;

            if (_orderSettings.ReturnRequestsAllowFiles)
            {
                var download = await _downloadService.GetDownloadByGuidAsync(model.UploadedFileGuid);

                if (download != null)
                {
                    downloadId = download.Id;
                }
            }

            //returnable products
            var orderItems = await _orderService.GetOrderItemsAsync(order.Id, isNotReturnable : false);

            foreach (var orderItem in orderItems)
            {
                var quantity = 0; //parse quantity
                foreach (var formKey in form.Keys)
                {
                    if (formKey.Equals($"quantity{orderItem.Id}", StringComparison.InvariantCultureIgnoreCase))
                    {
                        int.TryParse(form[formKey], out quantity);
                        break;
                    }
                }
                if (quantity > 0)
                {
                    var rrr = await _returnRequestService.GetReturnRequestReasonByIdAsync(model.ReturnRequestReasonId);

                    var rra = await _returnRequestService.GetReturnRequestActionByIdAsync(model.ReturnRequestActionId);

                    var rr = new ReturnRequest
                    {
                        CustomNumber        = "",
                        StoreId             = (await _storeContext.GetCurrentStoreAsync()).Id,
                        OrderItemId         = orderItem.Id,
                        Quantity            = quantity,
                        CustomerId          = (await _workContext.GetCurrentCustomerAsync()).Id,
                        ReasonForReturn     = rrr != null ? await _localizationService.GetLocalizedAsync(rrr, x => x.Name) : "not available",
                        RequestedAction     = rra != null ? await _localizationService.GetLocalizedAsync(rra, x => x.Name) : "not available",
                        CustomerComments    = model.Comments,
                        UploadedFileId      = downloadId,
                        StaffNotes          = string.Empty,
                        ReturnRequestStatus = ReturnRequestStatus.Pending,
                        CreatedOnUtc        = DateTime.UtcNow,
                        UpdatedOnUtc        = DateTime.UtcNow
                    };

                    await _returnRequestService.InsertReturnRequestAsync(rr);

                    //set return request custom number
                    rr.CustomNumber = _customNumberFormatter.GenerateReturnRequestCustomNumber(rr);
                    await _customerService.UpdateCustomerAsync(await _workContext.GetCurrentCustomerAsync());

                    await _returnRequestService.UpdateReturnRequestAsync(rr);

                    //notify store owner
                    await _workflowMessageService.SendNewReturnRequestStoreOwnerNotificationAsync(rr, orderItem, order, _localizationSettings.DefaultAdminLanguageId);

                    //notify customer
                    await _workflowMessageService.SendNewReturnRequestCustomerNotificationAsync(rr, orderItem, order);

                    count++;
                }
            }

            model = await _returnRequestModelFactory.PrepareSubmitReturnRequestModelAsync(model, order);

            if (count > 0)
            {
                model.Result = await _localizationService.GetResourceAsync("ReturnRequests.Submitted");
            }
            else
            {
                model.Result = await _localizationService.GetResourceAsync("ReturnRequests.NoItemsSubmitted");
            }

            return(View(model));
        }
        protected SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId = order.Id;

            var    language             = Services.WorkContext.WorkingLanguage;
            string returnRequestReasons = _orderSettings.GetLocalized(x => x.ReturnRequestReasons, order.CustomerLanguageId, true, false);
            string returnRequestActions = _orderSettings.GetLocalized(x => x.ReturnRequestActions, order.CustomerLanguageId, true, false);

            // Return reasons.
            foreach (var rrr in returnRequestReasons.SplitSafe(","))
            {
                model.AvailableReturnReasons.Add(new SelectListItem {
                    Text = rrr, Value = rrr
                });
            }

            // Return actions.
            foreach (var rra in returnRequestActions.SplitSafe(","))
            {
                model.AvailableReturnActions.Add(new SelectListItem {
                    Text = rra, Value = rra
                });
            }

            // Products.
            var orderItems = _orderService.GetAllOrderItems(order.Id, null, null, null, null, null, null);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = new SubmitReturnRequestModel.OrderItemModel
                {
                    Id            = orderItem.Id,
                    ProductId     = orderItem.Product.Id,
                    ProductName   = orderItem.Product.GetLocalized(x => x.Name),
                    ProductSeName = orderItem.Product.GetSeName(),
                    AttributeInfo = orderItem.AttributeDescription,
                    Quantity      = orderItem.Quantity
                };

                orderItemModel.ProductUrl = _productUrlHelper.GetProductUrl(orderItemModel.ProductSeName, orderItem);

                // Unit price.
                switch (order.CustomerTaxDisplayType)
                {
                case TaxDisplayType.ExcludingTax:
                {
                    var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, language, false);
                }
                break;

                case TaxDisplayType.IncludingTax:
                {
                    var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, language, true);
                }
                break;
                }

                model.Items.Add(orderItemModel);
            }

            return(model);
        }
Example #18
0
        protected virtual SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId     = order.Id;
            model.OrderNumber = _orderService.GetOrderById(order.Id).OrderNumber;
            //return reasons
            model.AvailableReturnReasons = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTREASONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel()
                    {
                        Id   = rrr.Id,
                        Name = rrr.GetLocalized(x => x.Name)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = _cacheManager.Get(string.Format(ModelCacheEventConsumer.RETURNREQUESTACTIONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                             () =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel()
                    {
                        Id   = rra.Id,
                        Name = rra.GetLocalized(x => x.Name)
                    });
                }
                return(actions);
            });

            var shipments = Grand.Core.Infrastructure.EngineContextExperimental.Current.Resolve <Grand.Services.Shipping.IShipmentService>().GetShipmentsByOrder(order.Id);

            //products
            var orderItems = _orderService.GetAllOrderItems(order.Id, null, null, null, null, null, null);

            foreach (var orderItem in orderItems)
            {
                var qtyDelivery = shipments.Where(x => x.DeliveryDateUtc.HasValue).SelectMany(x => x.ShipmentItems).Where(x => x.OrderItemId == orderItem.Id).Sum(x => x.Quantity);
                var qtyReturn   = _returnRequestService.SearchReturnRequests(customerId: order.CustomerId, orderItemId: orderItem.Id).Sum(x => x.Quantity);

                var product = _productService.GetProductByIdIncludeArch(orderItem.ProductId);
                if (!product.NotReturnable)
                {
                    var orderItemModel = new SubmitReturnRequestModel.OrderItemModel
                    {
                        Id            = orderItem.Id,
                        ProductId     = orderItem.ProductId,
                        ProductName   = product.GetLocalized(x => x.Name),
                        ProductSeName = product.GetSeName(),
                        AttributeInfo = orderItem.AttributeDescription,
                        Quantity      = qtyDelivery - qtyReturn,
                    };
                    model.Items.Add(orderItemModel);
                    //unit price
                    if (order.CustomerTaxDisplayType == TaxDisplayType.IncludingTax)
                    {
                        //including tax
                        var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                        orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                    }
                    else
                    {
                        //excluding tax
                        var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                        orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                    }
                }
            }

            return(model);
        }
Example #19
0
        public virtual async Task <IActionResult> ReturnRequestSubmit(string orderId, SubmitReturnRequestModel model, IFormCollection form)
        {
            var order = await _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(Challenge());
            }

            if (!await _orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            string   pD         = form["pickupDate"];
            DateTime pickupDate = default(DateTime);

            if (!string.IsNullOrEmpty(pD))
            {
                pickupDate = DateTime.ParseExact(form["pickupDate"], "MM/dd/yyyy", CultureInfo.InvariantCulture);
            }
            else if (_orderSettings.ReturnRequests_AllowToSpecifyPickupDate && _orderSettings.ReturnRequests_PickupDateRequired)
            {
                ModelState.AddModelError("", _localizationService.GetResource("ReturnRequests.PickupDateRequired"));
            }

            string pickupAddressId = form["pickup_address_id"];
            var    address         = new Address();

            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
            {
                if (!string.IsNullOrEmpty(pickupAddressId))
                {
                    address = _workContext.CurrentCustomer.Addresses.FirstOrDefault(a => a.Id == pickupAddressId);
                }
                else
                {
                    var customAttributes = await _addressViewModelService.ParseCustomAddressAttributes(form);

                    var customAttributeWarnings = await _addressViewModelService.GetAttributeWarnings(customAttributes);

                    foreach (var error in customAttributeWarnings)
                    {
                        ModelState.AddModelError("", error);
                    }
                    address = model.NewAddress.ToEntity();
                    model.NewAddressPreselected = true;
                    address.CustomAttributes    = customAttributes;
                    address.CreatedOnUtc        = DateTime.UtcNow;
                }
            }
            if (!ModelState.IsValid && ModelState.ErrorCount > 0)
            {
                model.Error = string.Join(", ", ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(m => m.ErrorMessage).ToArray());
                model       = await _returnRequestViewModelService.PrepareReturnRequest(model, order);

                return(View(model));
            }

            var rr = new ReturnRequest
            {
                StoreId             = _storeContext.CurrentStore.Id,
                OrderId             = order.Id,
                CustomerId          = _workContext.CurrentCustomer.Id,
                CustomerComments    = model.Comments,
                StaffNotes          = string.Empty,
                ReturnRequestStatus = ReturnRequestStatus.Pending,
                CreatedOnUtc        = DateTime.UtcNow,
                UpdatedOnUtc        = DateTime.UtcNow,
                PickupAddress       = address,
                PickupDate          = pickupDate
            };

            int count = 0;

            foreach (var orderItem in order.OrderItems)
            {
                var product = await _productService.GetProductById(orderItem.ProductId);

                if (!product.NotReturnable)
                {
                    int    quantity = 0; //parse quantity
                    string rrrId    = "";
                    string rraId    = "";

                    foreach (string formKey in form.Keys)
                    {
                        if (formKey.Equals(string.Format("quantity{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            int.TryParse(form[formKey], out quantity);
                        }

                        if (formKey.Equals(string.Format("reason{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            rrrId = form[formKey];
                        }

                        if (formKey.Equals(string.Format("action{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            rraId = form[formKey];
                        }
                    }

                    if (quantity > 0)
                    {
                        var rrr = await _returnRequestService.GetReturnRequestReasonById(rrrId);

                        var rra = await _returnRequestService.GetReturnRequestActionById(rraId);

                        rr.ReturnRequestItems.Add(new ReturnRequestItem
                        {
                            RequestedAction = rra != null ? rra.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id) : "not available",
                            ReasonForReturn = rrr != null ? rrr.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id) : "not available",
                            Quantity        = quantity,
                            OrderItemId     = orderItem.Id
                        });

                        count++;
                    }
                }
            }
            model = await _returnRequestViewModelService.PrepareReturnRequest(model, order);

            if (count > 0)
            {
                await _returnRequestService.InsertReturnRequest(rr);

                model.Result = string.Format(_localizationService.GetResource("ReturnRequests.Submitted"), rr.ReturnNumber, Url.Link("ReturnRequestDetails", new { returnRequestId = rr.Id }));

                //notify store owner here (email)
                await _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, order, _localizationSettings.DefaultAdminLanguageId);

                //notify customer
                await _workflowMessageService.SendNewReturnRequestCustomerNotification(rr, order, order.CustomerLanguageId);
            }
            else
            {
                model.Error = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted");
                return(View(model));
            }

            return(View(model));
        }
Example #20
0
        protected virtual SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId = order.Id;

            //return reasons
            if (_orderSettings.ReturnRequestReasons != null)
            {
                foreach (var rrr in _orderSettings.ReturnRequestReasons)
                {
                    model.AvailableReturnReasons.Add(new SelectListItem
                    {
                        Text  = rrr,
                        Value = rrr
                    });
                }
            }

            //return actions
            if (_orderSettings.ReturnRequestActions != null)
            {
                foreach (var rra in _orderSettings.ReturnRequestActions)
                {
                    model.AvailableReturnActions.Add(new SelectListItem
                    {
                        Text  = rra,
                        Value = rra
                    });
                }
            }

            //products
            var orderItems = _orderService.GetAllOrderItems(order.Id, null, null, null, null, null, null);

            foreach (var orderItem in orderItems)
            {
                var orderItemModel = new SubmitReturnRequestModel.OrderItemModel
                {
                    Id            = orderItem.Id,
                    ProductId     = orderItem.Product.Id,
                    ProductName   = orderItem.Product.GetLocalized(x => x.Name),
                    ProductSeName = orderItem.Product.GetSeName(),
                    AttributeInfo = orderItem.AttributeDescription,
                    Quantity      = orderItem.Quantity
                };
                model.Items.Add(orderItemModel);

                //unit price
                if (order.CustomerTaxDisplayType == TaxDisplayType.IncludingTax)
                {
                    //including tax
                    var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                }
                else
                {
                    //excluding tax
                    var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                    orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                }
            }

            return(model);
        }
Example #21
0
        //[ValidateInput(false)]
        ////[PublicAntiForgery]
        public virtual IActionResult ReturnRequestSubmit(string orderId, SubmitReturnRequestModel model, IFormCollection form)
        {
            var order = _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(new UnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            int count = 0;

            foreach (var orderItem in order.OrderItems)
            {
                var product = _productService.GetProductById(orderItem.ProductId);
                if (!product.NotReturnable)
                {
                    int quantity = 0; //parse quantity
                    foreach (string formKey in form.Keys)
                    {
                        if (formKey.Equals(string.Format("quantity{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            int.TryParse(form[formKey], out quantity);
                            break;
                        }
                    }
                    if (quantity > 0)
                    {
                        var rrr = _returnRequestService.GetReturnRequestReasonById(model.ReturnRequestReasonId);
                        var rra = _returnRequestService.GetReturnRequestActionById(model.ReturnRequestActionId);

                        var rr = new ReturnRequest
                        {
                            StoreId         = _storeContext.CurrentStore.Id,
                            OrderId         = order.Id,
                            OrderItemId     = orderItem.Id,
                            Quantity        = quantity,
                            CustomerId      = _workContext.CurrentCustomer.Id,
                            ReasonForReturn = rrr != null?rrr.GetLocalized(x => x.Name) : "not available",
                                                  RequestedAction = rra != null?rra.GetLocalized(x => x.Name) : "not available",
                                                                        CustomerComments    = model.Comments,
                                                                        StaffNotes          = string.Empty,
                                                                        ReturnRequestStatus = ReturnRequestStatus.Pending,
                                                                        CreatedOnUtc        = DateTime.UtcNow,
                                                                        UpdatedOnUtc        = DateTime.UtcNow
                        };

                        _returnRequestService.InsertReturnRequest(rr);
                        //notify store owner here (email)
                        _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, orderItem, _localizationSettings.DefaultAdminLanguageId);
                        //notify customer
                        _workflowMessageService.SendNewReturnRequestCustomerNotification(rr, orderItem, order.CustomerLanguageId);

                        count++;
                    }
                }
            }

            model = PrepareReturnRequestModel(model, order);
            if (count > 0)
            {
                model.Result = _localizationService.GetResource("ReturnRequests.Submitted");
            }
            else
            {
                model.Result = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted");
            }

            return(View(model));
        }
        public virtual async Task <IActionResult> ReturnRequestSubmit(string orderId, SubmitReturnRequestModel model, IFormCollection form)
        {
            var order = await _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(Challenge());
            }

            if (!await _orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            ModelState.Clear();

            string   pD         = form["pickupDate"];
            DateTime pickupDate = default(DateTime);

            if (!string.IsNullOrEmpty(pD))
            {
                pickupDate = DateTime.ParseExact(form["pickupDate"], "MM/dd/yyyy", CultureInfo.InvariantCulture);
            }
            else if (_orderSettings.ReturnRequests_AllowToSpecifyPickupDate && _orderSettings.ReturnRequests_PickupDateRequired)
            {
                ModelState.AddModelError("", _localizationService.GetResource("ReturnRequests.PickupDateRequired"));
            }

            var address = await PrepareAddress(model, form);

            if (!ModelState.IsValid && ModelState.ErrorCount > 0)
            {
                model.Error = string.Join(", ", ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(m => m.ErrorMessage).ToArray());
                model       = await _returnRequestViewModelService.PrepareReturnRequest(model, order);

                return(View(model));
            }

            var result = await _returnRequestViewModelService.ReturnRequestSubmit(model, order, address, pickupDate, form);

            if (result.rr.ReturnNumber > 0)
            {
                model.Result = string.Format(_localizationService.GetResource("ReturnRequests.Submitted"), result.rr.ReturnNumber, Url.Link("ReturnRequestDetails", new { returnRequestId = result.rr.Id }));
            }

            return(View(result.model));
        }
        public virtual async Task <(SubmitReturnRequestModel model, ReturnRequest rr)> ReturnRequestSubmit(SubmitReturnRequestModel model, Order order, Address address, DateTime pickupDate, IFormCollection form)
        {
            var rr = new ReturnRequest {
                StoreId             = _storeContext.CurrentStore.Id,
                OrderId             = order.Id,
                CustomerId          = _workContext.CurrentCustomer.Id,
                CustomerComments    = model.Comments,
                StaffNotes          = string.Empty,
                ReturnRequestStatus = ReturnRequestStatus.Pending,
                CreatedOnUtc        = DateTime.UtcNow,
                UpdatedOnUtc        = DateTime.UtcNow,
                PickupAddress       = address,
                PickupDate          = pickupDate
            };

            foreach (var orderItem in order.OrderItems)
            {
                var product = await _productService.GetProductById(orderItem.ProductId);

                if (!product.NotReturnable)
                {
                    int    quantity = 0; //parse quantity
                    string rrrId    = "";
                    string rraId    = "";

                    foreach (string formKey in form.Keys)
                    {
                        if (formKey.Equals(string.Format("quantity{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            int.TryParse(form[formKey], out quantity);
                        }

                        if (formKey.Equals(string.Format("reason{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            rrrId = form[formKey];
                        }

                        if (formKey.Equals(string.Format("action{0}", orderItem.Id), StringComparison.OrdinalIgnoreCase))
                        {
                            rraId = form[formKey];
                        }
                    }

                    if (quantity > 0)
                    {
                        var rrr = await _returnRequestService.GetReturnRequestReasonById(rrrId);

                        var rra = await _returnRequestService.GetReturnRequestActionById(rraId);

                        rr.ReturnRequestItems.Add(new ReturnRequestItem {
                            RequestedAction = rra != null ? rra.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id) : "not available",
                            ReasonForReturn = rrr != null ? rrr.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id) : "not available",
                            Quantity        = quantity,
                            OrderItemId     = orderItem.Id
                        });
                    }
                }
            }
            model = await PrepareReturnRequest(model, order);

            if (rr.ReturnRequestItems.Any())
            {
                await _returnRequestService.InsertReturnRequest(rr);

                //notify store owner here (email)
                await _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, order, _localizationSettings.DefaultAdminLanguageId);

                //notify customer
                await _workflowMessageService.SendNewReturnRequestCustomerNotification(rr, order, order.CustomerLanguageId);
            }
            else
            {
                model.Error = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted");
            }

            return(model, rr);
        }
        public virtual async Task <SubmitReturnRequestModel> PrepareReturnRequest(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId     = order.Id;
            model.OrderNumber = (await _orderService.GetOrderById(order.Id)).OrderNumber;
            //return reasons
            model.AvailableReturnReasons = await _cacheManager.GetAsync(string.Format(ModelCacheEventConsumer.RETURNREQUESTREASONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                                        async() =>
            {
                var reasons = new List <SubmitReturnRequestModel.ReturnRequestReasonModel>();
                foreach (var rrr in await _returnRequestService.GetAllReturnRequestReasons())
                {
                    reasons.Add(new SubmitReturnRequestModel.ReturnRequestReasonModel()
                    {
                        Id   = rrr.Id,
                        Name = rrr.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id)
                    });
                }
                return(reasons);
            });

            //return actions
            model.AvailableReturnActions = await _cacheManager.GetAsync(string.Format(ModelCacheEventConsumer.RETURNREQUESTACTIONS_MODEL_KEY, _workContext.WorkingLanguage.Id),
                                                                        async() =>
            {
                var actions = new List <SubmitReturnRequestModel.ReturnRequestActionModel>();
                foreach (var rra in await _returnRequestService.GetAllReturnRequestActions())
                {
                    actions.Add(new SubmitReturnRequestModel.ReturnRequestActionModel()
                    {
                        Id   = rra.Id,
                        Name = rra.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id)
                    });
                }
                return(actions);
            });

            var shipments = await _serviceProvider.GetRequiredService <Grand.Services.Shipping.IShipmentService>().GetShipmentsByOrder(order.Id);

            //products
            var orderItems = await _orderService.GetAllOrderItems(order.Id, null, null, null, null, null, null);

            foreach (var orderItem in orderItems)
            {
                var qtyDelivery    = shipments.Where(x => x.DeliveryDateUtc.HasValue).SelectMany(x => x.ShipmentItems).Where(x => x.OrderItemId == orderItem.Id).Sum(x => x.Quantity);
                var returnRequests = await _returnRequestService.SearchReturnRequests(customerId : order.CustomerId, orderItemId : orderItem.Id);

                int qtyReturn = 0;

                foreach (var rr in returnRequests)
                {
                    foreach (var rrItem in rr.ReturnRequestItems)
                    {
                        qtyReturn += rrItem.Quantity;
                    }
                }

                var product = await _productService.GetProductByIdIncludeArch(orderItem.ProductId);

                if (!product.NotReturnable)
                {
                    var orderItemModel = new SubmitReturnRequestModel.OrderItemModel {
                        Id            = orderItem.Id,
                        ProductId     = orderItem.ProductId,
                        ProductName   = product.GetLocalized(x => x.Name, _workContext.WorkingLanguage.Id),
                        ProductSeName = product.GetSeName(_workContext.WorkingLanguage.Id),
                        AttributeInfo = orderItem.AttributeDescription,
                        Quantity      = qtyDelivery - qtyReturn,
                    };
                    if (orderItemModel.Quantity > 0)
                    {
                        model.Items.Add(orderItemModel);
                    }
                    //unit price
                    if (order.CustomerTaxDisplayType == TaxDisplayType.IncludingTax)
                    {
                        //including tax
                        var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                        orderItemModel.UnitPrice = await _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                    }
                    else
                    {
                        //excluding tax
                        var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                        orderItemModel.UnitPrice = await _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                    }
                }
            }
            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
            {
                //existing addresses
                var addresses = new List <Address>();
                foreach (var item in _workContext.CurrentCustomer.Addresses)
                {
                    if (string.IsNullOrEmpty(item.CountryId))
                    {
                        addresses.Add(item);
                        continue;
                    }
                    var country = await _countryService.GetCountryById(item.CountryId);

                    if (country == null || (country.AllowsShipping && _storeMappingService.Authorize(country)))
                    {
                        addresses.Add(item);
                        continue;
                    }
                }

                foreach (var address in addresses)
                {
                    var addressModel = new AddressModel();
                    await _addressViewModelService.PrepareModel(model : addressModel,
                                                                address : address,
                                                                excludeProperties : false);

                    model.ExistingAddresses.Add(addressModel);
                }

                //new address
                var countries = await _countryService.GetAllCountriesForShipping();

                await _addressViewModelService.PrepareModel(model : model.NewAddress,
                                                            address : null,
                                                            excludeProperties : false,
                                                            loadCountries : () => countries,
                                                            prePopulateWithCustomerFields : true,
                                                            customer : _workContext.CurrentCustomer);
            }
            model.ShowPickupAddress  = _orderSettings.ReturnRequests_AllowToSpecifyPickupAddress;
            model.ShowPickupDate     = _orderSettings.ReturnRequests_AllowToSpecifyPickupDate;
            model.PickupDateRequired = _orderSettings.ReturnRequests_PickupDateRequired;

            return(model);
        }
        /// <summary>
        /// Prepare the submit return request model
        /// </summary>
        /// <param name="model">Submit return request model</param>
        /// <param name="order">Order</param>
        /// <returns>
        /// A task that represents the asynchronous operation
        /// The task result contains the submit return request model
        /// </returns>
        public virtual async Task <SubmitReturnRequestModel> PrepareSubmitReturnRequestModelAsync(SubmitReturnRequestModel model,
                                                                                                  Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException(nameof(order));
            }

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

            model.OrderId           = order.Id;
            model.AllowFiles        = _orderSettings.ReturnRequestsAllowFiles;
            model.CustomOrderNumber = order.CustomOrderNumber;

            //return reasons
            model.AvailableReturnReasons = await(await _returnRequestService.GetAllReturnRequestReasonsAsync())
                                           .SelectAwait(async rrr => new SubmitReturnRequestModel.ReturnRequestReasonModel
            {
                Id   = rrr.Id,
                Name = await _localizationService.GetLocalizedAsync(rrr, x => x.Name)
            }).ToListAsync();

            //return actions
            model.AvailableReturnActions = await(await _returnRequestService.GetAllReturnRequestActionsAsync())
                                           .SelectAwait(async rra => new SubmitReturnRequestModel.ReturnRequestActionModel
            {
                Id   = rra.Id,
                Name = await _localizationService.GetLocalizedAsync(rra, x => x.Name)
            })
                                           .ToListAsync();

            //returnable products
            model.Items = await PrepareSubmitReturnRequestOrderItemModelsAsync(order);

            return(model);
        }
Example #26
0
        private SubmitReturnRequestModel PrepareReturnRequestModel(SubmitReturnRequestModel model, Order order)
        {
            if (order == null)
            {
                throw new ArgumentNullException("order");
            }

            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

            model.OrderId = order.Id;

            //return reasons
            if (_orderSettings.ReturnRequestReasons != null)
            {
                foreach (var rrr in _orderSettings.ReturnRequestReasons)
                {
                    string sRrr = _localizationService.GetResource(rrr);

                    model.AvailableReturnReasons.Add(new SelectListItem()
                    {
                        Text  = sRrr,
                        Value = sRrr
                    });
                }
            }

            //return actions
            if (_orderSettings.ReturnRequestActions != null)
            {
                foreach (var rra in _orderSettings.ReturnRequestActions)
                {
                    string sRra = _localizationService.GetResource(rra);
                    model.AvailableReturnActions.Add(new SelectListItem()
                    {
                        Text  = sRra,
                        Value = sRra
                    });
                }
            }

            //products
            var orderProductVariants = _orderService.GetAllOrderProductVariants(order.Id, null, null, null, null, null, null);

            foreach (var opv in orderProductVariants)
            {
                var opvModel = new SubmitReturnRequestModel.OrderProductVariantModel()
                {
                    Id            = opv.Id,
                    ProductId     = opv.ProductVariant.ProductId,
                    ProductSeName = opv.ProductVariant.Product.GetSeName(),
                    AttributeInfo = opv.AttributeDescription,
                    Quantity      = opv.Quantity
                };

                for (int i = 1; i <= opvModel.Quantity; i++)
                {
                    opvModel.SelectListProductQuantity.Add(new SelectListItem()
                    {
                        Value = i.ToString(),
                        Text  = i.ToString()
                    }
                                                           );
                }
                var picture = opv.ProductVariant.GetDefaultProductVariantPicture(_pictureService);
                if (picture == null)
                {
                    picture = _pictureService.GetPicturesByProductId(opv.ProductVariant.Product.Id, 1).FirstOrDefault();
                }

                var pictureModel = new PictureModel()
                {
                    ImageUrl      = _pictureService.GetPictureUrl(picture, _mediaSettings.CartThumbPictureSize, true),
                    Title         = string.Format(_localizationService.GetResource("Media.Product.ImageLinkTitleFormat"), opv.ProductVariant.Product.Name),
                    AlternateText = string.Format(_localizationService.GetResource("Media.Product.ImageAlternateTextFormat"), opv.ProductVariant.Name),
                };

                opvModel.Picture          = pictureModel;
                opvModel.ManufacturerName = opv.ProductVariant.Product.ManufacturerName();
                opvModel.Sku = opv.ProductVariant.Sku;
                //product name
                if (!String.IsNullOrEmpty(opv.ProductVariant.GetLocalized(x => x.Name)))
                {
                    opvModel.ProductName = string.Format("{0} ({1})", opv.ProductVariant.Product.GetLocalized(x => x.Name), opv.ProductVariant.GetLocalized(x => x.Name));
                }
                else
                {
                    opvModel.ProductName = opv.ProductVariant.Product.GetLocalized(x => x.Name);
                }
                model.Items.Add(opvModel);

                //unit price
                switch (order.CustomerTaxDisplayType)
                {
                case TaxDisplayType.ExcludingTax:
                {
                    var opvUnitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(opv.UnitPriceExclTax, order.CurrencyRate);
                    opvModel.UnitPrice = _priceFormatter.FormatPrice(opvUnitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, false);
                }
                break;

                case TaxDisplayType.IncludingTax:
                {
                    var opvUnitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(opv.UnitPriceInclTax, order.CurrencyRate);
                    opvModel.UnitPrice = _priceFormatter.FormatPrice(opvUnitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, _workContext.WorkingLanguage, true);
                }
                break;
                }
            }
            return(model);
        }
Example #27
0
        public ActionResult ReturnRequestSubmit(int orderId, SubmitReturnRequestModel model, FormCollection form)
        {
            //TempData["ReturnRequestSuccess"] = null;
            CustomerNavigationModel navModel = new CustomerNavigationModel();

            ViewData["NavModel"] = navModel;
            MessageModel msg   = new MessageModel();
            var          order = _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(new HttpUnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToAction("Index", "Home"));
            }

            int count = 0;

            foreach (var opv in order.OrderProductVariants)
            {
                int  quantity  = 0; //parse quantity
                bool selection = false;
                foreach (string formKey in form.AllKeys)
                {
                    if (formKey.Equals(string.Format("quantity{0}", opv.Id), StringComparison.InvariantCultureIgnoreCase))
                    {
                        int.TryParse(form[formKey], out quantity);
                        continue;
                    }
                    if (formKey.Equals(string.Format("selection{0}", opv.Id), StringComparison.InvariantCultureIgnoreCase))
                    {
                        bool.TryParse(form[formKey], out selection);
                        continue;
                    }
                }
                if (selection && quantity > 0)
                {
                    var rr = new ReturnRequest()
                    {
                        OrderProductVariantId = opv.Id,
                        Quantity            = quantity,
                        CustomerId          = _workContext.CurrentCustomer.Id,
                        ReasonForReturn     = model.ReturnReason,
                        RequestedAction     = model.ReturnAction,
                        CustomerComments    = model.Comments,
                        StaffNotes          = string.Empty,
                        ReturnRequestStatus = ReturnRequestStatus.Pending,
                        CreatedOnUtc        = DateTime.UtcNow,
                        UpdatedOnUtc        = DateTime.UtcNow
                    };
                    _workContext.CurrentCustomer.ReturnRequests.Add(rr);
                    _customerService.UpdateCustomer(_workContext.CurrentCustomer);
                    //notify store owner here (email)
                    _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, opv, _localizationSettings.DefaultAdminLanguageId);
                    _workflowMessageService.SendNewReturnRequestCustomerNotification(_workContext.CurrentCustomer.GetFullName(), _workContext.CurrentCustomer.Email, model.OrderId.ToString(), _workContext.WorkingLanguage.Id);
                    count++;
                }
            }

            if (count > 0)
            {
                msg.Successful = true;
                msg.MessageList.Add(_localizationService.GetResource("ReturnRequests.Submitted", _workContext.WorkingLanguage.Id));
                TempData["ReturnRequestSuccess"] = msg;
                return(RedirectToAction("Details", new { orderId = orderId }));
            }
            else
            {
                msg.Successful = false;
                msg.MessageList.Add(_localizationService.GetResource("ReturnRequests.NoItemsSubmitted", _workContext.WorkingLanguage.Id));
                ViewBag.Msg = msg;
            }
            model       = PrepareReturnRequestModel(new SubmitReturnRequestModel(), order);
            ViewBag.Msg = msg;
            return(View("ReturnRequest", model));
        }
Example #28
0
        protected async Task <SubmitReturnRequestModel> PrepareReturnRequestModelAsync(SubmitReturnRequestModel model, Order order)
        {
            Guard.NotNull(order, nameof(order));
            Guard.NotNull(model, nameof(model));

            model.OrderId = order.Id;

            var    language             = Services.WorkContext.WorkingLanguage;
            string returnRequestReasons = _orderSettings.GetLocalizedSetting(x => x.ReturnRequestReasons, order.CustomerLanguageId, order.StoreId, true, false);
            string returnRequestActions = _orderSettings.GetLocalizedSetting(x => x.ReturnRequestActions, order.CustomerLanguageId, order.StoreId, true, false);

            // Return reasons.
            var availableReturnReasons = new List <SelectListItem>();

            foreach (var rrr in returnRequestReasons.SplitSafe(","))
            {
                availableReturnReasons.Add(new SelectListItem {
                    Text = rrr, Value = rrr
                });
            }
            ViewBag.AvailableReturnReasons = availableReturnReasons;

            // Return actions.
            var availableReturnActions = new List <SelectListItem>();

            foreach (var rra in returnRequestActions.SplitSafe(","))
            {
                availableReturnActions.Add(new SelectListItem {
                    Text = rra, Value = rra
                });
            }
            ViewBag.AvailableReturnActions = availableReturnActions;

            foreach (var orderItem in order.OrderItems)
            {
                var orderItemModel = new SubmitReturnRequestModel.OrderItemModel
                {
                    Id            = orderItem.Id,
                    ProductId     = orderItem.Product.Id,
                    ProductName   = orderItem.Product.GetLocalized(x => x.Name),
                    ProductSeName = await orderItem.Product.GetActiveSlugAsync(),
                    AttributeInfo = orderItem.AttributeDescription,
                    Quantity      = orderItem.Quantity
                };

                orderItemModel.ProductUrl = await _productUrlHelper.GetProductUrlAsync(orderItemModel.ProductSeName, orderItem);

                // TODO: (mh) (core) Reconsider when pricing is available.
                var customerCurrency = await _db.Currencies
                                       .AsNoTracking()
                                       .Where(x => x.CurrencyCode == order.CustomerCurrencyCode)
                                       .FirstOrDefaultAsync() ?? new Currency
                {
                    CurrencyCode = order.CustomerCurrencyCode
                };

                // Unit price.
                switch (order.CustomerTaxDisplayType)
                {
                case TaxDisplayType.ExcludingTax:
                {
                    // TODO: (mh) (core) _currencyService.ConvertToCurrency doesn't take a rate as paramter.
                    //var unitPriceExclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceExclTax, order.CurrencyRate);
                    //orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceExclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, language, false);
                    orderItemModel.UnitPrice = new Money(orderItem.UnitPriceExclTax, customerCurrency);
                }
                break;

                case TaxDisplayType.IncludingTax:
                {
                    //var unitPriceInclTaxInCustomerCurrency = _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate);
                    //orderItemModel.UnitPrice = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency, true, order.CustomerCurrencyCode, language, true);
                    orderItemModel.UnitPrice = new Money(orderItem.UnitPriceInclTax, customerCurrency);
                }
                break;
                }

                model.Items.Add(orderItemModel);
            }

            return(model);
        }
Example #29
0
        public virtual ActionResult ReturnRequestSubmit(int orderId, SubmitReturnRequestModel model, FormCollection form)
        {
            var order = _orderService.GetOrderById(orderId);

            if (order == null || order.Deleted || _workContext.CurrentCustomer.Id != order.CustomerId)
            {
                return(new HttpUnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("HomePage"));
            }

            int count = 0;

            var downloadId = 0;

            if (_orderSettings.ReturnRequestsAllowFiles)
            {
                var download = _downloadService.GetDownloadByGuid(model.UploadedFileGuid);
                if (download != null)
                {
                    downloadId = download.Id;
                }
            }

            //returnable products
            var orderItems = order.OrderItems.Where(oi => !oi.Product.NotReturnable);

            foreach (var orderItem in orderItems)
            {
                int quantity = 0; //parse quantity
                foreach (string formKey in form.AllKeys)
                {
                    if (formKey.Equals(string.Format("quantity{0}", orderItem.Id), StringComparison.InvariantCultureIgnoreCase))
                    {
                        int.TryParse(form[formKey], out quantity);
                        break;
                    }
                }
                if (quantity > 0)
                {
                    var rrr = _returnRequestService.GetReturnRequestReasonById(model.ReturnRequestReasonId);
                    var rra = _returnRequestService.GetReturnRequestActionById(model.ReturnRequestActionId);

                    var rr = new ReturnRequest
                    {
                        CustomNumber    = "",
                        StoreId         = _storeContext.CurrentStore.Id,
                        OrderItemId     = orderItem.Id,
                        Quantity        = quantity,
                        CustomerId      = _workContext.CurrentCustomer.Id,
                        ReasonForReturn = rrr != null?rrr.GetLocalized(x => x.Name) : "not available",
                                              RequestedAction = rra != null?rra.GetLocalized(x => x.Name) : "not available",
                                                                    CustomerComments    = model.Comments,
                                                                    UploadedFileId      = downloadId,
                                                                    StaffNotes          = string.Empty,
                                                                    ReturnRequestStatus = ReturnRequestStatus.Pending,
                                                                    CreatedOnUtc        = DateTime.UtcNow,
                                                                    UpdatedOnUtc        = DateTime.UtcNow
                    };
                    _workContext.CurrentCustomer.ReturnRequests.Add(rr);
                    _customerService.UpdateCustomer(_workContext.CurrentCustomer);
                    //set return request custom number
                    rr.CustomNumber = _customNumberFormatter.GenerateReturnRequestCustomNumber(rr);
                    _customerService.UpdateCustomer(_workContext.CurrentCustomer);
                    //notify store owner
                    _workflowMessageService.SendNewReturnRequestStoreOwnerNotification(rr, orderItem, _localizationSettings.DefaultAdminLanguageId);
                    //notify customer
                    _workflowMessageService.SendNewReturnRequestCustomerNotification(rr, orderItem, order.CustomerLanguageId);

                    count++;
                }
            }

            model = _returnRequestModelFactory.PrepareSubmitReturnRequestModel(model, order);
            if (count > 0)
            {
                model.Result = _localizationService.GetResource("ReturnRequests.Submitted");
            }
            else
            {
                model.Result = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted");
            }

            return(View(model));
        }
Example #30
0
        public async Task <IActionResult> ReturnRequestSubmit(int id /* orderId */, SubmitReturnRequestModel model)
        {
            var order = await _db.Orders.FindByIdAsync(id);

            var customer = Services.WorkContext.CurrentCustomer;

            if (order == null || customer.Id != order.CustomerId)
            {
                return(new UnauthorizedResult());
            }

            if (!_orderProcessingService.IsReturnRequestAllowed(order))
            {
                return(RedirectToRoute("Homepage"));
            }

            foreach (var orderItem in order.OrderItems)
            {
                var form = Request.Form;

                var quantity = 0;
                foreach (var formKey in form.Keys)
                {
                    if (formKey.EqualsNoCase($"quantity{orderItem.Id}"))
                    {
                        _ = int.TryParse(form[formKey], out quantity);
                        break;
                    }
                }

                if (quantity > 0)
                {
                    var rr = new ReturnRequest
                    {
                        StoreId             = Services.StoreContext.CurrentStore.Id,
                        OrderItemId         = orderItem.Id,
                        Quantity            = quantity,
                        CustomerId          = customer.Id,
                        ReasonForReturn     = model.ReturnReason,
                        RequestedAction     = model.ReturnAction,
                        CustomerComments    = model.Comments,
                        StaffNotes          = string.Empty,
                        ReturnRequestStatus = ReturnRequestStatus.Pending
                    };

                    customer.ReturnRequests.Add(rr);

                    _db.TryUpdate(customer);
                    await _db.SaveChangesAsync();

                    model.AddedReturnRequestIds.Add(rr.Id);

                    // Notify store owner here by sending an email.
                    await _messageFactory.SendNewReturnRequestStoreOwnerNotificationAsync(rr, orderItem, _localizationSettings.DefaultAdminLanguageId);
                }
            }

            model = await PrepareReturnRequestModelAsync(model, order);

            if (model.AddedReturnRequestIds.Any())
            {
                model.Result = T("ReturnRequests.Submitted");
            }
            else
            {
                NotifyWarning(T("ReturnRequests.NoItemsSubmitted"));
            }

            return(View(model));
        }