{"version":3,"file":"static/js/67e2de36d6be1da505ef.bundle.js","mappings":"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","sources":["webpack://Msdyn365.Commerce.Online/./src/cart-state/add-product-to-cart.ts?85ba","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-promo-code.ts?2e69","webpack://Msdyn365.Commerce.Online/./src/cart-state/base-cart-state.ts?592c","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-invoices-to-cart.ts?cb4a","webpack://Msdyn365.Commerce.Online/./src/cart-state/add-order-invoice-to-cart.ts?d6f8","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-receipt-email.ts?a0ea","webpack://Msdyn365.Commerce.Online/./src/cart-state/clear-cart-line-delivery-mode.ts?86b9","webpack://Msdyn365.Commerce.Online/./src/cart-state/clear-cart-lines-delivery-information.ts?527a","webpack://Msdyn365.Commerce.Online/./src/cart-state/get-or-create-active-cart.ts?26ce","webpack://Msdyn365.Commerce.Online/./src/cart-state/refresh-cart.ts?3943","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-all-promo-codes.ts?1bb2","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-cart-lines.ts?2e16","webpack://Msdyn365.Commerce.Online/./src/cart-state/remove-promo-codes.ts?ffc1","webpack://Msdyn365.Commerce.Online/./src/cart-state/set-invoice-line-price.ts?9cb9","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-line-delivery-specifications.ts?6d68","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-line-quantity.ts?a037","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart-lines.ts?cd2f","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-cart.ts?8850","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-loyalty-card-id.ts?c304","webpack://Msdyn365.Commerce.Online/./src/cart-state/update-shipping-address.ts?4d06","webpack://Msdyn365.Commerce.Online/./src/data-actions/cart-state-data-action.ts?5695","webpack://Msdyn365.Commerce.Online/./src/data-actions/get-cart-state-data-action.ts?9f8e","webpack://Msdyn365.Commerce.Online/./src/data-actions/get-cart-state.ts?4428","webpack://Msdyn365.Commerce.Online/./src/data-actions/global-state-data-action.ts?901a","webpack://Msdyn365.Commerce.Online/./src/global-state/i-global-state.ts?6850","webpack://Msdyn365.Commerce.Online/./src/global-state/global-state.ts?008e"],"sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Get the quantity limit.\n * @param maxQuantityForCartLineItem - Max quantity for cart line.\n * @param inputItem - The input item.\n * @param inputItem.cartLineToAdd - Cart line to add.\n * @param inputItem.availableQuantity - Available quantity.\n * @param inputItem.shouldEnableStockCheck - Is stock check enabled.\n * @param inputItem.isAddServiceItemToCart - Is add service item to cart.\n * @returns The quantity limit.\n */\nfunction getQuantityLimit(\n maxQuantityForCartLineItem: number | undefined,\n inputItem: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n shouldEnableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }\n): number {\n let quantityLimit: number;\n const defaultSiteMaxQuantity = 10;\n\n if (inputItem.shouldEnableStockCheck === false) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined && inputItem.availableQuantity === undefined) {\n quantityLimit = defaultSiteMaxQuantity;\n } else if (inputItem.availableQuantity === undefined) {\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\n } else if (maxQuantityForCartLineItem === undefined) {\n quantityLimit = inputItem.availableQuantity;\n } else {\n quantityLimit = Math.min(maxQuantityForCartLineItem, inputItem.availableQuantity);\n }\n\n return quantityLimit;\n}\n\n/**\n * Get the index of the item to add.\n * @param lines - The cart lines.\n * @param cartLineToAdd - The cart line to add.\n * @returns The index of the item to add.\n */\nfunction getElementIndex(lines: CartLine[], cartLineToAdd: CartLine): number {\n let elementFoundAt: number = -1;\n const productIdToFind = cartLineToAdd.ProductId;\n\n for (const [index, line] of lines.entries()) {\n if (\n line.ProductId === productIdToFind &&\n (line.DeliveryMode || '') === (cartLineToAdd.DeliveryMode || '') &&\n (line.FulfillmentStoreId || '') === (cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = index;\n\n break;\n }\n }\n\n return elementFoundAt;\n}\n\nasync function addProductsToCartValidateMaxAgainstDefaultOrderSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n for (const inputItem of input) {\n if (inputItem.enableStockCheck && inputItem.availableQuantity) {\n let elementFoundAt: number = -1;\n const productIdToFind = inputItem.cartLineToAdd.ProductId;\n\n for (let i = 0; i < cart.CartLines.length; i++) {\n if (\n cart.CartLines[i].ProductId === productIdToFind &&\n (cart.CartLines[i].DeliveryMode || '') === (inputItem.cartLineToAdd.DeliveryMode || '') &&\n (cart.CartLines[i].FulfillmentStoreId || '') === (inputItem.cartLineToAdd.FulfillmentStoreId || '')\n ) {\n elementFoundAt = i;\n\n break;\n }\n }\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const curQuantity = cartLineToUpdate.Quantity || 0;\n\n if (curQuantity + (inputItem.cartLineToAdd.Quantity || 1) > inputItem.availableQuantity) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n if (\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity'\n ) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return addCartLinesResult;\n }\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n\n return addCartLinesResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nasync function addProductsToCartValidateMaxAgainstSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const maxQuantityForCartLineItem: number | undefined = actionContext.requestContext.app.config.maxQuantityForCartLineItem;\n\n for (const inputItem of input) {\n const quantityLimit: number = getQuantityLimit(maxQuantityForCartLineItem, {\n cartLineToAdd: inputItem.cartLineToAdd,\n availableQuantity: inputItem.availableQuantity,\n shouldEnableStockCheck: inputItem.enableStockCheck,\n isAddServiceItemToCart: inputItem.isAddServiceItemToCart\n });\n const elementFoundAt: number = getElementIndex(cart.CartLines, inputItem.cartLineToAdd);\n\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\n const currentQuantity = cartLineToUpdate.Quantity || 0;\n\n if (currentQuantity + (inputItem.cartLineToAdd.Quantity || 1) > quantityLimit) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n if (\n !inputItem.isAddServiceItemToCart &&\n inputItem.cartLineToAdd &&\n inputItem.cartLineToAdd.Quantity &&\n inputItem.cartLineToAdd.Quantity > quantityLimit\n ) {\n return {\n cart: {\n Id: cart.Id,\n CartLines: cart.CartLines\n },\n status: 'FAILED',\n substatus: 'MAXQUANTITY'\n };\n }\n }\n\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity || 1;\n return cartLine;\n });\n let cartActionResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n cartActionResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return cartActionResult;\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add Cart Line');\n\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\n if (hasInvoiceInCart) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'INVOICEINCART',\n errorDetails: { LocalizedMessage: error.message }\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n }\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\n\n cartActionResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return cartActionResult;\n}\n\n/**\n * Add products to cart without site settings validation.\n * @param cart - The cart.\n * @param actionContext - The action context.\n * @param input - The cart lines to add.\n * @returns The results.\n */\nasync function addProductsToCartWithoutSiteSettings(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n }[]\n): Promise {\n if (!cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const defaultQuantity = 1;\n const newCartLines = input.map(inputItem => {\n const cartLine = { ...inputItem.cartLineToAdd };\n cartLine.Quantity = cartLine.Quantity ?? defaultQuantity;\n return cartLine;\n });\n let addCartLinesResult: ICartActionResultWithCart;\n\n if (cart.Version) {\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\n .then(newCart => {\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\n return addCartLinesResult;\n })\n .catch(error => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add cart lines');\n\n addCartLinesResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return addCartLinesResult;\n });\n }\n\n actionContext.telemetry.warning('Unable to update cart lines, cart version could not be found');\n\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n return addCartLinesResult;\n}\n\nexport async function addProductsToCartInternal(\n cart: Readonly,\n actionContext: IActionContext,\n input: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[]\n): Promise {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, input);\n}\n\nexport async function addProductToCartInternal(\n cart: Readonly,\n cartLineToAdd: CartLine,\n actionContext: IActionContext,\n orderQuantityLimitsFeatureIsEnabled: boolean,\n availableQuantity?: number,\n enableStockCheck?: boolean,\n isAddServiceItemToCart?: boolean,\n isMaxByQuantityValidationFeatureDefined?: boolean,\n shouldSkipSiteSettings?: boolean\n): Promise {\n if (shouldSkipSiteSettings) {\n return addProductsToCartWithoutSiteSettings(cart, actionContext, [{ cartLineToAdd }]);\n }\n\n // Using max from the default order settings if it's defined there and quantity limits feature is enabled.\n // Otherwise use max from site settings or default max 10.\n if (isMaxByQuantityValidationFeatureDefined && orderQuantityLimitsFeatureIsEnabled) {\n return addProductsToCartValidateMaxAgainstDefaultOrderSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n }\n return addProductsToCartValidateMaxAgainstSiteSettings(cart, actionContext, [\n { cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }\n ]);\n}\n\nexport default addProductToCartInternal;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addDiscountCodeAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, Coupon } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addPromoCode(\n cart: Readonly,\n promoCode: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (hasPromoCode(cart, promoCode)) {\n return { cart: undefined, status: 'FAILED', substatus: 'ALREADYADDED' };\n }\n\n return addDiscountCodeAsync({ callerContext: actionContext }, cart.Id, promoCode)\n .then(newCart => {\n // Retail server will still return success if a promo code is not valid,\n // but it won't actually add that promo code. So need to check if promo\n // code is actually in the new cart\n if (hasPromoCode(newCart, promoCode)) {\n return { cart: newCart, status: 'SUCCESS' };\n }\n return { cart: undefined, status: 'FAILED', substatus: 'INVALIDPROMOCODE' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n}\n\nfunction hasPromoCode(cart: Cart, code: string): boolean {\n const codes = cart.Coupons\n ? cart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!.toLowerCase();\n })\n : [];\n return codes.includes(code.toLowerCase());\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { getCatalogId, IActionContext } from '@msdyn365-commerce/core';\nimport {\n Address,\n Cart,\n CartLine,\n ChannelDeliveryOptionConfiguration,\n OrgUnitLocation,\n SimpleProduct\n} from '@msdyn365-commerce/retail-proxy';\nimport {\n AttributeValueBase,\n CommerceProperty,\n LineDeliverySpecification,\n ReleasedProductType\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { action, computed, observable } from 'mobx';\n\nimport { GlobalState } from '../global-state/global-state';\nimport { ICartActionResult, ICartState } from '../state-interfaces/i-cart-state';\nimport addInvoicesToCartInternal from './add-invoices-to-cart';\nimport addOrderInvoiceToCartInternal from './add-order-invoice-to-cart';\nimport addProductToCartInternal, { addProductsToCartInternal } from './add-product-to-cart';\nimport addPromoCodeInternal from './add-promo-code';\nimport { ICartActionResultWithCart } from './cart-action-result';\nimport clearCartLineDeliveryModeInternal from './clear-cart-line-delivery-mode';\nimport clearCartLinesDeliveryInformation from './clear-cart-lines-delivery-information';\nimport getOrCreateActiveCart from './get-or-create-active-cart';\nimport refreshCartInternal from './refresh-cart';\nimport removeAllPromoCodesInternal from './remove-all-promo-codes';\nimport removeCartLineInternal from './remove-cart-lines';\nimport removePromoCodesInternal from './remove-promo-codes';\nimport setInvoiceLinePriceInternal from './set-invoice-line-price';\nimport updateCart from './update-cart';\nimport updateCartLineDeliverySpecificationsInternal from './update-cart-line-delivery-specifications';\nimport updateCartLineQuantityInternal from './update-cart-line-quantity';\nimport updateLoyaltyCardIdInternal from './update-loyalty-card-id';\nimport updateReceiptEmail from './update-receipt-email';\nimport updateShippingAddress from './update-shipping-address';\nimport updateCartLinesInternal from './update-cart-lines';\n\n/**\n * Cart state information.\n */\nexport class BaseCartState extends GlobalState implements ICartState {\n @observable protected _cart: Cart;\n\n @computed public get cart(): Readonly {\n return this._cart;\n }\n\n @observable protected _attributeValues: AttributeValueBase[];\n\n @computed public get attributeValues(): AttributeValueBase[] {\n return this._attributeValues;\n }\n\n @observable protected _extensionProperties: CommerceProperty[];\n\n @computed public get extensionProperties(): CommerceProperty[] {\n return this._extensionProperties;\n }\n\n @computed public get totalItemsInCart(): number {\n if (this._cart.CartLines) {\n return this._cart.CartLines.map(cartLine => cartLine.Quantity || 1).reduce((total, num) => total + num, 0);\n }\n\n return 0;\n }\n\n @observable protected _isProductAddedToCart: boolean;\n\n @computed public get isProductAddedToCart(): boolean {\n return this._isProductAddedToCart;\n }\n\n @computed public get isEmpty(): boolean {\n return !(this._cart.CartLines && this._cart.CartLines.length > 0);\n }\n\n @computed public get hasInvoiceLine(): boolean {\n return !!(this._cart.CartLines && this._cart.CartLines.some(cartline => cartline.IsInvoiceLine === true));\n }\n\n constructor(actionContext: IActionContext) {\n super(actionContext);\n this._cart = {};\n this._attributeValues = [];\n this._extensionProperties = [];\n this._isProductAddedToCart = false;\n }\n\n /**\n * Refreshes the cart by getting it from the server.\n *\n * Other actions should keep cart up to date so shouldn't need to call this\n * outside of initialization but still might be scenarios where a manual\n * refresh is needed.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @returns - The cart action result.\n */\n @action\n public async refreshCart(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n const newCart = await refreshCartInternal(this.cart.Id, this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n\n return { status: 'SUCCESS' };\n }\n\n return { status: 'FAILED' };\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - The input.\n * @param input.product - The product to add to the cart.\n * @param input.count - How many copies of the product to add.\n * @param input.location - The org unit location, used for BuyOnlinePickupInStore scenarios\n * (If you want item to simply be shipped, leave this parameter undefined).\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Is stock check enabled.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @param input.shouldSkipSiteSettings - Should skip site settings.\n * @param input.catalogId - Should skip site settings.\n * @returns Cart action result.\n */\n @action\n public async addProductToCart(input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n shouldSkipSiteSettings?: boolean;\n catalogId?: number;\n }): Promise {\n return this._doAsyncAction(async () => {\n const cartLine: CartLine = {\n CatalogId: input.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: input.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: input.product.ItemId,\n ProductId: input.product.RecordId,\n Quantity: input.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: input.isPriceKeyedIn,\n IsGiftCardLine: input.product.IsGiftCard,\n Price: input.customPrice ? input.customPrice : input.product.Price\n };\n\n if (input.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (input.deliveryMode !== undefined) {\n cartLine.DeliveryMode = input.deliveryMode;\n } else {\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\n cartLine.WarehouseId = input.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\n }\n\n if (input.isAddEmailDeliveryItemToCart) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\n\n // @ts-expect-error\n const orderQuantityLimitsFeatureIsEnabled: boolean = !!input.additionalProperties?.orderQuantityLimitsFeatureIsEnabled;\n const isMaxByQuantityValidationFeatureDefined: boolean = !!input.product.Behavior?.MaximumQuantity;\n return this._doCartOperationWithRetry(() =>\n addProductToCartInternal(\n this.cart,\n cartLine,\n this.actionContext,\n orderQuantityLimitsFeatureIsEnabled,\n input.availableQuantity,\n input.enableStockCheck,\n isAddServiceItemToCart,\n isMaxByQuantityValidationFeatureDefined,\n input.shouldSkipSiteSettings\n )\n );\n });\n }\n\n /**\n * Adds the specified product to the current cart. If product is already in cart\n * will update its cart line, otherwise will add a new cart line to the cart.\n * @param input - Input.\n * @param input.product - Product.\n * @param input.count - Count.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.availableQuantity - Available quantity.\n * @param input.enableStockCheck - Enable stock check.\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\n * @param input.isPriceKeyedIn - Is price keyed in.\n * @param input.customPrice - Custom price.\n * @param input.deliveryMode - Delivery mode.\n * @returns Cart action result.\n */\n @action\n public async addProductsToCart(\n input: {\n product: SimpleProduct;\n count?: number;\n location?: OrgUnitLocation;\n additionalProperties?: object;\n availableQuantity?: number;\n enableStockCheck?: boolean;\n isAddEmailDeliveryItemToCart?: boolean;\n isPriceKeyedIn?: boolean;\n customPrice?: number;\n deliveryMode?: string;\n catalogId?: number;\n }[]\n ): Promise {\n return this._doAsyncAction(async () => {\n const internalInput: {\n cartLineToAdd: CartLine;\n availableQuantity?: number;\n isStockCheckEnabled?: boolean;\n isAddServiceItemToCart?: boolean;\n }[] = [];\n\n for (const inputItem of input) {\n const cartLine: CartLine = {\n CatalogId: inputItem.catalogId ?? getCatalogId(this.actionContext.requestContext),\n Description: inputItem.product.Description,\n\n // TODO: Investigate this value and what it represents\n EntryMethodTypeValue: 3,\n ItemId: inputItem.product.ItemId,\n ProductId: inputItem.product.RecordId,\n Quantity: inputItem.count || 1,\n TrackingId: '',\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\n IsGiftCardLine: inputItem.product.IsGiftCard,\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price\n };\n\n if (inputItem.location) {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n // If curbside pick is not available use the default one\n if (inputItem.deliveryMode !== undefined) {\n cartLine.DeliveryMode = inputItem.deliveryMode;\n } else {\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n }\n\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\n }\n\n if (inputItem.isAddEmailDeliveryItemToCart) {\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\n }\n\n // Check if the product is service or not by product type\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\n\n internalInput.push({\n cartLineToAdd: cartLine,\n availableQuantity: inputItem.availableQuantity,\n isStockCheckEnabled: inputItem.enableStockCheck,\n isAddServiceItemToCart\n });\n }\n\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(this.cart, this.actionContext, internalInput));\n });\n }\n\n /**\n * Adds the specified invoices to the current cart.\n * @param input - The input.\n * @param input.invoiceIds - Invoice Ids.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addInvoicesToCart(input: { invoiceIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addInvoicesToCartInternal(this.cart, input.invoiceIds, this.actionContext));\n });\n }\n\n /**\n * Adds the specified order invoice to the current cart.\n * @param input - Input.\n * @param input.invoiceId - Invoice id.\n * @param input.lineDescription - Line description.\n * @param input.additionalProperties - Additional properties.\n * @returns Cart action result.\n */\n @action\n public async addOrderInvoiceToCart(input: {\n invoiceId: string;\n lineDescription: string;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n addOrderInvoiceToCartInternal(this.cart, input.invoiceId, input.lineDescription, this.actionContext)\n );\n });\n }\n\n /**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param input - Input for the operation.\n * @param input.cartLineId - The cart line with the invoice for which to update the price.\n * @param input.price - The new value of price of the invoice.\n * @returns The cart action result.\n */\n @action public async setInvoiceLinePrice(input: { cartLineId: string | null; price: number }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n setInvoiceLinePriceInternal(this.cart, input.cartLineId, input.price, this.actionContext)\n );\n });\n }\n\n /**\n * Removes the cart lines with the provided ids from the cart.\n * @param input - Input.\n * @param input.cartLineIds - Cart line ids.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async removeCartLines(input: { cartLineIds: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeCartLineInternal(this.cart, input.cartLineIds, this.actionContext));\n });\n }\n\n /**\n * Clears the pickup location information from the provided cart line,\n * resulting in it getting shipped to the customer.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinePickupLocation(input: { cartLineId: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => clearCartLineDeliveryModeInternal(this.cart, input.cartLineId, this.actionContext));\n });\n }\n\n /**\n * Clears the delivery mode, and other information for the shipping cart lines.\n * @param input - Input.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfiguration -- Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async clearCartLinesDeliveryInformation(input: {\n additionalProperties?: object;\n channelDeliveryOptionConfiguration?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n clearCartLinesDeliveryInformation(this.cart, this.actionContext, input.channelDeliveryOptionConfiguration)\n );\n });\n }\n\n /**\n * Marks the provided cart line for pickup in store, with the provided location as\n * the pickup location.\n * @param input - Input.\n * @param input.cartLineId - Cart line id.\n * @param input.location - Location.\n * @param input.additionalProperties - Additional properties.\n * @param input.deliveryMode - Delivery mode.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupLocation(input: {\n cartLineId: string;\n location: OrgUnitLocation;\n additionalProperties?: object;\n deliveryMode?: string;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (!this.actionContext.requestContext.channel) {\n return { status: 'FAILED' };\n }\n\n const cartLineDeliverySpecification = {\n LineId: input.cartLineId,\n DeliverySpecification: {\n DeliveryModeId:\n input.deliveryMode !== undefined\n ? input.deliveryMode\n : this.actionContext.requestContext.channel.PickupDeliveryModeCode,\n DeliveryPreferenceTypeValue: 2, // Pick up in store\n PickUpStoreId: input.location.OrgUnitNumber,\n DeliveryAddress: this._buildAddressFromOrgUnitLocation(input.location)\n }\n };\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, [cartLineDeliverySpecification], this.actionContext)\n );\n });\n }\n\n /**\n * Updates cart line pick up date.\n * @param input - The cart line.\n * @param input.lineDeliverySpecifications - Line delivery specifications.\n * @returns The cart action result.\n */\n @action\n public async updateCartLinePickupDateTimeslot(input: {\n lineDeliverySpecifications: LineDeliverySpecification[];\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, input.lineDeliverySpecifications, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the delivery mode for items in the cart with the desired delivery mode, preserving BOPIS status for stuff already marked as BOPIS.\n * @param input - The input.\n * @param input.deliveryModeId - Delivery mode id.\n * @param input.shippingAddress - Shipping address.\n * @param input.additionalProperties - Additional properties.\n * @param input.channelDeliveryOptionConfig - Channel delivery option configuration.\n * @returns The cart action result.\n */\n @action\n public async updateCartDeliverySpecification(input: {\n deliveryModeId: string;\n shippingAddress: Address | undefined;\n additionalProperties?: object;\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration;\n }): Promise {\n return this._doAsyncAction(async () => {\n if (input.deliveryModeId.trim() === '') {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n const pickupDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.EmailDeliveryModeCode;\n let cartLinesForShipping: CartLine[] = [];\n\n cartLinesForShipping =\n input.channelDeliveryOptionConfig !== undefined\n ? (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !==\n input.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(\n deliveryMode => deliveryMode === cartLine.DeliveryMode\n ) && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n )\n : (this.cart.CartLines || []).filter(cartLine =>\n cartLine.DeliveryMode && cartLine.DeliveryMode !== ''\n ? cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode\n : cartLine\n );\n\n if (cartLinesForShipping.length > 0) {\n const deliverySpecifications = cartLinesForShipping.map(cartLine => {\n return {\n LineId: cartLine.LineId,\n DeliverySpecification: {\n DeliveryModeId: input.deliveryModeId,\n DeliveryPreferenceTypeValue: 1, // Ship\n DeliveryAddress: input.shippingAddress\n }\n };\n });\n\n return this._doCartOperationWithRetry(() =>\n updateCartLineDeliverySpecificationsInternal(this.cart, deliverySpecifications, this.actionContext)\n );\n }\n\n return { status: 'FAILED', substatus: 'NOCONTENT' };\n });\n }\n\n /**\n * Updates the quantity of the cart line.\n * @param input - The input.\n * @param input.cartLineId - Cart line id.\n * @param input.newQuantity - New quantity.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateCartLineQuantity(input: {\n cartLineId: string;\n newQuantity: number;\n additionalProperties?: object;\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLineQuantityInternal(\n this.cart,\n input.cartLineId,\n input.newQuantity,\n this.actionContext,\n\n // @ts-expect-error\n input.additionalProperties?.isUsingDefaultOrderSettingsMax\n )\n );\n });\n }\n\n /**\n * Updates the loyalty card ID on the card.\n * @param input - The input.\n * @param input.loyaltyCardNumber - The loyalty card id to use.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateLoyaltyCardId(input: {\n loyaltyCardNumber: string | undefined;\n additionalProperties?: object;\n }): Promise {\n if (!input.loyaltyCardNumber) {\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateLoyaltyCardIdInternal(this.cart, input.loyaltyCardNumber!, this.actionContext)\n );\n });\n }\n\n /**\n * Adds promo code to the cart.\n * @param input - The input.\n * @param input.promoCode - The promo code to add.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public addPromoCode(input: { promoCode: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => addPromoCodeInternal(this.cart, input.promoCode, this.actionContext));\n });\n }\n\n /**\n * Removes promo codes from the cart.\n * @param input - The input.\n * @param input.promoCodes - The promo codes to remove.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removePromoCodes(input: { promoCodes: string[]; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removePromoCodesInternal(this.cart, input.promoCodes, this.actionContext));\n });\n }\n\n /**\n * Removes all promo code from the cart.\n * @param input - The input.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public removeAllPromoCodes(input: { additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => removeAllPromoCodesInternal(this.cart, this.actionContext));\n });\n }\n\n /**\n * Updates receipt email.\n * @param input - The input.\n * @param input.newEmail - The receipt email.\n * @param input.additionalProperties - Additional properties.\n * @returns The cart action result.\n */\n @action\n public async updateReceiptEmail(input: { newEmail: string; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateReceiptEmail(this.cart, input.newEmail, this.actionContext));\n });\n }\n\n /**\n * Updates shipping address.\n * @param input - The input.\n * @param input.newShippingAddress - The shipping address.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateShippingAddress(input: {\n newShippingAddress: Address;\n additionalProperties?: { [key: string]: unknown };\n }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(async () =>\n updateShippingAddress(this.cart, input.newShippingAddress, this.actionContext)\n );\n });\n }\n\n /**\n * Updates the attribute values.\n * @param input - The input.\n * @param input.newAttributeValues - The new attribute values to update.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateAttributeValues(input: {\n newAttributeValues: AttributeValueBase[];\n additionalProperties?: object;\n }): Promise {\n this._attributeValues = input.newAttributeValues;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n AttributeValues: input.newAttributeValues\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates the extension properties.\n * @param input - The input.\n * @param input.newExtensionProperties - The new extension properties.\n * @param input.additionalProperties - The additional properties.\n * @returns ICartActionResult.\n */\n @action\n public async updateExtensionProperties(input: {\n newExtensionProperties: CommerceProperty[];\n additionalProperties?: object;\n }): Promise {\n this._extensionProperties = input.newExtensionProperties;\n const newCartObject: Cart = {\n Id: this.cart.Id,\n ExtensionProperties: input.newExtensionProperties\n };\n return this.updateCart({ newCartObject });\n }\n\n /**\n * Updates cart object.\n * @param input - The input.\n * @param input.newCartObject - The new cart object.\n * @param input.additionalProperties - Additional properties.\n * @returns Promise of cart action result.\n */\n @action\n public async updateCart(input: { newCartObject: Cart; additionalProperties?: object }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() => updateCart(this.cart, input.newCartObject, this.actionContext));\n });\n }\n\n /**\n * Updates cartLines objects in cart.\n * @param input - The input.\n * @param input.updatedCartLinesObject - updated cartline.\n * @returns ICartActionResult.\n */\n @action\n public async updateCartLines(input: { updatedCartLinesObject: CartLine[] }): Promise {\n return this._doAsyncAction(async () => {\n return this._doCartOperationWithRetry(() =>\n updateCartLinesInternal(this.cart, input.updatedCartLinesObject, this.actionContext)\n );\n });\n }\n\n /**\n * Initialize function.\n */\n public async initialize(): Promise {\n if (this.isInitialized) {\n return;\n }\n\n const newCart = await getOrCreateActiveCart(this.actionContext);\n\n if (newCart) {\n this._cart = newCart;\n this._status = 'READY';\n } else {\n this._status = 'ERROR';\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Validates inventory across cart lines.\n * @param callback - Callback function.\n * @returns ICartActionResult.\n */\n private async _doCartOperationWithRetry(callback: () => Promise): Promise {\n let callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n } else {\n const refreshCartResult = await this.refreshCart({});\n\n if (refreshCartResult.status === 'SUCCESS') {\n callbackResult = await callback();\n\n if (callbackResult.status === 'SUCCESS') {\n if (callbackResult.cart) {\n this._cart = callbackResult.cart;\n }\n }\n }\n }\n\n if (callbackResult.status === 'SUCCESS' && callbackResult.substatus && callbackResult.substatus === 'PRODUCTADDED') {\n this._isProductAddedToCart = true;\n } else {\n this._isProductAddedToCart = false;\n }\n\n return {\n status: callbackResult.status,\n substatus: callbackResult.substatus,\n errorDetails: callbackResult.errorDetails,\n validationResults: callbackResult.validationResults\n };\n }\n\n /**\n * Build address from org unit location.\n * @param location - The location.\n * @returns Address.\n */\n private _buildAddressFromOrgUnitLocation(location: OrgUnitLocation): Address {\n return {\n RecordId: location.PostalAddressId,\n Name: location.OrgUnitName,\n FullAddress: location.Address,\n Street: location.Street,\n StreetNumber: location.StreetNumber,\n City: location.City,\n DistrictName: location.DistrictName,\n BuildingCompliment: location.BuildingCompliment,\n Postbox: location.Postbox,\n ThreeLetterISORegionName: location.Country,\n ZipCode: location.Zip,\n County: location.County,\n CountyName: location.CountyName,\n State: location.State,\n StateName: location.StateName\n };\n }\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Cart, CartsDataActions, CommerceException } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addInvoicesToCartInternal(\n cart: Readonly,\n invoiceIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!invoiceIds || invoiceIds.length === 0) {\n actionContext.telemetry.trace('Invoice ids are empty, unable to add invoices to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return CartsDataActions.addInvoicesAsync({ callerContext: actionContext }, cart.Id, invoiceIds)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add invoices to cart');\n\n // Error object comes from API and doesn't have type definitions yet.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- No type definition for error.\n const errorDetails: CommerceException = error.data;\n const errorResult: ICartActionResultWithCart = { cart: undefined, status: 'FAILED', errorDetails };\n return errorResult;\n });\n }\n actionContext.telemetry.warning('Unable to add invoices, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { addOrderInvoiceAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function addOrderInvoiceToCartInternal(\n cart: Readonly,\n invoiceId: string,\n lineDescription: string,\n actionContext: IActionContext\n): Promise {\n if (!invoiceId || invoiceId === '') {\n actionContext.telemetry.trace('Invoice id is empty, unable to add invoice to cart.');\n return { cart, status: 'FAILED', substatus: 'EMPTYINPUT' };\n }\n\n if (cart.Version) {\n return addOrderInvoiceAsync({ callerContext: actionContext }, cart.Id, invoiceId, lineDescription)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.trace(error);\n actionContext.telemetry.trace('Unable to add order invoice to cart');\n\n const resultWithCart: ICartActionResultWithCart = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message }\n };\n\n return resultWithCart;\n });\n }\n actionContext.telemetry.warning('Unable to add order invoice, Cart Version could not be found');\n\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateReceiptEmail(\n cart: Readonly,\n email: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ReceiptEmail: email\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to add receipt email to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLineDeliveryMode(\n cart: Readonly,\n cartLineId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.DeliveryMode = '';\n copyCartLine.FulfillmentStoreId = '';\n copyCartLine.ShippingAddress = {};\n copyCartLine.WarehouseId = actionContext.requestContext.channel?.InventLocation || cart.WarehouseId;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine, ChannelDeliveryOptionConfiguration } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport { cloneDeep } from 'lodash';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function clearCartLinesDeliveryInformation(\n cart: Readonly,\n actionContext: IActionContext,\n channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n let matchingLines: CartLine[] = [];\n const pickupDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode =\n actionContext && actionContext.requestContext && actionContext.requestContext.channel?.EmailDeliveryModeCode;\n if (channelDeliveryOptionConfig !== undefined) {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(dM => dM === cartLine.DeliveryMode) &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n } else {\n matchingLines = cart.CartLines.filter(\n cartLine =>\n cartLine.DeliveryMode &&\n cartLine.DeliveryMode !== pickupDeliveryModeCode &&\n cartLine.DeliveryMode !== emailDeliveryModeCode &&\n cartLine.LineId\n );\n }\n\n // If there are no lines needing updates, just return success\n if (matchingLines.length === 0) {\n return { cart, status: 'SUCCESS' };\n }\n\n const copiedLines: CartLine[] = cloneDeep(matchingLines);\n\n copiedLines.forEach(line => {\n line.DeliveryMode = '';\n line.FulfillmentStoreId = '';\n line.ShippingAddress = {};\n });\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, copiedLines, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\nimport {\n addCartLinesAsync,\n addCouponsAsync,\n createCartAsync,\n readAsync,\n removeCartLinesAsync,\n searchAsync,\n updateAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport {\n getChannelDeliveryOptionConfigurationAsync,\n getCustomerLoyaltyCardsAsync,\n getFeatureStatesAsync\n} from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\nimport {\n Cart,\n CartLine,\n CartSearchCriteria,\n Coupon,\n QueryResultSettings\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\nimport isEmpty from 'lodash/isEmpty';\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nexport default async function getOrCreateActiveCart(ctx: IActionContext): Promise {\n let cart: Cart | undefined;\n const cartCookie: string = ctx.requestContext.cookies.getCartCookie();\n const cartCookieParts: string[] = cartCookie.split(':');\n try {\n // Check if there are already is a cart cookie and it is in the format we understand\n cart = await getCartFromCookie(cartCookieParts, ctx);\n const wasReadFromCookie = !!cart && cart.Id;\n\n // If the customer is authenticated, and the auth cookie didn't give us a cart OR doesn't have a cookie, search for the customer's cart\n if (!(cart && cart.Id)) {\n cart = await getCartFromCustomer(ctx);\n }\n\n // If the customer just went from anon to signed in state then get that anon cart\n // if the search of carts didn't result in a cart, claim the current anon cart as a new auth cart for the customer\n // if the search resulted in a cart, and the read also resulted in cart, then go ahead an merge the carts\n const anonCart = await claimAnonCart(cartCookieParts, cart, ctx);\n if (anonCart) {\n cart = anonCart;\n }\n\n // If there is no cookie or everything else fails, create an empty cart and return that for the customer\n if (!(cart && cart.Id)) {\n cart = await createNewCart(ctx);\n }\n if (!wasReadFromCookie && ctx.requestContext.user.isAuthenticated && cart && !cart.LoyaltyCardId) {\n const card = await getCustomerLoyaltyCardsAsync({ callerContext: ctx, queryResultSettings: {} }, null);\n if (card && card.length > 0) {\n cart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cart.Id,\n LoyaltyCardId: card[0].CardNumber\n }\n );\n }\n }\n } catch (error) {\n ctx.telemetry.error(`Caught exception in getting cart: ${error}`);\n cart = await createNewCart(ctx);\n }\n return cart;\n}\n\n/**\n * Function to check cart exception due to product no available\n *\n * @param ctx Request context.\n * @param errorObj Error Object.\n */\nfunction handleItemDiscontinuedException(ctx: IActionContext, errorObj: object): boolean {\n const error = errorObj as Error;\n let response = false;\n if (error && error.name === 'Microsoft_Dynamics_Commerce_Runtime_ItemDiscontinuedFromChannel') {\n ctx.telemetry.information('Caught cart ItemDiscontinuedException error.');\n response = true;\n }\n\n return response;\n}\n\nexport async function createNewCart(ctx: IActionContext): Promise {\n const newCart = await createCartAsync({ callerContext: ctx }, {});\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n\n return newCart;\n }\n\n return undefined;\n}\n\nexport async function getCartFromCookie(cartCookieParts: string[], ctx: IActionContext): Promise {\n let readCart: Cart | undefined;\n let readCartId: string = '';\n\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n if (cartCookieParts && cartCookieParts.length === 2) {\n // If the customer is authenticated and they have an auth cookie\n // OR if the customer is not authenticated and then have an anon cookie\n // just get the cart and return that\n\n if (\n (isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\n (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)\n ) {\n try {\n readCartId = cartCookieParts[1];\n const readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n\n if (readCart && readCart.Id) {\n ctx.requestContext.cookies.setCartCookie(readCart, ctx.requestContext.user.isAuthenticated);\n return readCart;\n }\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, readCartId);\n }\n ctx.telemetry.error('Error getting cart based on saved card id');\n ctx.telemetry.exception(error);\n }\n }\n }\n\n return readCart;\n}\n\nexport async function getCartFromCustomer(ctx: IActionContext): Promise {\n if (ctx.requestContext.user.isAuthenticated) {\n const authCarts = await searchCarts(ctx);\n if (authCarts && authCarts.length > 0) {\n ctx.requestContext.cookies.setCartCookie(authCarts[0], ctx.requestContext.user.isAuthenticated);\n return authCarts[0];\n }\n }\n\n return undefined;\n}\n\nexport async function claimAnonCart(\n cartCookieParts: string[],\n currentCart: Cart | undefined,\n ctx: IActionContext\n): Promise {\n let anonCurrentCart: Cart | undefined;\n\n if (\n ctx.requestContext.user.isAuthenticated &&\n cartCookieParts &&\n cartCookieParts.length === 2 &&\n cartCookieParts[0] === CartTokenPrefix.Anon\n ) {\n try {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n } catch (error) {\n if (handleItemDiscontinuedException(ctx, error)) {\n anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\n }\n }\n\n if (anonCurrentCart && !currentCart) {\n const newCart = await claimCart(anonCurrentCart.Id, ctx);\n if (newCart && newCart.Id) {\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\n return newCart;\n }\n }\n\n if (anonCurrentCart && anonCurrentCart.Id && currentCart) {\n const mergedCart = await addCartLines(anonCurrentCart, currentCart, ctx);\n\n // Once updated, take that merged cart ID and store the cart ID in the cookie\n if (!(mergedCart instanceof Error) && mergedCart.Id) {\n ctx.requestContext.cookies.setCartCookie(mergedCart, ctx.requestContext.user.isAuthenticated);\n return mergedCart;\n }\n }\n }\n\n return undefined;\n}\n\n/**\n * Function that copies a cartline for giftcard.\n * @param cartline Source CartLine you want to copy.\n */\nfunction buildGiftCardLine(cartline: CartLine): CartLine {\n return {\n DeliveryMode: cartline.DeliveryMode,\n CatalogId: cartline.CatalogId,\n Description: cartline.Description,\n EntryMethodTypeValue: cartline.EntryMethodTypeValue || 3,\n ItemId: cartline.ItemId,\n ProductId: cartline.ProductId,\n Quantity: cartline.Quantity,\n Price: cartline.Price,\n NetPrice: cartline.NetPrice,\n GiftCardBalance: cartline.GiftCardBalance,\n TrackingId: '',\n UnitOfMeasureSymbol: cartline.UnitOfMeasureSymbol,\n IsPriceKeyedIn: true,\n IsGiftCardLine: true,\n ExtensionProperties: cartline.ExtensionProperties\n };\n}\n\n/**\n * Function that adds cart lines from source cart to destination cart.\n * @param sourceCart Source cart you want to add cart lines from.\n * @param destinationCart Destination cart that you want to add cart lines to.\n * @param ctx Request context.\n */\nexport async function addCartLines(sourceCart: Cart, destinationCart: Cart, ctx: IActionContext): Promise {\n let updatedCart;\n const cartLines: CartLine[] = [];\n const cartLinesToDelete: string[] = [];\n let hasShippingMethod: boolean;\n const channelConfiguration = ctx.requestContext.channel;\n const featureNames: string[] = [\n 'Dynamics.AX.Application.RetailB2BEcommerceFeature',\n 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature',\n 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n ];\n if (destinationCart.Version) {\n if (sourceCart.CartLines && sourceCart.CartLines.length > 0) {\n for (const cartline of sourceCart.CartLines) {\n let newCartLine: CartLine;\n\n if (cartline.IsGiftCardLine) {\n newCartLine = buildGiftCardLine(cartline);\n } else {\n newCartLine = {};\n const featureStates = await getFeatureStatesAsync({ callerContext: ctx }, featureNames);\n const isfeatureStatesEnabled =\n featureStates?.find(\n (featureState: FeatureState) =>\n featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\n )?.IsEnabled || false;\n if (isfeatureStatesEnabled) {\n const channelDeliveryOptionConfig = await getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx });\n hasShippingMethod =\n cartline.DeliveryMode ===\n channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(\n (deliveryMode: string) => deliveryMode === cartline.DeliveryMode\n );\n\n if (cartline.DeliveryMode !== undefined && hasShippingMethod) {\n newCartLine.DeliveryMode = cartline.DeliveryMode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n } else if (!isEmpty(cartline.DeliveryMode) && cartline.DeliveryMode === channelConfiguration?.PickupDeliveryModeCode) {\n newCartLine.DeliveryMode = channelConfiguration?.PickupDeliveryModeCode;\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\n newCartLine.ShippingAddress = cartline.ShippingAddress;\n newCartLine.WarehouseId = cartline.WarehouseId;\n }\n newCartLine.ProductId = cartline.ProductId;\n newCartLine.Quantity = cartline.Quantity;\n newCartLine.ExtensionProperties = cartline.ExtensionProperties;\n newCartLine.Description = cartline.Description;\n newCartLine.ReasonCodeLines = cartline.ReasonCodeLines;\n newCartLine.AttributeValues = cartline.AttributeValues;\n newCartLine.CatalogId = cartline.CatalogId;\n if (cartline.IsPriceKeyedIn) {\n newCartLine.Price = cartline.Price;\n newCartLine.IsPriceKeyedIn = cartline.IsPriceKeyedIn;\n }\n }\n\n cartLines.push({ ...newCartLine });\n if (cartline.LineId) {\n cartLinesToDelete.push(cartline.LineId);\n }\n }\n }\n\n if (cartLines.length > 0) {\n try {\n updatedCart = await addCartLinesAsync({ callerContext: ctx }, destinationCart.Id, cartLines, destinationCart.Version);\n\n if (cartLinesToDelete.length > 0) {\n sourceCart = await removeCartLinesAsync({ callerContext: ctx }, sourceCart.Id, cartLinesToDelete);\n }\n } catch (error) {\n ctx.telemetry.error('Error adding cart lines to desination cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n\n // Copy over coupon codes from source cart to destination cart so that the customer doesn't lose couponCodes while migration\n if (sourceCart.Coupons && sourceCart.Coupons.length > 0) {\n const coupons = sourceCart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!;\n });\n\n try {\n updatedCart = await addCouponsAsync({ callerContext: ctx }, destinationCart.Id, coupons, false);\n } catch (error) {\n ctx.telemetry.error('Error adding existing coupon codes to the cart');\n ctx.telemetry.exception(error);\n return destinationCart;\n }\n }\n }\n\n return updatedCart || destinationCart;\n}\n\n/**\n * Function to claim a cart as auth cart and set the browser cookie accordingly.\n *\n * @param cartId Cart Id to claim as auth cart.\n * @param ctx Request Context.\n */\nexport async function claimCart(cartId: string, ctx: IActionContext): Promise {\n const claimAuthCart = await updateAsync(\n { callerContext: ctx },\n {\n Id: cartId\n }\n );\n if (!(claimAuthCart instanceof Error) && claimAuthCart && claimAuthCart.Id) {\n return claimAuthCart;\n }\n return {};\n}\n\n/**\n * Function to search carts that belong to a customer.\n *\n * @param ctx Request context.\n */\nexport async function searchCarts(ctx: IActionContext): Promise {\n const cartSearchCriteria: CartSearchCriteria = {\n IncludeAnonymous: false,\n CartTypeValue: 1\n };\n\n const queryResultSettings: QueryResultSettings = {\n Paging: {\n Top: 1,\n Skip: 0\n },\n Sorting: {\n Columns: [\n {\n ColumnName: 'ModifiedDateTime',\n IsDescending: true\n }\n ]\n }\n };\n\n return searchAsync({ callerContext: ctx, queryResultSettings }, cartSearchCriteria);\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nexport default async function refreshCart(cartId: string, ctx: IActionContext): Promise {\n return readAsync({ callerContext: ctx, bypassCache: 'get' }, cartId)\n .then(cart => {\n return cart;\n })\n .catch(error => {\n return undefined;\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeAllPromoCodes(\n cart: Readonly,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n if (cart.Coupons && cart.Coupons.length > 0) {\n const promoCodes = cart.Coupons.map(coupon => {\n return coupon.Code || '';\n });\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n }\n\n return { cart, status: 'SUCCESS' };\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removeCartLinesInternal(\n cart: Readonly,\n cartLineIds: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLineIds)\n .then(newCart => {\n // This is because of a TSProxy typing error\n const returnedCart = Array.isArray(newCart) ? newCart[0] : newCart;\n\n return { cart: returnedCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Remove Cart Line');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { removeDiscountCodesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function removePromoCodes(\n cart: Readonly,\n promoCodes: string[],\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return removeDiscountCodesAsync({ callerContext: actionContext }, cart.Id, promoCodes)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\n * @param cart - Cart where the invoice is located.\n * @param cartLineId - The cart line with the invoice for which to update the price.\n * @param price - The new value of price of the invoice.\n * @param actionContext - The action context from SDK.\n * @returns Result of the operation with the details.\n */\nexport async function setInvoiceLinePriceInternal(\n cart: Readonly,\n cartLineId: string | null,\n price: number,\n actionContext: IActionContext\n): Promise {\n if (!cart.Version) {\n actionContext.telemetry.warning('Unable to set invoice line price, Cart Version could not be found');\n return { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\n }\n\n try {\n const newCart = await CartsDataActions.setInvoiceLinePriceAsync(\n { callerContext: actionContext },\n cart.Id,\n cartLineId,\n price,\n cart.Version\n );\n return { cart: newCart, status: 'SUCCESS' };\n } catch (error) {\n const errorInstance = error as Error;\n actionContext.telemetry.trace(error as string);\n actionContext.telemetry.trace('Unable to set invoice line price');\n\n return {\n cart: undefined,\n status: 'FAILED',\n errorDetails: { LocalizedMessage: errorInstance.message }\n };\n }\n}\n\nexport default setInvoiceLinePriceInternal;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateLineDeliverySpecificationsAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, LineDeliverySpecification } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineDeliverySpecificationsInternal(\n cart: Readonly,\n cartLineDeliverySpecifications: LineDeliverySpecification[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines || cartLineDeliverySpecifications.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateLineDeliverySpecificationsAsync({ callerContext: actionContext }, cart.Id, cartLineDeliverySpecifications)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to updateLineDeliverySpecificationsAsync');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLineQuantityInternal(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext,\n isUsingDefaultOrderSettingsMax: boolean\n): Promise {\n if (isUsingDefaultOrderSettingsMax) {\n return updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(cart, cartLineId, newQuantity, actionContext);\n }\n return updateCartLineQuantityValidateMaxAgainstSiteSettings(cart, cartLineId, newQuantity, actionContext);\n}\nasync function updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n\n copyCartLine.Quantity = newQuantity;\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n let cartActionResult: ICartActionResultWithCart;\n\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n if (\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity'\n ) {\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n substatus: 'QUANTITYLIMITS',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n }\n\n cartActionResult = {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n return cartActionResult;\n });\n}\n\nasync function updateCartLineQuantityValidateMaxAgainstSiteSettings(\n cart: Readonly,\n cartLineId: string,\n newQuantity: number,\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n const matchingLines = cart.CartLines.filter(cartLine => cartLine.LineId === cartLineId);\n\n if (matchingLines.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'NOMATCHEDCARTLINE' };\n }\n\n const copyCartLine: CartLine = { ...matchingLines[0] };\n copyCartLine.Quantity = Math.min(newQuantity, actionContext.requestContext.app.config.maxQuantityForCartLineItem || 10);\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, [copyCartLine], null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Line');\n return {\n cart: undefined,\n status: 'FAILED',\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n errorDetails: { LocalizedMessage: error.message },\n validationResults: error.data?.ValidationResults\n };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCartLinesInternal(\n cart: Readonly,\n cartLinesToUpdate: CartLine[],\n actionContext: IActionContext\n): Promise {\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateCartLinesAsync({ callerContext: actionContext }, cart.Id, cartLinesToUpdate, null)\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch((error: string) => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to Update Cart Lines');\n\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateCart(\n cart: Readonly,\n updatedCartObject: Cart,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync({ callerContext: actionContext }, { ...updatedCartObject, Id: cart.Id })\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\nimport { Cart } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\nexport default async function updateLoyaltyCardId(\n cart: Readonly,\n newLoyaltyCardId: string,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n LoyaltyCardId: newLoyaltyCardId\n }\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update loyalty card id');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { Address, Cart, CartsDataActions } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartActionResultWithCart } from './cart-action-result';\n\n/**\n * Update shipping address in cart.\n * @param cart - The cart object.\n * @param shippingAddress - The new shipping address.\n * @param actionContext - The action context.\n * @returns The updated cart with new shipping address.\n */\nexport async function updateShippingAddress(\n cart: Readonly,\n shippingAddress: Address,\n actionContext: IActionContext\n): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return CartsDataActions.updateAsync(\n { callerContext: actionContext },\n {\n Id: cart.Id,\n ShippingAddress: shippingAddress\n }\n )\n .then(newCart => {\n const result: ICartActionResultWithCart = { cart: newCart, status: 'SUCCESS' };\n return result;\n })\n .catch(error => {\n actionContext.telemetry.warning(error);\n actionContext.telemetry.debug('Unable to update shipping address to the cart');\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\n return { cart: undefined, status: 'FAILED', errorDetails: { LocalizedMessage: error.message } };\n });\n}\n\nexport default updateShippingAddress;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CARTSTATE', BaseCartState);\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IRequestContext\n} from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICartState } from '../state-interfaces';\nimport { getCartState } from './get-cart-state';\n\n/**\n * Input class for getCart data action.\n */\nexport class GetCartStateDataInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n private readonly catalogId?: number;\n\n constructor(apiSettings: ICommerceApiSettings, requestContext?: IRequestContext) {\n this.apiSettings = apiSettings;\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `GetCart-chanId:${this.apiSettings.channelId}-catId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => 'Cart';\n\n public dataCacheType = (): CacheType => 'none';\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCartStateDataInput(inputData.requestContext.apiSettings, inputData.requestContext);\n};\n\n/**\n * Data action to copy the cart for actions.\n * @param input\n * @param ctx\n */\nexport async function getCartStateData(input: GetCartStateDataInput, ctx: IActionContext): Promise {\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n return cartState;\n }\n\n return undefined;\n}\n\nexport default createObservableDataAction({\n id: '@msdyn365-commerce/global-state/get-cart-state-data',\n action: >getCartStateData,\n input: createInput\n});\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\n\nimport { BaseCartState } from '../cart-state/base-cart-state';\nimport { ICartState } from '../state-interfaces/i-cart-state';\nimport cartStateDataAction from './cart-state-data-action';\nimport { GlobalStateInput } from './global-state-data-action';\n\nexport function getCartState(ctx: IActionContext): AsyncResult {\n return cartStateDataAction(\n new GlobalStateInput('CARTSTATE', BaseCartState, ctx.requestContext.apiSettings, ctx.requestContext),\n ctx\n );\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport {\n CacheType,\n createObservableDataAction,\n getCatalogId,\n IAction,\n IActionContext,\n IActionInput,\n ICommerceApiSettings,\n ICreateActionContext,\n IObservableAction,\n IRequestContext\n} from '@msdyn365-commerce/core';\n\nimport { createGlobalState, GlobalStateConstructor, IGlobalState } from '../global-state/i-global-state';\n\nexport declare type GlobalStateType = 'CARTSTATE' | 'CHECKOUTSTATE';\n\n/**\n * Shared class that handles global state inputs.\n */\nexport class GlobalStateInput implements IActionInput {\n public readonly stateConstructor: GlobalStateConstructor;\n\n public readonly key: GlobalStateType;\n\n public readonly catalogId?: number;\n\n private readonly apiSettings: ICommerceApiSettings;\n\n public constructor(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor,\n apiSettings: ICommerceApiSettings,\n requestContext?: IRequestContext\n ) {\n this.apiSettings = apiSettings;\n this.stateConstructor = stateConstructor;\n this.key = key;\n\n if (requestContext) {\n this.catalogId = getCatalogId(requestContext);\n }\n }\n\n public getCacheKey = () => `${this.key}-chanId:${this.apiSettings.channelId}-catId:${this.catalogId ?? 0}`;\n\n public getCacheObjectType = () => this.key;\n\n public dataCacheType = (): CacheType => 'instance';\n}\n\nexport async function getState(input: GlobalStateInput, ctx: IActionContext): Promise {\n const globalStateObject = createGlobalState(input.stateConstructor, ctx);\n\n await globalStateObject.initialize();\n\n return globalStateObject;\n}\n\nexport default function createGlobalStateDataAction(\n key: GlobalStateType,\n stateConstructor: GlobalStateConstructor\n): IObservableAction {\n return createObservableDataAction({\n action: >getState,\n input: (args: ICreateActionContext) => {\n return new GlobalStateInput(key, stateConstructor, args.requestContext.apiSettings, args.requestContext);\n }\n });\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\n\nexport declare type GlobalStateStatus = 'READY' | 'UPDATING' | 'ERROR';\n\nexport type GlobalStateConstructor = new (actionContext: IActionContext) => T;\n\nexport function createGlobalState(ctor: GlobalStateConstructor, actionContext: IActionContext): T {\n return new ctor(actionContext);\n}\n\nexport interface IGlobalState {\n readonly status: GlobalStateStatus;\n\n initialize(): Promise;\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { IActionContext } from '@msdyn365-commerce/core';\nimport { computed, observable } from 'mobx';\n\nimport { GlobalStateStatus, IGlobalState } from './i-global-state';\n\n/**\n * Base global state that handles common global state behavior that other state can extend from.\n */\nexport class GlobalState implements IGlobalState {\n protected isInitialized: boolean = false;\n\n protected actionContext: IActionContext;\n\n @observable protected _status: GlobalStateStatus;\n\n @computed public get status(): Readonly {\n return this._status;\n }\n\n constructor(actionContext: IActionContext) {\n this.actionContext = actionContext;\n this._status = 'UPDATING';\n }\n\n public async initialize(): Promise {\n this.isInitialized = true;\n this._status = 'READY';\n\n return;\n }\n\n protected async _doAsyncAction(lambda: () => Promise): Promise {\n this._status = 'UPDATING';\n\n return lambda()\n .then(result => {\n this._status = 'READY';\n return result;\n })\n .catch(error => {\n console.log(error);\n this._status = 'ERROR';\n\n return Promise.reject(error);\n });\n }\n}\n"],"names":["getQuantityLimit","maxQuantityForCartLineItem","inputItem","quantityLimit","shouldEnableStockCheck","undefined","availableQuantity","Math","min","getElementIndex","lines","cartLineToAdd","elementFoundAt","productIdToFind","ProductId","index","line","entries","DeliveryMode","FulfillmentStoreId","async","addProductsToCartWithoutSiteSettings","cart","actionContext","input","CartLines","status","substatus","newCartLines","map","_cartLine$Quantity","cartLine","_objectSpread","Quantity","addCartLinesResult","Version","addCartLinesAsync","callerContext","Id","then","newCart","catch","error","_error$data3","telemetry","trace","errorDetails","LocalizedMessage","message","validationResults","data","ValidationResults","warning","addProductsToCartInternal","orderQuantityLimitsFeatureIsEnabled","enableStockCheck","isAddServiceItemToCart","isMaxByQuantityValidationFeatureDefined","shouldSkipSiteSettings","i","length","_cart$CartLines","_error$data","name","find","cartline","IsInvoiceLine","addProductsToCartValidateMaxAgainstDefaultOrderSettings","requestContext","app","config","cartActionResult","_cart$CartLines2","_error$data2","addProductsToCartValidateMaxAgainstSiteSettings","addPromoCode","promoCode","hasPromoCode","addDiscountCodeAsync","code","Coupons","coupon","Code","toLowerCase","includes","BaseCartState","GlobalState","constructor","super","this","_cart","_attributeValues","_extensionProperties","_isProductAddedToCart","attributeValues","extensionProperties","totalItemsInCart","reduce","total","num","isProductAddedToCart","isEmpty","hasInvoiceLine","some","_doAsyncAction","refreshCartInternal","_input$catalogId","_input$additionalProp","_input$product$Behavi","CatalogId","catalogId","getCatalogId","Description","product","EntryMethodTypeValue","ItemId","RecordId","count","TrackingId","UnitOfMeasureSymbol","DefaultUnitOfMeasure","IsPriceKeyedIn","isPriceKeyedIn","IsGiftCardLine","IsGiftCard","Price","customPrice","location","channel","deliveryMode","PickupDeliveryModeCode","OrgUnitNumber","WarehouseId","InventoryLocationId","ShippingAddress","_buildAddressFromOrgUnitLocation","isAddEmailDeliveryItemToCart","EmailDeliveryModeCode","ItemTypeValue","ReleasedProductType","Service","additionalProperties","Behavior","MaximumQuantity","_doCartOperationWithRetry","addProductToCartInternal","internalInput","_inputItem$catalogId","_this$actionContext$r","PRODUCTASSERVICE","push","isStockCheckEnabled","invoiceIds","CartsDataActions","addInvoicesToCartInternal","invoiceId","lineDescription","addOrderInvoiceAsync","addOrderInvoiceToCartInternal","setInvoiceLinePriceInternal","cartLineId","price","removeCartLineInternal","cartLineIds","clearCartLineDeliveryModeInternal","clearCartLinesDeliveryInformation","channelDeliveryOptionConfiguration","cartLineDeliverySpecification","LineId","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","PickUpStoreId","DeliveryAddress","updateCartLineDeliverySpecificationsInternal","lineDeliverySpecifications","deliveryModeId","trim","pickupDeliveryModeCode","emailDeliveryModeCode","cartLinesForShipping","channelDeliveryOptionConfig","filter","_input$channelDeliver","PickupDeliveryModeCodes","deliverySpecifications","shippingAddress","_input$additionalProp2","updateCartLineQuantityInternal","newQuantity","isUsingDefaultOrderSettingsMax","loyaltyCardNumber","updateLoyaltyCardIdInternal","addPromoCodeInternal","removePromoCodes","removePromoCodesInternal","promoCodes","removeAllPromoCodes","removeAllPromoCodesInternal","email","updateAsync","ReceiptEmail","debug","updateReceiptEmail","newEmail","updateShippingAddress","newShippingAddress","newAttributeValues","newCartObject","AttributeValues","updateCart","newExtensionProperties","ExtensionProperties","updateCartLinesInternal","updatedCartLinesObject","isInitialized","getOrCreateActiveCart","_status","callback","callbackResult","refreshCart","PostalAddressId","Name","OrgUnitName","FullAddress","Address","Street","StreetNumber","City","DistrictName","BuildingCompliment","Postbox","ThreeLetterISORegionName","Country","ZipCode","Zip","County","CountyName","State","StateName","__decorate","observable","computed","action","clearCartLineDeliveryMode","_actionContext$reques","matchingLines","copyCartLine","InventLocation","updateCartLinesAsync","_actionContext$reques2","_channelDeliveryOptio","dM","copiedLines","_cloneDeep","forEach","CartTokenPrefix","ctx","cartCookieParts","cookies","getCartCookie","split","readCart","readCartId","isAuthenticated","user","Auth","Anon","readAsync","bypassCache","setCartCookie","handleItemDiscontinuedException","exception","getCartFromCookie","wasReadFromCookie","getCartFromCustomer","anonCart","currentCart","anonCurrentCart","cartId","claimAuthCart","Error","claimCart","mergedCart","sourceCart","destinationCart","updatedCart","cartLines","cartLinesToDelete","hasShippingMethod","channelConfiguration","featureNames","newCartLine","buildGiftCardLine","_featureStates$find","featureStates","getFeatureStatesAsync","featureState","IsEnabled","getChannelDeliveryOptionConfigurationAsync","ReasonCodeLines","removeCartLinesAsync","coupons","addCouponsAsync","addCartLines","claimAnonCart","createNewCart","LoyaltyCardId","card","getCustomerLoyaltyCardsAsync","queryResultSettings","CardNumber","errorObj","response","information","createCartAsync","authCarts","cartSearchCriteria","IncludeAnonymous","CartTypeValue","Paging","Top","Skip","Sorting","Columns","ColumnName","IsDescending","searchAsync","searchCarts","NetPrice","GiftCardBalance","removeDiscountCodesAsync","removeCartLinesInternal","Array","isArray","errorInstance","cartLineDeliverySpecifications","updateLineDeliverySpecificationsAsync","updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings","updateCartLineQuantityValidateMaxAgainstSiteSettings","cartLinesToUpdate","updatedCartObject","updateLoyaltyCardId","newLoyaltyCardId","createGlobalStateDataAction","GetCartStateDataInput","apiSettings","getCacheKey","_this$catalogId","channelId","getCacheObjectType","dataCacheType","getCartStateData","cartState","getCartState","createObservableDataAction","id","inputData","cartStateDataAction","GlobalStateInput","key","stateConstructor","getState","globalStateObject","createGlobalState","initialize","args","lambda","result","console","log","Promise","reject"],"sourceRoot":""}