public virtual async Task <ReturnRequestModel> PrepareReturnRequestModel(ReturnRequestModel model,
                                                                                 ReturnRequest returnRequest, bool excludeProperties)
        {
            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

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

            var order = await _orderService.GetOrderById(returnRequest.OrderId);

            decimal unitPriceInclTaxInCustomerCurrency = 0;

            foreach (var item in returnRequest.ReturnRequestItems)
            {
                var orderItem = order.OrderItems.Where(x => x.Id == item.OrderItemId).First();
                unitPriceInclTaxInCustomerCurrency += _currencyService.ConvertCurrency(orderItem.UnitPriceInclTax, order.CurrencyRate) * item.Quantity;
            }

            model.Total          = _priceFormatter.FormatPrice(unitPriceInclTaxInCustomerCurrency);
            model.Quantity       = returnRequest.ReturnRequestItems.Sum(x => x.Quantity);
            model.Id             = returnRequest.Id;
            model.OrderId        = order.Id;
            model.OrderNumber    = order.OrderNumber;
            model.OrderCode      = order.Code;
            model.ReturnNumber   = returnRequest.ReturnNumber;
            model.CustomerId     = returnRequest.CustomerId;
            model.NotifyCustomer = returnRequest.NotifyCustomer;
            var customer = await _customerService.GetCustomerById(returnRequest.CustomerId);

            if (customer != null)
            {
                model.CustomerInfo = customer.IsRegistered() ? customer.Email : _localizationService.GetResource("Admin.Customers.Guest");
            }
            else
            {
                model.CustomerInfo = _localizationService.GetResource("Admin.Customers.Guest");
            }

            model.ReturnRequestStatusStr = returnRequest.ReturnRequestStatus.ToString();
            model.CreatedOn         = _dateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc);
            model.PickupDate        = returnRequest.PickupDate;
            model.GenericAttributes = returnRequest.GenericAttributes;

            if (!excludeProperties)
            {
                var addr = new AddressModel();
                model.PickupAddress = await PrepareAddressModel(addr, returnRequest.PickupAddress, excludeProperties);

                model.CustomerComments      = returnRequest.CustomerComments;
                model.ExternalId            = returnRequest.ExternalId;
                model.StaffNotes            = returnRequest.StaffNotes;
                model.ReturnRequestStatusId = returnRequest.ReturnRequestStatusId;
            }

            return(model);
        }
        public virtual async Task <ReturnRequest> UpdateReturnRequestModel(ReturnRequest returnRequest, ReturnRequestModel model, string customAddressAttributes)
        {
            returnRequest.CustomerComments      = model.CustomerComments;
            returnRequest.StaffNotes            = model.StaffNotes;
            returnRequest.ReturnRequestStatusId = model.ReturnRequestStatusId;
            returnRequest.ExternalId            = model.ExternalId;
            returnRequest.UpdatedOnUtc          = DateTime.UtcNow;

            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupDate)
            {
                returnRequest.PickupDate = model.PickupDate;
            }
            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
            {
                returnRequest.PickupAddress = model.PickupAddress.ToEntity();
                if (returnRequest.PickupAddress != null)
                {
                    returnRequest.PickupAddress.CustomAttributes = customAddressAttributes;
                }
            }
            returnRequest.NotifyCustomer = model.NotifyCustomer;
            await _returnRequestService.UpdateReturnRequest(returnRequest);

            //activity log
            await _customerActivityService.InsertActivity("EditReturnRequest", returnRequest.Id, _localizationService.GetResource("ActivityLog.EditReturnRequest"), returnRequest.Id);

            if (model.NotifyCustomer)
            {
                await NotifyCustomer(returnRequest);
            }
            return(returnRequest);
        }
