{"version":3,"file":"static/js/99a17a9771802df5a007.bundle.js","mappings":"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","sources":["webpack://msdyn365.commerce.online/./src/actions/get-on-account-guest-checkout-state.ts?1a00","webpack://msdyn365.commerce.online/./src/common/utils/helper.tsx?25b9","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/add-product-to-cart.ts?5b43","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/add-promo-code.ts?5769","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/clear-cart-line-delivery-mode.ts?2938","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/get-or-create-active-cart.ts?0e43","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/set-invoice-line-price.ts?7033","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-cart-line-delivery-specifications.ts?82ae","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-cart-line-quantity.ts?8d42","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-shipping-address.ts?5dab","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/base-cart-state.ts?e99e","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/refresh-cart.ts?48af","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/add-invoices-to-cart.ts?cfc8","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/add-order-invoice-to-cart.ts?8520","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/remove-cart-lines.ts?778a","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/clear-cart-lines-delivery-information.ts?1f7d","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-loyalty-card-id.ts?dd46","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/remove-promo-codes.ts?3a97","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/remove-all-promo-codes.ts?647e","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-receipt-email.ts?ff96","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/cart-state/update-cart.ts?c71d","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/checkout-state/checkout-state-storage.ts?bec2","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/checkout-state/base-checkout-cart-state.ts?7bfc","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/checkout-state/base-checkout-state.ts?e3fe","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/cart-state-data-action.ts?d8af","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/checkout-state-data-action.ts?d293","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/get-cart-state.ts?2d1c","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/get-checkout-cart.ts?0268","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/get-checkout-state.ts?a560","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/data-actions/global-state-data-action.ts?3867","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/global-state/i-global-state.ts?e100","webpack://msdyn365.commerce.online/./src/modules/c-checkout/mod/global-state/global-state.ts?51ed"],"sourcesContent":["// on-account-guest-checkout-state.ts\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nexport interface IOnAccountGuestCheckoutState {\r\n appliedOnAccount: boolean;\r\n receiptEmail: string;\r\n rentOptIn: boolean;\r\n emailOptIn: boolean;\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - action input\r\n */\r\nexport class OnAccountGuestCheckoutStateInput implements IActionInput {\r\n public getCacheKey = () => `OnAccountGuestCheckoutState`;\r\n public getCacheObjectType = () => 'OnAccountGuestCheckoutState';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - action\r\n */\r\nexport async function onAccountGuestCheckoutStateAction(\r\n input: OnAccountGuestCheckoutStateInput,\r\n ctx: IActionContext\r\n): Promise {\r\n return { appliedOnAccount: false, receiptEmail: '', rentOptIn: false, emailOptIn: false };\r\n}\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - create new input for create action\r\n */\r\nconst createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new OnAccountGuestCheckoutStateInput();\r\n};\r\n\r\n/**\r\n * OnAccountGuestCheckoutState - create action\r\n */\r\nexport default createObservableDataAction({\r\n action: >onAccountGuestCheckoutStateAction,\r\n input: createInput\r\n});\r\n","/* eslint-disable security/detect-object-injection */\r\nimport { IAny, ICoreContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport {\r\n AttributeValueBase,\r\n AttributeTextValue,\r\n CartLine,\r\n SimpleProduct,\r\n CustomerAttribute,\r\n AsyncResult,\r\n CommerceProperty\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport {\r\n ObjectExtensions,\r\n IDimensionForSelectedVariant,\r\n IDimensionValueForSelectedVariant\r\n} from '@msdyn365-commerce-modules/retail-actions';\r\nimport { ICartState } from '../../modules/c-checkout/mod/state-interfaces';\r\nimport { IOnAccountGuestCheckoutState, OnAccountGuestCheckoutStateInput } from '../../actions/get-on-account-guest-checkout-state';\r\n\r\n// Created Custom Interface for Cart Attributes\r\nexport interface ICartAttributes {\r\n attributeName: string;\r\n attributeValue: boolean | string;\r\n}\r\n\r\n// Set Customer Attribues\r\nexport const setCustomerAttribute = (attributeName: string, attributeValue: string): CustomerAttribute => {\r\n const privIdAttribute: CustomerAttribute = {\r\n Name: attributeName,\r\n KeyName: attributeName,\r\n ExtensionProperties: [],\r\n AttributeValue: {\r\n StringValue: attributeValue\r\n },\r\n NameTranslations: []\r\n };\r\n\r\n return privIdAttribute;\r\n};\r\n\r\n// Find Customer Attributes if exist update it other wise push\r\nexport const findCustomerAttribute = async (\r\n currentAttributes: CustomerAttribute[],\r\n attributeObj: CustomerAttribute\r\n): Promise => {\r\n const attributeIndex = currentAttributes.findIndex(\r\n (attribute: CustomerAttribute) => attribute.Name?.toLowerCase() === attributeObj.Name?.toLowerCase()\r\n );\r\n if (attributeIndex > -1) {\r\n currentAttributes[attributeIndex] = attributeObj;\r\n } else {\r\n currentAttributes.push(attributeObj);\r\n }\r\n\r\n return currentAttributes;\r\n};\r\n\r\n// Set Order and Cart Attribues\r\nexport const setNameAttribute = (attributeName: string, attributeValue: string): AttributeValueBase => {\r\n const privIdAttribute = {\r\n // @ts-ignore\r\n '@odata.type': '#Microsoft.Dynamics.Commerce.Runtime.DataModel.AttributeTextValue',\r\n Name: attributeName,\r\n ExtensionProperties: [],\r\n TextValue: attributeValue,\r\n TextValueTranslations: []\r\n };\r\n\r\n return privIdAttribute as AttributeTextValue;\r\n};\r\n\r\n// Find attribute if exist update it other wise push\r\n\r\nexport const findAttribute = async (\r\n currentAttributes: AttributeTextValue[],\r\n attributeObj: AttributeTextValue\r\n): Promise => {\r\n const attributeIndex = currentAttributes.findIndex(\r\n (attribute: AttributeTextValue) => attribute.Name?.toLowerCase() === attributeObj.Name?.toLowerCase()\r\n );\r\n\r\n if (attributeIndex > -1) {\r\n currentAttributes[attributeIndex] = attributeObj;\r\n } else {\r\n currentAttributes.push(attributeObj);\r\n }\r\n\r\n return currentAttributes;\r\n};\r\n\r\n// Set Extension Properties\r\nexport const setExtensionProperties = (attributeName: string, attributeValue: string | boolean | number): CommerceProperty => {\r\n const privIdExtensionProperty: CommerceProperty = {\r\n Key: attributeName\r\n };\r\n if (typeof attributeValue === 'string') {\r\n privIdExtensionProperty.Value = {\r\n StringValue: attributeValue\r\n };\r\n } else if (typeof attributeValue === 'boolean') {\r\n privIdExtensionProperty.Value = {\r\n BooleanValue: attributeValue\r\n };\r\n }\r\n\r\n return privIdExtensionProperty;\r\n};\r\n\r\n// Find Extension Properties if exist update it other wise push\r\nexport const findExtensionProperty = async (\r\n currentProperties: CommerceProperty[],\r\n attributeObj: CommerceProperty\r\n): Promise => {\r\n const propertyIndex = currentProperties.findIndex(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() === attributeObj.Key?.toLowerCase()\r\n );\r\n\r\n if (propertyIndex > -1) {\r\n currentProperties[propertyIndex] = attributeObj;\r\n } else {\r\n currentProperties.push(attributeObj);\r\n }\r\n\r\n return currentProperties;\r\n};\r\n\r\n// Find Extension Properties if exist update it other wise push\r\nexport const findToRemoveExtensionProperty = async (\r\n currentProperties: CommerceProperty[],\r\n attributeObj: CommerceProperty\r\n): Promise => {\r\n const propertyIndex = currentProperties.findIndex(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() === attributeObj.Key?.toLowerCase()\r\n );\r\n\r\n if (propertyIndex > -1) {\r\n currentProperties.splice(propertyIndex, 1);\r\n }\r\n\r\n return currentProperties;\r\n};\r\n\r\nexport const getNBFlagForCartLine = (cartline: CartLine): boolean | undefined => {\r\n const NBFlag: AttributeTextValue | undefined = cartline.AttributeValues?.find(attr => attr.Name === 'NonBackOrderableFlag');\r\n if (NBFlag && NBFlag.TextValue) {\r\n const value = JSON.parse(NBFlag.TextValue);\r\n return value;\r\n }\r\n return;\r\n};\r\n\r\n// ITS - Customization to get dimension value for selected product\r\nexport const getDiemnsionValueForSelectedProduct = (\r\n productDimensions: IDimensionForSelectedVariant[],\r\n product: SimpleProduct\r\n): IDimensionValueForSelectedVariant | undefined => {\r\n const dimensions = (productDimensions[0].dimensionValuesWithInventory ??\r\n productDimensions[0].DimensionValues ??\r\n []) as IDimensionValueForSelectedVariant[];\r\n let dimension = dimensions.find(\r\n value =>\r\n !ObjectExtensions.isNullOrUndefined(value.DimensionValue?.RecordId ?? value.RecordId) &&\r\n value.ProductIds &&\r\n value.ProductIds.find(prod => prod === product.RecordId)\r\n );\r\n dimension = dimension && dimension.DimensionValue;\r\n return dimension;\r\n};\r\n\r\nexport const getNBFlagFromProductDimensions = (\r\n productDimensions: IDimensionForSelectedVariant[],\r\n product: SimpleProduct\r\n): boolean | undefined => {\r\n const dimension = getDiemnsionValueForSelectedProduct(productDimensions, product);\r\n const NBFlag =\r\n dimension &&\r\n dimension.ExtensionProperties &&\r\n dimension.ExtensionProperties[0] &&\r\n dimension.ExtensionProperties[0].Key === 'NonBackOrderableFlag'\r\n ? dimension.ExtensionProperties[0].Value?.BooleanValue\r\n : false;\r\n return NBFlag;\r\n};\r\n// ITS - Customization End\r\n\r\n// ITS Customization\r\n// export const updateCartAttributes = async (checkoutCart: ICartState, attributeName: string, attributeValue: string) => {\r\n// const newCart = {...checkoutCart.cart};\r\n// const newAttribute = setNameAttribute(attributeName, attributeValue);\r\n// let currentAttributes: AttributeValueBase[] = newCart?.AttributeValues || [];\r\n// currentAttributes = await findAttribute(currentAttributes, newAttribute);\r\n// newCart.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n// updateCart(checkoutCart, newCart);\r\n// // await checkoutCart.updateAttributeValues({ newAttributeValues: newCart.AttributeValues })\r\n// };\r\n\r\nexport const updateCartExtensionProperties = async (\r\n checkoutCart: ICartState,\r\n attributeName: string,\r\n attributeValue: string,\r\n context?: ICoreContext\r\n) => {\r\n const newCart = { ...checkoutCart.cart };\r\n const newProperty = setExtensionProperties(attributeName, attributeValue);\r\n let currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n currentExtensionProperties = await findExtensionProperty(currentExtensionProperties, newProperty);\r\n newCart.ExtensionProperties = currentExtensionProperties; // Updates cart with Extension Properties\r\n // newCart.ExtensionProperties && await updateAsync({callerContext: context?.actionContext!}, newCart);\r\n newCart.ExtensionProperties && (await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties }));\r\n};\r\n\r\nexport const removeCartExtensionProperties = async (checkoutCart: ICartState, attributeName: string, context?: ICoreContext) => {\r\n const newCart = { ...checkoutCart.cart };\r\n const currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n const newExtensionProperties = currentExtensionProperties.filter(\r\n (property: CommerceProperty) => property.Key?.toLowerCase() !== attributeName.toLowerCase()\r\n );\r\n newCart.ExtensionProperties = newExtensionProperties; // Updates cart with Extension Properties\r\n console.log(newCart.ExtensionProperties, newExtensionProperties);\r\n newCart.ExtensionProperties && (await updateAsync({ callerContext: context?.actionContext! }, newCart));\r\n // newCart.ExtensionProperties && await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties });\r\n};\r\n\r\nexport const updateCartProperties = async (checkoutCart: ICartState, attributesArr: ICartAttributes[]) => {\r\n const newCart = { ...checkoutCart.cart };\r\n let currentExtensionProperties: CommerceProperty[] = newCart?.ExtensionProperties || [];\r\n await (async function() {\r\n for (const attr of attributesArr) {\r\n const newProperty = setExtensionProperties(attr.attributeName, attr.attributeValue);\r\n currentExtensionProperties = await findExtensionProperty(currentExtensionProperties, newProperty);\r\n }\r\n })();\r\n newCart.ExtensionProperties = [...currentExtensionProperties]; // Updates cart with Extension Properties\r\n newCart.ExtensionProperties && (await checkoutCart.updateExtensionProperties({ newExtensionProperties: newCart.ExtensionProperties }));\r\n};\r\n// ITS Customization\r\n// export const updateCartAttributes = async (checkoutCart: ICartState, attributesArr: ICartAttributes[]) => {\r\n// const newCart = {...checkoutCart.cart};\r\n// let currentAttributes: AttributeValueBase[] = newCart?.AttributeValues || [];\r\n// await (async function() {\r\n// for (const attr of attributesArr) {\r\n// const newAttribute = setNameAttribute(attr.attributeName, attr.attributeValue);\r\n// currentAttributes = await findAttribute(currentAttributes, newAttribute);\r\n// newCart.AttributeValues = currentAttributes; // Updates cart with Attribute Values\r\n// console.log('newCart Attrbiutes::::', newCart.AttributeValues, ' with the attribuite::::', attr);\r\n// }\r\n// })();\r\n// newCart.AttributeValues && await checkoutCart.updateAttributeValues({ newAttributeValues: newCart.AttributeValues });\r\n// console.log('newCart Attrbiutes::::', newCart.AttributeValues);\r\n// };\r\n\r\nexport const updateContext = (context: ICoreContext>, key: string, attributeValue: boolean | string) => {\r\n const input = new OnAccountGuestCheckoutStateInput();\r\n const value = context.actionContext.get(input.getCacheObjectType(), input.getCacheKey()) as AsyncResult;\r\n context.actionContext.update(input, { ...value.result, [key]: attributeValue });\r\n};\r\n","/* eslint-disable security/detect-object-injection */\r\n/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { addCartLinesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { Cart, CartLine } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\n\r\nimport { ICartActionResultWithCart } from './cart-action-result';\r\n\r\n/**\r\n * Get the quantity limit.\r\n * @param maxQuantityForCartLineItem - Max quantity for cart line.\r\n * @param inputItem - The input item.\r\n * @param inputItem.cartLineToAdd - Cart line to add.\r\n * @param inputItem.availableQuantity - Available quantity.\r\n * @param inputItem.shouldEnableStockCheck - Is stock check enabled.\r\n * @param inputItem.isAddServiceItemToCart - Is add service item to cart.\r\n * @returns The quantity limit.\r\n */\r\nfunction getQuantityLimit(\r\n maxQuantityForCartLineItem: number | undefined,\r\n inputItem: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n shouldEnableStockCheck?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }\r\n): number {\r\n let quantityLimit: number;\r\n const defaultSiteMaxQuantity = 10;\r\n\r\n if (inputItem.shouldEnableStockCheck === false) {\r\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\r\n } else if (maxQuantityForCartLineItem === undefined && inputItem.availableQuantity === undefined) {\r\n quantityLimit = defaultSiteMaxQuantity;\r\n } else if (inputItem.availableQuantity === undefined) {\r\n quantityLimit = maxQuantityForCartLineItem ?? defaultSiteMaxQuantity;\r\n } else if (maxQuantityForCartLineItem === undefined) {\r\n quantityLimit = inputItem.availableQuantity;\r\n } else {\r\n quantityLimit = Math.min(maxQuantityForCartLineItem, inputItem.availableQuantity);\r\n }\r\n\r\n return quantityLimit;\r\n}\r\n\r\n/**\r\n * Get the index of the item to add.\r\n * @param lines - The cart lines.\r\n * @param cartLineToAdd - The cart line to add.\r\n * @returns The index of the item to add.\r\n */\r\nfunction getElementIndex(\r\n lines: CartLine[],\r\n cartLineToAdd: CartLine\r\n): number {\r\n let elementFoundAt: number = -1;\r\n const productIdToFind = cartLineToAdd.ProductId;\r\n\r\n for (const [index, line] of lines.entries()) {\r\n if (line.ProductId === productIdToFind &&\r\n (line.DeliveryMode || '') === (cartLineToAdd.DeliveryMode || '') &&\r\n (line.FulfillmentStoreId || '') === (cartLineToAdd.FulfillmentStoreId || '')) {\r\n elementFoundAt = index;\r\n\r\n break;\r\n }\r\n }\r\n\r\n return elementFoundAt;\r\n}\r\n\r\nasync function addProductsToCartValidateMaxAgainstDefaultOrderSettings(\r\n cart: Readonly,\r\n actionContext: IActionContext,\r\n input: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[]): Promise {\r\n if (!cart.CartLines) {\r\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\r\n }\r\n\r\n for (const inputItem of input) {\r\n if (inputItem.enableStockCheck && inputItem.availableQuantity) {\r\n let elementFoundAt: number = -1;\r\n const productIdToFind = inputItem.cartLineToAdd.ProductId;\r\n\r\n for (let i = 0; i < cart.CartLines.length; i++) {\r\n if (cart.CartLines[i].ProductId === productIdToFind &&\r\n (cart.CartLines[i].DeliveryMode || '') === (inputItem.cartLineToAdd.DeliveryMode || '') &&\r\n (cart.CartLines[i].FulfillmentStoreId || '') === (inputItem.cartLineToAdd.FulfillmentStoreId || '')) {\r\n elementFoundAt = i;\r\n\r\n break;\r\n }\r\n }\r\n\r\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\r\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\r\n const curQuantity = cartLineToUpdate.Quantity || 0;\r\n\r\n if (curQuantity + (inputItem.cartLineToAdd.Quantity || 1) > inputItem.availableQuantity) {\r\n return {\r\n cart: {\r\n Id: cart.Id,\r\n CartLines: cart.CartLines\r\n },\r\n status: 'FAILED',\r\n substatus: 'MAXQUANTITY'\r\n };\r\n }\r\n }\r\n }\r\n }\r\n\r\n const newCartLines = input.map(inputItem => {\r\n const cartLine = { ...inputItem.cartLineToAdd };\r\n return cartLine;\r\n });\r\n let addCartLinesResult: ICartActionResultWithCart;\r\n\r\n if (cart.Version) {\r\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\r\n .then(newCart => {\r\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\r\n return addCartLinesResult;\r\n })\r\n .catch(error => {\r\n actionContext.telemetry.trace(error);\r\n actionContext.telemetry.trace('Unable to add Cart Line');\r\n\r\n if (error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\r\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity') {\r\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'QUANTITYLIMITS', errorDetails: { LocalizedMessage: error.message }\r\n };\r\n return addCartLinesResult;\r\n }\r\n\r\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\r\n if (hasInvoiceInCart) {\r\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'INVOICEINCART', errorDetails: { LocalizedMessage: error.message } };\r\n return addCartLinesResult;\r\n }\r\n\r\n addCartLinesResult = { cart: undefined, status: 'FAILED',\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\r\n errorDetails: { LocalizedMessage: error.message }, validationResults: error.data?.ValidationResults };\r\n\r\n return addCartLinesResult;\r\n });\r\n }\r\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\r\n\r\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\r\n return addCartLinesResult;\r\n}\r\n\r\nasync function addProductsToCartValidateMaxAgainstSiteSettings(\r\n cart: Readonly,\r\n actionContext: IActionContext,\r\n input: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n enableStockCheck?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[]): Promise {\r\n if (!cart.CartLines) {\r\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\r\n }\r\n\r\n const maxQuantityForCartLineItem: number | undefined = actionContext.requestContext.app.config.maxQuantityForCartLineItem;\r\n\r\n for (const inputItem of input) {\r\n const quantityLimit: number = getQuantityLimit(maxQuantityForCartLineItem,\r\n {\r\n cartLineToAdd: inputItem.cartLineToAdd, availableQuantity: inputItem.availableQuantity,\r\n shouldEnableStockCheck: inputItem.enableStockCheck, isAddServiceItemToCart: inputItem.isAddServiceItemToCart\r\n });\r\n const elementFoundAt: number = getElementIndex(cart.CartLines, inputItem.cartLineToAdd);\r\n\r\n if (!inputItem.isAddServiceItemToCart && elementFoundAt !== -1) {\r\n const cartLineToUpdate = { ...cart.CartLines[elementFoundAt] };\r\n const currentQuantity = cartLineToUpdate.Quantity || 0;\r\n\r\n if (currentQuantity + (inputItem.cartLineToAdd.Quantity || 1) > quantityLimit) {\r\n return {\r\n cart: {\r\n Id: cart.Id,\r\n CartLines: cart.CartLines\r\n },\r\n status: 'FAILED',\r\n substatus: 'MAXQUANTITY'\r\n };\r\n }\r\n }\r\n\r\n if (!inputItem.isAddServiceItemToCart &&\r\n inputItem.cartLineToAdd &&\r\n inputItem.cartLineToAdd.Quantity &&\r\n inputItem.cartLineToAdd.Quantity > quantityLimit) {\r\n return {\r\n cart: {\r\n Id: cart.Id,\r\n CartLines: cart.CartLines\r\n },\r\n status: 'FAILED',\r\n substatus: 'MAXQUANTITY'\r\n };\r\n }\r\n }\r\n\r\n const newCartLines = input.map(inputItem => {\r\n const cartLine = { ...inputItem.cartLineToAdd };\r\n cartLine.Quantity = cartLine.Quantity || 1;\r\n return cartLine;\r\n });\r\n let cartActionResult: ICartActionResultWithCart;\r\n\r\n if (cart.Version) {\r\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\r\n .then(newCart => {\r\n cartActionResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\r\n return cartActionResult;\r\n }).catch(error => {\r\n actionContext.telemetry.trace(error);\r\n actionContext.telemetry.trace('Unable to add Cart Line');\r\n\r\n const hasInvoiceInCart = cart.CartLines?.find(cartline => cartline.IsInvoiceLine === true);\r\n if (hasInvoiceInCart) {\r\n cartActionResult = { cart: undefined, status: 'FAILED', substatus: 'INVOICEINCART', errorDetails: { LocalizedMessage: error.message } };\r\n return cartActionResult;\r\n }\r\n\r\n cartActionResult = { cart: undefined, status: 'FAILED',\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\r\n errorDetails: { LocalizedMessage: error.message }, validationResults: error.data?.ValidationResults };\r\n return cartActionResult;\r\n });\r\n }\r\n actionContext.telemetry.warning('Unable to update Cart Line, Cart Version could not be found');\r\n\r\n cartActionResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\r\n return cartActionResult;\r\n}\r\n\r\n/**\r\n * Add products to cart without site settings validation.\r\n * @param cart - The cart.\r\n * @param actionContext - The action context.\r\n * @param input - The cart lines to add.\r\n * @returns The results.\r\n */\r\nasync function addProductsToCartWithoutSiteSettings(\r\n cart: Readonly,\r\n actionContext: IActionContext,\r\n input: {\r\n cartLineToAdd: CartLine;\r\n }[]): Promise {\r\n\r\n if (!cart.CartLines) {\r\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\r\n }\r\n\r\n const defaultQuantity = 1;\r\n const newCartLines = input.map(inputItem => {\r\n const cartLine = { ...inputItem.cartLineToAdd };\r\n cartLine.Quantity = cartLine.Quantity ?? defaultQuantity;\r\n return cartLine;\r\n });\r\n let addCartLinesResult: ICartActionResultWithCart;\r\n\r\n if (cart.Version) {\r\n return addCartLinesAsync({ callerContext: actionContext }, cart.Id, newCartLines, cart.Version)\r\n .then(newCart => {\r\n addCartLinesResult = { cart: newCart, status: 'SUCCESS', substatus: 'PRODUCTADDED' };\r\n return addCartLinesResult;\r\n }).catch(error => {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-argument -- existing error type.\r\n actionContext.telemetry.trace(error);\r\n actionContext.telemetry.trace('Unable to add cart lines');\r\n\r\n addCartLinesResult = { cart: undefined, status: 'FAILED',\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access -- existing error type.\r\n errorDetails: { LocalizedMessage: error.message }, validationResults: error.data?.ValidationResults\r\n };\r\n return addCartLinesResult;\r\n });\r\n }\r\n\r\n actionContext.telemetry.warning('Unable to update cart lines, cart version could not be found');\r\n\r\n addCartLinesResult = { cart: undefined, status: 'FAILED', substatus: 'NOCARTVERSION' };\r\n return addCartLinesResult;\r\n}\r\n\r\nexport async function addProductsToCartInternal(\r\n cart: Readonly,\r\n actionContext: IActionContext,\r\n input: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n isStockCheckEnabled?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[]\r\n): Promise {\r\n return addProductsToCartWithoutSiteSettings(\r\n cart, actionContext, input);\r\n}\r\n\r\nexport async function addProductToCartInternal(\r\n cart: Readonly, cartLineToAdd: CartLine, actionContext: IActionContext, orderQuantityLimitsFeatureIsEnabled: boolean,\r\n availableQuantity?: number, enableStockCheck?: boolean, isAddServiceItemToCart?: boolean,\r\n isMaxByQuantityValidationFeatureDefined?: boolean, shouldSkipSiteSettings?: boolean\r\n): Promise {\r\n if (shouldSkipSiteSettings) {\r\n return addProductsToCartWithoutSiteSettings(\r\n cart, actionContext, [{ cartLineToAdd }]\r\n );\r\n }\r\n\r\n // Using max from the default order settings if it's defined there and quantity limits feature is enabled.\r\n // Otherwise use max from site settings or default max 10.\r\n if (isMaxByQuantityValidationFeatureDefined && orderQuantityLimitsFeatureIsEnabled) {\r\n return addProductsToCartValidateMaxAgainstDefaultOrderSettings(\r\n cart, actionContext, [{ cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }]);\r\n }\r\n return addProductsToCartValidateMaxAgainstSiteSettings(\r\n cart, actionContext, [{ cartLineToAdd, availableQuantity, enableStockCheck, isAddServiceItemToCart }]);\r\n\r\n}\r\n\r\nexport default addProductToCartInternal;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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(cart: Readonly, promoCode: string, actionContext: IActionContext): 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 ? cart.Coupons.map((coupon: Coupon) => {\n return coupon.Code!.toLowerCase();\n }) : [];\n return codes.includes(code.toLowerCase());\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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(cart: Readonly, cartLineId: string, actionContext: IActionContext): 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 = 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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { FeatureState } from '@msdyn365-commerce/retail-proxy';\r\nimport { addCartLinesAsync, addCouponsAsync, createCartAsync, readAsync, removeCartLinesAsync, searchAsync, updateAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\r\nimport { getChannelDeliveryOptionConfigurationAsync, getCustomerLoyaltyCardsAsync, getFeatureStatesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { Cart, CartLine, CartSearchCriteria, Coupon, QueryResultSettings } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport isEmpty from 'lodash/isEmpty';\r\n\r\nenum CartTokenPrefix {\r\n Auth = 't',\r\n Anon = 'p'\r\n}\r\n\r\nexport default async function getOrCreateActiveCart(ctx: IActionContext): Promise {\r\n let cart: Cart | undefined;\r\n const cartCookie: string = ctx.requestContext.cookies.getCartCookie();\r\n const cartCookieParts: string[] = cartCookie.split(':');\r\n try {\r\n // Check if there are already is a cart cookie and it is in the format we understand\r\n cart = await getCartFromCookie(cartCookieParts, ctx);\r\n const wasReadFromCookie = !!cart && cart.Id;\r\n\r\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\r\n if (!(cart && cart.Id)) {\r\n cart = await getCartFromCustomer(ctx);\r\n }\r\n\r\n // If the customer just went from anon to signed in state then get that anon cart\r\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\r\n // if the search resulted in a cart, and the read also resulted in cart, then go ahead an merge the carts\r\n const anonCart = await claimAnonCart(cartCookieParts, cart, ctx);\r\n if (anonCart) {\r\n cart = anonCart;\r\n }\r\n\r\n // If there is no cookie or everything else fails, create an empty cart and return that for the customer\r\n if (!(cart && cart.Id)) {\r\n cart = await createNewCart(ctx);\r\n }\r\n if (!wasReadFromCookie && ctx.requestContext.user.isAuthenticated && cart && !cart.LoyaltyCardId) {\r\n const card = await getCustomerLoyaltyCardsAsync({ callerContext: ctx, queryResultSettings: {} }, null);\r\n if (card && card.length > 0) {\r\n\r\n cart = await updateAsync(\r\n { callerContext: ctx },\r\n {\r\n Id: cart.Id,\r\n LoyaltyCardId: card[0].CardNumber\r\n }\r\n );\r\n }\r\n }\r\n\r\n } catch (error) {\r\n ctx.telemetry.error(`Caught exception in getting cart: ${error}`);\r\n cart = await createNewCart(ctx);\r\n }\r\n return cart;\r\n}\r\n\r\nexport async function createNewCart(ctx: IActionContext): Promise {\r\n const newCart = await createCartAsync({ callerContext: ctx }, {});\r\n if (newCart && newCart.Id) {\r\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\r\n\r\n return newCart;\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport async function getCartFromCookie(cartCookieParts: string[], ctx: IActionContext): Promise {\r\n if (cartCookieParts && cartCookieParts.length === 2) {\r\n // If the customer is authenticated and they have an auth cookie\r\n // OR if the customer is not authenticated and then have an anon cookie\r\n // just get the cart and return that\r\n\r\n if ((ctx.requestContext.user.isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) ||\r\n (!ctx.requestContext.user.isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)) {\r\n const readCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\r\n\r\n if (readCart && readCart.Id) {\r\n ctx.requestContext.cookies.setCartCookie(readCart, ctx.requestContext.user.isAuthenticated);\r\n return readCart;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport async function getCartFromCustomer(ctx: IActionContext): Promise {\r\n if (ctx.requestContext.user.isAuthenticated) {\r\n const authCarts = await searchCarts(ctx);\r\n if (authCarts && authCarts.length > 0) {\r\n ctx.requestContext.cookies.setCartCookie(authCarts[0], ctx.requestContext.user.isAuthenticated);\r\n return authCarts[0];\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\nexport async function claimAnonCart(cartCookieParts: string[], currentCart: Cart | undefined, ctx: IActionContext): Promise {\r\n if (ctx.requestContext.user.isAuthenticated && cartCookieParts && cartCookieParts.length === 2 && cartCookieParts[0] === CartTokenPrefix.Anon) {\r\n const anonCurrentCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, cartCookieParts[1]);\r\n\r\n if (anonCurrentCart && !currentCart) {\r\n const newCart = await claimCart(anonCurrentCart.Id, ctx);\r\n if (newCart && newCart.Id) {\r\n ctx.requestContext.cookies.setCartCookie(newCart, ctx.requestContext.user.isAuthenticated);\r\n return newCart;\r\n }\r\n }\r\n\r\n if (anonCurrentCart && anonCurrentCart.Id && currentCart) {\r\n const mergedCart = await addCartLines(anonCurrentCart, currentCart, ctx);\r\n\r\n // Once updated, take that merged cart ID and store the cart ID in the cookie\r\n if (!(mergedCart instanceof Error) && mergedCart.Id) {\r\n ctx.requestContext.cookies.setCartCookie(mergedCart, ctx.requestContext.user.isAuthenticated);\r\n return mergedCart;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Function that copies a cartline for giftcard.\r\n * @param cartline Source CartLine you want to copy.\r\n */\r\nfunction buildGiftCardLine(cartline: CartLine): CartLine {\r\n return {\r\n DeliveryMode: cartline.DeliveryMode,\r\n CatalogId: cartline.CatalogId,\r\n Description: cartline.Description,\r\n EntryMethodTypeValue: cartline.EntryMethodTypeValue || 3,\r\n ItemId: cartline.ItemId,\r\n ProductId: cartline.ProductId,\r\n Quantity: cartline.Quantity,\r\n Price: cartline.Price,\r\n NetPrice: cartline.NetPrice,\r\n GiftCardBalance: cartline.GiftCardBalance,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: cartline.UnitOfMeasureSymbol,\r\n IsPriceKeyedIn: true,\r\n IsGiftCardLine: true,\r\n ExtensionProperties: cartline.ExtensionProperties\r\n };\r\n}\r\n\r\n/**\r\n * Function that adds cart lines from source cart to destination cart.\r\n * @param sourceCart Source cart you want to add cart lines from.\r\n * @param destinationCart Destination cart that you want to add cart lines to.\r\n * @param ctx Request context.\r\n */\r\nexport async function addCartLines(sourceCart: Cart, destinationCart: Cart, ctx: IActionContext): Promise {\r\n let updatedCart;\r\n const cartLines: CartLine[] = [];\r\n const cartLinesToDelete: string[] = [];\r\n let hasShippingMethod: boolean;\r\n const channelConfiguration = ctx.requestContext.channel;\r\n const featureNames: string[] = [\r\n 'Dynamics.AX.Application.RetailB2BEcommerceFeature',\r\n 'Dynamics.AX.Application.RetailDefaultOrderQuantityLimitsFeature',\r\n 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature'\r\n ];\r\n if (destinationCart.Version) {\r\n if (sourceCart.CartLines && sourceCart.CartLines.length > 0) {\r\n for (const cartline of sourceCart.CartLines) {\r\n let newCartLine: CartLine;\r\n\r\n if (cartline.IsGiftCardLine) {\r\n newCartLine = buildGiftCardLine(cartline);\r\n } else {\r\n newCartLine = {};\r\n const featureStates = await getFeatureStatesAsync({ callerContext: ctx }, featureNames);\r\n const isfeatureStatesEnabled = featureStates\r\n ?.find((featureState: FeatureState) => featureState.Name === 'Dynamics.AX.Application.RetailMultiplePickupDeliveryModeFeature')?.IsEnabled || false;\r\n if (isfeatureStatesEnabled) {\r\n const channelDeliveryOptionConfig = await getChannelDeliveryOptionConfigurationAsync({ callerContext: ctx });\r\n hasShippingMethod = cartline.DeliveryMode === channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find((deliveryMode: string) => deliveryMode === cartline.DeliveryMode);\r\n\r\n if (cartline.DeliveryMode !== undefined && hasShippingMethod) {\r\n newCartLine.DeliveryMode = cartline.DeliveryMode;\r\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\r\n newCartLine.ShippingAddress = cartline.ShippingAddress;\r\n }\r\n } else if (!isEmpty(cartline.DeliveryMode) && cartline.DeliveryMode === channelConfiguration?.PickupDeliveryModeCode) {\r\n newCartLine.DeliveryMode = channelConfiguration?.PickupDeliveryModeCode;\r\n newCartLine.FulfillmentStoreId = cartline.FulfillmentStoreId;\r\n newCartLine.ShippingAddress = cartline.ShippingAddress;\r\n }\r\n newCartLine.ProductId = cartline.ProductId;\r\n newCartLine.Quantity = cartline.Quantity;\r\n newCartLine.ExtensionProperties = cartline.ExtensionProperties;\r\n newCartLine.Description = cartline.Description;\r\n newCartLine.ReasonCodeLines = cartline.ReasonCodeLines;\r\n newCartLine.AttributeValues = cartline.AttributeValues;\r\n }\r\n\r\n cartLines.push({ ...newCartLine });\r\n if (cartline.LineId) {\r\n cartLinesToDelete.push(cartline.LineId);\r\n }\r\n }\r\n }\r\n\r\n if (cartLines.length > 0) {\r\n try {\r\n updatedCart = await addCartLinesAsync({ callerContext: ctx }, destinationCart.Id, cartLines, destinationCart.Version);\r\n\r\n if (cartLinesToDelete.length > 0) {\r\n sourceCart = await removeCartLinesAsync({ callerContext: ctx }, sourceCart.Id, cartLinesToDelete);\r\n }\r\n } catch (error) {\r\n ctx.telemetry.error('Error adding cart lines to desination cart');\r\n ctx.telemetry.exception(error);\r\n return destinationCart;\r\n }\r\n }\r\n\r\n // Copy over coupon codes from source cart to destination cart so that the customer doesn't lose couponCodes while migration\r\n if (sourceCart.Coupons && sourceCart.Coupons.length > 0) {\r\n const coupons = sourceCart.Coupons.map((coupon: Coupon) => {\r\n return coupon.Code!;\r\n });\r\n\r\n try {\r\n updatedCart = await addCouponsAsync({ callerContext: ctx }, destinationCart.Id, coupons, false);\r\n } catch (error) {\r\n ctx.telemetry.error('Error adding existing coupon codes to the cart');\r\n ctx.telemetry.exception(error);\r\n return destinationCart;\r\n }\r\n }\r\n }\r\n\r\n return updatedCart || destinationCart;\r\n}\r\n\r\n/**\r\n * Function to claim a cart as auth cart and set the browser cookie accordingly.\r\n *\r\n * @param cartId Cart Id to claim as auth cart.\r\n * @param ctx Request Context.\r\n */\r\nexport async function claimCart(cartId: string, ctx: IActionContext): Promise {\r\n const claimAuthCart = await updateAsync(\r\n { callerContext: ctx },\r\n {\r\n Id: cartId\r\n }\r\n );\r\n if (!(claimAuthCart instanceof Error) && claimAuthCart && claimAuthCart.Id) {\r\n return claimAuthCart;\r\n }\r\n return {};\r\n\r\n}\r\n\r\n/**\r\n * Function to search carts that belong to a customer.\r\n *\r\n * @param ctx Request context.\r\n */\r\nexport async function searchCarts(ctx: IActionContext): Promise {\r\n const cartSearchCriteria: CartSearchCriteria = {\r\n IncludeAnonymous: false,\r\n CartTypeValue: 1\r\n };\r\n\r\n const queryResultSettings: QueryResultSettings = {\r\n Paging: {\r\n Top: 1,\r\n Skip: 0\r\n },\r\n Sorting: {\r\n Columns: [\r\n {\r\n ColumnName: 'ModifiedDateTime',\r\n IsDescending: true\r\n }\r\n ]\r\n }\r\n };\r\n\r\n return searchAsync({ callerContext: ctx, queryResultSettings }, cartSearchCriteria);\r\n}\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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, cartLineId: string | null, price: number, actionContext: IActionContext): Promise {\n\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({ callerContext: actionContext }, cart.Id, cartLineId, price, cart.Version);\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. All rights reserved.\n * See License.txt 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(cart: Readonly, cartLineDeliverySpecifications: LineDeliverySpecification[], actionContext: IActionContext): Promise {\n if (!cart || !cart.CartLines || cartLineDeliverySpecifications.length === 0) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateLineDeliverySpecificationsAsync(\n { callerContext: actionContext },\n cart.Id,\n cartLineDeliverySpecifications\n )\n .then(newCart => {\n return { cart: newCart, status: 'SUCCESS' };\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. All rights reserved.\n * See License.txt 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\n}\nasync function updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings(cart: Readonly, cartLineId: string, newQuantity: number, 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 (error.name === 'Microsoft_Dynamics_Commerce_Runtime_AddingItem_ExceedsMaximumQuantity' ||\n error.name === 'Microsoft_Dynamics_Commerce_Runtime_UpdatingItem_ExceedsMaximumQuantity') {\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 }, validationResults: error.data?.ValidationResults };\n return cartActionResult;\n }\n\n cartActionResult = { cart: undefined, 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 }, validationResults: error.data?.ValidationResults };\n return cartActionResult;\n });\n}\n\nasync function updateCartLineQuantityValidateMaxAgainstSiteSettings(cart: Readonly, cartLineId: string, newQuantity: number, 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 { cart: undefined, 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 }, validationResults: error.data?.ValidationResults };\n });\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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): 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","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { Address, Cart, CartLine, ChannelDeliveryOptionConfiguration, OrgUnitLocation, SimpleProduct } from '@msdyn365-commerce/retail-proxy';\r\nimport { AttributeValueBase, CommerceProperty, LineDeliverySpecification, ReleasedProductType } from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport { action, computed, observable } from 'mobx';\r\n\r\nimport { GlobalState } from '../global-state/global-state';\r\nimport { ICartActionResult, ICartState } from '../state-interfaces/i-cart-state';\r\nimport addInvoicesToCartInternal from './add-invoices-to-cart';\r\nimport addOrderInvoiceToCartInternal from './add-order-invoice-to-cart';\r\nimport addProductToCartInternal, { addProductsToCartInternal } from './add-product-to-cart';\r\nimport addPromoCodeInternal from './add-promo-code';\r\nimport { ICartActionResultWithCart } from './cart-action-result';\r\nimport clearCartLineDeliveryModeInternal from './clear-cart-line-delivery-mode';\r\nimport clearCartLinesDeliveryInformation from './clear-cart-lines-delivery-information';\r\nimport getOrCreateActiveCart from './get-or-create-active-cart';\r\nimport refreshCartInternal from './refresh-cart';\r\nimport removeAllPromoCodesInternal from './remove-all-promo-codes';\r\nimport removeCartLineInternal from './remove-cart-lines';\r\nimport removePromoCodesInternal from './remove-promo-codes';\r\nimport setInvoiceLinePriceInternal from './set-invoice-line-price';\r\nimport updateCart from './update-cart';\r\nimport updateCartLineDeliverySpecificationsInternal from './update-cart-line-delivery-specifications';\r\nimport updateCartLineQuantityInternal from './update-cart-line-quantity';\r\nimport updateLoyaltyCardIdInternal from './update-loyalty-card-id';\r\nimport updateReceiptEmail from './update-receipt-email';\r\nimport updateShippingAddress from './update-shipping-address';\r\n\r\n/**\r\n * Cart state information.\r\n */\r\nexport class BaseCartState extends GlobalState implements ICartState {\r\n @observable protected _cart: Cart;\r\n\r\n @computed public get cart(): Readonly {\r\n return this._cart;\r\n }\r\n\r\n @observable protected _attributeValues: AttributeValueBase[];\r\n\r\n @computed public get attributeValues(): AttributeValueBase[] {\r\n return this._attributeValues;\r\n }\r\n\r\n @observable protected _extensionProperties: CommerceProperty[];\r\n\r\n @computed public get extensionProperties(): CommerceProperty[] {\r\n return this._extensionProperties;\r\n }\r\n\r\n @computed public get totalItemsInCart(): number {\r\n if (this._cart.CartLines) {\r\n return this._cart.CartLines.map(cartLine => cartLine.Quantity || 1).reduce((total, num) => total + num, 0);\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n @observable protected _isProductAddedToCart: boolean;\r\n\r\n @computed public get isProductAddedToCart(): boolean {\r\n return this._isProductAddedToCart;\r\n }\r\n\r\n @computed public get isEmpty(): boolean {\r\n return !(this._cart.CartLines && this._cart.CartLines.length > 0);\r\n }\r\n\r\n @computed public get hasInvoiceLine(): boolean {\r\n return !!(this._cart.CartLines && this._cart.CartLines.some(\r\n cartline => cartline.IsInvoiceLine === true\r\n ));\r\n }\r\n\r\n constructor(actionContext: IActionContext) {\r\n super(actionContext);\r\n this._cart = {};\r\n this._attributeValues = [];\r\n this._extensionProperties = [];\r\n this._isProductAddedToCart = false;\r\n }\r\n\r\n /**\r\n * Refreshes the cart by getting it from the server.\r\n *\r\n * Other actions should keep cart up to date so shouldn't need to call this\r\n * outside of initialization but still might be scenarios where a manual\r\n * refresh is needed.\r\n * @param input\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async refreshCart(input: { additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n const newCart = await refreshCartInternal(this.cart.Id, this.actionContext);\r\n\r\n if (newCart) {\r\n this._cart = newCart;\r\n\r\n return { status: 'SUCCESS' };\r\n }\r\n\r\n return { status: 'FAILED' };\r\n });\r\n }\r\n\r\n /**\r\n * Adds the specified product to the current cart. If product is already in cart\r\n * will update its cart line, otherwise will add a new cart line to the cart.\r\n * @param input - The input.\r\n * @param input.product - The product to add to the cart.\r\n * @param input.count - How many copies of the product to add.\r\n * @param input.location - The org unit location, used for BuyOnlinePickupInStore scenarios\r\n * (If you want item to simply be shipped, leave this parameter undefined).\r\n * @param input.additionalProperties - Additional properties.\r\n * @param input.availableQuantity - Available quantity.\r\n * @param input.enableStockCheck - Is stock check enabled.\r\n * @param input.isAddEmailDeliveryItemToCart - Is add email delivery item to cart.\r\n * @param input.isPriceKeyedIn - Is price keyed in.\r\n * @param input.customPrice - Custom price.\r\n * @param input.deliveryMode - Delivery mode.\r\n * @param input.shouldSkipSiteSettings - Should skip site settings.\r\n * @returns Cart action result.\r\n */\r\n @action\r\n public async addProductToCart(input: {\r\n product: SimpleProduct; count?: number; location?: OrgUnitLocation; additionalProperties?: object; availableQuantity?: number;\r\n enableStockCheck?: boolean; isAddEmailDeliveryItemToCart?: boolean; isPriceKeyedIn?: boolean; customPrice?: number;\r\n deliveryMode?: string; shouldSkipSiteSettings?: boolean;\r\n }): Promise {\r\n return this._doAsyncAction(async () => {\r\n const cartLine: CartLine = {\r\n CatalogId: this.actionContext.requestContext.apiSettings.catalogId,\r\n Description: input.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: input.product.ItemId,\r\n ProductId: input.product.RecordId,\r\n Quantity: input.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: input.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: input.isPriceKeyedIn,\r\n IsGiftCardLine: input.product.IsGiftCard,\r\n Price: input.customPrice ? input.customPrice : input.product.Price\r\n };\r\n\r\n if (input.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (input.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = input.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = input.location.OrgUnitNumber;\r\n cartLine.WarehouseId = input.location.InventoryLocationId;\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(input.location);\r\n }\r\n\r\n if (input.isAddEmailDeliveryItemToCart) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const isAddServiceItemToCart = input.product.ItemTypeValue === ReleasedProductType.Service;\r\n\r\n // @ts-expect-error\r\n const orderQuantityLimitsFeatureIsEnabled: boolean = !!input.additionalProperties?.orderQuantityLimitsFeatureIsEnabled;\r\n const isMaxByQuantityValidationFeatureDefined: boolean = !!input.product.Behavior?.MaximumQuantity;\r\n return this._doCartOperationWithRetry(() => addProductToCartInternal(\r\n this.cart,\r\n cartLine,\r\n this.actionContext,\r\n orderQuantityLimitsFeatureIsEnabled,\r\n input.availableQuantity,\r\n input.enableStockCheck,\r\n isAddServiceItemToCart,\r\n isMaxByQuantityValidationFeatureDefined,\r\n input.shouldSkipSiteSettings\r\n ));\r\n });\r\n }\r\n\r\n /**\r\n * Adds the specified product to the current cart. If product is already in cart\r\n * will update its cart line, otherwise will add a new cart line to the cart.\r\n * @param input\r\n * @param product The product to add to the cart.\r\n * @param count: How many copies of the product to add.\r\n * @param location: The org unit location, used for BuyOnlinePickupInStore scenarios\r\n * (If you want item to simply be shipped, leave this parameter undefined).\r\n * @param input.product\r\n * @param input.count\r\n * @param input.location\r\n * @param input.additionalProperties\r\n * @param input.availableQuantity\r\n * @param input.enableStockCheck\r\n * @param input.isAddEmailDeliveryItemToCart\r\n * @param input.isPriceKeyedIn\r\n * @param input.customPrice\r\n * @param input.deliveryMode\r\n * @returns Cart action result.\r\n */\r\n @action\r\n public async addProductsToCart(input: {\r\n product: SimpleProduct; count?: number; location?: OrgUnitLocation; additionalProperties?: object; availableQuantity?: number;\r\n enableStockCheck?: boolean; isAddEmailDeliveryItemToCart?: boolean; isPriceKeyedIn?: boolean; customPrice?: number; deliveryMode?: string;\r\n }[]): Promise {\r\n return this._doAsyncAction(async () => {\r\n const internalInput: {\r\n cartLineToAdd: CartLine;\r\n availableQuantity?: number;\r\n isStockCheckEnabled?: boolean;\r\n isAddServiceItemToCart?: boolean;\r\n }[] = [];\r\n\r\n for (const inputItem of input) {\r\n const cartLine: CartLine = {\r\n CatalogId: this.actionContext.requestContext.apiSettings.catalogId,\r\n Description: inputItem.product.Description,\r\n\r\n // TODO: Investigate this value and what it represents\r\n EntryMethodTypeValue: 3,\r\n ItemId: inputItem.product.ItemId,\r\n ProductId: inputItem.product.RecordId,\r\n Quantity: inputItem.count || 1,\r\n TrackingId: '',\r\n UnitOfMeasureSymbol: inputItem.product.DefaultUnitOfMeasure,\r\n IsPriceKeyedIn: inputItem.isPriceKeyedIn,\r\n IsGiftCardLine: inputItem.product.IsGiftCard,\r\n Price: inputItem.customPrice ? inputItem.customPrice : inputItem.product.Price\r\n };\r\n\r\n if (inputItem.location) {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n // If curbside pick is not available use the default one\r\n if (inputItem.deliveryMode !== undefined) {\r\n cartLine.DeliveryMode = inputItem.deliveryMode;\r\n } else {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n }\r\n\r\n cartLine.FulfillmentStoreId = inputItem.location.OrgUnitNumber;\r\n cartLine.WarehouseId = inputItem.location.InventoryLocationId;\r\n cartLine.ShippingAddress = this._buildAddressFromOrgUnitLocation(inputItem.location);\r\n }\r\n\r\n if (inputItem.isAddEmailDeliveryItemToCart) {\r\n cartLine.DeliveryMode = this.actionContext.requestContext.channel?.EmailDeliveryModeCode;\r\n }\r\n\r\n // Check if the product is service or not by product type\r\n const PRODUCTASSERVICE = 2 as ReleasedProductType.Service;\r\n const isAddServiceItemToCart = inputItem.product.ItemTypeValue === PRODUCTASSERVICE;\r\n\r\n internalInput.push({\r\n cartLineToAdd: cartLine,\r\n availableQuantity: inputItem.availableQuantity,\r\n isStockCheckEnabled: inputItem.enableStockCheck,\r\n isAddServiceItemToCart\r\n });\r\n }\r\n\r\n return this._doCartOperationWithRetry(() => addProductsToCartInternal(\r\n this.cart,\r\n this.actionContext,\r\n internalInput\r\n ));\r\n });\r\n }\r\n\r\n /**\r\n * Adds the specified invoices to the current cart.\r\n * @param input\r\n * @param invoiceIds The invoice ids to add to the cart.\r\n * @param input.invoiceIds\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async addInvoicesToCart(input: { invoiceIds: string[]; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => addInvoicesToCartInternal(this.cart, input.invoiceIds, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Adds the specified order invoice to the current cart.\r\n * @param input\r\n * @param invoiceId The invoice id to add to the cart.\r\n * @param lineDescription The description for the invoice line.\r\n * @param input.invoiceId\r\n * @param input.lineDescription\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async addOrderInvoiceToCart(input: { invoiceId: string; lineDescription: string; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => addOrderInvoiceToCartInternal(this.cart, input.invoiceId, input.lineDescription, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Sets price for the given cart line with an invoice. Used to complete partial invoice payments.\r\n * @param input - Input for the operation.\r\n * @param input.cartLineId - The cart line with the invoice for which to update the price.\r\n * @param input.price - The new value of price of the invoice.\r\n * @returns The result of the operation.\r\n */\r\n @action public async setInvoiceLinePrice(\r\n input: { cartLineId: string | null; price: number }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(\r\n async () => setInvoiceLinePriceInternal(this.cart, input.cartLineId, input.price, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Removes the cart lines with the provided ids from the cart.\r\n * @param input\r\n * @param cartLineIds The cart lines to remove.\r\n * @param input.cartLineIds\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async removeCartLines(input: { cartLineIds: string[]; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => removeCartLineInternal(this.cart, input.cartLineIds, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Clears the pickup location information from the provided cart line,\r\n * resulting in it getting shipped to the customer.\r\n * @param input\r\n * @param cartLineId The cart line to clear the location from.\r\n * @param input.cartLineId\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async clearCartLinePickupLocation(input: { cartLineId: string; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => clearCartLineDeliveryModeInternal(this.cart, input.cartLineId, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Clears the delivery mode, and other information for the shipping cart lines.\r\n * @param input\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async clearCartLinesDeliveryInformation(input: { additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => clearCartLinesDeliveryInformation(this.cart, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Marks the provided cartline for pickup in store, with the provided location as\r\n * the pickup location.\r\n * @param input\r\n * @param cartLineId The cart line to mark for pickup.\r\n * @param location The location to set for pickup.\r\n * @param input.cartLineId\r\n * @param input.location\r\n * @param input.additionalProperties\r\n * @param input.deliveryMode\r\n */\r\n @action\r\n public async updateCartLinePickupLocation(input: { cartLineId: string; location: OrgUnitLocation; additionalProperties?: object; deliveryMode?: string }): Promise {\r\n return this._doAsyncAction(async () => {\r\n if (!this.actionContext.requestContext.channel) {\r\n return { status: 'FAILED' };\r\n }\r\n\r\n const cartLineDeliverySpecification = {\r\n LineId: input.cartLineId,\r\n DeliverySpecification: {\r\n DeliveryModeId: input.deliveryMode !== undefined ? input.deliveryMode : this.actionContext.requestContext.channel.PickupDeliveryModeCode,\r\n DeliveryPreferenceTypeValue: 2, // Pick up in store\r\n PickUpStoreId: input.location.OrgUnitNumber,\r\n DeliveryAddress: this._buildAddressFromOrgUnitLocation(input.location)\r\n }\r\n };\r\n\r\n return this._doCartOperationWithRetry(() => updateCartLineDeliverySpecificationsInternal(this.cart, [cartLineDeliverySpecification], this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * @param input The cart line.\r\n * @param input.lineDeliverySpecifications\r\n */\r\n @action\r\n public async updateCartLinePickupDateTimeslot(input: { lineDeliverySpecifications: LineDeliverySpecification[] }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => updateCartLineDeliverySpecificationsInternal(this.cart, input.lineDeliverySpecifications, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Updates the delivery mode for items in the cart with the desired delivery mode, preserving BOPIS status for stuff already marked as BOPIS.\r\n * @param input\r\n * @param deliveryModeId The delivery mode to use.\r\n * @param input.deliveryModeId\r\n * @param input.shippingAddress\r\n * @param input.additionalProperties\r\n * @param input.channelDeliveryOptionConfig\r\n */\r\n @action\r\n public async updateCartDeliverySpecification(input: { deliveryModeId: string; shippingAddress: Address | undefined; additionalProperties?: object; channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration }): Promise {\r\n return this._doAsyncAction(async () => {\r\n if (input.deliveryModeId.trim() === '') {\r\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\r\n }\r\n\r\n const pickupDeliveryModeCode =\r\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.PickupDeliveryModeCode;\r\n const emailDeliveryModeCode =\r\n this.actionContext.requestContext.channel && this.actionContext.requestContext.channel.EmailDeliveryModeCode;\r\n let cartLinesForShipping: CartLine[] = [];\r\n\r\n cartLinesForShipping = input.channelDeliveryOptionConfig !== undefined ? (this.cart.CartLines || []).filter(\r\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== input.channelDeliveryOptionConfig?.PickupDeliveryModeCodes?.find(deliveryMode => deliveryMode === cartLine.DeliveryMode) && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\r\n ) : (this.cart.CartLines || []).filter(\r\n cartLine => ((cartLine.DeliveryMode && cartLine.DeliveryMode !== '') ? (cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode) : cartLine)\r\n );\r\n\r\n if (cartLinesForShipping.length > 0) {\r\n const deliverySpecifications = cartLinesForShipping.map(cartLine => {\r\n return {\r\n LineId: cartLine.LineId,\r\n DeliverySpecification: {\r\n DeliveryModeId: input.deliveryModeId,\r\n DeliveryPreferenceTypeValue: 1, // Ship\r\n DeliveryAddress: input.shippingAddress\r\n }\r\n };\r\n });\r\n\r\n return this._doCartOperationWithRetry(() => updateCartLineDeliverySpecificationsInternal(this.cart, deliverySpecifications, this.actionContext));\r\n }\r\n\r\n return { status: 'FAILED', substatus: 'NOCONTENT' };\r\n });\r\n }\r\n\r\n /**\r\n * Updates the quantity of the cart line.\r\n * @param input\r\n * @param cartLineId The cart line to update the quantity.\r\n * @param newQuantity The new quantity to use (note that if this exceeds max quantity, will set quantity to max quantity).\r\n * @param input.cartLineId\r\n * @param input.newQuantity\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateCartLineQuantity(input: { cartLineId: string; newQuantity: number; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => updateCartLineQuantityInternal(\r\n this.cart, input.cartLineId,\r\n input.newQuantity,\r\n this.actionContext,\r\n\r\n // @ts-expect-error\r\n input.additionalProperties?.isUsingDefaultOrderSettingsMax));\r\n });\r\n }\r\n\r\n /**\r\n * Updates the loyalty card ID on the card.\r\n * @param loyaltyCardId The loyalty card id to use.\r\n * @param input\r\n * @param input.loyaltyCardNumber\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateLoyaltyCardId(input: { loyaltyCardNumber: string | undefined; additionalProperties?: object }): Promise {\r\n if (!input.loyaltyCardNumber) {\r\n return { status: 'FAILED', substatus: 'EMPTYINPUT' };\r\n }\r\n\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => updateLoyaltyCardIdInternal(this.cart, input.loyaltyCardNumber!, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Adds promo code to the cart.\r\n * @param input\r\n * @param promoCode The promo code to add.\r\n * @param input.promoCode\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public addPromoCode(input: { promoCode: string; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => addPromoCodeInternal(this.cart, input.promoCode, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Removes promo codes from the cart.\r\n * @param input\r\n * @param promoCodes The promo codes to remove.\r\n * @param input.promoCodes\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public removePromoCodes(input: { promoCodes: string[]; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => removePromoCodesInternal(this.cart, input.promoCodes, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Removes all promo code from the cart.\r\n * @param input\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public removeAllPromoCodes(input: { additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => removeAllPromoCodesInternal(this.cart, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Updates receipt email.\r\n * @param input\r\n * @param newEmail The receipt email.\r\n * @param input.newEmail\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateReceiptEmail(input: { newEmail: string; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => updateReceiptEmail(this.cart, input.newEmail, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Updates shipping address.\r\n * @param input - The input.\r\n * @param input.newShippingAddress - The shipping address.\r\n * @param input.additionalProperties - The additional properties.\r\n * @returns ICartActionResult.\r\n */\r\n @action\r\n public async updateShippingAddress(input: { newShippingAddress: Address; additionalProperties?: { [key: string]: unknown } }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(async () => updateShippingAddress(this.cart, input.newShippingAddress, this.actionContext));\r\n });\r\n }\r\n\r\n /**\r\n * Updates the attribute values.\r\n * @param input\r\n * @param newAttributeValues The new attribute values to update.\r\n * @param input.newAttributeValues\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateAttributeValues(input: { newAttributeValues: AttributeValueBase[]; additionalProperties?: object }): Promise {\r\n this._attributeValues = input.newAttributeValues;\r\n const newCartObject: Cart = {\r\n Id: this.cart.Id,\r\n AttributeValues: input.newAttributeValues\r\n };\r\n return this.updateCart({ newCartObject });\r\n }\r\n\r\n /**\r\n * Updates the extension properties.\r\n * @param input\r\n * @param newExtensionProperties The new Extension properties to update.\r\n * @param input.newExtensionProperties\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateExtensionProperties(input: { newExtensionProperties: CommerceProperty[]; additionalProperties?: object }): Promise {\r\n this._extensionProperties = input.newExtensionProperties;\r\n const newCartObject: Cart = {\r\n Id: this.cart.Id,\r\n ExtensionProperties: input.newExtensionProperties\r\n };\r\n return this.updateCart({ newCartObject });\r\n }\r\n\r\n /**\r\n * Updates cart object.\r\n * @param newCart The cart object.\r\n * @param input\r\n * @param input.newCartObject\r\n * @param input.additionalProperties\r\n */\r\n @action\r\n public async updateCart(input: { newCartObject: Cart; additionalProperties?: object }): Promise {\r\n return this._doAsyncAction(async () => {\r\n return this._doCartOperationWithRetry(() => updateCart(this.cart, input.newCartObject, this.actionContext));\r\n });\r\n }\r\n\r\n public async initialize(): Promise {\r\n if (this.isInitialized) {\r\n return;\r\n }\r\n const newCart = await getOrCreateActiveCart(this.actionContext);\r\n if (newCart) {\r\n this._cart = newCart;\r\n this._status = 'READY';\r\n } else {\r\n this._status = 'ERROR';\r\n }\r\n\r\n this.isInitialized = true;\r\n }\r\n\r\n private async _doCartOperationWithRetry(callback: () => Promise): Promise {\r\n let callbackResult = await callback();\r\n\r\n if (callbackResult.status === 'SUCCESS') {\r\n if (callbackResult.cart) {\r\n this._cart = callbackResult.cart;\r\n }\r\n } else {\r\n const refreshCartResult = await this.refreshCart({});\r\n\r\n if (refreshCartResult.status === 'SUCCESS') {\r\n callbackResult = await callback();\r\n\r\n if (callbackResult.status === 'SUCCESS') {\r\n if (callbackResult.cart) {\r\n this._cart = callbackResult.cart;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (callbackResult.status === 'SUCCESS' && callbackResult.substatus && callbackResult.substatus === 'PRODUCTADDED') {\r\n this._isProductAddedToCart = true;\r\n } else {\r\n this._isProductAddedToCart = false;\r\n }\r\n\r\n return {\r\n status: callbackResult.status,\r\n substatus: callbackResult.substatus,\r\n errorDetails: callbackResult.errorDetails,\r\n validationResults: callbackResult.validationResults\r\n };\r\n }\r\n\r\n private _buildAddressFromOrgUnitLocation(location: OrgUnitLocation): Address {\r\n return {\r\n RecordId: location.PostalAddressId,\r\n Name: location.OrgUnitName,\r\n FullAddress: location.Address,\r\n Street: location.Street,\r\n StreetNumber: location.StreetNumber,\r\n City: location.City,\r\n DistrictName: location.DistrictName,\r\n BuildingCompliment: location.BuildingCompliment,\r\n Postbox: location.Postbox,\r\n ThreeLetterISORegionName: location.Country,\r\n ZipCode: location.Zip,\r\n County: location.County,\r\n CountyName: location.CountyName,\r\n State: location.State,\r\n StateName: location.StateName\r\n };\r\n }\r\n}\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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 }).catch(error => {\n return undefined;\n });\n}\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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, invoiceIds: string[], actionContext: IActionContext): Promise {\n\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. All rights reserved.\n * See License.txt 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(cart: Readonly, invoiceId: string, lineDescription: string, actionContext: IActionContext): 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. All rights reserved.\n * See License.txt 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(cart: Readonly, cartLineIds: string[], actionContext: IActionContext): 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. All rights reserved.\n * See License.txt 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(cart: Readonly, actionContext: IActionContext, channelDeliveryOptionConfig?: ChannelDeliveryOptionConfiguration): Promise {\n\n if (!cart || !cart.CartLines) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n let matchingLines: CartLine[] = [];\n const pickupDeliveryModeCode = actionContext && actionContext.requestContext && actionContext.requestContext.channel?.PickupDeliveryModeCode;\n const emailDeliveryModeCode = actionContext && actionContext.requestContext && actionContext.requestContext.channel?.EmailDeliveryModeCode;\n if (channelDeliveryOptionConfig !== undefined) {\n matchingLines = cart.CartLines.filter(\n cartLine => cartLine.DeliveryMode && cartLine.DeliveryMode !== channelDeliveryOptionConfig.PickupDeliveryModeCodes?.find(dM => dM === cartLine.DeliveryMode) && cartLine.DeliveryMode !== emailDeliveryModeCode && cartLine.LineId\n );\n } else {\n matchingLines = cart.CartLines.filter(\n cartLine => cartLine.DeliveryMode && cartLine.DeliveryMode !== pickupDeliveryModeCode && cartLine.DeliveryMode !== emailDeliveryModeCode && 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: any) => {\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. All rights reserved.\n * See License.txt 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(cart: Readonly, newLoyaltyCardId: string, actionContext: IActionContext): 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. All rights reserved.\n * See License.txt 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(cart: Readonly, promoCodes: string[], actionContext: IActionContext): 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 }).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. All rights reserved.\n * See License.txt 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(cart: Readonly, actionContext: IActionContext): 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 }).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. All rights reserved.\n * See License.txt 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(cart: Readonly, email: string, actionContext: IActionContext): 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. All rights reserved.\n * See License.txt 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(cart: Readonly, updatedCartObject: Cart, actionContext: IActionContext): Promise {\n if (!cart) {\n return { cart: undefined, status: 'FAILED', substatus: 'EMPTYCART' };\n }\n\n return updateAsync(\n { callerContext: actionContext },\n { ...updatedCartObject, Id: cart.Id }\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 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. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nexport enum CheckoutStorageKey {\n BillingAddress = 'BillingAddress',\n GiftCard = 'GiftCard',\n LoyaltyCardNumber = 'LoyaltyCardNumber',\n LoyaltyAmount = 'LoyaltyAmount',\n TermsAndCondition = 'TermsAndCondition',\n CheckoutGenericData = 'Checkout-Generic-Data',\n PaymentTenderType = 'PaymentTenderType'\n}\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { BaseCartState } from '../cart-state/base-cart-state';\r\nimport getCheckoutCart, { GetCheckoutCartInput } from '../data-actions/get-checkout-cart';\r\n\r\n/**\r\n * Version of BaseCartState that uses the checkout cart.\r\n */\r\nexport class BaseCheckoutCartState extends BaseCartState {\r\n public async initialize(): Promise {\r\n if (this.isInitialized) {\r\n return;\r\n }\r\n\r\n let newCart = await getCheckoutCart(new GetCheckoutCartInput(this.actionContext.requestContext.apiSettings), this.actionContext);\r\n newCart?.CustomerId;\r\n if (newCart) {\r\n newCart = {\r\n ...newCart,\r\n CustomerId: '100001'\r\n };\r\n this._cart = newCart;\r\n this._status = 'READY';\r\n } else {\r\n this._status = 'ERROR';\r\n }\r\n\r\n this.isInitialized = true;\r\n }\r\n}\r\n","/* eslint-disable security/detect-object-injection */\r\n/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport {\r\n Address,\r\n AttributeValueBase,\r\n CardPaymentAcceptResult,\r\n CommerceProperty,\r\n GiftCard,\r\n SalesOrder,\r\n SimpleProduct,\r\n TenderLine,\r\n TokenizedPaymentCard\r\n} from '@msdyn365-commerce/retail-proxy/dist/Entities/CommerceTypes.g';\r\nimport get from 'lodash/get';\r\nimport { action, computed, observable } from 'mobx';\r\n\r\nimport { GlobalState } from '../global-state/global-state';\r\nimport { ICartState } from '../state-interfaces/i-cart-state';\r\nimport { ICheckoutActionResult, ICheckoutGenericData, ICheckoutState, IGiftCardExtend } from '../state-interfaces/i-checkout-state';\r\nimport { BaseCheckoutCartState } from './base-checkout-cart-state';\r\nimport { CheckoutStorageKey } from './checkout-state-storage';\r\n\r\n/**\r\n * State information related to what is needed to succesfully perform a checkout.\r\n */\r\nexport class BaseCheckoutState extends GlobalState implements ICheckoutState {\r\n @observable protected _checkoutCart: ICartState;\r\n\r\n @computed public get checkoutCart(): ICartState {\r\n return this._checkoutCart;\r\n }\r\n\r\n @observable protected _salesOrder?: SalesOrder;\r\n\r\n @computed public get salesOrder(): Readonly {\r\n return this._salesOrder;\r\n }\r\n\r\n @observable protected _attributeValues: AttributeValueBase[];\r\n\r\n @computed public get attributeValues(): Readonly {\r\n return this._attributeValues;\r\n }\r\n\r\n @observable protected _extensionProperties: CommerceProperty[];\r\n\r\n @computed public get extensionProperties(): Readonly {\r\n return this._extensionProperties;\r\n }\r\n\r\n @observable protected _orderedProducts?: SimpleProduct[];\r\n\r\n @computed public get orderedProducts(): Readonly {\r\n return this._orderedProducts;\r\n }\r\n\r\n @observable protected _tokenizedPaymentCard?: TokenizedPaymentCard;\r\n\r\n @computed public get tokenizedPaymentCard(): Readonly {\r\n return this._tokenizedPaymentCard;\r\n }\r\n\r\n @observable protected _tenderLine?: TenderLine;\r\n\r\n @computed public get tenderLine(): Readonly {\r\n return this._tenderLine;\r\n }\r\n\r\n @observable protected _billingAddress?: Address;\r\n\r\n @computed public get billingAddress(): Readonly
{\r\n return this._billingAddress;\r\n }\r\n\r\n @observable protected _isBillingAddressSameAsShippingAddress?: boolean;\r\n\r\n @computed public get isBillingAddressSameAsShippingAddress(): Readonly {\r\n return this._isBillingAddressSameAsShippingAddress;\r\n }\r\n\r\n @observable protected _shippingAddress?: Address;\r\n\r\n @computed public get shippingAddress(): Readonly
{\r\n return this._shippingAddress;\r\n }\r\n\r\n @observable protected _hasShippingAddress?: boolean;\r\n\r\n @computed public get hasShippingAddress(): Readonly {\r\n return this._hasShippingAddress;\r\n }\r\n\r\n @observable protected _hasCartDeliveryMode?: boolean;\r\n\r\n @computed public get hasCartDeliveryMode(): Readonly {\r\n return this._hasCartDeliveryMode;\r\n }\r\n\r\n @observable protected _cardPrefix?: string;\r\n\r\n @computed public get cardPrefix(): Readonly {\r\n return this._cardPrefix;\r\n }\r\n\r\n @observable protected _paymentTenderType?: string;\r\n\r\n @computed public get paymentTenderType(): Readonly {\r\n return this._paymentTenderType;\r\n }\r\n\r\n /**\r\n * @deprecated Use giftCardExtends method.\r\n */\r\n @computed public get giftCards(): Readonly {\r\n return this.giftCardExtends;\r\n }\r\n\r\n @observable protected _giftCardExtends: IGiftCardExtend[] = [];\r\n\r\n @computed public get giftCardExtends(): Readonly {\r\n return this._giftCardExtends;\r\n }\r\n\r\n @observable protected _loyaltyCardNumber?: string;\r\n\r\n @computed public get loyaltyCardNumber(): Readonly {\r\n return this._loyaltyCardNumber;\r\n }\r\n\r\n @observable protected _loyaltyAmount: number = 0;\r\n\r\n @computed public get loyaltyAmount(): Readonly {\r\n return this._loyaltyAmount;\r\n }\r\n\r\n @observable protected _guestCheckoutEmail: string = '';\r\n\r\n @computed public get guestCheckoutEmail(): Readonly {\r\n return this._guestCheckoutEmail;\r\n }\r\n\r\n @observable protected _hasGuestCheckoutEmail?: boolean;\r\n\r\n @computed public get hasGuestCheckoutEmail(): Readonly {\r\n return this._hasGuestCheckoutEmail;\r\n }\r\n\r\n @observable protected _isTermsAndConditionAccepted?: boolean;\r\n\r\n @computed public get isTermsAndConditionAccepted(): Readonly {\r\n return this._isTermsAndConditionAccepted;\r\n }\r\n\r\n @observable protected _isTermsAndConditionChecked?: boolean;\r\n\r\n @computed public get isTermsAndConditionChecked(): Readonly {\r\n return this._isTermsAndConditionChecked;\r\n }\r\n\r\n @observable protected _shouldEnableSinglePaymentAuthorizationCheckout?: boolean;\r\n\r\n @computed public get shouldEnableSinglePaymentAuthorizationCheckout(): Readonly {\r\n return this._shouldEnableSinglePaymentAuthorizationCheckout;\r\n }\r\n\r\n @observable protected _shouldCollapsePaymentSection?: boolean;\r\n\r\n @computed public get shouldCollapsePaymentSection(): Readonly {\r\n return this._shouldCollapsePaymentSection;\r\n }\r\n\r\n @observable protected _shouldTriggerPaymentWithPlaceOrder?: boolean;\r\n\r\n @computed public get shouldTriggerPaymentWithPlaceOrder(): Readonly {\r\n return this._shouldTriggerPaymentWithPlaceOrder;\r\n }\r\n\r\n @observable protected _isPaymentSectionContainerReady?: boolean;\r\n\r\n @computed public get isPaymentSectionContainerReady(): Readonly {\r\n return this._isPaymentSectionContainerReady;\r\n }\r\n\r\n @observable protected _cardPaymentAcceptResult?: CardPaymentAcceptResult;\r\n\r\n @computed public get cardPaymentAcceptResult(): Readonly {\r\n return this._cardPaymentAcceptResult;\r\n }\r\n\r\n @observable protected _isPaymentSectionContainerHasError?: boolean;\r\n\r\n @computed public get isPaymentSectionContainerHasError(): Readonly {\r\n return this._isPaymentSectionContainerHasError;\r\n }\r\n\r\n @observable protected _redirectAdditionalContext?: string;\r\n\r\n @computed public get redirectAdditionalContext(): Readonly {\r\n return this._redirectAdditionalContext;\r\n }\r\n\r\n @observable protected _isPlaceOrderEnabledInRedirection?: boolean;\r\n\r\n @computed public get isPlaceOrderEnabledInRedirection(): Readonly {\r\n return this._isPlaceOrderEnabledInRedirection;\r\n }\r\n\r\n @observable protected _isPaymentVerificationRequired?: boolean;\r\n\r\n @computed public get isPaymentVerificationRequired(): Readonly {\r\n return this._isPaymentVerificationRequired;\r\n }\r\n\r\n @observable protected _isCheckoutCallFailed?: boolean;\r\n\r\n @computed public get isCheckoutCallFailed(): Readonly {\r\n return this._isCheckoutCallFailed;\r\n }\r\n\r\n @observable protected _customerAccountAmount: number = 0;\r\n\r\n @computed public get customerAccountAmount(): Readonly {\r\n return this._customerAccountAmount;\r\n }\r\n\r\n @observable protected _shouldEnableExpressCheckoutInCheckout?: boolean;\r\n\r\n @computed public get shouldEnableExpressCheckoutInCheckout(): Readonly {\r\n return this._shouldEnableExpressCheckoutInCheckout;\r\n }\r\n\r\n @observable protected _shouldEnableExpressCheckoutInCart?: boolean;\r\n\r\n @computed public get shouldEnableExpressCheckoutInCart(): Readonly {\r\n return this._shouldEnableExpressCheckoutInCart;\r\n }\r\n\r\n @observable protected _shippingAddressFromExpressCheckout?: Address;\r\n\r\n @computed public get shippingAddressFromExpressCheckout(): Readonly
{\r\n return this._shippingAddressFromExpressCheckout;\r\n }\r\n\r\n @observable protected _emailAddressFromExpressCheckout: string = '';\r\n\r\n @computed public get emailAddressFromExpressCheckout(): Readonly {\r\n return this._emailAddressFromExpressCheckout;\r\n }\r\n\r\n @observable protected _billingAddressFromExpressCheckout?: Address;\r\n\r\n @computed public get billingAddressFromExpressCheckout(): Readonly
{\r\n return this._billingAddressFromExpressCheckout;\r\n }\r\n\r\n @observable protected _isExpressCheckoutApplied?: boolean;\r\n\r\n @computed public get isExpressCheckoutApplied(): Readonly {\r\n return this._isExpressCheckoutApplied;\r\n }\r\n\r\n @observable protected _isExpressCheckoutAppliedInCartPage?: boolean;\r\n\r\n @computed public get isExpressCheckoutAppliedInCartPage(): Readonly {\r\n return this._isExpressCheckoutAppliedInCartPage;\r\n }\r\n\r\n @observable protected _checkoutGenericData: object = {};\r\n\r\n constructor(actionContext: IActionContext) {\r\n super(actionContext);\r\n this._checkoutCart = new BaseCheckoutCartState(actionContext);\r\n this._attributeValues = [];\r\n this._extensionProperties = [];\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- Do not need type check for app settings.\r\n this._shouldEnableSinglePaymentAuthorizationCheckout = actionContext.requestContext.app.config\r\n .shouldEnableSinglePaymentAuthorizationCheckout as boolean;\r\n }\r\n\r\n @action\r\n public updateSalesOrder(input: {\r\n newSalesOrder: SalesOrder;\r\n newOrderedProducts: SimpleProduct[];\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._salesOrder = input.newSalesOrder;\r\n this._orderedProducts = input.newOrderedProducts;\r\n this._attributeValues = input.newSalesOrder.AttributeValues || [];\r\n this._extensionProperties = input.newSalesOrder.ExtensionProperties || [];\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateAttributeValues(input: {\r\n newAttributeValues: AttributeValueBase[];\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._attributeValues = input.newAttributeValues;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateExtensionProperties(input: {\r\n newExtensionProperties: CommerceProperty[];\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._extensionProperties = input.newExtensionProperties;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateTokenizedPaymentCard(input: {\r\n newTokenizedPaymentCard?: TokenizedPaymentCard;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateTenderLine(input: { newTenderLine?: TenderLine; additionalProperties?: object }): Promise {\r\n this._tenderLine = input.newTenderLine;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateShippingAddress(input: {\r\n newShippingAddress: Address;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._shippingAddress = input.newShippingAddress;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateHasShippingAddress(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newHasShippingAddress: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._hasShippingAddress = input.newHasShippingAddress;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateHasCartDeliveryMode(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newHasCartDeliveryMode: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._hasCartDeliveryMode = input.newHasCartDeliveryMode;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateTermsAndConditionsAcceptance(input: {\r\n newIsTermsAndConditionAccepted: boolean;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._isTermsAndConditionAccepted = input.newIsTermsAndConditionAccepted;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateIsTermsAndConditionsChecked(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsTermsAndConditionChecked: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isTermsAndConditionChecked = input.newIsTermsAndConditionChecked;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateShouldCollapsePaymentSection(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newShouldCollapsePaymentSection: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._shouldCollapsePaymentSection = input.newShouldCollapsePaymentSection;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateShouldTriggerPaymentWithPlaceOrder(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newShouldTriggerPaymentWithPlaceOrder: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._shouldTriggerPaymentWithPlaceOrder = input.newShouldTriggerPaymentWithPlaceOrder;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsPaymentSectionContainerReady(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsPaymentSectionContainerReady: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isPaymentSectionContainerReady = input.newIsPaymentSectionContainerReady;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateCardPaymentAcceptResult(input: {\r\n newCardPaymentAcceptResult: CardPaymentAcceptResult;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._cardPaymentAcceptResult = input.newCardPaymentAcceptResult;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsPaymentSectionContainerHasError(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsPaymentSectionContainerHasError: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isPaymentSectionContainerHasError = input.newIsPaymentSectionContainerHasError;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateRedirectAdditionalContext(input: {\r\n newRedirectAdditionalContext: string;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._redirectAdditionalContext = input.newRedirectAdditionalContext;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsCheckoutCallFailed(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsCheckoutCallFailed: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isCheckoutCallFailed = input.newIsCheckoutCallFailed;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsPlaceOrderEnabledInRedirection(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsPlaceOrderEnabledInRedirection: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isPlaceOrderEnabledInRedirection = input.newIsPlaceOrderEnabledInRedirection;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsPaymentVerificationRequired(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsPaymentVerificationRequired: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isPaymentVerificationRequired = input.newIsPaymentVerificationRequired;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public updateBillingAddress(input: { newBillingAddress: Address; additionalProperties?: object }): Promise {\r\n this._billingAddress = input.newBillingAddress;\r\n\r\n // @ts-expect-error\r\n this._isBillingAddressSameAsShippingAddress = input.additionalProperties?.isBillingAddressSameAsShippingAddress || false;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public removeBillingAddress(input: { additionalProperties?: object }): Promise {\r\n this._billingAddress = undefined;\r\n this._isBillingAddressSameAsShippingAddress = undefined;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updatePaymentTenderType(input: {\r\n newPaymentTenderType?: string;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._paymentTenderType = input.newPaymentTenderType;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateCardPrefix(input: { newCardPrefix: string; additionalProperties?: object }): Promise {\r\n this._cardPrefix = input.newCardPrefix;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public removeGiftCard(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\r\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public removeGiftCardExtend(input: { giftCardNumber: string; additionalProperties?: object }): Promise {\r\n this._giftCardExtends = this._giftCardExtends.filter(giftCard => giftCard.Id !== input.giftCardNumber);\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public addGiftCard(input: { giftCard: GiftCard; additionalProperties?: object }): Promise {\r\n // @ts-expect-error\r\n const { Pin, ExpirationDate, TenderTypeId } = input.additionalProperties || {};\r\n\r\n const gitCardExtend = { ...input.giftCard, ...{ Pin, ExpirationDate, TenderTypeId } };\r\n\r\n this._giftCardExtends = [gitCardExtend, ...this._giftCardExtends];\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public addGiftCardExtend(input: { giftCard: IGiftCardExtend; additionalProperties?: object }): Promise {\r\n this._giftCardExtends = [input.giftCard, ...this._giftCardExtends];\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateLoyaltyCardNumber(input: { newLoyaltyCardNumber: string; additionalProperties?: object }): Promise {\r\n this._loyaltyCardNumber = input.newLoyaltyCardNumber;\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateLoyaltyAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\r\n this._loyaltyAmount = Number(input.newAmount.toFixed(2));\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateGuestCheckoutEmail(input: {\r\n newGuestCheckoutEmail: string;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._guestCheckoutEmail = input.newGuestCheckoutEmail;\r\n const emailOnCart = this.checkoutCart.cart.ReceiptEmail;\r\n\r\n if (emailOnCart !== input.newGuestCheckoutEmail) {\r\n await this.checkoutCart.updateReceiptEmail({ newEmail: input.newGuestCheckoutEmail });\r\n }\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateHasGuestCheckoutEmail(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newHasGuestCheckoutEmail: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._hasGuestCheckoutEmail = input.newHasGuestCheckoutEmail;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public removeCheckoutCartId(input: { additionalProperties?: object }): Promise {\r\n this.actionContext.requestContext.cookies.removeCheckoutCartCookie();\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public saveDataInStorage(input: { additionalProperties?: object }): Promise {\r\n const { sessionStorage } = this.actionContext.requestContext;\r\n\r\n // Add all local data to session storage\r\n if (this.billingAddress) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.BillingAddress, {\r\n billingAddress: this.billingAddress,\r\n isBillingAddressSameAsShippingAddress: this.isBillingAddressSameAsShippingAddress\r\n });\r\n }\r\n\r\n if (this.giftCardExtends && this.giftCardExtends.length > 0) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.GiftCard, this.giftCardExtends);\r\n }\r\n\r\n if (this.loyaltyCardNumber) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber, { loyaltyCardNumber: this.loyaltyCardNumber });\r\n }\r\n\r\n if (this.loyaltyAmount) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.LoyaltyAmount, { loyaltyAmount: this.loyaltyAmount });\r\n }\r\n\r\n if (this.isTermsAndConditionAccepted) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.TermsAndCondition, {\r\n isTermsAndConditionAccepted: this.isTermsAndConditionAccepted\r\n });\r\n }\r\n\r\n if (this.paymentTenderType) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.PaymentTenderType, { paymentTenderType: this.paymentTenderType });\r\n }\r\n\r\n // Save generic data with SaveDataBeforeRedirect value true\r\n const filtered = Object.keys(this._checkoutGenericData).reduce((filteredData: object, key: string) => {\r\n if (this._checkoutGenericData[key].SaveDataBeforeRedirect) {\r\n filteredData[key] = this._checkoutGenericData[key];\r\n }\r\n return filteredData;\r\n }, {});\r\n\r\n if (Object.keys(filtered).length > 0) {\r\n sessionStorage.setCheckoutCartData(CheckoutStorageKey.CheckoutGenericData, { checkoutGenericData: filtered });\r\n }\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public updateCustomerAccountAmount(input: { newAmount: number; additionalProperties?: object }): Promise {\r\n this._customerAccountAmount = Number(input.newAmount.toFixed(2));\r\n\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public async updateBillingAddressFromExpressCheckout(input: {\r\n newBillingAddressFromExpressCheckout: Address;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._billingAddressFromExpressCheckout = input.newBillingAddressFromExpressCheckout;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateShippingAddressFromExpressCheckout(input: {\r\n newShippingAddressFromExpressCheckout: Address;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._shippingAddressFromExpressCheckout = input.newShippingAddressFromExpressCheckout;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateEmailAddressFromExpressCheckout(input: {\r\n newEmailAddressFromExpressCheckout: string;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateShouldEnableExpressCheckoutInCheckout(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newShouldEnableExpressCheckoutInCheckout: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._shouldEnableExpressCheckoutInCheckout = input.newShouldEnableExpressCheckoutInCheckout;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateShouldEnableExpressCheckoutInCart(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newShouldEnableExpressCheckoutInCart: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._shouldEnableExpressCheckoutInCart = input.newShouldEnableExpressCheckoutInCart;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateIsExpressCheckoutApplied(\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n input: { newIsExpressCheckoutApplied: boolean; additionalProperties?: { [key: string]: unknown } }\r\n ): Promise {\r\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public async updateExpressCheckoutDetails(input: {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention -- Keep the same naming pattern.\r\n newIsExpressCheckoutApplied: boolean;\r\n newEmailAddressFromExpressCheckout: string;\r\n newTenderLine?: TenderLine;\r\n newPaymentTenderType?: string;\r\n newTokenizedPaymentCard?: TokenizedPaymentCard;\r\n additionalProperties?: { [key: string]: unknown };\r\n }): Promise {\r\n this._isExpressCheckoutApplied = input.newIsExpressCheckoutApplied;\r\n this._paymentTenderType = input.newPaymentTenderType;\r\n this._tokenizedPaymentCard = input.newTokenizedPaymentCard;\r\n this._tenderLine = input.newTenderLine;\r\n this._emailAddressFromExpressCheckout = input.newEmailAddressFromExpressCheckout;\r\n\r\n const result: ICheckoutActionResult = { status: 'SUCCESS' };\r\n return Promise.resolve(result);\r\n }\r\n\r\n @action\r\n public setCheckoutGenericData(input: {\r\n key: string;\r\n checkoutGenericData: ICheckoutGenericData;\r\n additionalProperties?: object;\r\n }): Promise {\r\n this._checkoutGenericData[input.key] = input.checkoutGenericData;\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n @action\r\n public getCheckoutGenericData(input: { key: string }): ICheckoutGenericData | undefined {\r\n return this._checkoutGenericData[input.key];\r\n }\r\n\r\n public async initialize(): Promise {\r\n if (this.isInitialized) {\r\n return;\r\n }\r\n\r\n await this._checkoutCart.initialize();\r\n\r\n this.setInitialData();\r\n this.isInitialized = true;\r\n this._status = 'READY';\r\n this._attributeValues = [];\r\n this._extensionProperties = [];\r\n }\r\n\r\n @action\r\n private cleanCheckoutData(input: { additionalProperties?: object }): Promise {\r\n this.actionContext.requestContext.sessionStorage.removeCheckoutCartData();\r\n return Promise.resolve({ status: 'SUCCESS' });\r\n }\r\n\r\n private isPaymentVerificationRedirection(): boolean {\r\n const { requestFormData, query } = this.actionContext.requestContext;\r\n return !!(requestFormData && query && query.pv === '1');\r\n }\r\n\r\n private setInitialData() {\r\n const { sessionStorage } = this.actionContext.requestContext;\r\n\r\n if (this.isPaymentVerificationRedirection()) {\r\n const billingAddress = sessionStorage.getCheckoutCartData(CheckoutStorageKey.BillingAddress);\r\n const giftCard = sessionStorage.getCheckoutCartData(CheckoutStorageKey.GiftCard);\r\n\r\n this._billingAddress = get(billingAddress, 'billingAddress');\r\n this._isBillingAddressSameAsShippingAddress = get(billingAddress, 'isBillingAddressSameAsShippingAddress');\r\n this._giftCardExtends = (giftCard && Array.isArray(giftCard) ? giftCard : []) as IGiftCardExtend[];\r\n this._loyaltyCardNumber = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyCardNumber), 'loyaltyCardNumber');\r\n this._loyaltyAmount = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.LoyaltyAmount), 'loyaltyAmount');\r\n this._isTermsAndConditionAccepted = get(\r\n sessionStorage.getCheckoutCartData(CheckoutStorageKey.TermsAndCondition),\r\n 'isTermsAndConditionAccepted'\r\n );\r\n this._checkoutGenericData =\r\n get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.CheckoutGenericData), 'checkoutGenericData') || {};\r\n this._paymentTenderType = get(sessionStorage.getCheckoutCartData(CheckoutStorageKey.PaymentTenderType), 'paymentTenderType');\r\n }\r\n\r\n this.cleanCheckoutData({});\r\n }\r\n}\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { BaseCheckoutState } from '../checkout-state/base-checkout-state';\nimport { ICheckoutState } from '../state-interfaces/i-checkout-state';\nimport createGlobalStateDataAction from './global-state-data-action';\n\nexport default createGlobalStateDataAction('CHECKOUTSTATE', BaseCheckoutState);\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCartState } from '../cart-state/base-cart-state';\r\nimport { ICartState } from '../state-interfaces/i-cart-state';\r\nimport cartStateDataAction from './cart-state-data-action';\r\nimport { GlobalStateInput } from './global-state-data-action';\r\n\r\nexport function getCartState(ctx: IActionContext): AsyncResult {\r\n return cartStateDataAction(new GlobalStateInput('CARTSTATE', BaseCartState, ctx.requestContext.apiSettings), ctx);\r\n}\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, ICommerceApiSettings, ICreateActionContext } from '@msdyn365-commerce/core';\nimport { Cart } from '@msdyn365-commerce/retail-proxy';\nimport { copyAsync, readAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/CartsDataActions.g';\n\nimport { getCartState } from './get-cart-state';\n\n/**\n * Input class for getCheckoutCart data action.\n */\nexport class GetCheckoutCartInput implements IActionInput {\n private readonly apiSettings: ICommerceApiSettings;\n\n constructor(apiSettings: ICommerceApiSettings) {\n this.apiSettings = apiSettings;\n }\n\n public getCacheKey = () => `CheckoutCart-chanId:${this.apiSettings.channelId}-catId:${this.apiSettings.catalogId}`;\n\n public getCacheObjectType = () => 'CheckoutCart';\n\n public dataCacheType = (): CacheType => 'request';\n}\n\nenum CartTokenPrefix {\n Auth = 't',\n Anon = 'p'\n}\n\nconst createInput = (inputData: ICreateActionContext) => {\n return new GetCheckoutCartInput(inputData.requestContext.apiSettings);\n};\n\n/**\n * Data action to copy the cart for checkout actions.\n * @param input\n * @param ctx\n */\nexport async function getCheckoutCart(input: GetCheckoutCartInput, ctx: IActionContext): Promise {\n const savedCheckoutCartId = ctx.requestContext.cookies.getCheckoutCartCookie();\n const cartCookieParts: string[] = savedCheckoutCartId.split(':');\n let checkoutCartId = null;\n const isAuthenticated = ctx.requestContext.user.isAuthenticated;\n\n if ((isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Auth) || (!isAuthenticated && cartCookieParts[0] === CartTokenPrefix.Anon)) {\n checkoutCartId = cartCookieParts[1];\n }\n\n let checkoutCart: Cart | undefined;\n\n if (checkoutCartId) {\n try {\n checkoutCart = await readAsync({ callerContext: ctx, bypassCache: 'none' }, checkoutCartId);\n } catch (error) {\n ctx.telemetry.error('Error getting checkout cart based on saved checkout card id');\n ctx.telemetry.exception(error);\n }\n }\n\n const cartState = await getCartState(ctx);\n if (cartState && cartState.cart.Id !== undefined) {\n if (checkoutCart && checkoutCart.Version && cartState.cart.Version && checkoutCart.Version > cartState.cart.Version) {\n return Promise.resolve(checkoutCart);\n }\n\n return copyAsync({ callerContext: ctx }, cartState.cart.Id, 2)\n .then(cart => {\n ctx.requestContext.cookies.setCheckoutCartCookie(cart, isAuthenticated);\n return cart;\n })\n .catch(error => {\n ctx.telemetry.error('Error copying cart');\n ctx.telemetry.exception(error);\n return undefined;\n });\n }\n\n return undefined;\n}\n\nexport const getCheckoutCartDataAction = createObservableDataAction({\n id: '@msdyn365-commerce/global-state/get-checkout-cart',\n action: >getCheckoutCart,\n input: createInput\n});\n\nexport default getCheckoutCartDataAction;\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { AsyncResult, IActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCheckoutState } from '../checkout-state/base-checkout-state';\r\nimport { ICheckoutState } from '../state-interfaces/i-checkout-state';\r\nimport checkoutStateDataAction from './checkout-state-data-action';\r\nimport { GlobalStateInput } from './global-state-data-action';\r\n\r\nexport function getCheckoutState(ctx: IActionContext): AsyncResult {\r\n return checkoutStateDataAction(new GlobalStateInput('CHECKOUTSTATE', BaseCheckoutState, ctx.requestContext.apiSettings), ctx);\r\n}\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport { CacheType, createObservableDataAction, IAction, IActionContext, IActionInput, ICommerceApiSettings, ICreateActionContext, IObservableAction } from '@msdyn365-commerce/core';\r\n\r\nimport { createGlobalState, GlobalStateConstructor, IGlobalState } from '../global-state/i-global-state';\r\n\r\nexport declare type GlobalStateType = 'CARTSTATE' | 'CHECKOUTSTATE';\r\n\r\n/**\r\n * Shared class that handles global state inputs.\r\n */\r\nexport class GlobalStateInput implements IActionInput {\r\n public readonly stateConstructor: GlobalStateConstructor;\r\n\r\n public readonly key: GlobalStateType;\r\n\r\n private readonly apiSettings: ICommerceApiSettings;\r\n\r\n constructor(key: GlobalStateType, stateConstructor: GlobalStateConstructor, apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n this.stateConstructor = stateConstructor;\r\n this.key = key;\r\n }\r\n\r\n public getCacheKey = () => `${this.key}-chanId:${this.apiSettings.channelId}-catId:${this.apiSettings.catalogId}`;\r\n\r\n public getCacheObjectType = () => this.key;\r\n\r\n public dataCacheType = (): CacheType => 'instance';\r\n}\r\n\r\nexport async function getState(input: GlobalStateInput, ctx: IActionContext): Promise {\r\n const globalStateObject = createGlobalState(input.stateConstructor, ctx);\r\n\r\n await globalStateObject.initialize();\r\n\r\n return globalStateObject;\r\n}\r\n\r\nexport default function createGlobalStateDataAction(key: GlobalStateType, stateConstructor: GlobalStateConstructor): IObservableAction {\r\n return createObservableDataAction({\r\n action: >getState,\r\n input: (args: ICreateActionContext) => {\r\n return new GlobalStateInput(key, stateConstructor, args.requestContext.apiSettings);\r\n }\r\n });\r\n}\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt 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. All rights reserved.\n * See License.txt 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().then(result => {\n this._status = 'READY';\n return result;\n }).catch(error => {\n console.log(error);\n this._status = 'ERROR';\n\n return Promise.reject(error);\n });\n }\n}\n"],"names":["OnAccountGuestCheckoutStateInput","constructor","getCacheKey","getCacheObjectType","dataCacheType","async","onAccountGuestCheckoutStateAction","input","ctx","appliedOnAccount","receiptEmail","rentOptIn","emailOptIn","createObservableDataAction","action","inputData","setNameAttribute","attributeName","attributeValue","Name","ExtensionProperties","TextValue","TextValueTranslations","findAttribute","currentAttributes","attributeObj","attributeIndex","findIndex","attribute","toLowerCase","push","setExtensionProperties","privIdExtensionProperty","Key","Value","StringValue","BooleanValue","findExtensionProperty","currentProperties","propertyIndex","property","getNBFlagForCartLine","cartline","NBFlag","AttributeValues","find","attr","JSON","parse","getDiemnsionValueForSelectedProduct","productDimensions","product","dimension","dimensionValuesWithInventory","DimensionValues","value","ObjectExtensions","isNullOrUndefined","DimensionValue","RecordId","ProductIds","prod","getNBFlagFromProductDimensions","updateCartExtensionProperties","checkoutCart","context","newCart","cart","newProperty","currentExtensionProperties","updateExtensionProperties","newExtensionProperties","removeCartExtensionProperties","filter","console","log","updateAsync","callerContext","actionContext","updateCartProperties","attributesArr","updateContext","key","get","update","result","getQuantityLimit","maxQuantityForCartLineItem","inputItem","quantityLimit","shouldEnableStockCheck","undefined","availableQuantity","Math","min","getElementIndex","lines","cartLineToAdd","elementFoundAt","productIdToFind","ProductId","index","line","entries","DeliveryMode","FulfillmentStoreId","addProductsToCartWithoutSiteSettings","CartLines","status","substatus","newCartLines","map","cartLine","Quantity","addCartLinesResult","Version","addCartLinesAsync","Id","then","catch","error","telemetry","trace","errorDetails","LocalizedMessage","message","validationResults","data","ValidationResults","warning","orderQuantityLimitsFeatureIsEnabled","enableStockCheck","isAddServiceItemToCart","isMaxByQuantityValidationFeatureDefined","shouldSkipSiteSettings","i","length","name","IsInvoiceLine","addProductsToCartValidateMaxAgainstDefaultOrderSettings","requestContext","app","config","cartActionResult","addProductsToCartValidateMaxAgainstSiteSettings","hasPromoCode","code","Coupons","coupon","Code","includes","clearCartLineDeliveryMode","cartLineId","matchingLines","LineId","copyCartLine","ShippingAddress","WarehouseId","updateCartLinesAsync","debug","CartTokenPrefix","getOrCreateActiveCart","cartCookieParts","cookies","getCartCookie","split","user","isAuthenticated","Auth","Anon","readCart","readAsync","bypassCache","setCartCookie","getCartFromCookie","wasReadFromCookie","authCarts","cartSearchCriteria","IncludeAnonymous","CartTypeValue","queryResultSettings","Paging","Top","Skip","Sorting","Columns","ColumnName","IsDescending","searchAsync","searchCarts","getCartFromCustomer","anonCart","currentCart","anonCurrentCart","cartId","claimAuthCart","Error","claimCart","mergedCart","sourceCart","destinationCart","updatedCart","cartLines","cartLinesToDelete","hasShippingMethod","channelConfiguration","channel","featureNames","newCartLine","IsGiftCardLine","buildGiftCardLine","featureStates","getFeatureStatesAsync","featureState","IsEnabled","channelDeliveryOptionConfig","getChannelDeliveryOptionConfigurationAsync","PickupDeliveryModeCodes","deliveryMode","isEmpty","PickupDeliveryModeCode","Description","ReasonCodeLines","removeCartLinesAsync","exception","coupons","addCouponsAsync","addCartLines","claimAnonCart","createNewCart","LoyaltyCardId","card","getCustomerLoyaltyCardsAsync","CardNumber","createCartAsync","CatalogId","EntryMethodTypeValue","ItemId","Price","NetPrice","GiftCardBalance","TrackingId","UnitOfMeasureSymbol","IsPriceKeyedIn","price","CartsDataActions","errorInstance","updateCartLineDeliverySpecificationsInternal","cartLineDeliverySpecifications","updateLineDeliverySpecificationsAsync","updateCartLineQuantityInternal","newQuantity","isUsingDefaultOrderSettingsMax","updateCartLineQuantityValidateMaxAgainstDefaultOrderSettings","updateCartLineQuantityValidateMaxAgainstSiteSettings","shippingAddress","BaseCartState","GlobalState","super","this","_cart","_attributeValues","_extensionProperties","_isProductAddedToCart","reduce","total","num","some","_doAsyncAction","refreshCartInternal","apiSettings","catalogId","count","DefaultUnitOfMeasure","isPriceKeyedIn","IsGiftCard","customPrice","location","OrgUnitNumber","InventoryLocationId","_buildAddressFromOrgUnitLocation","isAddEmailDeliveryItemToCart","EmailDeliveryModeCode","ItemTypeValue","ReleasedProductType","Service","additionalProperties","Behavior","MaximumQuantity","_doCartOperationWithRetry","addProductToCartInternal","internalInput","PRODUCTASSERVICE","isStockCheckEnabled","addProductsToCartInternal","invoiceIds","addInvoicesToCartInternal","invoiceId","lineDescription","addOrderInvoiceAsync","addOrderInvoiceToCartInternal","setInvoiceLinePriceInternal","cartLineIds","Array","isArray","removeCartLineInternal","clearCartLineDeliveryModeInternal","pickupDeliveryModeCode","emailDeliveryModeCode","dM","copiedLines","forEach","clearCartLinesDeliveryInformation","cartLineDeliverySpecification","DeliverySpecification","DeliveryModeId","DeliveryPreferenceTypeValue","PickUpStoreId","DeliveryAddress","lineDeliverySpecifications","deliveryModeId","trim","cartLinesForShipping","deliverySpecifications","loyaltyCardNumber","newLoyaltyCardId","updateLoyaltyCardIdInternal","addPromoCode","promoCode","addDiscountCodeAsync","addPromoCodeInternal","removePromoCodes","promoCodes","removeDiscountCodesAsync","removePromoCodesInternal","removeAllPromoCodes","removeAllPromoCodesInternal","email","ReceiptEmail","updateReceiptEmail","newEmail","updateShippingAddress","newShippingAddress","newAttributeValues","newCartObject","updateCart","updatedCartObject","isInitialized","_status","callback","callbackResult","refreshCart","PostalAddressId","OrgUnitName","FullAddress","Address","Street","StreetNumber","City","DistrictName","BuildingCompliment","Postbox","ThreeLetterISORegionName","Country","ZipCode","Zip","County","CountyName","State","StateName","__decorate","observable","computed","CheckoutStorageKey","BaseCheckoutCartState","getCheckoutCart","GetCheckoutCartInput","CustomerId","BaseCheckoutState","_giftCardExtends","_loyaltyAmount","_guestCheckoutEmail","_customerAccountAmount","_emailAddressFromExpressCheckout","_checkoutGenericData","_checkoutCart","_shouldEnableSinglePaymentAuthorizationCheckout","shouldEnableSinglePaymentAuthorizationCheckout","_salesOrder","_orderedProducts","_tokenizedPaymentCard","_tenderLine","_billingAddress","_isBillingAddressSameAsShippingAddress","_shippingAddress","_hasShippingAddress","_hasCartDeliveryMode","_cardPrefix","_paymentTenderType","giftCardExtends","_loyaltyCardNumber","_hasGuestCheckoutEmail","_isTermsAndConditionAccepted","_isTermsAndConditionChecked","_shouldCollapsePaymentSection","_shouldTriggerPaymentWithPlaceOrder","_isPaymentSectionContainerReady","_cardPaymentAcceptResult","_isPaymentSectionContainerHasError","_redirectAdditionalContext","_isPlaceOrderEnabledInRedirection","_isPaymentVerificationRequired","_isCheckoutCallFailed","_shouldEnableExpressCheckoutInCheckout","_shouldEnableExpressCheckoutInCart","_shippingAddressFromExpressCheckout","_billingAddressFromExpressCheckout","_isExpressCheckoutApplied","_isExpressCheckoutAppliedInCartPage","updateSalesOrder","newSalesOrder","newOrderedProducts","Promise","resolve","updateTokenizedPaymentCard","newTokenizedPaymentCard","updateTenderLine","newTenderLine","newHasShippingAddress","newHasCartDeliveryMode","newIsTermsAndConditionAccepted","newIsTermsAndConditionChecked","newShouldCollapsePaymentSection","newShouldTriggerPaymentWithPlaceOrder","newIsPaymentSectionContainerReady","newCardPaymentAcceptResult","newIsPaymentSectionContainerHasError","newRedirectAdditionalContext","newIsCheckoutCallFailed","newIsPlaceOrderEnabledInRedirection","newIsPaymentVerificationRequired","updateBillingAddress","newBillingAddress","isBillingAddressSameAsShippingAddress","removeBillingAddress","updatePaymentTenderType","newPaymentTenderType","updateCardPrefix","newCardPrefix","removeGiftCard","giftCard","giftCardNumber","removeGiftCardExtend","addGiftCard","Pin","ExpirationDate","TenderTypeId","gitCardExtend","addGiftCardExtend","updateLoyaltyCardNumber","newLoyaltyCardNumber","updateLoyaltyAmount","Number","newAmount","toFixed","newGuestCheckoutEmail","newHasGuestCheckoutEmail","removeCheckoutCartId","removeCheckoutCartCookie","saveDataInStorage","sessionStorage","billingAddress","setCheckoutCartData","BillingAddress","GiftCard","LoyaltyCardNumber","loyaltyAmount","LoyaltyAmount","isTermsAndConditionAccepted","TermsAndCondition","paymentTenderType","PaymentTenderType","filtered","Object","keys","filteredData","SaveDataBeforeRedirect","CheckoutGenericData","checkoutGenericData","updateCustomerAccountAmount","newBillingAddressFromExpressCheckout","newShippingAddressFromExpressCheckout","newEmailAddressFromExpressCheckout","newShouldEnableExpressCheckoutInCheckout","newShouldEnableExpressCheckoutInCart","newIsExpressCheckoutApplied","setCheckoutGenericData","getCheckoutGenericData","initialize","setInitialData","cleanCheckoutData","removeCheckoutCartData","isPaymentVerificationRedirection","requestFormData","query","pv","getCheckoutCartData","createGlobalStateDataAction","getCartState","cartStateDataAction","GlobalStateInput","channelId","id","getCheckoutCartCookie","checkoutCartId","cartState","copyAsync","setCheckoutCartCookie","getCheckoutState","checkoutStateDataAction","stateConstructor","getState","globalStateObject","createGlobalState","args","lambda","reject"],"sourceRoot":""}