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); }
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); }
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); }
/// <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); }
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)); }