in src/Foundation/CommerceServer/code/Managers/CartManager.cs [541:592]
public virtual ManagerResponse<CartResult, CommerceCart> MergeCarts([NotNull] CommerceStorefront storefront, [NotNull] IVisitorContext visitorContext, string anonymousVisitorId, Cart anonymousVisitorCart)
{
Assert.ArgumentNotNull(storefront, "storefront");
Assert.ArgumentNotNull(visitorContext, "visitorContext");
Assert.ArgumentNotNullOrEmpty(anonymousVisitorId, "anonymousVisitorId");
var userId = visitorContext.UserId;
var cartResult = this.LoadCartByName(storefront.ShopName, storefront.DefaultCartName, userId, true);
if (!cartResult.Success || cartResult.Cart == null)
{
var message = StorefrontManager.GetSystemMessage(StorefrontConstants.SystemMessages.CartNotFoundError);
cartResult.SystemMessages.Add(new SystemMessage { Message = message });
return new ManagerResponse<CartResult, CommerceCart>(cartResult, cartResult.Cart as CommerceCart);
}
CommerceCart currentCart = (CommerceCart)cartResult.Cart;
var result = new CartResult { Cart = currentCart, Success = true };
if (userId != anonymousVisitorId)
{
var anonymousCartHasPromocodes = (anonymousVisitorCart is CommerceCart) &&
((CommerceCart)anonymousVisitorCart).OrderForms.Any(of => of.PromoCodes.Any());
if (anonymousVisitorCart != null && (anonymousVisitorCart.Lines.Any() || anonymousCartHasPromocodes))
{
if ((currentCart.ShopName == anonymousVisitorCart.ShopName) || (currentCart.ExternalId != anonymousVisitorCart.ExternalId))
{
var mergeCartRequest = new MergeCartRequest(anonymousVisitorCart, currentCart);
result = this._cartServiceProvider.MergeCart(mergeCartRequest);
if (result.Success)
{
var updateCartRequest = new UpdateCartLinesRequest(result.Cart, anonymousVisitorCart.Lines);
updateCartRequest.RefreshCart(true);
result = this._cartServiceProvider.UpdateCartLines(updateCartRequest);
if (result.Success)
{
this._cartServiceProvider.DeleteCart(new DeleteCartRequest(anonymousVisitorCart));
}
}
}
}
}
if (result.Success && result.Cart != null)
{
var cartCache = ContextTypeLoader.CreateInstance<CartCacheHelper>();
cartCache.InvalidateCartCache(anonymousVisitorId);
cartCache.AddCartToCache(result.Cart as CommerceCart);
}
return new ManagerResponse<CartResult, CommerceCart>(result, result.Cart as CommerceCart);
}