/// <summary>
            /// Removes the items.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <param name="lineIds">The line ids.</param>
            /// <returns>The updated cart.</returns>
            public async Task <Cart> RemoveItems(bool isCheckoutSession, IEnumerable <string> lineIds)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContextBase);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContextBase, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, sessionType);

                Cart cart = await cartOperationsHandler.RemoveItems(cartId, lineIds);

                // For checkout sessions, reflect the changes in shopping cart as well.
                if (sessionType == SessionType.AnonymousCheckout || sessionType == SessionType.SignedInCheckout)
                {
                    string shoppingCartId = null;
                    if (sessionType == SessionType.AnonymousCheckout)
                    {
                        shoppingCartId = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.AnonymousShopping);
                    }
                    else if (sessionType == SessionType.SignedInCheckout)
                    {
                        shoppingCartId = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.SignedInShopping);
                    }

                    await cartOperationsHandler.RemoveItems(shoppingCartId, lineIds);
                }

                cart = await DataAugmenter.GetAugmentedCart(ecommerceContext, cart);

                return(cart);
            }
            /// <summary>
            /// Adds the items.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <param name="cartLines">The cart lines.</param>
            /// <returns>The updated cart.</returns>
            public async Task <Cart> AddItems(bool isCheckoutSession, IEnumerable <CartLine> cartLines)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContextBase);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContextBase, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, sessionType);

                foreach (CartLine cartLine in cartLines)
                {
                    if (cartLine.Price != null && cartLine.Price != 0)
                    {
                        cartLine.IsPriceKeyedIn = true;
                    }
                }

                Cart cart = await cartOperationsHandler.AddItems(cartId, cartLines, sessionType);

                if (cart != null)
                {
                    ServiceUtilities.SetCartIdInResponseCookie(this.HttpContextBase, sessionType, cart.Id);
                }

                cart = await DataAugmenter.GetAugmentedCart(ecommerceContext, cart);

                return(cart);
            }
Пример #3
0
            /// <summary>
            /// Gets the promotions.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <returns>The service response containing the applicable promotions.</returns>
            public async Task <ActionResult> GetPromotions(bool isCheckoutSession)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                CartPromotions cartPromotions = await cartOperationsHandler.GetPromotions(cartId);

                return(this.Json(cartPromotions));
            }
Пример #4
0
            /// <summary>
            /// Updates the loyalty card identifier.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <param name="loyaltyCardId">The loyalty card identifier.</param>
            /// <returns>A response containing the updated shopping cart.</returns>
            public async Task <ActionResult> UpdateLoyaltyCardId(bool isCheckoutSession, string loyaltyCardId)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                Cart cart = await cartOperationsHandler.UpdateLoyaltyCardId(cartId, loyaltyCardId);

                return(this.Json(cart));
            }
Пример #5
0
            /// <summary>
            /// Gets the card payment accept point.
            /// </summary>
            /// <param name="cardPaymentAcceptSettings">The card payment accept settings.</param>
            /// <returns>Returns payment response.</returns>
            public async Task <ActionResult> GetCardPaymentAcceptPoint(CardPaymentAcceptSettings cardPaymentAcceptSettings)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession: true);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                CardPaymentAcceptPoint cardPaymentAcceptPoint = await cartOperationsHandler.GetCardPaymentAcceptPoint(cartId, cardPaymentAcceptSettings);

                return(this.Json(cardPaymentAcceptPoint));
            }
Пример #6
0
            /// <summary>
            /// Updates the line delivery specifications.
            /// </summary>
            /// <param name="lineDeliverySpecifications">The line delivery specifications.</param>
            /// <returns>The updated shopping cart.</returns>
            public async Task <ActionResult> UpdateLineDeliverySpecifications(IEnumerable <LineDeliverySpecification> lineDeliverySpecifications)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession: true);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                Cart cart = await cartOperationsHandler.UpdateLineDeliverySpecifications(cartId, lineDeliverySpecifications);

                return(this.Json(cart));
            }