Exemplo n.º 3
0
        private bool PrepareReturnRequestModel(ReturnRequestModel model, ReturnRequest returnRequest, bool excludeProperties)
        {
            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

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

            var orderItem = _orderService.GetOrderItemById(returnRequest.OrderItemId);

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

            var store = _storeService.GetStoreById(returnRequest.StoreId);

            model.Id                     = returnRequest.Id;
            model.ProductId              = orderItem.ProductId;
            model.ProductSku             = orderItem.Product.Sku;
            model.ProductName            = orderItem.Product.Name;
            model.ProductTypeName        = orderItem.Product.GetProductTypeLabel(_localizationService);
            model.ProductTypeLabelHint   = orderItem.Product.ProductTypeLabelHint;
            model.StoreName              = (store != null ? store.Name : "".NaIfEmpty());
            model.OrderId                = orderItem.OrderId;
            model.OrderNumber            = orderItem.Order.GetOrderNumber();
            model.CustomerId             = returnRequest.CustomerId;
            model.CustomerFullName       = returnRequest.Customer.GetFullName().NaIfEmpty();
            model.CanSendEmailToCustomer = returnRequest.Customer.FindEmail().HasValue();
            model.Quantity               = returnRequest.Quantity;
            model.ReturnRequestStatusStr = returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext);
            model.CreatedOn              = _dateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc);
            model.UpdatedOn              = _dateTimeHelper.ConvertToUserTime(returnRequest.UpdatedOnUtc, DateTimeKind.Utc);

            if (!excludeProperties)
            {
                model.ReasonForReturn = returnRequest.ReasonForReturn;
                model.RequestedAction = returnRequest.RequestedAction;

                if (returnRequest.RequestedActionUpdatedOnUtc.HasValue)
                {
                    model.RequestedActionUpdated = _dateTimeHelper.ConvertToUserTime(returnRequest.RequestedActionUpdatedOnUtc.Value, DateTimeKind.Utc);
                }

                model.CustomerComments      = returnRequest.CustomerComments;
                model.StaffNotes            = returnRequest.StaffNotes;
                model.AdminComment          = returnRequest.AdminComment;
                model.ReturnRequestStatusId = returnRequest.ReturnRequestStatusId;
            }

            string unspec = _localizationService.GetResource("Common.Unspecified");

            model.AvailableReasonForReturn.Add(new SelectListItem()
            {
                Text = unspec, Value = ""
            });
            model.AvailableRequestedAction.Add(new SelectListItem()
            {
                Text = unspec, Value = ""
            });

            // that's what we also offer in frontend
            string returnRequestReasons = _orderSettings.GetLocalized(x => x.ReturnRequestReasons, orderItem.Order.CustomerLanguageId, true, false);
            string returnRequestActions = _orderSettings.GetLocalized(x => x.ReturnRequestActions, orderItem.Order.CustomerLanguageId, true, false);

            foreach (var rrr in returnRequestReasons.SplitSafe(","))
            {
                model.AvailableReasonForReturn.Add(new SelectListItem()
                {
                    Text = rrr, Value = rrr, Selected = (rrr == returnRequest.ReasonForReturn)
                });
            }

            foreach (var rra in returnRequestActions.SplitSafe(","))
            {
                model.AvailableRequestedAction.Add(new SelectListItem()
                {
                    Text = rra, Value = rra, Selected = (rra == returnRequest.RequestedAction)
                });
            }

            var urlHelper = new UrlHelper(Request.RequestContext);

            model.AutoUpdateOrderItem.Id                     = returnRequest.Id;
            model.AutoUpdateOrderItem.Caption                = _localizationService.GetResource("Admin.ReturnRequests.Accept.Caption");
            model.AutoUpdateOrderItem.PostUrl                = urlHelper.Action("Accept", "ReturnRequest");
            model.AutoUpdateOrderItem.ShowUpdateTotals       = (orderItem.Order.OrderStatusId <= (int)OrderStatus.Pending);
            model.AutoUpdateOrderItem.ShowUpdateRewardPoints = (orderItem.Order.OrderStatusId > (int)OrderStatus.Pending && orderItem.Order.RewardPointsWereAdded);
            model.AutoUpdateOrderItem.UpdateTotals           = model.AutoUpdateOrderItem.ShowUpdateTotals;
            model.AutoUpdateOrderItem.UpdateRewardPoints     = orderItem.Order.RewardPointsWereAdded;

            model.ReturnRequestInfo = TempData[AutoUpdateOrderItemContext.InfoKey] as string;

            return(true);
        }
