private bool TryResolveSubmittedOrder(CartBase cart, out SubmitVisitorOrderResult managerResponse) { var getVisitorOrdersResult = this.GetOrdersHeaders(cart.CustomerId, cart.ShopName); if (getVisitorOrdersResult.Success) { // Getting the latest order var orderHeader = getVisitorOrdersResult.OrderHeaders .OrderByDescending(x => x.OrderDate) .FirstOrDefault(); if (orderHeader != null) { var getVisitorOrderResult = this.GetOrder( orderHeader.OrderID, orderHeader.CustomerId, orderHeader.ShopName); if (getVisitorOrderResult.Order != null) { managerResponse = new SubmitVisitorOrderResult { Order = getVisitorOrderResult.Order, Success = true }; return(true); } } } managerResponse = null; return(false); }
public ManagerResponse <SubmitVisitorOrderResult, Order> SubmitVisitorOrder(Cart cart) { var request = new SubmitVisitorOrderRequest(cart); try { SubmitVisitorOrderResult visitorOrderResult = this.orderServiceProvider.SubmitVisitorOrder(request); SubmitVisitorOrderResult serviceProviderResult = visitorOrderResult; return(new ManagerResponse <SubmitVisitorOrderResult, Order>( serviceProviderResult, serviceProviderResult.Order)); } catch (Exception ex) { Log.Error(ex.Message, ex, this); // ToDo: fix issues during order submitting: down there: temp implementation of the submit result if (this.TryResolveSubmittedOrder(cart, out ManagerResponse <SubmitVisitorOrderResult, Order> managerResponse)) { return(managerResponse); } throw; } }
public ManagerResponse <SubmitVisitorOrderResult, CommerceOrder> SubmitVisitorOrder(string userId, SubmitOrderInputModel inputModel) { Assert.ArgumentNotNull(inputModel, nameof(inputModel)); var errorResult = new SubmitVisitorOrderResult { Success = false }; var response = CartManager.GetCart(userId, true); if (!response.ServiceProviderResult.Success || response.Result == null) { response.ServiceProviderResult.SystemMessages.ToList().ForEach(m => errorResult.SystemMessages.Add(m)); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, null)); } var cart = (CommerceCart)response.ServiceProviderResult.Cart; if (cart.Lines.Count == 0) { errorResult.SystemMessages.Add(new SystemMessage { Message = DictionaryPhraseRepository.Current.Get("/System Messages/Orders/Submit Order Has Empty Cart", "Cannot submit and order with an empty cart.") }); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, null)); } cart.Email = inputModel.UserEmail; var request = new SubmitVisitorOrderRequest(cart); RefreshCartOnOrdersRequest(request); errorResult = OrderServiceProvider.SubmitVisitorOrder(request); if (errorResult.Success && errorResult.Order != null && errorResult.CartWithErrors == null) { CartCacheHelper.InvalidateCartCache(userId); try { var wasEmailSent = MailManager.SendMail("PurchaseConfirmation", inputModel.UserEmail, string.Join(" ", cart.Parties.FirstOrDefault()?.FirstName, cart.Parties.FirstOrDefault()?.LastName), errorResult.Order.TrackingNumber, errorResult.Order.OrderDate, string.Join(", ", cart.Lines.Select(x => x.Product.ProductName)), cart.Total.Amount.ToCurrency(cart.Total.CurrencyCode)); if (!wasEmailSent) { var message = DictionaryPhraseRepository.Current.Get("/System Messages/Orders/Could Not Send Email Error", "Sorry, the email could not be sent"); //errorResult.SystemMessages.Add(new SystemMessage(message)); } } catch (Exception ex) { Log.Error("Could not send Purchase Confirmation mail message", ex, this); var message = DictionaryPhraseRepository.Current.Get("/System Messages/Orders/Could Not Send Email Error", "Sorry, the email could not be sent"); errorResult.SystemMessages.Add(new SystemMessage(message)); } } errorResult.WriteToSitecoreLog(); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, errorResult.Order as CommerceOrder)); }
public override void Process(ServicePipelineArgs args) { Assert.ArgumentNotNull(args, "args"); Assert.ArgumentNotNull(args.Request, "args.Request"); Assert.ArgumentNotNull(args.Result, "args.Result"); Assert.IsTrue((bool)(args.Request is SubmitVisitorOrderRequest), "args.Request is SubmitVisitorOrderRequest"); Assert.IsTrue((bool)(args.Result is SubmitVisitorOrderResult), "args.Result is SubmitVisitorOrderResult"); SubmitVisitorOrderRequest request = (SubmitVisitorOrderRequest)args.Request; SubmitVisitorOrderResult result = (SubmitVisitorOrderResult)args.Result; CartPipelineContext context = CartPipelineContext.Get(request.RequestContext); Assert.IsNotNull(context, "cartContext"); if (((context.Basket != null) && !context.HasBasketErrors) && result.Success) { foreach (OrderForm orderForm in context.Basket.OrderForms) { foreach (LineItem lineItem in orderForm.LineItems) { var cartLine = request.Cart.Lines.FirstOrDefault(l => l.ExternalCartLineId.Equals(lineItem.LineItemId.ToString("B"), StringComparison.OrdinalIgnoreCase)); if (cartLine == null) { continue; } // Store the image as a string since a dictionary is not serializable and causes problems in C&OM. StringBuilder imageList = new StringBuilder(); foreach (MediaItem image in ((CustomCommerceCartLine)cartLine).Images) { if (image != null) { if (imageList.Length > 0) { imageList.Append("|"); } imageList.Append(image.ID.ToString()); imageList.Append(","); imageList.Append(image.MediaPath); } } lineItem["Images"] = imageList.ToString(); } } PurchaseOrder orderGroup = context.Basket.SaveAsOrder(); TranslateOrderGroupToEntityRequest request2 = new TranslateOrderGroupToEntityRequest(context.UserId, context.ShopName, orderGroup); TranslateOrderGroupToEntityResult result2 = PipelineUtility.RunCommerceConnectPipeline <TranslateOrderGroupToEntityRequest, TranslateOrderGroupToEntityResult>("translate.orderGroupToEntity", request2); result.Order = result2.Cart as Order; } }
/// <summary> /// Submits the visitor order. /// </summary> /// <param name="storefront">The storefront.</param> /// <param name="visitorContext">The visitor context.</param> /// <param name="inputModel">The input model.</param> /// <returns> /// The manager response where the new CommerceOrder is returned in the Result. /// </returns> public ManagerResponse <SubmitVisitorOrderResult, CommerceOrder> SubmitVisitorOrder([NotNull] CommerceStorefront storefront, [NotNull] IVisitorContext visitorContext, [NotNull] SubmitOrderInputModel inputModel) { Assert.ArgumentNotNull(storefront, "storefront"); Assert.ArgumentNotNull(visitorContext, "visitorContext"); Assert.ArgumentNotNull(inputModel, "inputModel"); SubmitVisitorOrderResult errorResult = new SubmitVisitorOrderResult { Success = false }; var response = this._cartManager.GetCurrentCart(storefront, visitorContext, true); if (!response.ServiceProviderResult.Success || response.Result == null) { response.ServiceProviderResult.SystemMessages.ToList().ForEach(m => errorResult.SystemMessages.Add(m)); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, null)); } var cart = (CommerceCart)response.ServiceProviderResult.Cart; if (cart.Lines.Count == 0) { errorResult.SystemMessages.Add(new SystemMessage { Message = StorefrontManager.GetSystemMessage(StorefrontConstants.SystemMessages.SubmitOrderHasEmptyCart) }); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, null)); } var cartChanges = new CommerceCart(); cartChanges.Properties["Email"] = inputModel.UserEmail; var updateCartResult = this._cartManager.UpdateCart(storefront, visitorContext, cart, cartChanges); if (!updateCartResult.ServiceProviderResult.Success) { response.ServiceProviderResult.SystemMessages.ToList().ForEach(m => errorResult.SystemMessages.Add(m)); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, null)); } var request = new SubmitVisitorOrderRequest(cart); request.RefreshCart(true); errorResult = this._orderServiceProvider.SubmitVisitorOrder(request); if (errorResult.Success && errorResult.Order != null && errorResult.CartWithErrors == null) { var cartCache = ContextTypeLoader.CreateInstance <CartCacheHelper>(); cartCache.InvalidateCartCache(visitorContext.GetCustomerId()); } //Helpers.LogSystemMessages(errorResult.SystemMessages, errorResult); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(errorResult, errorResult.Order as CommerceOrder)); }
/// <summary> /// Processes the specified arguments. /// </summary> /// <param name="args">The arguments.</param> public override void Process(ServicePipelineArgs args) { Assert.ArgumentNotNull(args, "args"); Assert.ArgumentNotNull(args.Request, "args.Request"); Assert.ArgumentNotNull(args.Result, "args.Result"); Assert.ArgumentCondition(args.Request is SubmitVisitorOrderRequest, "args.Request", "args.Request is SubmitVisitorOrderRequest"); Assert.ArgumentCondition(args.Result is SubmitVisitorOrderResult, "args.Result", "args.Result is SubmitVisitorOrderResult"); if (args.Result.Success) { SubmitVisitorOrderRequest request = (SubmitVisitorOrderRequest)args.Request; SubmitVisitorOrderResult result = (SubmitVisitorOrderResult)args.Result; Assert.ArgumentNotNull(result.Order, "result.Order"); Assert.IsNotNullOrEmpty(result.Order.ShopName, "result.Order.ShopName"); Assert.IsNotNullOrEmpty(result.Order.ExternalId, "result.Order.ExternalId"); string shopName = request.Cart.ShopName; var userId = Tracker.Current.Contact.Identifiers.Identifier; string engagementPlanName = string.Format(CultureInfo.InvariantCulture, "{0} {1}", new object[] { shopName, this.EngagementPlanName }); Tuple <ID, ID> engagementPlan = this._engagementPlanProvider.GetEaPlanId(shopName, engagementPlanName, this.InitialStateName); this.AddContactToPlan(userId, result.Order, engagementPlan.Item1, engagementPlan.Item2); } }
/// <summary> /// Processes the specified arguments. /// </summary> /// <param name="args">The arguments.</param> public override void Process(ServicePipelineArgs args) { Assert.ArgumentNotNull(args, "args"); Assert.ArgumentNotNull(args.Request, "args.Request"); Assert.ArgumentNotNull(args.Result, "args.Result"); Assert.ArgumentCondition(args.Request is SubmitVisitorOrderRequest, "args.Request", "args.Request is SubmitVisitorOrderRequest"); Assert.ArgumentCondition(args.Result is SubmitVisitorOrderResult, "args.Result", "args.Result is SubmitVisitorOrderResult"); if (args.Result.Success) { if (Tracker.Current != null) { SubmitVisitorOrderResult result = args.Result as SubmitVisitorOrderResult; Order orderFromResult = result.Order; Assert.ArgumentNotNull(orderFromResult, "order result"); var contactId = Guid.Empty; if (Tracker.Current.Contact != null) { contactId = Tracker.Current.Contact.ContactId; } try { var serializedOrder = SerializeOrder(orderFromResult); var outcome = new ContactOutcome(ID.NewID, StorefrontConstants.KnownItemIds.ProductPurchaseOutcome, new ID(contactId)); outcome.CustomValues["ShopName"] = orderFromResult.ShopName; outcome.CustomValues["ExternalId"] = orderFromResult.ExternalId; outcome.CustomValues["Order"] = JsonConvert.SerializeObject(orderFromResult); outcome.MonetaryValue = orderFromResult.Total.Amount; Tracker.Current.RegisterContactOutcome(outcome); } catch (Exception ex) { CommerceLog.Current.Error("SubmitVisitorOrder, OrderOutcome", this, ex); } } } }
/// <summary> /// Submits the visitor order. /// </summary> /// <param name="storefront">The storefront.</param> /// <param name="visitorContext">The visitor context.</param> /// <param name="inputModel">The input model.</param> /// <returns> /// The manager response where the new CommerceOrder is returned in the Result. /// </returns> public ManagerResponse<SubmitVisitorOrderResult, CommerceOrder> SubmitVisitorOrder([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] SubmitOrderInputModel inputModel) { Assert.ArgumentNotNull(storefront, "storefront"); Assert.ArgumentNotNull(visitorContext, "visitorContext"); Assert.ArgumentNotNull(inputModel, "inputModel"); SubmitVisitorOrderResult errorResult = new SubmitVisitorOrderResult { Success = false }; var response = this.CartManager.GetCurrentCart(storefront, visitorContext, true); if (!response.ServiceProviderResult.Success || response.Result == null) { response.ServiceProviderResult.SystemMessages.ToList().ForEach(m => errorResult.SystemMessages.Add(m)); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(errorResult, null); } var cart = (CommerceCart)response.ServiceProviderResult.Cart; if (cart.Lines.Count == 0) { errorResult.SystemMessages.Add(new SystemMessage { Message = StorefrontManager.GetSystemMessage("SubmitOrderHasEmptyCart") }); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(errorResult, null); } var cartChanges = new CommerceCart(); cartChanges.Properties["Email"] = inputModel.UserEmail; var updateCartResult = this.CartManager.UpdateCart(storefront, visitorContext, cart, cartChanges); if (!updateCartResult.ServiceProviderResult.Success) { response.ServiceProviderResult.SystemMessages.ToList().ForEach(m => errorResult.SystemMessages.Add(m)); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(errorResult, null); } var request = new SubmitVisitorOrderRequest(cart); request.RefreshCart(true); errorResult = this.OrderServiceProvider.SubmitVisitorOrder(request); if (errorResult.Success && errorResult.Order != null && errorResult.CartWithErrors == null) { var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>(); cartCache.InvalidateCartCache(visitorContext.GetCustomerId()); } Helpers.LogSystemMessages(errorResult.SystemMessages, errorResult); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(errorResult, errorResult.Order as CommerceOrder); }
public ManagerResponse <SubmitVisitorOrderResult, CommerceOrder> SubmitVisitorOrder([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] SubmitOrderInputModel inputModel) { Assert.ArgumentNotNull(storefront, "storefront"); Assert.ArgumentNotNull(visitorContext, "visitorContext"); Assert.ArgumentNotNull(inputModel, "inputModel"); SubmitVisitorOrderResult result = new SubmitVisitorOrderResult { Success = false }; var response = this.CartManager.GetCurrentCart(storefront, visitorContext, true); if (!response.ServiceProviderResult.Success || response.Result == null) { result.SystemMessages.ToList().AddRange(response.ServiceProviderResult.SystemMessages); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(result, null)); } var cart = (CommerceCart)response.ServiceProviderResult.Cart; if (cart.Lines.Count == 0) { result.SystemMessages.Add(new SystemMessage { Message = StorefrontManager.GetSystemMessage(StorefrontConstants.SystemMessages.SubmitOrderHasEmptyCart) }); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(result, null)); } // payments and billing address will be save as part of submit order var payments = new List <PaymentInfo>(); if (inputModel.CreditCardPayment != null && !string.IsNullOrEmpty(inputModel.CreditCardPayment.PaymentMethodID) && inputModel.BillingAddress != null) { payments.Add(inputModel.CreditCardPayment.ToCreditCardPaymentInfo()); List <Party> parties = cart.Parties.ToList(); parties.Add(inputModel.BillingAddress.ToParty()); cart.Parties = parties.AsSafeReadOnly(); } if (inputModel.GiftCardPayment != null && !string.IsNullOrEmpty(inputModel.GiftCardPayment.PaymentMethodID)) { payments.Add(inputModel.GiftCardPayment.ToGiftCardPaymentInfo()); } if (inputModel.LoyaltyCardPayment != null && !string.IsNullOrEmpty(inputModel.LoyaltyCardPayment.PaymentMethodID)) { payments.Add(inputModel.LoyaltyCardPayment.ToLoyaltyCardPaymentInfo()); } cart.Payment = payments.ToList().AsReadOnly(); var request = new Sitecore.Commerce.Connect.DynamicsRetail.Services.Orders.SubmitVisitorOrderRequest(cart, inputModel.UserEmail); request.RefreshCart(true); result = this.OrderServiceProvider.SubmitVisitorOrder(request); if (result.Success && result.Order != null && result.CartWithErrors == null) { var cartCache = CommerceTypeLoader.CreateInstance <CartCacheHelper>(); cartCache.InvalidateCartCache(visitorContext.GetCustomerId()); } Helpers.LogSystemMessages(result.SystemMessages, result); return(new ManagerResponse <SubmitVisitorOrderResult, CommerceOrder>(result, result.Order as CommerceOrder)); }
public ManagerResponse<SubmitVisitorOrderResult, CommerceOrder> SubmitVisitorOrder([NotNull] CommerceStorefront storefront, [NotNull] VisitorContext visitorContext, [NotNull] SubmitOrderInputModel inputModel) { Assert.ArgumentNotNull(storefront, "storefront"); Assert.ArgumentNotNull(visitorContext, "visitorContext"); Assert.ArgumentNotNull(inputModel, "inputModel"); SubmitVisitorOrderResult result = new SubmitVisitorOrderResult { Success = false }; var response = this.CartManager.GetCurrentCart(storefront, visitorContext, true); if (!response.ServiceProviderResult.Success || response.Result == null) { result.SystemMessages.ToList().AddRange(response.ServiceProviderResult.SystemMessages); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(result, null); } var cart = (CommerceCart)response.ServiceProviderResult.Cart; if (cart.Lines.Count == 0) { result.SystemMessages.Add(new SystemMessage { Message = StorefrontManager.GetSystemMessage("SubmitOrderHasEmptyCart") }); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(result, null); } // payments and billing address will be save as part of submit order var payments = new List<PaymentInfo>(); if (inputModel.CreditCardPayment != null && !string.IsNullOrEmpty(inputModel.CreditCardPayment.PaymentMethodID) && inputModel.BillingAddress != null) { payments.Add(inputModel.CreditCardPayment.ToCreditCardPaymentInfo()); List<Party> parties = cart.Parties.ToList(); parties.Add(inputModel.BillingAddress.ToParty()); cart.Parties = parties.AsSafeReadOnly(); } if (inputModel.GiftCardPayment != null && !string.IsNullOrEmpty(inputModel.GiftCardPayment.PaymentMethodID)) { payments.Add(inputModel.GiftCardPayment.ToGiftCardPaymentInfo()); } if (inputModel.LoyaltyCardPayment != null && !string.IsNullOrEmpty(inputModel.LoyaltyCardPayment.PaymentMethodID)) { payments.Add(inputModel.LoyaltyCardPayment.ToLoyaltyCardPaymentInfo()); } cart.Payment = payments.ToList().AsReadOnly(); var request = new Sitecore.Commerce.Connect.DynamicsRetail.Services.Orders.SubmitVisitorOrderRequest(cart, inputModel.UserEmail); request.RefreshCart(true); result = this.OrderServiceProvider.SubmitVisitorOrder(request); if (result.Success && result.Order != null && result.CartWithErrors == null) { var cartCache = CommerceTypeLoader.CreateInstance<CartCacheHelper>(); cartCache.InvalidateCartCache(visitorContext.GetCustomerId()); } Helpers.LogSystemMessages(result.SystemMessages, result); return new ManagerResponse<SubmitVisitorOrderResult, CommerceOrder>(result, result.Order as CommerceOrder); }