Пример #7
0
            /// <summary>
            /// Gets the line delivery options for shipping.
            /// </summary>
            /// <param name="lineShippingAddresses">The line shipping addresses.</param>
            /// <param name="queryResultSettings">The query result settings.</param>
            /// <returns>
            /// The service response containing the available delivery options for the specified lines.
            /// </returns>
            public async Task <ActionResult> GetLineDeliveryOptionsForShipping(IEnumerable <LineShippingAddress> lineShippingAddresses, QueryResultSettings queryResultSettings)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession: true);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                PagedResult <SalesLineDeliveryOption> lineDeliveryOptions = await cartOperationsHandler.GetLineDeliveryOptionsForShipping(cartId, lineShippingAddresses, queryResultSettings);

                return(this.Json(lineDeliveryOptions.Results));
            }
Пример #8
0
            /// <summary>
            /// Gets the order delivery options for shipping.
            /// </summary>
            /// <param name="shipToAddress">The ship to address.</param>
            /// <param name="queryResultSettings">The query result settings.</param>
            /// <returns>The service response containing the available delivery options.</returns>
            public async Task <ActionResult> GetOrderDeliveryOptionsForShipping(Address shipToAddress, QueryResultSettings queryResultSettings)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession: true);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                PagedResult <DeliveryOption> deliveryOptions = await cartOperationsHandler.GetOrderDeliveryOptionsForShipping(cartId, shipToAddress, queryResultSettings);

                return(this.Json(deliveryOptions));
            }
Пример #9
0
            /// <summary>
            /// Sets the cart affiliation loyalty tiers.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <param name="tiers">The tiers.</param>
            /// <returns>Returns a null response.</returns>
            public async Task <ActionResult> SetCartAffiliationLoyaltyTiers(bool isCheckoutSession, IEnumerable <long> tiers)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                await cartOperationsHandler.SetCartAffiliationLoyaltyTiers(cartId, tiers);

                return(this.Json(null));
            }
Пример #10
0
            /// <summary>
            /// Adds the or remove promotion code.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <param name="promotionCode">The promotion code.</param>
            /// <param name="isAdd">If set to <c>true</c> [is add].</param>
            /// <returns>The service response containing the updated shopping cart.</returns>
            public async Task <ActionResult> AddOrRemovePromotionCode(bool isCheckoutSession, string promotionCode, bool isAdd)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                Cart cart = await cartOperationsHandler.AddOrRemovePromotionCode(cartId, promotionCode, isAdd);

                return(this.Json(cart));
            }
