public void Can_save_and_load_returnRequest() { var rr = new ReturnRequest() { StoreId = 1, Customer = GetTestCustomer(), Quantity = 2, ReasonForReturn = "Wrong product", RequestedAction = "Refund", CustomerComments = "Some comment", StaffNotes = "Some notes", ReturnRequestStatus = ReturnRequestStatus.ItemsRefunded, CreatedOnUtc = new DateTime(2010, 01, 01), UpdatedOnUtc = new DateTime(2010, 01, 02), }; var fromDb = SaveAndLoadEntity(rr); fromDb.ShouldNotBeNull(); fromDb.StoreId.ShouldEqual(1); fromDb.Customer.ShouldNotBeNull(); fromDb.Quantity.ShouldEqual(2); fromDb.ReasonForReturn.ShouldEqual("Wrong product"); fromDb.RequestedAction.ShouldEqual("Refund"); fromDb.CustomerComments.ShouldEqual("Some comment"); fromDb.StaffNotes.ShouldEqual("Some notes"); fromDb.ReturnRequestStatus.ShouldEqual(ReturnRequestStatus.ItemsRefunded); fromDb.CreatedOnUtc.ShouldEqual(new DateTime(2010, 01, 01)); fromDb.UpdatedOnUtc.ShouldEqual(new DateTime(2010, 01, 02)); }
public virtual string GenerateReturnRequestCustomNumber(ReturnRequest returnRequest) { var customNumber = string.Empty; if (string.IsNullOrEmpty(_orderSettings.ReturnRequestNumberMask)) { customNumber = returnRequest.Id.ToString(); } else { customNumber = _orderSettings.ReturnRequestNumberMask .Replace("{ID}", returnRequest.Id.ToString()) .Replace("{YYYY}", returnRequest.CreatedOnUtc.ToString("yyyy")) .Replace("{YY}", returnRequest.CreatedOnUtc.ToString("yy")) .Replace("{MM}", returnRequest.CreatedOnUtc.ToString("MM")) .Replace("{DD}", returnRequest.CreatedOnUtc.ToString("dd")); //if you need to use the format for the ID with leading zeros, use the following code instead of the previous one. ////mask for Id example {#:00000000} //var rgx = new Regex(@"{#:\d+}"); //var match = rgx.Match(customNumber); //var maskForReplase = match.Value; // //rgx = new Regex(@"\d+"); //match = rgx.Match(maskForReplase); // //var formatValue = match.Value; //if(!string.IsNullOrEmpty(formatValue) && !string.IsNullOrEmpty(maskForReplase)) // customNumber = customNumber.Replace(maskForReplase, returnRequest.Id.ToString(formatValue)); //else // customNumber = customNumber.Insert(0, string.Format("{0}-", returnRequest.Id)); } return customNumber; }
protected virtual 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; model.Id = returnRequest.Id; model.ProductId = orderItem.ProductId; model.ProductName = orderItem.Product.Name; model.OrderId = orderItem.OrderId; model.CustomerId = returnRequest.CustomerId; var customer = returnRequest.Customer; model.CustomerInfo = customer.IsRegistered() ? customer.Email : _localizationService.GetResource("Admin.Customers.Guest"); model.Quantity = returnRequest.Quantity; model.ReturnRequestStatusStr = returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext); model.CreatedOn = _dateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc); if (!excludeProperties) { model.ReasonForReturn = returnRequest.ReasonForReturn; model.RequestedAction = returnRequest.RequestedAction; model.CustomerComments = returnRequest.CustomerComments; model.StaffNotes = returnRequest.StaffNotes; model.ReturnRequestStatusId = returnRequest.ReturnRequestStatusId; } //model is successfully prepared return true; }
/// <summary> /// Deletes a return request /// </summary> /// <param name="returnRequest">Return request</param> public virtual void DeleteReturnRequest(ReturnRequest returnRequest) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); _returnRequestRepository.Delete(returnRequest); //event notification _eventPublisher.EntityDeleted(returnRequest); }
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 opv in order.OrderProductVariants) { int quantity = 0; //parse quantity foreach (string formKey in form.AllKeys) if (formKey.Equals(string.Format("quantity{0}", opv.Id), StringComparison.InvariantCultureIgnoreCase)) { int.TryParse(form[formKey], out quantity); break; } if (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); count++; } } model = PrepareReturnRequestModel(model, order); if (count > 0) model.Result = _localizationService.GetResource("ReturnRequests.Submitted"); else model.Result = _localizationService.GetResource("ReturnRequests.NoItemsSubmitted"); return View(model); }
/// <summary> /// Sends 'Return Request status changed' message to a customer /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="opv">Order product variant</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendReturnRequestStatusChangedCustomerNotification(ReturnRequest returnRequest, OrderProductVariant opv, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); languageId = EnsureLanguageIsActive(languageId); var messageTemplate = GetLocalizedActiveMessageTemplate("ReturnRequestStatusChanged.CustomerNotification", languageId); if (messageTemplate == null) return 0; var orderTokens = GenerateTokens(returnRequest, opv); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, orderTokens); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = returnRequest.Customer.Email; var toName = returnRequest.Customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, orderTokens, toEmail, toName); }
private IList<Token> GenerateTokens(ReturnRequest returnRequest, OrderProductVariant opv) { var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens); _messageTokenProvider.AddCustomerTokens(tokens, returnRequest.Customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, opv); return tokens; }
/// <summary> /// Sends 'Return Request status changed' message to a customer /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="orderItem">Order item</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendReturnRequestStatusChangedCustomerNotification(ReturnRequest returnRequest, OrderItem orderItem, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var store = _storeService.GetStoreById(orderItem.Order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetActiveMessageTemplate("ReturnRequestStatusChanged.CustomerNotification", store.Id); if (messageTemplate == null) return 0; //email account var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store, emailAccount); _messageTokenProvider.AddCustomerTokens(tokens, returnRequest.Customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, orderItem); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); string toEmail = returnRequest.Customer.IsGuest() ? orderItem.Order.BillingAddress.Email : returnRequest.Customer.Email; var toName = returnRequest.Customer.IsGuest() ? orderItem.Order.BillingAddress.FirstName : returnRequest.Customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public virtual void AddReturnRequestTokens(IList<Token> tokens, ReturnRequest returnRequest, OrderItem orderItem) { tokens.Add(new Token("ReturnRequest.ID", returnRequest.Id.ToString())); tokens.Add(new Token("ReturnRequest.OrderId", orderItem.OrderId.ToString())); tokens.Add(new Token("ReturnRequest.Product.Quantity", returnRequest.Quantity.ToString())); tokens.Add(new Token("ReturnRequest.Product.Name", orderItem.Product.Name)); tokens.Add(new Token("ReturnRequest.Reason", returnRequest.ReasonForReturn)); tokens.Add(new Token("ReturnRequest.RequestedAction", returnRequest.RequestedAction)); tokens.Add(new Token("ReturnRequest.CustomerComment", HtmlHelper.FormatText(returnRequest.CustomerComments, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.StaffNotes", HtmlHelper.FormatText(returnRequest.StaffNotes, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.Status", returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext))); //event notification _eventPublisher.EntityTokensAdded(returnRequest, tokens); }
public virtual void AddReturnRequestTokens(IList<Token> tokens, ReturnRequest returnRequest, OrderProductVariant opv) { tokens.Add(new Token("ReturnRequest.ID", returnRequest.Id.ToString())); tokens.Add(new Token("ReturnRequest.Product.Quantity", returnRequest.Quantity.ToString())); tokens.Add(new Token("ReturnRequest.Product.Name", opv.ProductVariant.FullProductName)); tokens.Add(new Token("ReturnRequest.Reason", returnRequest.ReasonForReturn)); tokens.Add(new Token("ReturnRequest.RequestedAction", returnRequest.RequestedAction)); tokens.Add(new Token("ReturnRequest.CustomerComment", HtmlHelper.FormatText(returnRequest.CustomerComments, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.StaffNotes", HtmlHelper.FormatText(returnRequest.StaffNotes, false, true, false, false, false, false), true)); tokens.Add(new Token("ReturnRequest.Status", returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext))); }
/// <summary> /// Sends 'New Return Request' message to a store owner /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="opv">Order product variant</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendNewReturnRequestStoreOwnerNotification(ReturnRequest returnRequest, OrderProductVariant opv, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); languageId = EnsureLanguageIsActive(languageId); var messageTemplate = GetLocalizedActiveMessageTemplate("NewReturnRequest.StoreOwnerNotification", languageId); if (messageTemplate == null) return 0; var orderTokens = GenerateTokens(returnRequest, opv); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = emailAccount.Email; var toName = emailAccount.DisplayName; return SendNotification(messageTemplate, emailAccount, languageId, orderTokens, toEmail, toName); }
private void PrepareReturnRequestModel(ReturnRequestModel model, ReturnRequest returnRequest, bool excludeProperties) { if (model == null) throw new ArgumentNullException("model"); if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var opv = _orderService.GetOrderProductVariantById(returnRequest.OrderProductVariantId); model.Id = returnRequest.Id; model.ProductVariantId = opv.ProductVariantId; //product name if (!String.IsNullOrEmpty(opv.ProductVariant.Name)) model.ProductName = string.Format("{0} ({1})", opv.ProductVariant.Product.Name, opv.ProductVariant.Name); else model.ProductName = opv.ProductVariant.Product.Name; model.OrderId = opv.OrderId; model.CustomerId = returnRequest.CustomerId; model.Quantity = returnRequest.Quantity; model.ReturnRequestStatusStr = returnRequest.ReturnRequestStatus.GetLocalizedEnum(_localizationService, _workContext); model.CreatedOn = _dateTimeHelper.ConvertToUserTime(returnRequest.CreatedOnUtc, DateTimeKind.Utc); if (!excludeProperties) { model.ReasonForReturn = returnRequest.ReasonForReturn; model.RequestedAction = returnRequest.RequestedAction; model.CustomerComments = returnRequest.CustomerComments; model.StaffNotes = returnRequest.StaffNotes; model.ReturnRequestStatusId = returnRequest.ReturnRequestStatusId; } }
/// <summary> /// Sends 'New Return Request' message to a store owner /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="orderItem">Order item</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendNewReturnRequestStoreOwnerNotification(ReturnRequest returnRequest, OrderItem orderItem, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var order = EngineContext.Current.Resolve<IOrderService>().GetOrderById(orderItem.OrderId); var store = _storeService.GetStoreById(order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetActiveMessageTemplate("NewReturnRequest.StoreOwnerNotification", store.Id); if (messageTemplate == null) return 0; //email account var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var customer = EngineContext.Current.Resolve<ICustomerService>().GetCustomerById(returnRequest.CustomerId); //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store, emailAccount); _messageTokenProvider.AddCustomerTokens(tokens, customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, orderItem); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var toEmail = emailAccount.Email; var toName = emailAccount.DisplayName; return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
/// <summary> /// Sends 'Return Request status changed' message to a customer /// </summary> /// <param name="returnRequest">Return request</param> /// <param name="opv">Order product variant</param> /// <param name="languageId">Message language identifier</param> /// <returns>Queued email identifier</returns> public virtual int SendReturnRequestStatusChangedCustomerNotification(ReturnRequest returnRequest, OrderProductVariant opv, int languageId) { if (returnRequest == null) throw new ArgumentNullException("returnRequest"); var store = _storeService.GetStoreById(opv.Order.StoreId) ?? _storeContext.CurrentStore; languageId = EnsureLanguageIsActive(languageId, store.Id); var messageTemplate = GetLocalizedActiveMessageTemplate("ReturnRequestStatusChanged.CustomerNotification", languageId, store.Id); if (messageTemplate == null) return 0; //tokens var tokens = new List<Token>(); _messageTokenProvider.AddStoreTokens(tokens, store); _messageTokenProvider.AddCustomerTokens(tokens, returnRequest.Customer); _messageTokenProvider.AddReturnRequestTokens(tokens, returnRequest, opv); //event notification _eventPublisher.MessageTokensAdded(messageTemplate, tokens); var emailAccount = GetEmailAccountOfMessageTemplate(messageTemplate, languageId); var toEmail = returnRequest.Customer.Email; var toName = returnRequest.Customer.GetFullName(); return SendNotification(messageTemplate, emailAccount, languageId, tokens, toEmail, toName); }
public virtual void AddReturnRequestTokens(IList<Token> tokens, ReturnRequest returnRequest, OrderProductVariant opv) { tokens.Add(new Token("ReturnRequest.ID", returnRequest.Id.ToString())); tokens.Add(new Token("ReturnRequest.Product.Quantity", returnRequest.Quantity.ToString())); tokens.Add(new Token("ReturnRequest.Product.Name", opv.ProductVariant.FullProductName)); tokens.Add(new Token("ReturnRequest.Reason", returnRequest.ReasonForReturn)); tokens.Add(new Token("ReturnRequest.RequestedAction", returnRequest.RequestedAction)); tokens.Add(new Token("ReturnRequest.CustomerComment", HtmlHelper.FormatText(returnRequest.CustomerComments, false, true, false, false, false, false), true)); }