Exemplo n.º 4
0
        private bool PrepareReturnRequestModel(
            ReturnRequestModel model,
            ReturnRequest returnRequest,
            Dictionary <int, Store> allStores,
            bool excludeProperties = false,
            bool forList           = false)
        {
            if (model == null)
            {
                throw new ArgumentNullException("model");
            }

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

            var orderItem = _orderService.GetOrderItemById(returnRequest.OrderItemId);

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

            allStores.TryGetValue(returnRequest.StoreId, out Store store);

            model.Id                     = returnRequest.Id;
            model.ProductId              = orderItem.ProductId;
            model.ProductSku             = orderItem.Product.Sku;
            model.ProductName            = orderItem.Product.Name;
            model.ProductTypeName        = orderItem.Product.GetProductTypeLabel(Services.Localization);
            model.ProductTypeLabelHint   = orderItem.Product.ProductTypeLabelHint;
            model.AttributeInfo          = orderItem.AttributeDescription;
            model.OrderId                = orderItem.OrderId;
            model.OrderNumber            = orderItem.Order.GetOrderNumber();
            model.CustomerId             = returnRequest.CustomerId;
            model.CustomerFullName       = returnRequest.Customer.GetFullName().NaIfEmpty();
            model.CanSendEmailToCustomer = returnRequest.Customer.FindEmail().HasValue();
            model.Quantity               = returnRequest.Quantity;
            model.ReturnRequestStatusStr = returnRequest.ReturnRequestStatus.GetLocalizedEnum(Services.Localization, Services.WorkContext);
            model.CreatedOn              = Services.DateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc);
            model.UpdatedOn              = Services.DateTimeHelper.ConvertToUserTime(returnRequest.UpdatedOnUtc, DateTimeKind.Utc);

            if (allStores.Count > 1)
            {
                model.StoreName = store?.Name;
            }

            if (!excludeProperties)
            {
                model.ReasonForReturn = returnRequest.ReasonForReturn;
                model.RequestedAction = returnRequest.RequestedAction;

                if (returnRequest.RequestedActionUpdatedOnUtc.HasValue)
                {
                    model.RequestedActionUpdated = Services.DateTimeHelper.ConvertToUserTime(returnRequest.RequestedActionUpdatedOnUtc.Value, DateTimeKind.Utc);
                }

                model.CustomerComments      = returnRequest.CustomerComments;
                model.StaffNotes            = returnRequest.StaffNotes;
                model.AdminComment          = returnRequest.AdminComment;
                model.ReturnRequestStatusId = returnRequest.ReturnRequestStatusId;
            }

            if (!forList)
            {
                // That's what we also offer in frontend.
                string returnRequestReasons = _orderSettings.GetLocalizedSetting(x => x.ReturnRequestReasons, orderItem.Order.CustomerLanguageId, store?.Id, true, false);
                string returnRequestActions = _orderSettings.GetLocalizedSetting(x => x.ReturnRequestActions, orderItem.Order.CustomerLanguageId, store?.Id, true, false);
                string unspec = T("Common.Unspecified");

                model.AvailableReasonForReturn.Add(new SelectListItem {
                    Text = unspec, Value = ""
                });
                foreach (var rrr in returnRequestReasons.SplitSafe(","))
                {
                    model.AvailableReasonForReturn.Add(new SelectListItem {
                        Text = rrr, Value = rrr, Selected = (rrr == returnRequest.ReasonForReturn)
                    });
                }

                model.AvailableRequestedAction.Add(new SelectListItem {
                    Text = unspec, Value = ""
                });
                foreach (var rra in returnRequestActions.SplitSafe(","))
                {
                    model.AvailableRequestedAction.Add(new SelectListItem {
                        Text = rra, Value = rra, Selected = (rra == returnRequest.RequestedAction)
                    });
                }

                var urlHelper = new UrlHelper(Request.RequestContext);

                model.AutoUpdateOrderItem.Id                     = returnRequest.Id;
                model.AutoUpdateOrderItem.Caption                = T("Admin.ReturnRequests.Accept.Caption");
                model.AutoUpdateOrderItem.PostUrl                = urlHelper.Action("Accept", "ReturnRequest");
                model.AutoUpdateOrderItem.ShowUpdateTotals       = (orderItem.Order.OrderStatusId <= (int)OrderStatus.Pending);
                model.AutoUpdateOrderItem.ShowUpdateRewardPoints = (orderItem.Order.OrderStatusId > (int)OrderStatus.Pending && orderItem.Order.RewardPointsWereAdded);
                model.AutoUpdateOrderItem.UpdateTotals           = model.AutoUpdateOrderItem.ShowUpdateTotals;
                model.AutoUpdateOrderItem.UpdateRewardPoints     = orderItem.Order.RewardPointsWereAdded;

                model.ReturnRequestInfo = TempData[AutoUpdateOrderItemContext.InfoKey] as string;

                // The maximum amount that can be refunded for this return request.
                var maxRefundAmount = Math.Max(orderItem.UnitPriceInclTax * returnRequest.Quantity, 0);
                if (maxRefundAmount > decimal.Zero)
                {
                    model.MaxRefundAmount = _priceFormatter.FormatPrice(maxRefundAmount, true, store.PrimaryStoreCurrency, Services.WorkContext.WorkingLanguage, true, true);
                }
            }

            return(true);
        }