Пример #11
0
            /// <summary>
            /// Creates the order.
            /// </summary>
            /// <param name="cartTenderLines">The cart tender lines.</param>
            /// <param name="emailAddress">The email address.</param>
            /// <returns>The updated shopping cart response.</returns>
            public async Task <ActionResult> CreateOrder(IEnumerable <CartTenderLine> cartTenderLines, string emailAddress)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContext);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContext, isCheckoutSession: true);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContext, sessionType);

                SalesOrder salesOrder = await cartOperationsHandler.CreateOrder(cartId, cartTenderLines, emailAddress);

                ServiceUtilities.SetCartIdInResponseCookie(this.HttpContext, sessionType, null);

                return(this.Json(salesOrder));
            }
            /// <summary>
            /// Commences the checkout.
            /// </summary>
            /// <returns>Checkout cart.</returns>
            public async Task <Cart> CommenceCheckout()
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContextBase);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                string shoppingCartId;
                string previousCheckoutCartId;
                bool   isSignedIn = this.HttpContextBase.Request.IsAuthenticated;

                if (isSignedIn)
                {
                    shoppingCartId         = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.SignedInShopping);
                    previousCheckoutCartId = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.SignedInCheckout);
                }
                else
                {
                    shoppingCartId         = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.AnonymousShopping);
                    previousCheckoutCartId = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.AnonymousCheckout);
                }

                // Shopping cart would be null if the user lands on the checkout page immediately after signing in.
                // In this case we need to claim the anonymous shopping cart and assign it to the signed in user,
                // because there is no explicit GetShoppingCart call, which implicitly does the claiming, in the checkout page.
                if (string.IsNullOrWhiteSpace(shoppingCartId) && isSignedIn)
                {
                    Cart claimedShoppingCart = await this.GetCart(isCheckoutSession : true);

                    shoppingCartId = claimedShoppingCart.Id;
                    ServiceUtilities.SetCartIdInResponseCookie(this.HttpContextBase, SessionType.SignedInShopping, shoppingCartId);
                }

                Cart checkoutCart = await cartOperationsHandler.CommenceCheckout(shoppingCartId, previousCheckoutCartId);

                if (checkoutCart == null)
                {
                    string message = string.Format("Unable to create a checkout cart from shopping cart id: {0}", shoppingCartId);
                    throw new DataValidationException(DataValidationErrors.Microsoft_Dynamics_Commerce_Runtime_CartNotFound.ToString(), message);
                }

                // Update the checkout cart id cookie.
                SessionType sessionType = isSignedIn ? SessionType.SignedInCheckout : SessionType.AnonymousCheckout;

                ServiceUtilities.SetCartIdInResponseCookie(this.HttpContextBase, sessionType, checkoutCart.Id);

                checkoutCart = await DataAugmenter.GetAugmentedCart(ecommerceContext, checkoutCart);

                return(checkoutCart);
            }
            /// <summary>
            /// Gets the cart.
            /// </summary>
            /// <param name="isCheckoutSession">If set to <c>true</c> [is checkout session].</param>
            /// <returns>The cart object.</returns>
            public async Task <Cart> GetCart(bool isCheckoutSession)
            {
                EcommerceContext      ecommerceContext      = ServiceUtilities.GetEcommerceContext(this.HttpContextBase);
                CartOperationsHandler cartOperationsHandler = new CartOperationsHandler(ecommerceContext);

                SessionType sessionType = ServiceUtilities.GetSessionType(this.HttpContextBase, isCheckoutSession);
                string      cartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, sessionType);

                Cart cart = null;

                if (sessionType == SessionType.AnonymousCheckout || sessionType == SessionType.SignedInCheckout)
                {
                    cart = await cartOperationsHandler.GetCart(cartId);
                }
                else
                {
                    if (sessionType == SessionType.AnonymousShopping)
                    {
                        if (!string.IsNullOrEmpty(cartId))
                        {
                            cart = await cartOperationsHandler.GetCart(cartId);
                        }
                    }
                    else if (sessionType == SessionType.SignedInShopping)
                    {
                        // Get the latest cart associated with the user.
                        Cart activeAuthenticatedShoppingCart = await cartOperationsHandler.GetActiveShoppingCart();

                        string anonymousShoppingCartId      = ServiceUtilities.GetCartIdFromRequestCookie(this.HttpContextBase, SessionType.AnonymousShopping);
                        bool   isAnonymousShoppingCartIdSet = !string.IsNullOrWhiteSpace(anonymousShoppingCartId);

                        if ((activeAuthenticatedShoppingCart == null) && isAnonymousShoppingCartIdSet)
                        {
                            // Claim the shopping cart id present in the cookie.
                            activeAuthenticatedShoppingCart = await cartOperationsHandler.ClaimAnonymousCart(anonymousShoppingCartId);
                        }
                        else if ((activeAuthenticatedShoppingCart != null) && isAnonymousShoppingCartIdSet)
                        {
                            // Move items from the anonymous shopping cart to the authenticated shopping cart.
                            activeAuthenticatedShoppingCart = await cartOperationsHandler.MoveItemsBetweenCarts(anonymousShoppingCartId, activeAuthenticatedShoppingCart.Id, sessionType);
                        }

                        // Clear anonymous shopping cart identifier.
                        ServiceUtilities.SetCartIdInResponseCookie(this.HttpContextBase, SessionType.AnonymousShopping, string.Empty);

                        cart = activeAuthenticatedShoppingCart;
                    }
                    else
                    {
                        string message = string.Format("Invalid session type encountered: {0}.", sessionType);
                        throw new NotSupportedException(message);
                    }

                    if (cart == null)
                    {
                        cart = await cartOperationsHandler.CreateEmptyCart();
                    }
                }

                ServiceUtilities.SetCartIdInResponseCookie(this.HttpContextBase, sessionType, cart.Id);

                cart = await DataAugmenter.GetAugmentedCart(ecommerceContext, cart);

                return(cart);
            }