Exemplo n.º 5
0
        /// <summary>
        /// Prepare paged return request list model
        /// </summary>
        /// <param name="searchModel">Return request search model</param>
        /// <returns>Return request list model</returns>
        public virtual ReturnRequestListModel PrepareReturnRequestListModel(ReturnRequestSearchModel searchModel)
        {
            if (searchModel == null)
            {
                throw new ArgumentNullException(nameof(searchModel));
            }

            //get parameters to filter emails
            var startDateValue = !searchModel.StartDate.HasValue ? null
                : (DateTime?)_dateTimeHelper.ConvertToUtcTime(searchModel.StartDate.Value, _dateTimeHelper.CurrentTimeZone);
            var endDateValue = !searchModel.EndDate.HasValue ? null
                : (DateTime?)_dateTimeHelper.ConvertToUtcTime(searchModel.EndDate.Value, _dateTimeHelper.CurrentTimeZone).AddDays(1);
            var returnRequestStatus = searchModel.ReturnRequestStatusId == -1 ? null : (ReturnRequestStatus?)searchModel.ReturnRequestStatusId;

            //get return requests
            var returnRequests = _returnRequestService.SearchReturnRequests(customNumber: searchModel.CustomNumber,
                                                                            rs: returnRequestStatus,
                                                                            createdFromUtc: startDateValue,
                                                                            createdToUtc: endDateValue,
                                                                            pageIndex: searchModel.Page - 1, pageSize: searchModel.PageSize);

            //prepare list model
            var model = new ReturnRequestListModel
            {
                Data = returnRequests.Select(returnRequest =>
                {
                    //fill in model values from the entity
                    var returnRequestModel = new ReturnRequestModel
                    {
                        Id           = returnRequest.Id,
                        CustomNumber = returnRequest.CustomNumber,
                        CustomerId   = returnRequest.CustomerId,
                        Quantity     = returnRequest.Quantity
                    };

                    //convert dates to the user time
                    returnRequestModel.CreatedOn = _dateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc);

                    //fill in additional values (not existing in the entity)
                    returnRequestModel.CustomerInfo = returnRequest.Customer.IsRegistered()
                        ? returnRequest.Customer.Email : _localizationService.GetResource("Admin.Customers.Guest");
                    returnRequestModel.ReturnRequestStatusStr = _localizationService.GetLocalizedEnum(returnRequest.ReturnRequestStatus);
                    var orderItem = _orderService.GetOrderItemById(returnRequest.OrderItemId);
                    if (orderItem == null)
                    {
                        return(returnRequestModel);
                    }

                    returnRequestModel.ProductId         = orderItem.ProductId;
                    returnRequestModel.ProductName       = orderItem.Product.Name;
                    returnRequestModel.OrderId           = orderItem.OrderId;
                    returnRequestModel.AttributeInfo     = orderItem.AttributeDescription;
                    returnRequestModel.CustomOrderNumber = orderItem.Order.CustomOrderNumber;

                    return(returnRequestModel);
                }),
                Total = returnRequests.TotalCount
            };

            return(model);
        }
Exemplo n.º 6
0
        public virtual async Task <IActionResult> ReturnRequestSubmit(string orderId, ReturnRequestModel model, IFormCollection form)
        {
            var order = await _orderService.GetOrderById(orderId);

            if (!order.Access(_workContext.CurrentCustomer))
            {
                return(Challenge());
            }

            if (!await _mediator.Send(new IsReturnRequestAllowedQuery()
            {
                Order = order
            }))
            {
                return(RedirectToRoute("HomePage"));
            }

            ModelState.Clear();

            if (_orderSettings.ReturnRequests_AllowToSpecifyPickupDate && _orderSettings.ReturnRequests_PickupDateRequired && model.PickupDate == null)
            {
                ModelState.AddModelError("", _localizationService.GetResource("ReturnRequests.PickupDateRequired"));
            }

            var address = await PrepareAddress(model, form);

            if (!ModelState.IsValid && ModelState.ErrorCount > 0)
            {
                var returnmodel = await _mediator.Send(new GetReturnRequest()
                {
                    Order    = order,
                    Language = _workContext.WorkingLanguage,
                    Store    = _storeContext.CurrentStore
                });

                returnmodel.Error                 = string.Join(", ", ModelState.Keys.SelectMany(k => ModelState[k].Errors).Select(m => m.ErrorMessage).ToArray());
                returnmodel.Comments              = model.Comments;
                returnmodel.PickupDate            = model.PickupDate;
                returnmodel.NewAddressPreselected = model.NewAddressPreselected;
                returnmodel.NewAddress            = model.NewAddress;
                if (returnmodel.NewAddressPreselected || _orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
                {
                    await PrepareModelAddress(model.NewAddress, address);
                }
                return(View(returnmodel));
            }
            else
            {
                var result = await _mediator.Send(new ReturnRequestSubmitCommand()
                {
                    Address = address, Model = model, Form = form, Order = order
                });

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

                var returnmodel = await _mediator.Send(new GetReturnRequest()
                {
                    Order    = order,
                    Language = _workContext.WorkingLanguage,
                    Store    = _storeContext.CurrentStore
                });

                returnmodel.Error                 = result.model.Error;
                returnmodel.Comments              = model.Comments;
                returnmodel.PickupDate            = model.PickupDate;
                returnmodel.NewAddressPreselected = model.NewAddressPreselected;
                returnmodel.NewAddress            = model.NewAddress;
                if (returnmodel.NewAddressPreselected || _orderSettings.ReturnRequests_AllowToSpecifyPickupAddress)
                {
                    await PrepareModelAddress(model.NewAddress, address);
                }
                return(View(returnmodel));
            }
        }
        public virtual async Task <IActionResult> Edit(ReturnRequestModel model, bool continueEditing)
        {
            if (!await _permissionService.AuthorizeAsync(StandardPermissionProvider.ManageReturnRequests))
            {
                return(AccessDeniedView());
            }

            //try to get a return request with the specified id
            var returnRequest = await _returnRequestService.GetReturnRequestByIdAsync(model.Id);

            if (returnRequest == null)
            {
                return(RedirectToAction("List"));
            }

            if (ModelState.IsValid)
            {
                var quantityToReturn = model.ReturnedQuantity - returnRequest.ReturnedQuantity;
                if (quantityToReturn < 0)
                {
                    _notificationService.ErrorNotification(string.Format(await _localizationService.GetResourceAsync("Admin.ReturnRequests.Fields.ReturnedQuantity.CannotBeLessThanQuantityAlreadyReturned"), returnRequest.ReturnedQuantity));
                }
                else
                {
                    if (quantityToReturn > 0)
                    {
                        var orderItem = await _orderService.GetOrderItemByIdAsync(returnRequest.OrderItemId);

                        if (orderItem != null)
                        {
                            var product = await _productService.GetProductByIdAsync(orderItem.ProductId);

                            if (product != null)
                            {
                                var productStockChangedMessage = string.Format(await _localizationService.GetResourceAsync("Admin.ReturnRequests.QuantityReturnedToStock"), quantityToReturn);

                                await _productService.AdjustInventoryAsync(product, quantityToReturn, orderItem.AttributesXml, productStockChangedMessage);

                                _notificationService.SuccessNotification(productStockChangedMessage);
                            }
                        }
                    }

                    returnRequest = model.ToEntity(returnRequest);
                    returnRequest.UpdatedOnUtc = DateTime.UtcNow;

                    await _returnRequestService.UpdateReturnRequestAsync(returnRequest);

                    //activity log
                    await _customerActivityService.InsertActivityAsync("EditReturnRequest",
                                                                       string.Format(await _localizationService.GetResourceAsync("ActivityLog.EditReturnRequest"), returnRequest.Id), returnRequest);

                    _notificationService.SuccessNotification(await _localizationService.GetResourceAsync("Admin.ReturnRequests.Updated"));

                    return(continueEditing ? RedirectToAction("Edit", new { id = returnRequest.Id }) : RedirectToAction("List"));
                }
            }

            //prepare model
            model = await _returnRequestModelFactory.PrepareReturnRequestModelAsync(model, returnRequest, true);

            //if we got this far, something failed, redisplay form
            return(View(model));
        }