@dropins/storefront-quote-management 1.1.2 → 1.2.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/api.js +1172 -5
- package/api.js.map +1 -1
- package/chunks/ItemsQuoted.js +1 -1
- package/chunks/ItemsQuoted.js.map +1 -1
- package/chunks/ItemsQuotedTemplate.js +1 -1
- package/chunks/ItemsQuotedTemplate.js.map +1 -1
- package/chunks/QuoteCommentsList.js +1 -1
- package/chunks/QuoteCommentsList.js.map +1 -1
- package/chunks/QuoteHistoryLog.js +1 -1
- package/chunks/QuoteHistoryLog.js.map +1 -1
- package/chunks/QuoteTemplateCommentsList.js +1 -1
- package/chunks/QuoteTemplateCommentsList.js.map +1 -1
- package/chunks/QuoteTemplateHistoryLog.js +1 -1
- package/chunks/QuoteTemplateHistoryLog.js.map +1 -1
- package/chunks/ShippingAddressDisplay.js +1 -1
- package/chunks/ShippingAddressDisplay.js.map +1 -1
- package/chunks/components.js +4 -0
- package/chunks/components.js.map +1 -0
- package/containers/ItemsQuoted.js +1 -1
- package/containers/ItemsQuotedTemplate.js +1 -1
- package/containers/ManageNegotiableQuote.js +1 -1
- package/containers/ManageNegotiableQuote.js.map +1 -1
- package/containers/ManageNegotiableQuoteTemplate.js +2 -2
- package/containers/ManageNegotiableQuoteTemplate.js.map +1 -1
- package/containers/OrderSummary.js +1 -1
- package/containers/OrderSummary.js.map +1 -1
- package/containers/OrderSummaryLine.js +1 -1
- package/containers/QuoteCommentsList.js +1 -1
- package/containers/QuoteHistoryLog.js +1 -1
- package/containers/QuoteSummaryList.js +1 -1
- package/containers/QuoteSummaryList.js.map +1 -1
- package/containers/QuoteTemplateCommentsList.js +1 -1
- package/containers/QuoteTemplateHistoryLog.js +1 -1
- package/containers/QuoteTemplatesListTable.js +1 -1
- package/containers/QuoteTemplatesListTable.js.map +1 -1
- package/containers/QuotesListTable.js +1 -1
- package/containers/QuotesListTable.js.map +1 -1
- package/containers/RequestNegotiableQuoteForm.js +1 -1
- package/containers/RequestNegotiableQuoteForm.js.map +1 -1
- package/containers/ShippingAddressDisplay.js +1 -1
- package/package.json +1 -1
- package/render.js +2 -7
- package/render.js.map +1 -1
- package/chunks/AttachedFilesList.js +0 -4
- package/chunks/AttachedFilesList.js.map +0 -1
- package/chunks/CheckWithCircle.js +0 -4
- package/chunks/CheckWithCircle.js.map +0 -1
- package/chunks/ChevronDown.js +0 -4
- package/chunks/ChevronDown.js.map +0 -1
- package/chunks/ConfirmationModal.js +0 -4
- package/chunks/ConfirmationModal.js.map +0 -1
- package/chunks/LineItemNoteModal.js +0 -4
- package/chunks/LineItemNoteModal.js.map +0 -1
- package/chunks/NegotiableQuoteFragment.js +0 -396
- package/chunks/NegotiableQuoteFragment.js.map +0 -1
- package/chunks/NegotiableQuoteTemplateFragment.js +0 -342
- package/chunks/NegotiableQuoteTemplateFragment.js.map +0 -1
- package/chunks/OrderSummaryLine.js +0 -4
- package/chunks/OrderSummaryLine.js.map +0 -1
- package/chunks/QuoteCommentsList3.js +0 -4
- package/chunks/QuoteCommentsList3.js.map +0 -1
- package/chunks/QuoteHistoryLog3.js +0 -4
- package/chunks/QuoteHistoryLog3.js.map +0 -1
- package/chunks/RenameQuoteModal.js +0 -4
- package/chunks/RenameQuoteModal.js.map +0 -1
- package/chunks/WarningFilled.js +0 -4
- package/chunks/WarningFilled.js.map +0 -1
- package/chunks/addQuoteTemplateLineItemNote.js +0 -33
- package/chunks/addQuoteTemplateLineItemNote.js.map +0 -1
- package/chunks/dateUtils.js +0 -4
- package/chunks/dateUtils.js.map +0 -1
- package/chunks/duplicateNegotiableQuote.js +0 -109
- package/chunks/duplicateNegotiableQuote.js.map +0 -1
- package/chunks/generateQuoteFromTemplate.js +0 -12
- package/chunks/generateQuoteFromTemplate.js.map +0 -1
- package/chunks/getQuoteData.js +0 -16
- package/chunks/getQuoteData.js.map +0 -1
- package/chunks/getQuoteTemplateData.js +0 -28
- package/chunks/getQuoteTemplateData.js.map +0 -1
- package/chunks/getQuoteTemplates.js +0 -52
- package/chunks/getQuoteTemplates.js.map +0 -1
- package/chunks/negotiableQuotes.js +0 -77
- package/chunks/negotiableQuotes.js.map +0 -1
- package/chunks/openQuoteTemplate.js +0 -62
- package/chunks/openQuoteTemplate.js.map +0 -1
- package/chunks/requestNegotiableQuote.js +0 -25
- package/chunks/requestNegotiableQuote.js.map +0 -1
- package/chunks/setLineItemNote.js +0 -47
- package/chunks/setLineItemNote.js.map +0 -1
- package/chunks/state.js +0 -4
- package/chunks/state.js.map +0 -1
- package/chunks/transform-quote-template.js +0 -4
- package/chunks/transform-quote-template.js.map +0 -1
- package/chunks/transform-quote.js +0 -4
- package/chunks/transform-quote.js.map +0 -1
- package/chunks/uploadFile.js +0 -20
- package/chunks/uploadFile.js.map +0 -1
package/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sources":["/@dropins/storefront-quote-management/src/api/setShippingAddress/graphql/SetNegotiableQuoteShippingAddressMutation.ts","/@dropins/storefront-quote-management/src/api/setShippingAddress/setShippingAddress.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/graphql/setNegotiableQuoteTemplateShippingAddress.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/addQuoteTemplateShippingAddress.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION = `\n mutation SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION(\n $quoteUid: ID!\n $addressId: ID\n $addressData: NegotiableQuoteAddressInput\n ) {\n setNegotiableQuoteShippingAddress(\n input: {\n quote_uid: $quoteUid\n shipping_addresses: {\n customer_address_uid: $addressId\n address: $addressData\n }\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION } from './graphql/SetNegotiableQuoteShippingAddressMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface AddressInput {\n /** City name */\n city: string;\n /** Optional company name */\n company?: string;\n /** Two-letter country code (e.g., 'US') */\n countryCode: string;\n /** First name */\n firstname: string;\n /** Last name */\n lastname: string;\n /** Postal/ZIP code */\n postcode: string;\n /** Optional state/province name */\n region?: string;\n /** Optional state/province ID */\n regionId?: number;\n /** Whether to save this address to the customer's address book */\n saveInAddressBook?: boolean;\n /** Street address lines (array) */\n street: string[];\n /** Phone number */\n telephone: string;\n /** \n * Additional input (optional custom fields for the address).\n * These fields will be merged into the address data sent to GraphQL.\n * Standard fields take precedence over additional fields to prevent\n * accidental override of required address attributes.\n * \n * @example\n * ```ts\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute: 'value',\n * delivery_instructions: 'Leave at door'\n * }\n * ```\n */\n additionalInput?: Record<string, any>;\n}\n\nexport interface SetShippingAddressInput {\n /** The unique ID of the negotiable quote */\n quoteUid: string;\n /** The ID of a saved customer address (use this OR addressData, not both) */\n addressId?: number;\n /** New address data (use this OR addressId, not both) */\n addressData?: AddressInput;\n}\n\n/**\n * Transform camelCase address data to snake_case for GraphQL mutation.\n * Additional fields from additionalInput are spread into the result, with\n * standard fields taking precedence (defensive flexibility approach).\n */\nfunction transformAddressToSnakeCase(address: AddressInput) {\n const { additionalInput, ...standardFields } = address;\n \n // Build the standard transformed fields\n const transformedStandardFields = {\n city: standardFields.city,\n company: standardFields.company,\n country_code: standardFields.countryCode,\n firstname: standardFields.firstname,\n lastname: standardFields.lastname,\n postcode: standardFields.postcode,\n region: standardFields.region,\n region_id: standardFields.regionId,\n save_in_address_book: standardFields.saveInAddressBook,\n street: standardFields.street,\n telephone: standardFields.telephone,\n };\n \n // Spread additional input first, then standard fields take precedence\n // This provides defensive flexibility: allows custom fields while protecting core fields\n return {\n ...(additionalInput || {}),\n ...transformedStandardFields,\n };\n}\n\n/**\n * Sets or updates the shipping address for a negotiable quote.\n * \n * @param input - The input parameters for setting the shipping address\n * @param input.quoteUid - The unique ID of the negotiable quote\n * @param input.addressId - Optional ID of a saved customer address (use this OR addressData)\n * @param input.addressData - Optional new address data (use this OR addressId)\n * @param input.addressData.additionalInput - Optional additional address fields to pass through to GraphQL\n * @returns Promise that resolves to the updated quote model with shipping addresses including uid field\n * @throws Error if validation fails or GraphQL operation fails\n * \n * @example\n * ```ts\n * // Using a saved address\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressId: 5\n * });\n * \n * // Using new address data\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234'\n * }\n * });\n * \n * // Using address data with additional custom fields\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234',\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute_1: 'value1',\n * delivery_instructions: 'Leave at door'\n * }\n * }\n * });\n * \n * // Access address identifier\n * if (quote?.shippingAddresses?.[0]) {\n * console.log('Address UID:', quote.shippingAddresses[0].uid);\n * }\n * ```\n */\nexport const setShippingAddress = async (\n input: SetShippingAddressInput\n): Promise<NegotiableQuoteModel | null> => {\n const { quoteUid, addressId, addressData } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n // Validate that exactly one of addressId or addressData is provided\n if (addressId === undefined && !addressData) {\n throw new Error('Either addressId or addressData must be provided');\n }\n\n if (addressId !== undefined && addressData) {\n throw new Error('Cannot provide both addressId and addressData');\n }\n\n // Transform addressData to snake_case if provided\n const transformedAddressData = addressData\n ? transformAddressToSnakeCase(addressData)\n : null;\n\n return fetchGraphQl(SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION, {\n variables: {\n quoteUid,\n addressId: addressId || null,\n addressData: transformedAddressData,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to set shipping address: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.setNegotiableQuoteShippingAddress?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/shipping-address-set', {\n quote: quoteData,\n input: { quoteUid, addressId, addressData },\n });\n\n return quoteData;\n });\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION = /* GraphQL */ `\n mutation SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION(\n $templateId: ID!\n $shippingAddress: NegotiableQuoteTemplateShippingAddressInput!\n ) {\n setNegotiableQuoteTemplateShippingAddress(\n input: {\n template_id: $templateId\n shipping_address: $shippingAddress\n }\n ) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n \n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION } from './graphql/setNegotiableQuoteTemplateShippingAddress';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface NegotiableQuoteAddressInput {\n city: string;\n company?: string;\n countryCode: string;\n fax?: string;\n firstname: string;\n lastname: string;\n middlename?: string;\n postcode?: string;\n prefix?: string;\n region?: string;\n regionId?: number;\n saveInAddressBook?: boolean;\n street: string[];\n suffix?: string;\n telephone?: string;\n vatId?: string;\n}\n\nexport interface NegotiableQuoteTemplateShippingAddressInput {\n address?: NegotiableQuoteAddressInput;\n customerAddressUid?: string;\n customerNotes?: string;\n}\n\nexport interface AddQuoteTemplateShippingAddressParams {\n templateId: string;\n shippingAddress: NegotiableQuoteTemplateShippingAddressInput;\n}\n\nexport const addQuoteTemplateShippingAddress = async (\n params: AddQuoteTemplateShippingAddressParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.shippingAddress) {\n throw new Error('Shipping address is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n // Validate that at least one of address or customerAddressUid is provided\n if (\n !params.shippingAddress.address &&\n !params.shippingAddress.customerAddressUid\n ) {\n throw new Error('Either address or customerAddressUid must be provided');\n }\n\n try {\n const results: any = await fetchGraphQl(\n SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION,\n {\n variables: {\n templateId: params.templateId,\n shippingAddress: {\n address: params.shippingAddress.address\n ? {\n city: params.shippingAddress.address.city,\n company: params.shippingAddress.address.company,\n country_code: params.shippingAddress.address.countryCode,\n fax: params.shippingAddress.address.fax,\n firstname: params.shippingAddress.address.firstname,\n lastname: params.shippingAddress.address.lastname,\n middlename: params.shippingAddress.address.middlename,\n postcode: params.shippingAddress.address.postcode,\n prefix: params.shippingAddress.address.prefix,\n region: params.shippingAddress.address.region,\n region_id: params.shippingAddress.address.regionId,\n save_in_address_book:\n params.shippingAddress.address.saveInAddressBook,\n street: params.shippingAddress.address.street,\n suffix: params.shippingAddress.address.suffix,\n telephone: params.shippingAddress.address.telephone,\n vat_id: params.shippingAddress.address.vatId,\n }\n : undefined,\n customer_address_uid: params.shippingAddress.customerAddressUid,\n customer_notes: params.shippingAddress.customerNotes,\n },\n },\n }\n );\n\n if (!results?.data?.setNegotiableQuoteTemplateShippingAddress) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.setNegotiableQuoteTemplateShippingAddress\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n"],"names":["SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION","NEGOTIABLE_QUOTE_FRAGMENT","transformAddressToSnakeCase","address","additionalInput","standardFields","transformedStandardFields","setShippingAddress","input","quoteUid","addressId","addressData","transformedAddressData","fetchGraphQl","response","errors","errorMessages","error","quoteData","transformQuote","_b","_a","events","SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION","NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT","addQuoteTemplateShippingAddress","params","state","results","transformedData","transformQuoteTemplate"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api.js","sources":["/@dropins/storefront-quote-management/src/data/models/negotiable-quote-model.ts","/@dropins/storefront-quote-management/src/data/models/negotiable-quote-template-model.ts","/@dropins/storefront-quote-management/src/data/models/store-config-model.ts","/@dropins/storefront-quote-management/src/lib/state.ts","/@dropins/storefront-quote-management/src/utils/mapAuthPermissions.ts","/@dropins/storefront-quote-management/src/api/initialize/initialize.ts","/@dropins/storefront-quote-management/src/api/fetch-graphql/fetch-graphql.ts","/@dropins/storefront-quote-management/src/api/graphql/ShippingMethodFragment.ts","/@dropins/storefront-quote-management/src/api/graphql/NegotiableQuoteAddressFragment.ts","/@dropins/storefront-quote-management/src/api/graphql/NegotiableQuoteFragment.ts","/@dropins/storefront-quote-management/src/api/requestNegotiableQuote/graphql/RequestNegotiableQuoteMutation.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-store-config.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-history.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote-items.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote.ts","/@dropins/storefront-quote-management/src/data/transforms/transform-quote-template.ts","/@dropins/storefront-quote-management/src/api/requestNegotiableQuote/requestNegotiableQuote.ts","/@dropins/storefront-quote-management/src/api/getQuoteData/graphql/QuoteDataQuery.ts","/@dropins/storefront-quote-management/src/api/getQuoteData/getQuoteData.ts","/@dropins/storefront-quote-management/src/api/graphql/NegotiableQuoteListFragment.ts","/@dropins/storefront-quote-management/src/api/graphql/SearchResultPageInfoFragment.ts","/@dropins/storefront-quote-management/src/api/graphql/SortFieldsFragment.ts","/@dropins/storefront-quote-management/src/api/negotiableQuotes/graphql/NegotiableQuotesQuery.ts","/@dropins/storefront-quote-management/src/api/negotiableQuotes/negotiableQuotes.ts","/@dropins/storefront-quote-management/src/api/getStoreConfig/graphql/StoreConfigQuery.ts","/@dropins/storefront-quote-management/src/api/getStoreConfig/getStoreConfig.ts","/@dropins/storefront-quote-management/src/api/deleteQuote/graphql/DeleteQuoteMutation.ts","/@dropins/storefront-quote-management/src/api/deleteQuote/deleteQuote.ts","/@dropins/storefront-quote-management/src/api/setShippingAddress/graphql/SetNegotiableQuoteShippingAddressMutation.ts","/@dropins/storefront-quote-management/src/api/setShippingAddress/setShippingAddress.ts","/@dropins/storefront-quote-management/src/api/sendForReview/graphql/SendNegotiableQuoteForReviewMutation.ts","/@dropins/storefront-quote-management/src/api/sendForReview/sendForReview.ts","/@dropins/storefront-quote-management/src/api/uploadFile/graphql/InitiateUploadMutation.ts","/@dropins/storefront-quote-management/src/api/uploadFile/graphql/FinishUploadMutation.ts","/@dropins/storefront-quote-management/src/api/uploadFile/uploadFile.ts","/@dropins/storefront-quote-management/src/api/closeNegotiableQuote/graphql/CloseNegotiableQuoteMutation.ts","/@dropins/storefront-quote-management/src/api/closeNegotiableQuote/closeNegotiableQuote.ts","/@dropins/storefront-quote-management/src/api/graphql/NegotiableQuoteTemplateFragment.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplateData/graphql/getQuoteTemplateData.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplateData/getQuoteTemplateData.ts","/@dropins/storefront-quote-management/src/api/createQuoteTemplate/graphql/createQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/createQuoteTemplate/createQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplates/graphql/getQuoteTemplates.ts","/@dropins/storefront-quote-management/src/api/getQuoteTemplates/getQuoteTemplates.ts","/@dropins/storefront-quote-management/src/api/sendQuoteTemplateForReview/graphql/sendQuoteTemplateForReview.ts","/@dropins/storefront-quote-management/src/api/sendQuoteTemplateForReview/sendQuoteTemplateForReview.ts","/@dropins/storefront-quote-management/src/api/setQuoteTemplateExpirationDate/graphql/setQuoteTemplateExpirationDate.ts","/@dropins/storefront-quote-management/src/api/setQuoteTemplateExpirationDate/setQuoteTemplateExpirationDate.ts","/@dropins/storefront-quote-management/src/api/acceptQuoteTemplate/graphql/acceptQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/acceptQuoteTemplate/acceptQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/cancelQuoteTemplate/graphql/cancelQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/cancelQuoteTemplate/cancelQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/deleteQuoteTemplate/graphql/deleteQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/deleteQuoteTemplate/deleteQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/openQuoteTemplate/graphql/openQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/openQuoteTemplate/openQuoteTemplate.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/graphql/setNegotiableQuoteTemplateShippingAddress.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateShippingAddress/addQuoteTemplateShippingAddress.ts","/@dropins/storefront-quote-management/src/api/updateQuoteTemplateItemQuantities/graphql/updateNegotiableQuoteTemplateQuantities.ts","/@dropins/storefront-quote-management/src/api/updateQuoteTemplateItemQuantities/updateQuoteTemplateItemQuantities.ts","/@dropins/storefront-quote-management/src/api/removeQuoteTemplateItems/graphql/removeNegotiableQuoteTemplateItems.ts","/@dropins/storefront-quote-management/src/api/removeQuoteTemplateItems/removeQuoteTemplateItems.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateLineItemNote/graphql/setQuoteTemplateLineItemNote.ts","/@dropins/storefront-quote-management/src/api/addQuoteTemplateLineItemNote/addQuoteTemplateLineItemNote.ts","/@dropins/storefront-quote-management/src/api/generateQuoteFromTemplate/graphql/generateNegotiableQuoteFromTemplate.ts","/@dropins/storefront-quote-management/src/api/generateQuoteFromTemplate/generateQuoteFromTemplate.ts","/@dropins/storefront-quote-management/src/api/renameNegotiableQuote/graphql/RenameNegotiableQuoteMutation.ts","/@dropins/storefront-quote-management/src/api/renameNegotiableQuote/renameNegotiableQuote.ts","/@dropins/storefront-quote-management/src/api/duplicateNegotiableQuote/graphql/duplicateNegotiableQuoteMutation.ts","/@dropins/storefront-quote-management/src/api/duplicateNegotiableQuote/duplicateNegotiableQuote.ts","/@dropins/storefront-quote-management/src/api/updateQuantities/graphql/UpdateNegotiableQuoteQuantitiesMutation.ts","/@dropins/storefront-quote-management/src/api/updateQuantities/updateQuantities.ts","/@dropins/storefront-quote-management/src/api/removeNegotiableQuoteItems/graphql/RemoveNegotiableQuoteItemsMutation.ts","/@dropins/storefront-quote-management/src/api/removeNegotiableQuoteItems/removeNegotiableQuoteItems.ts","/@dropins/storefront-quote-management/src/api/setLineItemNote/graphql/SetLineItemNoteMutation.ts","/@dropins/storefront-quote-management/src/api/setLineItemNote/setLineItemNote.ts"],"sourcesContent":["/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport interface ShippingAddress {\n /**\n * The unique string identifier of the address\n */\n uid?: string;\n firstname: string;\n lastname: string;\n company?: string;\n street: string[];\n city: string;\n region?: {\n code: string;\n label: string;\n regionId: number;\n };\n postcode: string;\n country: {\n code: string;\n label: string;\n };\n telephone: string;\n}\n\nexport interface NegotiableQuoteModel {\n uid: string;\n name: string;\n createdAt: string;\n salesRepName: string;\n expirationDate: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n isVirtual: boolean;\n buyer: {\n firstname: string;\n lastname: string;\n };\n email?: string;\n templateName?: string;\n totalQuantity: number;\n comments?: {\n uid: string;\n createdAt: string;\n author: {\n firstname: string;\n lastname: string;\n };\n text: string;\n attachments?: {\n name: string;\n url: string;\n }[];\n }[];\n history?: NegotiableQuoteHistoryEntry[];\n prices: {\n appliedDiscounts?: Discount[];\n appliedTaxes?: Tax[];\n discount?: Currency;\n grandTotal?: Currency;\n grandTotalExcludingTax?: Currency;\n shippingExcludingTax?: Currency;\n shippingIncludingTax?: Currency;\n subtotalExcludingTax?: Currency;\n subtotalIncludingTax?: Currency;\n subtotalWithDiscountExcludingTax?: Currency;\n totalTax?: Currency;\n };\n items: CartItemModel[];\n shippingAddresses?: ShippingAddress[];\n canCheckout: boolean;\n canSendForReview: boolean;\n lockedForEditing?: boolean;\n canDelete: boolean;\n canClose: boolean;\n canUpdateQuote: boolean;\n readOnly: boolean;\n}\n\nexport interface ConfigurableOption {\n optionLabel: string;\n valueLabel: string;\n}\n\nexport interface BundleOption {\n label: string;\n values: {\n label: string;\n quantity: number;\n originalPrice: Currency;\n price: Currency;\n }[];\n}\n\nexport interface CustomizableOption {\n type: string;\n label: string;\n values: {\n label: string;\n value: string;\n }[];\n}\n\nexport interface CartItemModel {\n itemType: string;\n uid: string;\n product: {\n uid: string;\n sku: string;\n name: string;\n templateId?: string;\n templateName?: string;\n priceRange: {\n maximumPrice: {\n regularPrice: Currency;\n };\n };\n };\n image: ItemImage;\n links?: ItemLinks;\n discounted: boolean;\n discountedTotal: Currency;\n catalogDiscount: {\n amountOff: number;\n percentOff: number;\n };\n rowCatalogDiscount: {\n amountOff: number;\n percentOff: number;\n };\n discounts: {\n label: string;\n value: string;\n amount: Currency;\n }[];\n discountPercentage?: number;\n insufficientQuantity?: boolean;\n outOfStock?: boolean;\n stockStatus: string;\n quantity: number;\n prices: {\n regularPrice: Currency;\n priceIncludingTax: Currency;\n originalItemPrice: Currency;\n originalRowTotal: Currency;\n rowTotal: Currency;\n rowTotalIncludingTax: Currency;\n };\n savingsAmount?: Currency;\n configurableOptions?: ConfigurableOption[];\n bundleOptions?: BundleOption[];\n customizableOptions?: CustomizableOption[];\n noteFromBuyer?: ItemNote[];\n noteFromSeller?: ItemNote[];\n}\n\ninterface ItemImage {\n src: string;\n alt: string;\n}\n\ninterface ItemLinks {\n count: number;\n result: string;\n}\n\nexport interface ItemNote {\n createdAt: string;\n creatorId: number;\n creatorType: number;\n negotiableQuoteItemUid: string;\n note: string;\n noteUid: string;\n}\n\nexport interface Currency {\n value: number;\n currency: string;\n}\n\nexport interface Tax {\n amount: Currency;\n label: string;\n}\n\nexport interface Discount {\n amount: Currency;\n label: string;\n coupon?: Coupon;\n}\n\nexport interface Coupon {\n code: string;\n}\n\nexport interface NegotiableQuoteListEntry {\n uid: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n status: NegotiableQuoteStatus;\n buyer: {\n firstname: string;\n lastname: string;\n };\n templateName: string;\n prices: {\n grandTotal: Currency;\n };\n}\nexport interface NegotiableQuotesListModel {\n items: NegotiableQuoteListEntry[];\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n totalCount: number;\n paginationInfo?: PaginationInfo;\n sortFields?: {\n default: string;\n options: Array<{\n label: string;\n value: string;\n }>;\n };\n}\n\nexport interface NegotiableQuoteHistoryEntry {\n author: {\n firstname: string;\n lastname: string;\n };\n changeType: NegotiableQuoteHistoryEntryChangeType;\n changes: {\n commentAdded?: {\n comment: string;\n };\n customChanges?: {\n new_value: string;\n old_value: string;\n title: string;\n };\n expiration?: {\n newExpiration: string;\n oldExpiration: string;\n };\n productsRemoved?: {\n productsRemovedFromCatalog: string[];\n productsRemovedFromQuote?: {\n uid: string;\n name: string;\n sku: string;\n quantity: number;\n }[];\n };\n statuses?: {\n changes: {\n newStatus: string;\n oldStatus: string;\n }[];\n };\n total?: {\n newPrice: Currency;\n oldPrice: Currency;\n };\n };\n createdAt: string;\n uid: string;\n}\n\nexport enum NegotiableQuoteHistoryEntryChangeType {\n CREATED = 'CREATED',\n UPDATED = 'UPDATED',\n CLOSED = 'CLOSED',\n UPDATED_BY_SYSTEM = 'UPDATED_BY_SYSTEM',\n}\n\n// See: https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/quotes/quotes#quote-status\nexport enum NegotiableQuoteStatus {\n NEW = 'NEW', // Currently not returned by the API, but is used to indicate a new quote\n SUBMITTED = 'SUBMITTED',\n PENDING = 'PENDING',\n UPDATED = 'UPDATED',\n OPEN = 'OPEN',\n ORDERED = 'ORDERED',\n CLOSED = 'CLOSED',\n DECLINED = 'DECLINED',\n EXPIRED = 'EXPIRED',\n DRAFT = 'DRAFT',\n}\n\nexport interface PaginationInfo {\n currentPage: number;\n totalCount: number;\n pageSize: number;\n startItem: number;\n endItem: number;\n totalPages: number;\n pageSizeOptions?: number[];\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n Currency,\n PaginationInfo,\n ShippingAddress,\n NegotiableQuoteHistoryEntry,\n CartItemModel,\n} from './negotiable-quote-model';\n\nexport interface NegotiableQuoteTemplateModel {\n id: string;\n uid: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n expirationDate?: string;\n status: NegotiableQuoteTemplateStatus;\n salesRepName: string;\n buyer: {\n firstname: string;\n lastname: string;\n };\n comments?: QuoteTemplateComment[];\n history?: NegotiableQuoteHistoryEntry[];\n prices: {\n subtotalExcludingTax?: Currency;\n subtotalIncludingTax?: Currency;\n subtotalWithDiscountExcludingTax?: Currency;\n grandTotal?: Currency;\n appliedTaxes?: {\n amount: Currency;\n label: string;\n }[];\n };\n items: CartItemModel[];\n shippingAddresses?: ShippingAddress[];\n referenceDocuments?: {\n uid: string;\n name: string;\n identifier?: string;\n url: string;\n }[];\n // Template-specific fields\n quantityThresholds?: {\n min?: number;\n max?: number;\n };\n canAccept: boolean;\n canDelete: boolean;\n canReopen: boolean;\n canCancel: boolean;\n canSendForReview: boolean;\n canGenerateQuoteFromTemplate: boolean;\n canEditTemplateItems: boolean;\n}\n\nexport enum NegotiableQuoteTemplateStatus {\n ACTIVE = 'Active',\n IN_REVIEW = 'In Review',\n INACTIVE = 'Inactive',\n SUBMITTED = 'Submitted',\n PENDING = 'Pending',\n CLOSED = 'Closed',\n OPEN = 'Open',\n UPDATED = 'Updated',\n EDITED = 'Edited',\n NEW = 'New',\n DRAFT = 'Draft',\n DECLINED = 'Declined',\n CANCELED = 'Canceled',\n EXPIRED = 'Expired',\n}\n\n\nexport interface QuoteTemplateComment {\n uid: string;\n createdAt: string;\n author: {\n firstname: string;\n lastname: string;\n };\n text: string;\n attachments?: {\n name: string;\n url: string;\n }[];\n}\n\n// List model for getQuoteTemplates\nexport interface NegotiableQuoteTemplatesListModel {\n items: NegotiableQuoteTemplateListEntry[];\n pageInfo: {\n currentPage: number;\n pageSize: number;\n totalPages: number;\n };\n totalCount: number;\n paginationInfo?: PaginationInfo;\n sortFields?: {\n default: string;\n options: Array<{\n label: string;\n value: string;\n }>;\n };\n}\n\nexport interface NegotiableQuoteTemplateListEntry {\n id: string;\n uid: string;\n name: string;\n createdAt: string;\n updatedAt: string;\n status: NegotiableQuoteTemplateStatus;\n state: 'active' | 'inactive' | 'in_review';\n lastSharedAt: string;\n lastOrderedAt: string;\n expirationDate: string;\n ordersPlaced: number;\n prices: {\n grandTotal: Currency;\n minNegotiatedGrandTotal: Currency;\n };\n canGenerateQuoteFromTemplate?: boolean;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport enum QuoteDisplayAmount {\n TAX_EXCLUDED = 1,\n TAX_INCLUDED = 2,\n TAX_INCLUDED_AND_EXCLUDED = 3,\n}\n\nexport interface StoreConfigModel {\n quoteSummaryDisplayTotal: number;\n quoteSummaryMaxItems: number;\n quoteDisplaySettings: {\n zeroTax: boolean;\n subtotal: QuoteDisplayAmount;\n price: QuoteDisplayAmount;\n shipping: QuoteDisplayAmount;\n fullSummary: boolean;\n grandTotal: boolean;\n };\n useConfigurableParentThumbnail: boolean;\n quoteMinimumAmount: number | null;\n quoteMinimumAmountMessage: string | null;\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\nimport { State } from '@/quote-management/types/state.types';\n\nexport const DEFAULT_PERMISSIONS = {\n requestQuote: false,\n editQuote: false,\n deleteQuote: false,\n checkoutQuote: false,\n viewQuoteTemplates: false,\n manageQuoteTemplates: false,\n generateQuoteFromTemplate: false,\n};\n\nexport const DEFAULT_CONFIG: StoreConfigModel = {\n quoteSummaryDisplayTotal: 1,\n quoteSummaryMaxItems: 10,\n quoteDisplaySettings: {\n zeroTax: false,\n subtotal: QuoteDisplayAmount.TAX_INCLUDED,\n price: QuoteDisplayAmount.TAX_INCLUDED,\n shipping: QuoteDisplayAmount.TAX_INCLUDED,\n fullSummary: false,\n grandTotal: true,\n },\n useConfigurableParentThumbnail: true,\n quoteMinimumAmount: null,\n quoteMinimumAmountMessage: null,\n};\n\nconst _state: State = {\n authenticated: false,\n permissions: DEFAULT_PERMISSIONS,\n config: DEFAULT_CONFIG,\n initialized: false,\n quoteDataLoaded: false,\n quoteDataInitialized: false,\n};\n\n// Proxy state to make it reactive\nexport const state = new Proxy(_state, {\n get: (target, key) => {\n return target[key as keyof State];\n },\n set: (target, key, value) => {\n target[key as keyof State] = value;\n return true;\n },\n});\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { State } from '@/quote-management/types/state.types';\n\n/**\n * Type definition for the auth/permissions event payload\n * Contains flat Adobe Commerce permission keys with boolean values\n */\nexport type AuthPermissionsPayload = {\n all?: boolean;\n 'Magento_NegotiableQuote::all'?: boolean;\n 'Magento_NegotiableQuote::manage'?: boolean;\n 'Magento_NegotiableQuote::checkout'?: boolean;\n 'Magento_NegotiableQuoteTemplate::all'?: boolean;\n 'Magento_NegotiableQuoteTemplate::view_template'?: boolean;\n 'Magento_NegotiableQuoteTemplate::manage'?: boolean;\n 'Magento_NegotiableQuoteTemplate::generate_quote'?: boolean;\n [key: string]: boolean | undefined;\n};\n\n/**\n * Maps the auth/permissions event payload to internal permissions structure.\n * \n * Implements hierarchical permission checking:\n * 1. Top-level \"all\": If true, grants all permissions\n * 2. Module-level \"::all\": Grants all permissions for that module\n * 3. Specific permissions: Maps individual keys to internal flags\n * \n * @param payload - The raw auth/permissions event payload\n * @returns Typed permissions object matching the state structure\n * \n * @example\n * ```typescript\n * const permissions = mapAuthPermissions({\n * \"Magento_NegotiableQuote::manage\": true,\n * \"Magento_NegotiableQuote::checkout\": true\n * });\n * // Returns: { requestQuote: true, editQuote: true, deleteQuote: true, checkoutQuote: true, ... }\n * ```\n */\nexport function mapAuthPermissions(\n payload: AuthPermissionsPayload | null | undefined\n): State['permissions'] {\n // Handle null/undefined payload - return all false\n if (!payload || typeof payload !== 'object') {\n return {\n requestQuote: false,\n editQuote: false,\n deleteQuote: false,\n checkoutQuote: false,\n viewQuoteTemplates: false,\n manageQuoteTemplates: false,\n generateQuoteFromTemplate: false,\n };\n }\n\n // If top-level \"all\" is true, grant all permissions\n if (payload.all === true) {\n return {\n requestQuote: true,\n editQuote: true,\n deleteQuote: true,\n checkoutQuote: true,\n viewQuoteTemplates: true,\n manageQuoteTemplates: true,\n generateQuoteFromTemplate: true,\n };\n }\n\n // Check module-level \"all\" permissions\n const hasAllQuotePermissions = payload['Magento_NegotiableQuote::all'] === true;\n const hasAllTemplatePermissions = payload['Magento_NegotiableQuoteTemplate::all'] === true;\n\n // Map specific permissions with fallback to module-level \"all\"\n const hasManagePermission = \n hasAllQuotePermissions || payload['Magento_NegotiableQuote::manage'] === true;\n\n return {\n // Magento_NegotiableQuote::manage maps to request, edit, and delete\n requestQuote: hasManagePermission,\n editQuote: hasManagePermission,\n deleteQuote: hasManagePermission,\n \n // Magento_NegotiableQuote::checkout maps to checkoutQuote\n checkoutQuote: \n hasAllQuotePermissions || payload['Magento_NegotiableQuote::checkout'] === true,\n \n // Template permissions\n viewQuoteTemplates: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::view_template'] === true,\n manageQuoteTemplates: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::manage'] === true,\n generateQuoteFromTemplate: \n hasAllTemplatePermissions || payload['Magento_NegotiableQuoteTemplate::generate_quote'] === true,\n };\n}\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { Initializer } from '@adobe-commerce/elsie/lib';\nimport { Lang } from '@adobe-commerce/elsie/i18n';\nimport { events } from '@adobe-commerce/event-bus';\nimport {\n state,\n DEFAULT_CONFIG,\n DEFAULT_PERMISSIONS,\n} from '@/quote-management/lib/state';\nimport {\n getQuoteData,\n getStoreConfig,\n getQuoteTemplateData,\n} from '@/quote-management/api';\nimport { mapAuthPermissions, AuthPermissionsPayload } from '@/quote-management/utils/mapAuthPermissions';\n\ntype ConfigProps = {\n langDefinitions?: Lang;\n quoteId?: string;\n quoteTemplateId?: string;\n};\n\nfunction loadQuoteData(permissions: typeof DEFAULT_PERMISSIONS) {\n // Prevent loading quote data twice\n if (state.quoteDataLoaded) return;\n\n const config = initialize.config.getConfig();\n const { quoteId, quoteTemplateId } = config;\n\n\n // Only proceed if we have permissions and at least one ID to load\n if (!permissions.editQuote || (!quoteId && !quoteTemplateId)) {\n return;\n }\n\n // Mark as loaded before starting the async operations to prevent duplicate calls\n state.quoteDataLoaded = true;\n\n if (quoteId) {\n getQuoteData(quoteId)\n .then((quote) => {\n if (!state.quoteDataInitialized) {\n events.emit('quote-management/quote-data/initialized', { quote, permissions });\n }\n state.quoteDataInitialized = true;\n })\n .catch((error) => {\n state.quoteDataLoaded = false;\n events.emit('quote-management/quote-data/error', { error });\n });\n }\n\n if (quoteTemplateId) {\n getQuoteTemplateData(quoteTemplateId)\n .catch((error) => {\n state.quoteDataLoaded = false;\n events.emit('quote-management/quote-template-data/error', { error });\n });\n }\n}\n\nexport const initialize = new Initializer<ConfigProps>({\n init: async (config) => {\n const defaultConfig = {};\n\n // Set config\n initialize.config.setConfig({ ...defaultConfig, ...config });\n\n // Fetch store config\n await getStoreConfig()\n .then((config) => {\n state.config = config;\n })\n .catch((error) => {\n console.error('Failed to fetch store config: ', error);\n state.config = DEFAULT_CONFIG;\n });\n\n // Mark initialization as complete\n state.initialized = true;\n events.emit('quote-management/initialized', { config: state.config });\n },\n\n listeners: () => [\n events.on('authenticated', async (authenticated) => {\n state.authenticated = !!authenticated;\n\n // Defensive: reset permissions if user logs out\n // This ensures permissions are cleared even if auth/permissions event doesn't fire\n if (!authenticated) {\n state.permissions = DEFAULT_PERMISSIONS;\n state.quoteDataLoaded = false;\n events.emit('quote-management/permissions', DEFAULT_PERMISSIONS);\n }\n },\n {\n eager: true,\n }\n ),\n\n events.on('auth/permissions', async (payload: AuthPermissionsPayload) => {\n // Map the auth permissions payload to internal permissions structure\n const permissions = mapAuthPermissions(payload);\n\n state.permissions = permissions;\n // Reset quote data loaded flag when permissions change to allow reloading\n state.quoteDataLoaded = false;\n events.emit('quote-management/permissions', state.permissions);\n }, {\n eager: true,\n }),\n\n events.on('quote-management/permissions', async (permissions) => {\n // Only process quote data loading after initialization is complete\n if (!state.initialized) {\n return;\n }\n\n loadQuoteData(permissions);\n }, { eager: true }),\n\n events.on('quote-management/initialized', async () => {\n loadQuoteData(state.permissions);\n }, { eager: true }),\n\n events.on('checkout/updated', async (data) => {\n // Only process after initialization is complete\n if (!state.initialized) {\n return;\n }\n\n if (data?.type !== 'quote') {\n return;\n }\n\n // Reset the flag to allow reloading of quote data\n state.quoteDataLoaded = false;\n loadQuoteData(state.permissions);\n }, { eager: true }),\n ],\n});\n\nexport const config = initialize.config;\n","import { FetchGraphQL } from '@adobe-commerce/fetch-graphql';\n\nexport const {\n setEndpoint,\n setFetchGraphQlHeader,\n removeFetchGraphQlHeader,\n setFetchGraphQlHeaders,\n fetchGraphQl,\n getConfig,\n} = new FetchGraphQL().getMethods();\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const SELECTED_SHIPPING_METHOD_FRAGMENT = /* GraphQL */ `\n fragment SELECTED_SHIPPING_METHOD_FRAGMENT on SelectedShippingMethod {\n amount {\n currency\n value\n }\n carrier_code\n carrier_title\n method_code\n method_title\n price_excl_tax {\n value\n currency\n }\n price_incl_tax {\n value\n currency\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { SELECTED_SHIPPING_METHOD_FRAGMENT } from './ShippingMethodFragment';\n\nexport const NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT = /* GraphQL */ `\n fragment NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT on NegotiableQuoteShippingAddress {\n uid\n firstname\n lastname\n company\n street\n city\n region {\n code\n label\n region_id\n }\n postcode\n country {\n code\n label\n }\n telephone\n\n selected_shipping_method {\n ...SELECTED_SHIPPING_METHOD_FRAGMENT\n }\n }\n\n ${SELECTED_SHIPPING_METHOD_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT } from './NegotiableQuoteAddressFragment';\n\nexport const NEGOTIABLE_QUOTE_FRAGMENT = /* GraphQL */ `\n fragment NegotiableQuoteFragment on NegotiableQuote {\n uid\n name\n created_at\n is_virtual\n status\n sales_rep_name\n expiration_date\n updated_at\n buyer {\n firstname\n lastname\n }\n email\n comments {\n uid\n created_at\n author {\n firstname\n lastname\n }\n text\n attachments {\n name\n url\n }\n }\n template_id\n template_name\n total_quantity\n items {\n __typename\n uid\n product {\n name\n sku\n uid\n stock_status\n quantity\n thumbnail {\n label\n url\n }\n price_range {\n minimum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n maximum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n }\n price_tiers {\n quantity\n final_price {\n value\n }\n discount {\n amount_off\n percent_off\n }\n }\n }\n prices {\n price {\n currency\n value\n }\n price_including_tax {\n value\n currency\n }\n original_item_price {\n currency\n value\n }\n original_row_total {\n currency\n value\n }\n row_total {\n currency\n value\n }\n row_total_including_tax {\n value\n currency\n }\n catalog_discount {\n amount_off\n percent_off\n }\n row_catalog_discount {\n amount_off\n percent_off\n }\n discounts {\n label\n value\n amount {\n currency\n value\n }\n }\n }\n quantity\n is_available\n note_from_buyer {\n created_at\n creator_id\n creator_type\n negotiable_quote_item_uid\n note\n note_uid\n __typename\n }\n note_from_seller {\n created_at\n creator_id\n creator_type\n negotiable_quote_item_uid\n note\n note_uid\n __typename\n }\n ... on SimpleCartItem {\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n value_label\n }\n configured_variant {\n uid\n sku\n stock_status\n thumbnail {\n label\n url\n }\n price_range {\n minimum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n maximum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n }\n price_tiers {\n quantity\n final_price {\n value\n }\n discount {\n amount_off\n percent_off\n }\n }\n }\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n ... on BundleCartItem {\n bundle_options {\n label\n values {\n label\n quantity\n original_price {\n currency\n value\n }\n priceV2 {\n currency\n value\n }\n }\n }\n }\n ... on DownloadableCartItem {\n links {\n sort_order\n title\n }\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n }\n history {\n uid\n created_at\n author {\n firstname\n lastname\n }\n change_type\n changes {\n comment_added {\n comment\n }\n custom_changes {\n new_value\n old_value\n title\n }\n statuses {\n changes {\n new_status\n old_status\n }\n }\n expiration {\n new_expiration\n old_expiration\n }\n total {\n new_price {\n currency\n value\n }\n old_price {\n currency\n value\n }\n }\n products_removed {\n products_removed_from_catalog\n products_removed_from_quote {\n uid\n name\n sku\n quantity\n }\n }\n }\n }\n prices {\n subtotal_with_discount_excluding_tax {\n currency\n value\n }\n subtotal_including_tax {\n currency\n value\n }\n subtotal_excluding_tax {\n currency\n value\n }\n grand_total {\n currency\n value\n }\n grand_total_excluding_tax {\n currency\n value\n }\n applied_taxes {\n label\n amount {\n value\n currency\n }\n }\n discounts {\n amount {\n value\n currency\n }\n label\n coupon {\n code\n }\n applied_to\n }\n }\n\n shipping_addresses {\n ...NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT\n }\n }\n\n ${NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const REQUEST_NEGOTIABLE_QUOTE_MUTATION = `\n mutation REQUEST_NEGOTIABLE_QUOTE_MUTATION(\n $cartId: ID!\n $quoteName: String!\n $comment: NegotiableQuoteCommentInput!\n $isDraft: Boolean\n ) {\n requestNegotiableQuote(\n input: {\n cart_id: $cartId\n quote_name: $quoteName\n comment: $comment\n is_draft: $isDraft\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n QuoteDisplayAmount,\n StoreConfigModel,\n} from '@/quote-management/data/models';\nimport { DEFAULT_CONFIG } from '@/quote-management/lib/state';\n\nexport function transformStoreConfig(data: any): StoreConfigModel {\n if (!data) return DEFAULT_CONFIG;\n\n const transformQuoteDisplayAmountSetting = (\n quoteDisplayAmountSetting: number\n ) => {\n if (\n [\n QuoteDisplayAmount.TAX_EXCLUDED,\n QuoteDisplayAmount.TAX_INCLUDED,\n QuoteDisplayAmount.TAX_INCLUDED_AND_EXCLUDED,\n ].includes(quoteDisplayAmountSetting)\n ) {\n return quoteDisplayAmountSetting;\n }\n\n return QuoteDisplayAmount.TAX_EXCLUDED;\n };\n\n return {\n quoteSummaryDisplayTotal: data.cart_summary_display_quantity,\n quoteSummaryMaxItems: data.max_items_in_order_summary,\n quoteDisplaySettings: {\n zeroTax: data.shopping_cart_display_zero_tax,\n subtotal: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_subtotal\n ),\n price: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_price\n ),\n shipping: transformQuoteDisplayAmountSetting(\n data.shopping_cart_display_shipping\n ),\n fullSummary: data.shopping_cart_display_full_summary,\n grandTotal: data.shopping_cart_display_grand_total,\n },\n useConfigurableParentThumbnail:\n data.configurable_thumbnail_source === 'parent',\n quoteMinimumAmount: data.quote_minimum_amount ?? null,\n quoteMinimumAmountMessage: data.quote_minimum_amount_message ?? null,\n };\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NegotiableQuoteHistoryEntry, NegotiableQuoteHistoryEntryChangeType } from '../models/negotiable-quote-model';\n\n/**\n * Transforms a history entry from the API format to the model format\n * @param historyEntry - Raw history entry from API\n * @returns Transformed history entry\n */\nexport function transformHistoryEntry(\n historyEntry: any\n): NegotiableQuoteHistoryEntry {\n return {\n uid: historyEntry.uid,\n createdAt: historyEntry.created_at,\n author: {\n firstname: historyEntry.author.firstname,\n lastname: historyEntry.author.lastname,\n },\n changeType: historyEntry.change_type as NegotiableQuoteHistoryEntryChangeType,\n changes: {\n commentAdded: historyEntry.changes?.comment_added && {\n comment: historyEntry.changes.comment_added.comment,\n },\n customChanges: historyEntry.changes?.custom_changes && {\n new_value: historyEntry.changes.custom_changes.new_value,\n old_value: historyEntry.changes.custom_changes.old_value,\n title: historyEntry.changes.custom_changes.title,\n },\n expiration: historyEntry.changes?.expiration && {\n newExpiration: historyEntry.changes.expiration.new_expiration,\n oldExpiration: historyEntry.changes.expiration.old_expiration,\n },\n productsRemoved: historyEntry.changes?.products_removed && {\n productsRemovedFromCatalog:\n historyEntry.changes.products_removed.products_removed_from_catalog ||\n [],\n productsRemovedFromQuote:\n historyEntry.changes.products_removed.products_removed_from_quote ||\n [],\n },\n statuses: historyEntry.changes?.statuses && {\n changes:\n historyEntry.changes.statuses.changes?.map((change: any) => ({\n newStatus: change?.new_status,\n oldStatus: change?.old_status,\n })) || [],\n },\n total:\n historyEntry.changes?.total &&\n historyEntry.changes.total.new_price &&\n historyEntry.changes.total.old_price && {\n newPrice: {\n value: historyEntry.changes.total.new_price.value,\n currency: historyEntry.changes.total.new_price.currency,\n },\n oldPrice: {\n value: historyEntry.changes.total.old_price.value,\n currency: historyEntry.changes.total.old_price.currency,\n },\n },\n },\n };\n}\n\n/**\n * Transforms an array of history entries from the API format to the model format\n * @param historyEntries - Array of raw history entries from API\n * @returns Array of transformed history entries\n */\nexport function transformHistory(\n historyEntries: any[] | null | undefined\n): NegotiableQuoteHistoryEntry[] | undefined {\n if (!historyEntries) {\n return undefined;\n }\n\n return historyEntries.map(transformHistoryEntry);\n}\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { CartItemModel } from '../models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\n\n/**\n * Finds the most applicable price tier for a given quantity\n * @param priceTiers - Array of price tier objects\n * @param quantity - Current item quantity\n * @returns The applicable tier or null if none found\n */\nfunction findApplicablePriceTier(priceTiers: any[], quantity: number) {\n if (!priceTiers?.length) return null;\n\n // Sort price tiers by quantity in descending order to find the highest applicable tier\n const sortedTiers = [...priceTiers].sort(\n (a: any, b: any) => b.quantity - a.quantity\n );\n\n // Find the highest tier where the current quantity meets or exceeds the tier's minimum quantity\n return sortedTiers.find((tier: any) => quantity >= tier.quantity) || null;\n}\n\n/**\n * Helper function to get the image for a cart item component\n * @param item - Cart item from API\n * @returns Image object with src and alt\n */\nfunction getImage(item: any) {\n const config = state.config;\n\n return {\n // Use parent thumbnail if configured, otherwise use own variant. Use the parent thumbnail as a fallback\n src: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.url\n : item.configured_variant?.thumbnail?.url || item.product.thumbnail.url,\n alt: config?.useConfigurableParentThumbnail\n ? item.product.thumbnail.label\n : item.configured_variant?.thumbnail?.label ||\n item.product.thumbnail.label,\n };\n}\n\n/**\n * Helper function to get downloadable links for a cart item component\n * @param item - Cart item from API\n * @returns Links object with count and result, or null if no links\n */\nfunction getLinks(item: any) {\n return item.links?.length > 0\n ? {\n count: item.links.length,\n result: item.links.map((link: any) => link.title).join(', '),\n }\n : null;\n}\n\n/**\n * Helper function to check if an item is discounted\n * @param item - Cart item from API\n * @returns True if the item has a discount\n */\nfunction getDiscounted(item: any) {\n const quantity = item.quantity;\n const isConfigurable = item.__typename === 'ConfigurableCartItem';\n\n // Get price tiers and price range based on item type\n const priceTiers = isConfigurable\n ? item.configured_variant?.price_tiers\n : item.product.price_tiers;\n const priceRange = isConfigurable\n ? item.configured_variant?.price_range\n : item.product.price_range;\n\n // Check price tiers first for discount eligibility\n const applicableTier = findApplicablePriceTier(priceTiers, quantity);\n if (applicableTier) {\n return applicableTier.discount.amount_off > 0;\n }\n\n // Fallback to regular price range discount\n return (priceRange?.maximum_price?.discount?.amount_off ?? 0) > 0;\n}\n\n/**\n * Helper function to get the discount percentage of an item\n * @param item - Cart item from API\n * @returns Discount percentage rounded to nearest integer, or undefined if no discount\n */\nfunction getDiscountPercentage(item: any) {\n const quantity = item.quantity;\n\n // Check price tiers first for discount percentage\n const applicableTier = findApplicablePriceTier(\n item.product.price_tiers,\n quantity\n );\n\n if (applicableTier) {\n return Math.round(applicableTier.discount.percent_off);\n }\n\n // Fallback to product-specific discount percentage\n let percent_off;\n\n if (item.__typename === 'ConfigurableCartItem') {\n percent_off =\n item?.configured_variant?.price_range?.maximum_price?.discount\n ?.percent_off;\n } else if (item.__typename === 'BundleCartItem') {\n return undefined;\n } else {\n percent_off =\n item?.product?.price_range?.maximum_price?.discount?.percent_off;\n }\n\n if (percent_off === 0) {\n return undefined;\n }\n\n return Math.round(percent_off);\n}\n\n/**\n * Helper function to get the regular price of an item\n * @param item - Cart item from API\n * @returns Regular price object with value and currency\n */\nfunction getRegularPrice(item: any) {\n if (item.__typename === 'ConfigurableCartItem') {\n return {\n value:\n item.configured_variant?.price_range?.maximum_price.regular_price.value,\n currency:\n item.configured_variant?.price_range?.maximum_price.regular_price\n .currency,\n };\n }\n return {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n };\n}\n\n/**\n * Helper function to get the savings amount of an item\n * @param item - Cart item from API\n * @returns Savings amount object with value and currency, or undefined if no savings\n */\nfunction getSavingsAmount(item: any) {\n let amount_off;\n let currency;\n\n amount_off =\n item?.prices?.original_row_total?.value - item?.prices?.row_total?.value;\n currency = item?.prices?.row_total?.currency;\n\n if (amount_off === 0) {\n return undefined;\n }\n return {\n value: amount_off,\n currency,\n };\n}\n\n/**\n * Transforms a single quote item from the API format to the model format\n * @param item - Raw quote item from API\n * @returns Transformed quote item\n */\nexport function transformQuoteItem(item: any): CartItemModel {\n return {\n itemType: item.__typename,\n uid: item.uid,\n product: {\n uid: item.product.uid,\n sku: item.product.sku,\n name: item.product.name,\n priceRange: {\n maximumPrice: {\n regularPrice: {\n value:\n item.product.price_range.maximum_price.regular_price.value,\n currency:\n item.product.price_range.maximum_price.regular_price.currency,\n },\n },\n },\n },\n image: getImage(item),\n links: getLinks(item),\n discounted: getDiscounted(item),\n discountedTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n catalogDiscount: {\n amountOff: item.prices.catalog_discount.amount_off,\n percentOff: item.prices.catalog_discount.percent_off,\n },\n rowCatalogDiscount: {\n amountOff: item.prices.row_catalog_discount.amount_off,\n percentOff: item.prices.row_catalog_discount.percent_off,\n },\n discounts:\n item.prices?.discounts?.map((discount: any) => ({\n label: discount.label,\n value: discount.value,\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n })) ?? [],\n discountPercentage: getDiscountPercentage(item),\n insufficientQuantity:\n (item.__typename === 'ConfigurableCartItem'\n ? item.configured_variant?.stock_status ?? item.product.stock_status\n : item.product.stock_status\n ) === 'IN_STOCK' && !item.is_available,\n outOfStock: item.product.stock_status === 'OUT_OF_STOCK',\n stockStatus: item.product.stock_status,\n quantity: item.quantity,\n prices: {\n regularPrice: getRegularPrice(item),\n priceIncludingTax: {\n value: item.prices.price_including_tax.value,\n currency: item.prices.price_including_tax.currency,\n },\n originalItemPrice: {\n value: item.prices.original_item_price.value,\n currency: item.prices.original_item_price.currency,\n },\n originalRowTotal: {\n value: item.prices.original_row_total.value,\n currency: item.prices.original_row_total.currency,\n },\n rowTotal: {\n value: item.prices.row_total.value,\n currency: item.prices.row_total.currency,\n },\n rowTotalIncludingTax: {\n value: item.prices.row_total_including_tax.value,\n currency: item.prices.row_total_including_tax.currency,\n },\n },\n savingsAmount: getSavingsAmount(item),\n noteFromBuyer: item.note_from_buyer?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n noteFromSeller: item.note_from_seller?.map((note: any) => ({\n createdAt: note.created_at,\n creatorId: note.creator_id,\n creatorType: note.creator_type,\n negotiableQuoteItemUid: note.negotiable_quote_item_uid,\n note: note.note,\n noteUid: note.note_uid,\n })),\n configurableOptions: item.configurable_options?.map((option: any) => ({\n optionLabel: option.option_label,\n valueLabel: option.value_label,\n })),\n bundleOptions: item.bundle_options?.map((option: any) => ({\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n quantity: value.quantity,\n originalPrice: {\n value: value.original_price.value,\n currency: value.original_price.currency,\n },\n price: {\n value: value.priceV2.value,\n currency: value.priceV2.currency,\n },\n })),\n })),\n customizableOptions: item.customizable_options?.map((option: any) => ({\n type: option.type,\n label: option.label,\n values: option.values.map((value: any) => ({\n label: value.label,\n value: value.value,\n })),\n })),\n };\n}\n\n/**\n * Transforms an array of quote items from the API format to the model format\n * @param items - Array of raw quote items from API\n * @returns Array of transformed quote items\n */\nexport function transformQuoteItems(\n items: any[] | null | undefined\n): CartItemModel[] {\n if (!items) {\n return [];\n }\n\n return items.map(transformQuoteItem);\n}\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n CartItemModel,\n NegotiableQuoteListEntry,\n NegotiableQuoteModel,\n NegotiableQuotesListModel,\n NegotiableQuoteStatus,\n PaginationInfo,\n ShippingAddress,\n} from '@/quote-management/data/models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\nimport { transformHistory } from './transform-history';\nimport { transformQuoteItems } from './transform-quote-items';\n\n// Quote statuses that allow editing/sending for review\nconst EDITABLE_QUOTE_STATUSES = [\n 'DRAFT',\n 'UPDATED',\n 'DECLINED',\n 'EXPIRED',\n 'NEW',\n 'OPEN',\n] as const;\n\n// Helper function to get the total quantity of a quote (number of quote line items or total quantity)\nfunction getTotalQuantity(quote: any) {\n if (!quote.items) return 0;\n\n const config = state.config;\n\n if (config?.quoteSummaryDisplayTotal === 0) return quote.items.length;\n if (config?.quoteSummaryDisplayTotal === 1) return quote.total_quantity;\n // Default to items count if unexpected config value or error returned\n return quote.items.length;\n}\n\nfunction checkAllItemsHaveStock(items: CartItemModel[]): boolean {\n return items.every((item) => !item.outOfStock && !item.insufficientQuantity);\n}\n\n// Base helper that transforms a single quote object directly\nfunction transformSingleQuote(quote: any): NegotiableQuoteModel {\n const isQuoteNew = isNewQuote(quote);\n const isGeneratedFromTemplate = Boolean(quote.template_name?.trim());\n const quoteItems = transformQuoteItems(quote.items);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n expirationDate: quote.expiration_date,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n isVirtual: Boolean(quote.is_virtual),\n salesRepName: quote.sales_rep_name,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n email: quote.email,\n templateName: quote.template_name,\n totalQuantity: getTotalQuantity(quote),\n comments: quote.comments?.map((comment: any) => {\n const baseComment: any = {\n uid: comment.uid,\n createdAt: comment.created_at,\n author: {\n firstname: comment.author.firstname,\n lastname: comment.author.lastname,\n },\n text: comment.text,\n };\n\n if (\n Array.isArray(comment.attachments) &&\n comment.attachments.length > 0\n ) {\n baseComment.attachments = comment.attachments.map((a: any) => ({\n name: a.name,\n url: a.url,\n }));\n }\n\n return baseComment;\n }),\n prices: quote.prices && {\n appliedDiscounts: quote.prices.discounts?.map((discount: any) => ({\n amount: {\n value: discount.amount.value,\n currency: discount.amount.currency,\n },\n label: discount.label,\n coupon: discount.coupon,\n })),\n appliedTaxes: quote.prices.applied_taxes?.map((tax: any) => ({\n amount: { value: tax.amount.value, currency: tax.amount.currency },\n label: tax.label,\n })),\n discount:\n quote.prices.discounts &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.discounts,\n quote.prices.grand_total.currency\n ),\n grandTotal: quote.prices.grand_total && {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n grandTotalExcludingTax: quote.prices.grand_total_excluding_tax && {\n value: quote.prices.grand_total_excluding_tax.value,\n currency: quote.prices.grand_total_excluding_tax.currency,\n },\n subtotalExcludingTax: quote.prices.subtotal_excluding_tax && {\n value: quote.prices.subtotal_excluding_tax.value,\n currency: quote.prices.subtotal_excluding_tax.currency,\n },\n subtotalIncludingTax: quote.prices.subtotal_including_tax && {\n value: quote.prices.subtotal_including_tax.value,\n currency: quote.prices.subtotal_including_tax.currency,\n },\n subtotalWithDiscountExcludingTax: quote.prices\n .subtotal_with_discount_excluding_tax && {\n value: quote.prices.subtotal_with_discount_excluding_tax.value,\n currency: quote.prices.subtotal_with_discount_excluding_tax.currency,\n },\n ...transformShippingPrices(quote),\n totalTax:\n quote.prices.applied_taxes &&\n quote.prices.grand_total &&\n calculateTotal(\n quote.prices.applied_taxes,\n quote.prices.grand_total.currency\n ),\n },\n history: transformHistory(quote.history),\n items: quoteItems,\n shippingAddresses: quote.shipping_addresses?.map((address: any) => {\n const shippingAddress: ShippingAddress = {\n uid: address.uid,\n firstname: address.firstname,\n lastname: address.lastname,\n company: address.company,\n street: address.street,\n city: address.city,\n postcode: address.postcode,\n country: {\n code: address.country.code,\n label: address.country.label,\n },\n telephone: address.telephone,\n };\n\n if (address.region) {\n shippingAddress.region = {\n code: address.region.code,\n label: address.region.label,\n regionId: address.region.region_id,\n };\n }\n\n return shippingAddress;\n }),\n canCheckout:\n ['UPDATED', 'DECLINED'].includes(quote.status) &&\n state.permissions.checkoutQuote &&\n quote.shipping_addresses?.length > 0 &&\n checkAllItemsHaveStock(quoteItems),\n canSendForReview:\n !isGeneratedFromTemplate &&\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canUpdateQuote:\n !isGeneratedFromTemplate &&\n (isQuoteNew || EDITABLE_QUOTE_STATUSES.includes(quote.status)) &&\n state.permissions.editQuote,\n canDelete:\n !isGeneratedFromTemplate &&\n !['PENDING', 'SUBMITTED', 'ORDERED'].includes(quote.status) &&\n state.permissions.deleteQuote,\n canClose: quote.status\n ? !isGeneratedFromTemplate &&\n !['DRAFT', 'CLOSED', 'ORDERED', 'OPEN'].includes(quote.status)\n : false,\n readOnly:\n isGeneratedFromTemplate ||\n (!isQuoteNew &&\n ['ORDERED', 'SUBMITTED', 'CLOSED', 'PENDING'].includes(quote.status)) ||\n !state.permissions.editQuote,\n };\n}\n\nexport function transformQuote(quoteData: any): NegotiableQuoteModel | null {\n if (!quoteData) {\n return null;\n }\n\n return transformSingleQuote(quoteData);\n}\n\n// quote is new if it has a status of SUBMITTED and there is no history entry that\n// has a change_type of UPDATED with a non-empty array of status changes\nfunction isNewQuote(quote: any): boolean {\n return (\n quote.status === 'SUBMITTED' &&\n !(quote.history ?? []).some(\n (history: any) =>\n history.change_type === 'UPDATED' &&\n (history.changes?.statuses?.changes ?? []).length > 0\n )\n );\n}\n\nfunction transformNegotiableQuoteListEntry(\n quote: any\n): NegotiableQuoteListEntry {\n const isQuoteNew = isNewQuote(quote);\n return {\n uid: quote.uid,\n name: quote.name,\n createdAt: quote.created_at,\n updatedAt: quote.updated_at,\n status: isQuoteNew ? NegotiableQuoteStatus.NEW : quote.status,\n buyer: {\n firstname: quote.buyer.firstname,\n lastname: quote.buyer.lastname,\n },\n templateName: quote.template_name,\n prices: {\n grandTotal: {\n value: quote.prices.grand_total.value,\n currency: quote.prices.grand_total.currency,\n },\n },\n };\n}\n\nexport function transformNegotiableQuotesList(\n quotesData: any\n): NegotiableQuotesListModel | null {\n if (!quotesData) {\n return null;\n }\n\n const transformedModel = {\n items:\n quotesData.items\n ?.filter((quote: any) => quote?.uid)\n .map(transformNegotiableQuoteListEntry) || [],\n pageInfo: {\n currentPage: quotesData.page_info.current_page,\n pageSize: quotesData.page_info.page_size,\n totalPages: quotesData.page_info.total_pages,\n },\n totalCount: quotesData.total_count,\n sortFields: quotesData.sort_fields\n ? {\n default: quotesData.sort_fields.default,\n options: quotesData.sort_fields.options,\n }\n : undefined,\n };\n\n // Calculate pagination info\n const paginationInfo = transformPaginationInfo(transformedModel);\n\n return {\n ...transformedModel,\n paginationInfo: paginationInfo || undefined,\n };\n}\n\nexport function transformPaginationInfo(\n quotesData: NegotiableQuotesListModel | null\n): PaginationInfo | null {\n if (!quotesData?.pageInfo || !quotesData.totalCount) {\n return null;\n }\n\n const { currentPage, pageSize, totalPages } = quotesData.pageInfo;\n const { totalCount } = quotesData;\n\n const startItem = totalCount > 0 ? (currentPage - 1) * pageSize + 1 : 0;\n const endItem = Math.min(currentPage * pageSize, totalCount);\n\n const pageSizeOptions = [20, 30, 50, 100, 200]; // Default page size options\n\n return {\n currentPage,\n totalCount,\n pageSize,\n startItem,\n endItem,\n totalPages,\n pageSizeOptions,\n };\n}\n\n// TODO: Check if admin has this configuration\nexport const getDefaultPageSizeOptions = () => [20, 30, 50, 100, 200];\n\nexport function calculateTotal(data: any[], currency: string) {\n if (!data?.length)\n return {\n value: 0,\n currency,\n };\n\n return data.reduce(\n (acc: any, item: any) => {\n return {\n value: acc.value + item.amount.value,\n currency: item.amount.currency,\n };\n },\n { value: 0, currency }\n );\n}\n\nexport function transformShippingPrices(quote: any) {\n if (!quote || !quote.shipping_addresses?.length) {\n return {};\n }\n\n const shippingAddress = quote.shipping_addresses[0];\n const selectedShippingMethod = shippingAddress.selected_shipping_method;\n\n if (!selectedShippingMethod) {\n return {};\n }\n\n return {\n shippingIncludingTax: selectedShippingMethod.price_incl_tax && {\n value: selectedShippingMethod.price_incl_tax.value,\n currency: selectedShippingMethod.price_incl_tax.currency,\n },\n shippingExcludingTax: selectedShippingMethod.price_excl_tax && {\n value: selectedShippingMethod.price_excl_tax.value,\n currency: selectedShippingMethod.price_excl_tax.currency,\n },\n };\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport {\n NegotiableQuoteTemplateModel,\n NegotiableQuoteTemplatesListModel,\n NegotiableQuoteTemplateStatus,\n} from '../models/negotiable-quote-template-model';\nimport { transformPaginationInfo } from './transform-quote';\nimport { transformHistory } from './transform-history';\nimport { transformQuoteItems } from './transform-quote-items';\n\nexport function transformQuoteTemplate(\n templateData: any\n): NegotiableQuoteTemplateModel | null {\n if (!templateData) {\n return null;\n }\n\n return {\n id: templateData.template_id,\n uid: templateData.uid,\n name: templateData.name,\n createdAt: templateData.created_at,\n updatedAt: templateData.updated_at,\n expirationDate: templateData.expiration_date,\n status: templateData.status,\n salesRepName: templateData.sales_rep_name,\n buyer: {\n firstname: templateData.buyer.firstname,\n lastname: templateData.buyer.lastname,\n },\n comments: templateData.comments?.map((comment: any) => ({\n uid: comment.uid,\n createdAt: comment.created_at,\n author: {\n firstname: comment.author.firstname,\n lastname: comment.author.lastname,\n },\n text: comment.text,\n attachments: comment.attachments?.map((a: any) => ({\n name: a.name,\n url: a.url,\n })),\n })),\n prices: templateData.prices && {\n subtotalExcludingTax: templateData.prices.subtotal_excluding_tax && {\n value: templateData.prices.subtotal_excluding_tax.value,\n currency: templateData.prices.subtotal_excluding_tax.currency,\n },\n subtotalIncludingTax: templateData.prices.subtotal_including_tax && {\n value: templateData.prices.subtotal_including_tax.value,\n currency: templateData.prices.subtotal_including_tax.currency,\n },\n subtotalWithDiscountExcludingTax: templateData.prices\n .subtotal_with_discount_excluding_tax && {\n value: templateData.prices.subtotal_with_discount_excluding_tax.value,\n currency:\n templateData.prices.subtotal_with_discount_excluding_tax.currency,\n },\n appliedTaxes: templateData.prices.applied_taxes?.map((tax: any) => ({\n amount: { value: tax.amount.value, currency: tax.amount.currency },\n label: tax.label,\n })),\n grandTotal: templateData.prices.grand_total && {\n value: templateData.prices.grand_total.value,\n currency: templateData.prices.grand_total.currency,\n },\n },\n history: transformHistory(templateData.history),\n items: transformQuoteItems(templateData.items),\n shippingAddresses: templateData.shipping_addresses?.map((address: any) => ({\n uid: address.uid,\n firstname: address.firstname,\n lastname: address.lastname,\n company: address.company,\n street: address.street,\n city: address.city,\n postcode: address.postcode,\n country: {\n code: address.country.code,\n label: address.country.label,\n },\n telephone: address.telephone,\n region: address.region\n ? {\n code: address.region.code,\n label: address.region.label,\n regionId: address.region.region_id,\n }\n : undefined,\n })),\n referenceDocuments: templateData.reference_document_links?.map((doc: any) => ({\n uid: doc.link_id,\n name: doc.document_name,\n identifier: doc.document_identifier,\n url: doc.reference_document_url,\n })),\n // Calculate permissions based on status\n canAccept: [\n NegotiableQuoteTemplateStatus.SUBMITTED,\n NegotiableQuoteTemplateStatus.PENDING,\n NegotiableQuoteTemplateStatus.OPEN,\n ].includes(templateData.status),\n canDelete: templateData.status === NegotiableQuoteTemplateStatus.DRAFT,\n canReopen: [\n NegotiableQuoteTemplateStatus.DECLINED,\n NegotiableQuoteTemplateStatus.CANCELED,\n NegotiableQuoteTemplateStatus.EXPIRED,\n ].includes(templateData.status),\n canCancel: [\n NegotiableQuoteTemplateStatus.SUBMITTED,\n NegotiableQuoteTemplateStatus.PENDING,\n NegotiableQuoteTemplateStatus.OPEN,\n NegotiableQuoteTemplateStatus.ACTIVE,\n NegotiableQuoteTemplateStatus.EDITED,\n ].includes(templateData.status),\n canSendForReview: [\n NegotiableQuoteTemplateStatus.OPEN,\n NegotiableQuoteTemplateStatus.DRAFT,\n NegotiableQuoteTemplateStatus.NEW,\n NegotiableQuoteTemplateStatus.EDITED,\n ].includes(templateData.status),\n canGenerateQuoteFromTemplate: [\n NegotiableQuoteTemplateStatus.ACTIVE,\n ].includes(templateData.status),\n canEditTemplateItems: [\n NegotiableQuoteTemplateStatus.SUBMITTED,\n NegotiableQuoteTemplateStatus.DRAFT,\n NegotiableQuoteTemplateStatus.OPEN,\n NegotiableQuoteTemplateStatus.EDITED,\n ].includes(templateData.status),\n };\n}\n\nexport function transformQuoteTemplatesList(\n templatesData: any\n): NegotiableQuoteTemplatesListModel | null {\n if (!templatesData) {\n return null;\n }\n\n const transformedModel = {\n items:\n templatesData.items?.map((template: any) => ({\n id: template.template_id,\n uid: template.uid,\n name: template.name,\n createdAt: template.created_at,\n updatedAt: template.updated_at,\n status: template.status,\n state: template.state,\n prices: {\n grandTotal: template.prices?.grand_total\n ? {\n value: template.prices.grand_total.value,\n currency: template.prices.grand_total.currency,\n }\n : {\n value: 0,\n currency: 'USD',\n },\n minNegotiatedGrandTotal: {\n value: template.min_negotiated_grand_total,\n currency: template.prices?.grand_total?.currency || 'USD',\n },\n },\n lastSharedAt: template.last_shared_at,\n lastOrderedAt: template.last_ordered_at,\n expirationDate: template.expiration_date,\n ordersPlaced: template.orders_placed,\n canGenerateQuoteFromTemplate: [\n NegotiableQuoteTemplateStatus.ACTIVE,\n ].includes(template.status),\n })) || [],\n pageInfo: {\n currentPage: templatesData.page_info.current_page,\n pageSize: templatesData.page_info.page_size,\n totalPages: templatesData.page_info.total_pages,\n },\n totalCount: templatesData.total_count,\n sortFields: templatesData.sort_fields\n ? {\n default: templatesData.sort_fields.default,\n options: templatesData.sort_fields.options,\n }\n : undefined,\n };\n\n // Calculate pagination info\n const paginationInfo = transformPaginationInfo(transformedModel);\n\n return {\n ...transformedModel,\n paginationInfo: paginationInfo || undefined,\n };\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { REQUEST_NEGOTIABLE_QUOTE_MUTATION } from './graphql/RequestNegotiableQuoteMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface RequestNegotiableQuoteInput {\n cartId: string;\n quoteName: string;\n comment: string;\n isDraft?: boolean;\n attachments?: { key: string }[];\n}\n\nexport const requestNegotiableQuote = async (\n input: RequestNegotiableQuoteInput\n): Promise<NegotiableQuoteModel | null> => {\n const { cartId, quoteName, comment, attachments, isDraft } = input;\n\n if (!cartId) {\n throw new Error('Cart ID is required');\n }\n\n if (!quoteName) {\n throw new Error('Quote name is required');\n }\n\n if (!comment) {\n throw new Error('Comment is required');\n }\n\n return fetchGraphQl(REQUEST_NEGOTIABLE_QUOTE_MUTATION, {\n variables: {\n cartId,\n quoteName,\n comment: attachments?.length ? { comment, attachments } : { comment },\n isDraft,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to request negotiable quote: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(response.data?.requestNegotiableQuote?.quote);\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/negotiable-quote-requested', {\n quote: quoteData,\n input: { cartId, quoteName, comment, attachments, isDraft },\n });\n\n return quoteData;\n });\n};\n","import { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const QUOTE_DATA_QUERY = `\n query QUOTE_DATA_QUERY(\n $quoteId: ID!\n ) {\n negotiableQuote(\n uid: $quoteId\n ) {\n ...NegotiableQuoteFragment\n }\n }\n\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api/';\nimport { QUOTE_DATA_QUERY } from './graphql/QuoteDataQuery';\nimport { transformQuote } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const getQuoteData = async (quoteId: string) => { \n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n if (!state.permissions.editQuote) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n try {\n const results: any = await fetchGraphQl(QUOTE_DATA_QUERY, {\n variables: {\n quoteId\n }\n });\n\n const transformedQuote = transformQuote(results?.data?.negotiableQuote);\n\n if (!transformedQuote) {\n throw new Error('Failed to transform quote data');\n }\n\n events.emit('quote-management/quote-data', {\n quote: transformedQuote,\n permissions: state.permissions,\n });\n \n return transformedQuote;\n } catch (error) {\n return Promise.reject(error);\n }\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const NEGOTIABLE_QUOTE_LIST_FRAGMENT = /* GraphQL */ `\n fragment NegotiableQuoteListFragment on NegotiableQuote {\n uid\n name\n created_at\n updated_at\n status\n buyer {\n firstname\n lastname\n }\n template_name\n prices {\n grand_total {\n value\n currency\n }\n }\n history {\n change_type\n changes {\n statuses {\n changes {\n new_status\n old_status\n }\n }\n }\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const SEARCH_RESULT_PAGE_INFO_FRAGMENT = /* GraphQL */ `\n fragment SearchResultPageInfoFragment on SearchResultPageInfo {\n current_page\n page_size\n total_pages\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const SORT_FIELDS_FRAGMENT = /* GraphQL */ `\n fragment SortFieldsFragment on SortFields {\n default\n options {\n label\n value\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_LIST_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteListFragment';\nimport { SEARCH_RESULT_PAGE_INFO_FRAGMENT } from '@/quote-management/api/graphql/SearchResultPageInfoFragment';\nimport { SORT_FIELDS_FRAGMENT } from '@/quote-management/api/graphql/SortFieldsFragment';\n\nexport const NEGOTIABLE_QUOTES_QUERY = /* GraphQL */ `\n query negotiableQuotes(\n $filter: NegotiableQuoteFilterInput\n $pageSize: Int\n $currentPage: Int\n $sort: NegotiableQuoteSortInput\n ) {\n negotiableQuotes(\n filter: $filter\n pageSize: $pageSize\n currentPage: $currentPage\n sort: $sort\n ) {\n items {\n ...NegotiableQuoteListFragment\n }\n page_info {\n ...SearchResultPageInfoFragment\n }\n sort_fields {\n ...SortFieldsFragment\n }\n total_count\n }\n }\n\n ${NEGOTIABLE_QUOTE_LIST_FRAGMENT}\n ${SEARCH_RESULT_PAGE_INFO_FRAGMENT}\n ${SORT_FIELDS_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { NEGOTIABLE_QUOTES_QUERY } from './graphql/NegotiableQuotesQuery';\nimport { transformNegotiableQuotesList } from '@/quote-management/data/transforms';\nimport { NegotiableQuotesListModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { state } from '@/quote-management/lib/state';\n\nexport enum FilterMatchTypeEnum {\n FULL = 'FULL',\n PARTIAL = 'PARTIAL',\n}\n\nexport interface FilterEqualTypeInput {\n eq?: string;\n in?: string[];\n}\n\nexport interface FilterMatchTypeInput {\n match?: string;\n match_type?: FilterMatchTypeEnum;\n}\n\nexport interface NegotiableQuoteFilterInput {\n ids?: FilterEqualTypeInput;\n name?: FilterMatchTypeInput;\n}\n\nexport enum SortEnum {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport enum NegotiableQuoteSortableField {\n QUOTE_NAME = 'QUOTE_NAME',\n CREATED_AT = 'CREATED_AT',\n UPDATED_AT = 'UPDATED_AT',\n}\n\nexport interface NegotiableQuoteSortInput {\n sort_direction: SortEnum;\n sort_field: NegotiableQuoteSortableField;\n}\n\nexport interface NegotiableQuotesParams {\n filter?: NegotiableQuoteFilterInput;\n pageSize?: number;\n currentPage?: number;\n sort?: NegotiableQuoteSortInput;\n}\n\nexport const negotiableQuotes = async (\n params: NegotiableQuotesParams = {}\n): Promise<NegotiableQuotesListModel> => {\n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n const variables = {\n filter: params.filter || null,\n pageSize: params.pageSize || 20,\n currentPage: params.currentPage || 1,\n sort: params.sort || null,\n };\n\n try {\n const results: any = await fetchGraphQl(NEGOTIABLE_QUOTES_QUERY, {\n variables,\n });\n\n if (!results?.data?.negotiableQuotes) {\n throw new Error('No quotes data received');\n }\n\n const transformedData = transformNegotiableQuotesList(\n results.data.negotiableQuotes\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quotes data');\n }\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const STORE_CONFIG_QUERY = /* GraphQL */ `\n query STORE_CONFIG_QUERY {\n storeConfig {\n cart_summary_display_quantity\n max_items_in_order_summary\n shopping_cart_display_full_summary\n shopping_cart_display_grand_total\n shopping_cart_display_price\n shopping_cart_display_shipping\n shopping_cart_display_subtotal\n shopping_cart_display_zero_tax\n configurable_thumbnail_source\n quote_minimum_amount\n quote_minimum_amount_message\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { StoreConfigModel } from '@/quote-management/data/models';\nimport { transformStoreConfig } from '@/quote-management/data/transforms';\nimport { STORE_CONFIG_QUERY } from './graphql/StoreConfigQuery';\n\nexport const getStoreConfig = async (): Promise<StoreConfigModel> => {\n return fetchGraphQl(STORE_CONFIG_QUERY, {\n method: 'GET',\n cache: 'force-cache',\n }).then(({ errors, data }) => {\n if (errors) {\n const errorMessage = errors.map((e: any) => e.message).join(', ');\n throw new Error(`Failed to get store config: ${errorMessage}`);\n }\n\n return transformStoreConfig(data.storeConfig);\n });\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const DELETE_QUOTE_MUTATION = `\n mutation DELETE_QUOTE_MUTATION($quoteUids: [ID!]!) {\n deleteNegotiableQuotes(\n input: {\n quote_uids: $quoteUids\n }\n ) {\n result_status\n operation_results {\n __typename\n ... on NegotiableQuoteUidOperationSuccess {\n quote_uid\n }\n ... on DeleteNegotiableQuoteOperationFailure {\n quote_uid\n errors {\n __typename\n ... on ErrorInterface {\n message\n }\n ... on NoSuchEntityUidError {\n uid\n message\n }\n ... on NegotiableQuoteInvalidStateError {\n message\n }\n }\n }\n }\n }\n }\n`;\n\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n \nimport { fetchGraphQl } from '@/quote-management/api';\nimport { state } from '@/quote-management/lib/state';\nimport { DELETE_QUOTE_MUTATION } from '@/quote-management/api/deleteQuote/graphql/DeleteQuoteMutation';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface DeleteQuoteSuccessResult {\n __typename: 'NegotiableQuoteUidOperationSuccess';\n quoteUid: string;\n}\n\nexport interface DeleteQuoteFailureError {\n __typename: string;\n message?: string;\n uid?: string;\n}\n\nexport interface DeleteQuoteFailureResult {\n __typename: 'DeleteNegotiableQuoteOperationFailure';\n quoteUid: string;\n errors: DeleteQuoteFailureError[];\n}\n\nexport interface DeleteQuoteOutput {\n resultStatus: string;\n operationResults: Array<DeleteQuoteSuccessResult | DeleteQuoteFailureResult>;\n}\n\nexport const deleteQuote = async ( quoteUids: string[] | string ): Promise<DeleteQuoteOutput> => {\n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n const quoteUidsArray = Array.isArray(quoteUids) ? quoteUids : [quoteUids];\n\n try {\n const response: any = await fetchGraphQl(DELETE_QUOTE_MUTATION, {\n variables: {\n quoteUids: quoteUidsArray,\n },\n });\n\n const { errors } = response || {};\n if (errors && errors.length) {\n const errorMessages = errors.map((e: any) => e?.message).filter(Boolean).join('; ');\n throw new Error(errorMessages || 'Failed to delete negotiable quotes');\n }\n\n const raw = response?.data?.deleteNegotiableQuotes;\n if (!raw) {\n throw new Error('No delete result returned');\n }\n\n const transformed: DeleteQuoteOutput = {\n resultStatus: raw.result_status,\n operationResults: (raw.operation_results || []).map((result: any) => {\n const typename = result?.__typename;\n if (typename === 'NegotiableQuoteUidOperationSuccess') {\n const success: DeleteQuoteSuccessResult = {\n __typename: 'NegotiableQuoteUidOperationSuccess',\n quoteUid: result?.quote_uid,\n };\n return success;\n }\n const failure: DeleteQuoteFailureResult = {\n __typename: 'DeleteNegotiableQuoteOperationFailure',\n quoteUid: result?.quote_uid,\n errors: (result?.errors || []).map((err: any) => ({\n __typename: err?.__typename,\n message: err?.message,\n uid: err?.uid,\n })),\n };\n return failure;\n }),\n };\n\n // Emit event with successfully deleted quote UIDs\n const deletedUids = transformed.operationResults\n .filter((res) => res.__typename === 'NegotiableQuoteUidOperationSuccess')\n .map((res) => (res as DeleteQuoteSuccessResult).quoteUid);\n\n if (deletedUids.length > 0) {\n events.emit('quote-management/negotiable-quote-deleted', {\n deletedQuoteUids: deletedUids,\n resultStatus: transformed.resultStatus,\n });\n }\n\n return transformed;\n } catch (error) {\n // Emit error event for integration layer\n events.emit('quote-management/negotiable-quote-delete-error', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptedQuoteUids: quoteUidsArray,\n });\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION = `\n mutation SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION(\n $quoteUid: ID!\n $addressId: ID\n $addressData: NegotiableQuoteAddressInput\n ) {\n setNegotiableQuoteShippingAddress(\n input: {\n quote_uid: $quoteUid\n shipping_addresses: {\n customer_address_uid: $addressId\n address: $addressData\n }\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION } from './graphql/SetNegotiableQuoteShippingAddressMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface AddressInput {\n /** City name */\n city: string;\n /** Optional company name */\n company?: string;\n /** Two-letter country code (e.g., 'US') */\n countryCode: string;\n /** First name */\n firstname: string;\n /** Last name */\n lastname: string;\n /** Postal/ZIP code */\n postcode: string;\n /** Optional state/province name */\n region?: string;\n /** Optional state/province ID */\n regionId?: number;\n /** Whether to save this address to the customer's address book */\n saveInAddressBook?: boolean;\n /** Street address lines (array) */\n street: string[];\n /** Phone number */\n telephone: string;\n /** \n * Additional input (optional custom fields for the address).\n * These fields will be merged into the address data sent to GraphQL.\n * Standard fields take precedence over additional fields to prevent\n * accidental override of required address attributes.\n * \n * @example\n * ```ts\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute: 'value',\n * delivery_instructions: 'Leave at door'\n * }\n * ```\n */\n additionalInput?: Record<string, any>;\n}\n\nexport interface SetShippingAddressInput {\n /** The unique ID of the negotiable quote */\n quoteUid: string;\n /** The ID of a saved customer address (use this OR addressData, not both) */\n addressId?: number;\n /** New address data (use this OR addressId, not both) */\n addressData?: AddressInput;\n}\n\n/**\n * Transform camelCase address data to snake_case for GraphQL mutation.\n * Additional fields from additionalInput are spread into the result, with\n * standard fields taking precedence (defensive flexibility approach).\n */\nfunction transformAddressToSnakeCase(address: AddressInput) {\n const { additionalInput, ...standardFields } = address;\n \n // Build the standard transformed fields\n const transformedStandardFields = {\n city: standardFields.city,\n company: standardFields.company,\n country_code: standardFields.countryCode,\n firstname: standardFields.firstname,\n lastname: standardFields.lastname,\n postcode: standardFields.postcode,\n region: standardFields.region,\n region_id: standardFields.regionId,\n save_in_address_book: standardFields.saveInAddressBook,\n street: standardFields.street,\n telephone: standardFields.telephone,\n };\n \n // Spread additional input first, then standard fields take precedence\n // This provides defensive flexibility: allows custom fields while protecting core fields\n return {\n ...(additionalInput || {}),\n ...transformedStandardFields,\n };\n}\n\n/**\n * Sets or updates the shipping address for a negotiable quote.\n * \n * @param input - The input parameters for setting the shipping address\n * @param input.quoteUid - The unique ID of the negotiable quote\n * @param input.addressId - Optional ID of a saved customer address (use this OR addressData)\n * @param input.addressData - Optional new address data (use this OR addressId)\n * @param input.addressData.additionalInput - Optional additional address fields to pass through to GraphQL\n * @returns Promise that resolves to the updated quote model with shipping addresses including uid field\n * @throws Error if validation fails or GraphQL operation fails\n * \n * @example\n * ```ts\n * // Using a saved address\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressId: 5\n * });\n * \n * // Using new address data\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234'\n * }\n * });\n * \n * // Using address data with additional custom fields\n * const quote = await setShippingAddress({\n * quoteUid: 'quote-123',\n * addressData: {\n * firstname: 'John',\n * lastname: 'Doe',\n * street: ['123 Main St'],\n * city: 'San Francisco',\n * countryCode: 'US',\n * postcode: '94103',\n * telephone: '555-1234',\n * additionalInput: {\n * vat_id: 'GB123456789',\n * custom_attribute_1: 'value1',\n * delivery_instructions: 'Leave at door'\n * }\n * }\n * });\n * \n * // Access address identifier\n * if (quote?.shippingAddresses?.[0]) {\n * console.log('Address UID:', quote.shippingAddresses[0].uid);\n * }\n * ```\n */\nexport const setShippingAddress = async (\n input: SetShippingAddressInput\n): Promise<NegotiableQuoteModel | null> => {\n const { quoteUid, addressId, addressData } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n // Validate that exactly one of addressId or addressData is provided\n if (addressId === undefined && !addressData) {\n throw new Error('Either addressId or addressData must be provided');\n }\n\n if (addressId !== undefined && addressData) {\n throw new Error('Cannot provide both addressId and addressData');\n }\n\n // Transform addressData to snake_case if provided\n const transformedAddressData = addressData\n ? transformAddressToSnakeCase(addressData)\n : null;\n\n return fetchGraphQl(SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION, {\n variables: {\n quoteUid,\n addressId: addressId || null,\n addressData: transformedAddressData,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to set shipping address: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.setNegotiableQuoteShippingAddress?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/shipping-address-set', {\n quote: quoteData,\n input: { quoteUid, addressId, addressData },\n });\n\n return quoteData;\n });\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const SEND_NEGOTIABLE_QUOTE_FOR_REVIEW_MUTATION = `\n mutation SEND_NEGOTIABLE_QUOTE_FOR_REVIEW_MUTATION(\n $quoteUid: ID!\n $comment: NegotiableQuoteCommentInput\n ) {\n sendNegotiableQuoteForReview(\n input: {\n quote_uid: $quoteUid\n comment: $comment\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SEND_NEGOTIABLE_QUOTE_FOR_REVIEW_MUTATION } from './graphql/SendNegotiableQuoteForReviewMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface SendForReviewInput {\n quoteUid: string;\n comment?: string;\n attachments?: { key: string }[];\n}\n\nexport const sendForReview = async (\n input: SendForReviewInput\n): Promise<NegotiableQuoteModel | null> => {\n const { quoteUid, comment, attachments } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n // Build the comment object with attachments if provided\n const commentInput = attachments?.length \n ? { comment: comment || '', attachments } \n : comment \n ? { comment } \n : null;\n\n return fetchGraphQl(SEND_NEGOTIABLE_QUOTE_FOR_REVIEW_MUTATION, {\n variables: {\n quoteUid,\n comment: commentInput,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to send quote for review: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.sendNegotiableQuoteForReview?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/quote-sent-for-review', {\n quote: quoteData,\n input: { quoteUid, comment, attachments },\n });\n\n return quoteData;\n });\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const INITIATE_UPLOAD_MUTATION = `\n mutation INITIATE_UPLOAD_MUTATION($input: initiateUploadInput!) {\n initiateUpload(input: $input) {\n upload_url\n key\n expires_at\n }\n }\n`;","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nexport const FINISH_UPLOAD_MUTATION = `\n mutation FINISH_UPLOAD_MUTATION($input: finishUploadInput!) {\n finishUpload(input: $input) {\n success\n key\n message\n }\n }\n`;","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { INITIATE_UPLOAD_MUTATION } from '@/quote-management/api/uploadFile/graphql/InitiateUploadMutation';\nimport { FINISH_UPLOAD_MUTATION } from '@/quote-management/api/uploadFile/graphql/FinishUploadMutation';\n\ntype GraphQLError = { message: string };\ntype InitiateUploadData = {\n initiateUpload?: {\n upload_url: string;\n key: string;\n expires_at: string;\n };\n};\ntype FinishUploadData = {\n finishUpload?: {\n success: boolean;\n key: string;\n message?: string;\n };\n};\ntype GraphQLResponse<T> = {\n data?: T;\n errors?: GraphQLError[];\n};\n\nexport const uploadFile = async (file: File): Promise<{ key: string }> => {\n const mediaResourceType = 'NEGOTIABLE_QUOTE_ATTACHMENT';\n\n try {\n const filename = file?.name;\n if (!file || !filename) throw new Error('Invalid file');\n\n const formatGraphQLErrors = (errors: GraphQLError[]): string =>\n errors.map((e) => e.message).join('; ');\n\n const { data: initialData, errors: initialErrors } = (await fetchGraphQl(\n INITIATE_UPLOAD_MUTATION,\n { \n variables: { input: { key: filename, media_resource_type: mediaResourceType } } \n }\n )) as GraphQLResponse<InitiateUploadData>;\n if (initialErrors && initialErrors.length) throw new Error(formatGraphQLErrors(initialErrors));\n\n const { upload_url, key } = initialData?.initiateUpload || {};\n if (!upload_url || !key) throw new Error('Failed to initiate upload');\n\n const put = await fetch(upload_url, { method: 'PUT', body: file });\n if (!put.ok) throw new Error(`Upload failed: ${put.status} ${put.statusText}`);\n\n const { data: finishData, errors: finishErrors } = (await fetchGraphQl(\n FINISH_UPLOAD_MUTATION,\n { \n variables: { input: { key, media_resource_type: mediaResourceType } } \n }\n )) as GraphQLResponse<FinishUploadData>;\n if (finishErrors && finishErrors.length) throw new Error(formatGraphQLErrors(finishErrors));\n\n const { success, key: finalizedKey, message } = finishData?.finishUpload || {};\n if (!success || !finalizedKey) throw new Error(message || 'Failed to finish upload');\n\n return { key: finalizedKey };\n \n } catch (err: any) {\n events.emit('quote-management/file-upload-error', {\n error: err?.message || 'File upload failed',\n fileName: file?.name,\n });\n throw err instanceof Error ? err : new Error('File upload failed');\n }\n};\n","export const CLOSE_NEGOTIABLE_QUOTE_MUTATION = `\n mutation CLOSE_NEGOTIABLE_QUOTE_MUTATION(\n $quoteUids: [ID!]!\n ) {\n closeNegotiableQuotes(input: { quote_uids: $quoteUids }) {\n result_status\n operation_results {\n ... on NegotiableQuoteUidOperationSuccess {\n __typename\n quote_uid\n }\n ... on CloseNegotiableQuoteOperationFailure {\n __typename\n quote_uid\n errors {\n __typename\n ... on ErrorInterface {\n message\n }\n ... on NoSuchEntityUidError {\n uid\n }\n ... on NegotiableQuoteInvalidStateError {\n message\n }\n }\n }\n }\n }\n }\n`;","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\nimport { CLOSE_NEGOTIABLE_QUOTE_MUTATION } from './graphql/CloseNegotiableQuoteMutation';\n\nexport interface CloseNegotiableQuoteInput {\n quoteUids: string[];\n}\n\nexport interface CloseNegotiableQuoteSuccessResult {\n __typename: 'NegotiableQuoteUidOperationSuccess';\n quoteUid: string;\n}\n\nexport interface CloseNegotiableQuoteFailureError {\n __typename: string;\n message?: string;\n uid?: string;\n}\n\nexport interface CloseNegotiableQuoteFailureResult {\n __typename: 'CloseNegotiableQuoteOperationFailure';\n quoteUid: string;\n errors: CloseNegotiableQuoteFailureError[];\n}\n\nexport interface CloseNegotiableQuoteResult {\n resultStatus: string;\n operationResults: Array<CloseNegotiableQuoteSuccessResult | CloseNegotiableQuoteFailureResult>;\n}\n\nexport const closeNegotiableQuote = async (input: CloseNegotiableQuoteInput): Promise<CloseNegotiableQuoteResult> => { \n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n const { quoteUids } = input;\n\n if (!quoteUids || quoteUids.length === 0) {\n throw new Error('Quote UIDs are required');\n }\n\n try {\n const response: any = await fetchGraphQl(CLOSE_NEGOTIABLE_QUOTE_MUTATION, {\n variables: {\n quoteUids,\n },\n });\n\n const { errors } = response || {};\n if (errors && errors.length) {\n const errorMessages = errors\n .map((e: any) => e?.message)\n .filter(Boolean)\n .join('; ');\n throw new Error(errorMessages || 'Failed to close negotiable quotes');\n }\n\n const raw = response?.data?.closeNegotiableQuotes;\n if (!raw) {\n throw new Error('No close result returned');\n }\n\n const transformed: CloseNegotiableQuoteResult = {\n resultStatus: raw.result_status,\n operationResults: (raw.operation_results || []).map((result: any) => {\n const typename = result?.__typename;\n if (typename === 'NegotiableQuoteUidOperationSuccess') {\n const success: CloseNegotiableQuoteSuccessResult = {\n __typename: 'NegotiableQuoteUidOperationSuccess',\n quoteUid: result?.quote_uid,\n };\n return success;\n }\n const failure: CloseNegotiableQuoteFailureResult = {\n __typename: 'CloseNegotiableQuoteOperationFailure',\n quoteUid: result?.quote_uid,\n errors: (result?.errors || []).map((err: any) => ({\n __typename: err?.__typename,\n message: err?.message,\n uid: err?.uid,\n })),\n };\n return failure;\n }),\n };\n\n // Check for operation failures\n const failures = transformed.operationResults\n .filter(\n (res) => res.__typename === 'CloseNegotiableQuoteOperationFailure'\n )\n .map((res) => res as CloseNegotiableQuoteFailureResult);\n\n if (failures.length > 0) {\n // Create error message from failures\n const failureMessages = failures\n .map((failure) => {\n if (failure.errors && failure.errors.length > 0) {\n return failure.errors\n .map(\n (err) =>\n err.message || `Failed to close quote ${failure.quoteUid}`\n )\n .join(', ');\n }\n return `Failed to close quote ${failure.quoteUid}`;\n })\n .join('; ');\n\n throw new Error(failureMessages);\n }\n\n // Emit success event with closed quote UIDs\n const closedUids = transformed.operationResults\n .filter((res) => res.__typename === 'NegotiableQuoteUidOperationSuccess')\n .map((res) => (res as CloseNegotiableQuoteSuccessResult).quoteUid);\n\n if (closedUids.length > 0) {\n events.emit('quote-management/negotiable-quote-closed', {\n closedQuoteUids: closedUids,\n resultStatus: transformed.resultStatus,\n });\n }\n\n return transformed;\n } catch (error) {\n // Emit error event for integration layer\n events.emit('quote-management/negotiable-quote-close-error', {\n error: error instanceof Error ? error : new Error(String(error)),\n attemptedQuoteUids: quoteUids,\n });\n return Promise.reject(error);\n }\n}\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT = /* GraphQL */ `\n fragment NegotiableQuoteTemplateFragment on NegotiableQuoteTemplate {\n uid\n template_id\n name\n created_at\n updated_at\n status\n sales_rep_name\n expiration_date\n buyer {\n firstname\n lastname\n }\n comments {\n uid\n created_at\n author {\n firstname\n lastname\n }\n text\n attachments {\n name\n url\n }\n }\n items {\n __typename\n uid\n product {\n name\n sku\n uid\n stock_status\n quantity\n thumbnail {\n label\n url\n }\n price_range {\n minimum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n maximum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n }\n price_tiers {\n quantity\n final_price {\n value\n }\n discount {\n amount_off\n percent_off\n }\n }\n }\n prices {\n price {\n currency\n value\n }\n price_including_tax {\n value\n currency\n }\n original_item_price {\n currency\n value\n }\n original_row_total {\n currency\n value\n }\n row_total {\n currency\n value\n }\n row_total_including_tax {\n value\n currency\n }\n catalog_discount {\n amount_off\n percent_off\n }\n row_catalog_discount {\n amount_off\n percent_off\n }\n discounts {\n label\n value\n amount {\n currency\n value\n }\n }\n }\n quantity\n is_available\n note_from_buyer {\n created_at\n creator_id\n creator_type\n negotiable_quote_item_uid\n note\n note_uid\n __typename\n }\n note_from_seller {\n created_at\n creator_id\n creator_type\n negotiable_quote_item_uid\n note\n note_uid\n __typename\n }\n ... on SimpleCartItem {\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n ... on ConfigurableCartItem {\n configurable_options {\n option_label\n value_label\n }\n configured_variant {\n uid\n sku\n stock_status\n thumbnail {\n label\n url\n }\n price_range {\n minimum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n maximum_price {\n regular_price {\n value\n currency\n }\n final_price {\n value\n currency\n }\n discount {\n percent_off\n amount_off\n }\n }\n }\n price_tiers {\n quantity\n final_price {\n value\n }\n discount {\n amount_off\n percent_off\n }\n }\n }\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n ... on BundleCartItem {\n bundle_options {\n label\n values {\n label\n quantity\n original_price {\n currency\n value\n }\n priceV2 {\n currency\n value\n }\n }\n }\n }\n ... on DownloadableCartItem {\n links {\n sort_order\n title\n }\n customizable_options {\n type\n label\n values {\n label\n value\n }\n }\n }\n }\n history {\n uid\n created_at\n author {\n firstname\n lastname\n }\n change_type\n changes {\n comment_added {\n comment\n }\n custom_changes {\n new_value\n old_value\n title\n }\n statuses {\n changes {\n new_status\n old_status\n }\n }\n expiration {\n new_expiration\n old_expiration\n }\n total {\n new_price {\n currency\n value\n }\n old_price {\n currency\n value\n }\n }\n }\n }\n prices {\n subtotal_excluding_tax {\n currency\n value\n }\n subtotal_including_tax {\n currency\n value\n }\n subtotal_with_discount_excluding_tax {\n currency\n value\n }\n applied_taxes {\n amount {\n currency\n value\n }\n label\n }\n grand_total {\n currency\n value\n }\n }\n shipping_addresses {\n uid\n firstname\n lastname\n company\n street\n city\n region {\n code\n label\n region_id\n }\n postcode\n country {\n code\n label\n }\n telephone\n }\n reference_document_links {\n link_id\n document_name\n document_identifier\n reference_document_url\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const GET_QUOTE_TEMPLATE_DATA = /* GraphQL */ `\n query QUOTE_TEMPLATE_DATA_QUERY($templateId: ID!) {\n negotiableQuoteTemplate(templateId: $templateId) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { GET_QUOTE_TEMPLATE_DATA } from './graphql/getQuoteTemplateData';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport const getQuoteTemplateData = async (templateId: string): Promise<NegotiableQuoteTemplateModel | null> => {\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n if (!templateId) {\n throw new Error('Template ID is required');\n }\n\n try {\n const results: any = await fetchGraphQl(GET_QUOTE_TEMPLATE_DATA, {\n variables: { templateId },\n });\n\n\n if (!results?.data?.negotiableQuoteTemplate) {\n throw new Error('Quote template not found');\n }\n\n const transformedData = transformQuoteTemplate(results.data.negotiableQuoteTemplate);\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from \"../../graphql/NegotiableQuoteTemplateFragment\";\n\nexport const CREATE_QUOTE_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation CREATE_QUOTE_TEMPLATE_MUTATION($cartId: ID!) {\n requestNegotiableQuoteTemplateFromQuote(input: { cart_id: $cartId }) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { events } from '@adobe-commerce/event-bus';\nimport { fetchGraphQl } from '@/quote-management/api/';\nimport { CREATE_QUOTE_TEMPLATE_MUTATION } from './graphql/createQuoteTemplate';\nimport { state } from '@/quote-management/lib/state';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\n\nexport const createQuoteTemplate = async (\n quoteId: string\n): Promise<NegotiableQuoteTemplateModel | null> => {\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n if (!quoteId) {\n throw new Error('Cart ID is required');\n }\n\n try {\n const results: any = await fetchGraphQl(CREATE_QUOTE_TEMPLATE_MUTATION, {\n variables: {\n cartId: quoteId,\n },\n });\n\n if (!results?.data?.requestNegotiableQuoteTemplateFromQuote) {\n throw new Error('Failed to create quote template');\n }\n\n const transformedQuoteTemplate = transformQuoteTemplate(\n results.data.requestNegotiableQuoteTemplateFromQuote\n );\n\n if (!transformedQuoteTemplate) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedQuoteTemplate,\n permissions: state.permissions,\n });\n\n return transformedQuoteTemplate;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const QUOTE_TEMPLATES_QUERY = /* GraphQL */ `\n query QUOTE_TEMPLATES_QUERY(\n $filter: NegotiableQuoteTemplateFilterInput\n $pageSize: Int\n $currentPage: Int\n $sort: NegotiableQuoteTemplateSortInput\n ) {\n negotiableQuoteTemplates(\n filter: $filter\n pageSize: $pageSize\n currentPage: $currentPage\n sort: $sort\n ) {\n items {\n uid\n template_id\n name\n created_at\n updated_at\n last_ordered_at\n status\n state\n min_negotiated_grand_total\n last_shared_at\n expiration_date\n orders_placed\n prices {\n grand_total {\n currency\n value\n }\n }\n }\n page_info {\n current_page\n page_size\n total_pages\n }\n total_count\n sort_fields {\n default\n options {\n label\n value\n }\n }\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { QUOTE_TEMPLATES_QUERY } from './graphql/getQuoteTemplates';\nimport { transformQuoteTemplatesList } from '@/quote-management/data/transforms';\nimport { NegotiableQuoteTemplatesListModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport enum QuoteTemplateFilterStatus {\n ACTIVE = 'ACTIVE',\n IN_REVIEW = 'IN_REVIEW',\n INACTIVE = 'INACTIVE',\n}\n\nexport interface QuoteTemplateFilterInput {\n status?: QuoteTemplateFilterStatus[];\n name?: {\n match?: string;\n };\n}\n\nexport enum QuoteTemplateSortField {\n NAME = 'NAME',\n CREATED_AT = 'CREATED_AT',\n UPDATED_AT = 'UPDATED_AT',\n}\n\nexport enum SortDirection {\n ASC = 'ASC',\n DESC = 'DESC',\n}\n\nexport interface QuoteTemplateSortInput {\n sortField: QuoteTemplateSortField;\n sortDirection: SortDirection;\n}\n\nexport interface GetQuoteTemplatesParams {\n filter?: QuoteTemplateFilterInput;\n pageSize?: number;\n currentPage?: number;\n sort?: QuoteTemplateSortInput;\n}\n\nexport const getQuoteTemplates = async (\n params: GetQuoteTemplatesParams = {}\n): Promise<NegotiableQuoteTemplatesListModel> => {\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(QUOTE_TEMPLATES_QUERY, {\n variables: {\n filter: params.filter || null,\n pageSize: params.pageSize || 20,\n currentPage: params.currentPage || 1,\n sort: params.sort || null,\n },\n });\n\n if (!results?.data?.negotiableQuoteTemplates) {\n throw new Error('No quote templates data received');\n }\n\n const transformedData = transformQuoteTemplatesList(results.data.negotiableQuoteTemplates);\n\n if (!transformedData) {\n throw new Error('Failed to transform quote templates data');\n }\n\n events.emit('quote-management/quote-templates-data', {\n quoteTemplates: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SEND_QUOTE_TEMPLATE_FOR_REVIEW_MUTATION = /* GraphQL */ `\n mutation SEND_QUOTE_TEMPLATE_FOR_REVIEW_MUTATION(\n $templateId: ID!\n $comment: String\n $name: String\n $referenceDocumentLinks: [NegotiableQuoteTemplateReferenceDocumentLinkInput]\n $attachments: [NegotiableQuoteCommentAttachmentInput]\n ) {\n submitNegotiableQuoteTemplateForReview(input: { template_id: $templateId, name: $name, comment: $comment, reference_document_links: $referenceDocumentLinks, attachments: $attachments }) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { SEND_QUOTE_TEMPLATE_FOR_REVIEW_MUTATION } from './graphql/sendQuoteTemplateForReview';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface ReferenceDocumentLinkInput {\n uid?: string;\n name: string;\n identifier?: string;\n url: string;\n}\n\nexport interface SendQuoteTemplateForReviewParams {\n templateId: string;\n name?: string;\n comment?: string;\n referenceDocumentLinks?: ReferenceDocumentLinkInput[];\n attachments?: { key: string }[];\n}\n\nexport const sendQuoteTemplateForReview = async (\n params: SendQuoteTemplateForReviewParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n // Transform reference document links from camelCase to snake_case for GraphQL\n const referenceDocumentLinks = params.referenceDocumentLinks?.map((link) => ({\n link_id: link.uid,\n document_name: link.name,\n document_identifier: link.identifier,\n reference_document_url: link.url,\n }));\n\n // Format attachments for GraphQL (separate field, not nested in comment)\n const attachments = params.attachments?.length \n ? params.attachments.map(att => ({ key: att.key }))\n : undefined;\n\n const results: any = await fetchGraphQl(\n SEND_QUOTE_TEMPLATE_FOR_REVIEW_MUTATION,\n {\n variables: {\n templateId: params.templateId,\n name: params.name,\n comment: params.comment || undefined,\n referenceDocumentLinks,\n attachments,\n },\n }\n );\n\n if (!results?.data?.submitNegotiableQuoteTemplateForReview) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.submitNegotiableQuoteTemplateForReview\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SET_QUOTE_TEMPLATE_EXPIRATION_DATE_MUTATION = /* GraphQL */ `\n mutation SET_QUOTE_TEMPLATE_EXPIRATION_DATE_MUTATION(\n $templateId: ID!\n $expirationDate: String!\n ) {\n setQuoteTemplateExpirationDate(input: { template_id: $templateId, expiration_date: $expirationDate }) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { SET_QUOTE_TEMPLATE_EXPIRATION_DATE_MUTATION } from './graphql/setQuoteTemplateExpirationDate';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { NegotiableQuoteTemplateModel } from '@/quote-management/data/models/negotiable-quote-template-model';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface SetQuoteTemplateExpirationDateParams {\n templateId: string;\n expirationDate: string;\n}\n\nexport const setQuoteTemplateExpirationDate = async (\n params: SetQuoteTemplateExpirationDateParams\n): Promise<NegotiableQuoteTemplateModel | null> => {\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.expirationDate) {\n throw new Error('Expiration date is required');\n }\n\n try {\n const results: any = await fetchGraphQl(\n SET_QUOTE_TEMPLATE_EXPIRATION_DATE_MUTATION,\n {\n variables: {\n templateId: params.templateId,\n expirationDate: params.expirationDate,\n },\n }\n );\n\n if (!results?.data?.setQuoteTemplateExpirationDate) {\n throw new Error('Failed to set expiration date');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.setQuoteTemplateExpirationDate\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n // Emit event to update the UI\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const ACCEPT_QUOTE_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation ACCEPT_QUOTE_TEMPLATE_MUTATION($templateId: ID!) {\n acceptNegotiableQuoteTemplate(input: { template_id: $templateId }) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n \n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { ACCEPT_QUOTE_TEMPLATE_MUTATION } from './graphql/acceptQuoteTemplate';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface AcceptQuoteTemplateParams {\n templateId: string;\n}\n\nexport const acceptQuoteTemplate = async (\n params: AcceptQuoteTemplateParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(ACCEPT_QUOTE_TEMPLATE_MUTATION, {\n variables: { templateId: params.templateId },\n });\n\n if (!results?.data?.acceptNegotiableQuoteTemplate) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.acceptNegotiableQuoteTemplate\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const CANCEL_QUOTE_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation CANCEL_QUOTE_TEMPLATE_MUTATION(\n $templateId: ID!\n $comment: String\n ) {\n cancelNegotiableQuoteTemplate(\n input: {\n template_id: $templateId\n cancellation_comment: $comment\n }\n ) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { CANCEL_QUOTE_TEMPLATE_MUTATION } from './graphql/cancelQuoteTemplate';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface CancelQuoteTemplateParams {\n templateId: string;\n comment?: string;\n}\n\nexport const cancelQuoteTemplate = async (\n params: CancelQuoteTemplateParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(CANCEL_QUOTE_TEMPLATE_MUTATION, {\n variables: { templateId: params.templateId, comment: params.comment },\n });\n\n if (!results?.data?.cancelNegotiableQuoteTemplate) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.cancelNegotiableQuoteTemplate\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const DELETE_QUOTE_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation DELETE_QUOTE_TEMPLATE_MUTATION($templateId: ID!) {\n deleteNegotiableQuoteTemplate(input: { template_id: $templateId })\n }\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { DELETE_QUOTE_TEMPLATE_MUTATION } from './graphql/deleteQuoteTemplate';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface DeleteQuoteTemplateParams {\n templateId: string;\n}\n\nexport const deleteQuoteTemplate = async (\n params: DeleteQuoteTemplateParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(DELETE_QUOTE_TEMPLATE_MUTATION, {\n variables: { templateId: params.templateId },\n });\n\n if (results?.errors && results.errors.length > 0) {\n const errorMessages = results.errors\n .map((e: any) => e?.message)\n .filter(Boolean)\n .join('; ');\n throw new Error(errorMessages || 'Failed to delete quote template');\n }\n\n const deleted = results?.data?.deleteNegotiableQuoteTemplate;\n\n if (!deleted) {\n throw new Error('Failed to delete quote template');\n }\n\n events.emit('quote-management/quote-template-deleted', {\n templateId: params.templateId,\n });\n\n return { templateId: params.templateId };\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const OPEN_QUOTE_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation OPEN_QUOTE_TEMPLATE_MUTATION($templateId: ID!) {\n openNegotiableQuoteTemplate(input: { template_id: $templateId }) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { OPEN_QUOTE_TEMPLATE_MUTATION } from './graphql/openQuoteTemplate';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface OpenQuoteTemplateParams {\n templateId: string;\n}\n\nexport const openQuoteTemplate = async (params: OpenQuoteTemplateParams) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(OPEN_QUOTE_TEMPLATE_MUTATION, {\n variables: { templateId: params.templateId },\n });\n\n if (!results?.data?.openNegotiableQuoteTemplate) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.openNegotiableQuoteTemplate\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION = /* GraphQL */ `\n mutation SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION(\n $templateId: ID!\n $shippingAddress: NegotiableQuoteTemplateShippingAddressInput!\n ) {\n setNegotiableQuoteTemplateShippingAddress(\n input: {\n template_id: $templateId\n shipping_address: $shippingAddress\n }\n ) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n \n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION } from './graphql/setNegotiableQuoteTemplateShippingAddress';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface NegotiableQuoteAddressInput {\n city: string;\n company?: string;\n countryCode: string;\n fax?: string;\n firstname: string;\n lastname: string;\n middlename?: string;\n postcode?: string;\n prefix?: string;\n region?: string;\n regionId?: number;\n saveInAddressBook?: boolean;\n street: string[];\n suffix?: string;\n telephone?: string;\n vatId?: string;\n}\n\nexport interface NegotiableQuoteTemplateShippingAddressInput {\n address?: NegotiableQuoteAddressInput;\n customerAddressUid?: string;\n customerNotes?: string;\n}\n\nexport interface AddQuoteTemplateShippingAddressParams {\n templateId: string;\n shippingAddress: NegotiableQuoteTemplateShippingAddressInput;\n}\n\nexport const addQuoteTemplateShippingAddress = async (\n params: AddQuoteTemplateShippingAddressParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.shippingAddress) {\n throw new Error('Shipping address is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n // Validate that at least one of address or customerAddressUid is provided\n if (\n !params.shippingAddress.address &&\n !params.shippingAddress.customerAddressUid\n ) {\n throw new Error('Either address or customerAddressUid must be provided');\n }\n\n try {\n const results: any = await fetchGraphQl(\n SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION,\n {\n variables: {\n templateId: params.templateId,\n shippingAddress: {\n address: params.shippingAddress.address\n ? {\n city: params.shippingAddress.address.city,\n company: params.shippingAddress.address.company,\n country_code: params.shippingAddress.address.countryCode,\n fax: params.shippingAddress.address.fax,\n firstname: params.shippingAddress.address.firstname,\n lastname: params.shippingAddress.address.lastname,\n middlename: params.shippingAddress.address.middlename,\n postcode: params.shippingAddress.address.postcode,\n prefix: params.shippingAddress.address.prefix,\n region: params.shippingAddress.address.region,\n region_id: params.shippingAddress.address.regionId,\n save_in_address_book:\n params.shippingAddress.address.saveInAddressBook,\n street: params.shippingAddress.address.street,\n suffix: params.shippingAddress.address.suffix,\n telephone: params.shippingAddress.address.telephone,\n vat_id: params.shippingAddress.address.vatId,\n }\n : undefined,\n customer_address_uid: params.shippingAddress.customerAddressUid,\n customer_notes: params.shippingAddress.customerNotes,\n },\n },\n }\n );\n\n if (!results?.data?.setNegotiableQuoteTemplateShippingAddress) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.setNegotiableQuoteTemplateShippingAddress\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION = /* GraphQL */ `\n mutation UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION(\n $input: UpdateNegotiableQuoteTemplateQuantitiesInput!\n ) {\n updateNegotiableQuoteTemplateQuantities(input: $input) {\n quote_template {\n ...NegotiableQuoteTemplateFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION } from './graphql/updateNegotiableQuoteTemplateQuantities';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface NegotiableQuoteTemplateItemQuantityInput {\n itemId: string;\n quantity: number;\n minQty?: number;\n maxQty?: number;\n}\n\nexport interface UpdateQuoteTemplateItemQuantitiesParams {\n templateId: string;\n items: NegotiableQuoteTemplateItemQuantityInput[];\n}\n\nexport const updateQuoteTemplateItemQuantities = async (\n params: UpdateQuoteTemplateItemQuantitiesParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.items || params.items.length === 0) {\n throw new Error('Items array is required and must not be empty');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(\n UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION,\n {\n variables: {\n input: {\n template_id: params.templateId,\n items: params.items.map((item) => ({\n item_id: item.itemId,\n quantity: item.quantity,\n min_qty: item.minQty,\n max_qty: item.maxQty,\n })),\n },\n },\n }\n );\n\n if (\n !results?.data?.updateNegotiableQuoteTemplateQuantities?.quote_template\n ) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.updateNegotiableQuoteTemplateQuantities.quote_template\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const REMOVE_NEGOTIABLE_QUOTE_TEMPLATE_ITEMS_MUTATION = /* GraphQL */ `\n mutation REMOVE_NEGOTIABLE_QUOTE_TEMPLATE_ITEMS_MUTATION(\n $input: RemoveNegotiableQuoteTemplateItemsInput!\n ) {\n removeNegotiableQuoteTemplateItems(input: $input) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { REMOVE_NEGOTIABLE_QUOTE_TEMPLATE_ITEMS_MUTATION } from './graphql/removeNegotiableQuoteTemplateItems';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface RemoveQuoteTemplateItemsParams {\n templateId: string;\n itemUids: string[];\n}\n\nexport const removeQuoteTemplateItems = async (\n params: RemoveQuoteTemplateItemsParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.itemUids || params.itemUids.length === 0) {\n throw new Error('Item UIDs array is required and must not be empty');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(\n REMOVE_NEGOTIABLE_QUOTE_TEMPLATE_ITEMS_MUTATION,\n {\n variables: {\n input: {\n template_id: params.templateId,\n item_uids: params.itemUids,\n },\n },\n }\n );\n\n if (!results?.data?.removeNegotiableQuoteTemplateItems) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.removeNegotiableQuoteTemplateItems\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteTemplateFragment';\n\nexport const SET_QUOTE_TEMPLATE_LINE_ITEM_NOTE_MUTATION = /* GraphQL */ `\n mutation SET_QUOTE_TEMPLATE_LINE_ITEM_NOTE_MUTATION(\n $input: QuoteTemplateLineItemNoteInput!\n ) {\n setQuoteTemplateLineItemNote(input: $input) {\n ...NegotiableQuoteTemplateFragment\n }\n }\n ${NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { SET_QUOTE_TEMPLATE_LINE_ITEM_NOTE_MUTATION } from './graphql/setQuoteTemplateLineItemNote';\nimport { transformQuoteTemplate } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface AddQuoteTemplateLineItemNoteParams {\n templateId: string;\n itemId: string;\n note?: string;\n}\n\nexport const addQuoteTemplateLineItemNote = async (\n params: AddQuoteTemplateLineItemNoteParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!params.itemId) {\n throw new Error('Item ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(\n SET_QUOTE_TEMPLATE_LINE_ITEM_NOTE_MUTATION,\n {\n variables: {\n input: {\n templateId: params.templateId,\n item_uid: params.itemId,\n note: params.note,\n },\n },\n }\n );\n\n if (!results?.data?.setQuoteTemplateLineItemNote) {\n throw new Error('No quote template data received');\n }\n\n const transformedData = transformQuoteTemplate(\n results.data.setQuoteTemplateLineItemNote\n );\n\n if (!transformedData) {\n throw new Error('Failed to transform quote template data');\n }\n\n events.emit('quote-management/quote-template-data', {\n quoteTemplate: transformedData,\n permissions: state.permissions,\n });\n\n return transformedData;\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nexport const GENERATE_NEGOTIABLE_QUOTE_FROM_TEMPLATE_MUTATION = /* GraphQL */ `\n mutation GENERATE_NEGOTIABLE_QUOTE_FROM_TEMPLATE_MUTATION(\n $input: GenerateNegotiableQuoteFromTemplateInput!\n ) {\n generateNegotiableQuoteFromTemplate(input: $input) {\n negotiable_quote_uid\n }\n }\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { GENERATE_NEGOTIABLE_QUOTE_FROM_TEMPLATE_MUTATION } from './graphql/generateNegotiableQuoteFromTemplate';\nimport { state } from '@/quote-management/lib/state';\nimport { events } from '@adobe-commerce/event-bus';\n\nexport interface GenerateQuoteFromTemplateParams {\n templateId: string;\n}\n\nexport const generateQuoteFromTemplate = async (\n params: GenerateQuoteFromTemplateParams\n) => {\n if (!params.templateId) {\n throw new Error('Template ID is required');\n }\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n try {\n const results: any = await fetchGraphQl(\n GENERATE_NEGOTIABLE_QUOTE_FROM_TEMPLATE_MUTATION,\n {\n variables: {\n input: {\n template_id: params.templateId,\n },\n },\n }\n );\n\n if (\n !results?.data?.generateNegotiableQuoteFromTemplate?.negotiable_quote_uid\n ) {\n throw new Error('No quote UID received');\n }\n\n const quoteId =\n results.data.generateNegotiableQuoteFromTemplate.negotiable_quote_uid;\n\n events.emit('quote-management/quote-template-generated', {\n quoteId,\n });\n\n return { quoteId };\n } catch (error) {\n return Promise.reject(error);\n }\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const RENAME_NEGOTIABLE_QUOTE_MUTATION = `\n mutation renameNegotiableQuote($input: RenameNegotiableQuoteInput!) {\n renameNegotiableQuote(input: $input) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { RENAME_NEGOTIABLE_QUOTE_MUTATION } from './graphql/RenameNegotiableQuoteMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface RenameNegotiableQuoteInput {\n quoteUid: string;\n quoteName: string;\n quoteComment?: string;\n}\n\nexport const renameNegotiableQuote = async (\n input: RenameNegotiableQuoteInput\n): Promise<NegotiableQuoteModel | null> => {\n const { quoteUid, quoteName, quoteComment } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n if (!quoteName) {\n throw new Error('Quote name is required');\n }\n\n // Backend requires quote_comment to be present (even if empty string)\n const mutationInput = {\n quote_uid: quoteUid,\n quote_name: quoteName,\n quote_comment: quoteComment || '', // Always include, use empty string if not provided\n };\n\n return fetchGraphQl(RENAME_NEGOTIABLE_QUOTE_MUTATION, {\n variables: {\n input: mutationInput,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to rename quote: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.renameNegotiableQuote?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/quote-renamed', {\n quote: quoteData,\n input: { quoteUid, quoteName, quoteComment },\n });\n\n return quoteData;\n });\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const DUPLICATE_NEGOTIABLE_QUOTE_MUTATION = `\n mutation DUPLICATE_NEGOTIABLE_QUOTE_MUTATION($quoteUid: ID!, $duplicatedQuoteUid: ID!) {\n duplicateNegotiableQuote(input: { quote_uid: $quoteUid, duplicated_quote_uid: $duplicatedQuoteUid }) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this \n * file in accordance with the terms of the Adobe license agreement \n * accompanying it. \n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { DUPLICATE_NEGOTIABLE_QUOTE_MUTATION } from './graphql/duplicateNegotiableQuoteMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\n\nexport interface DuplicateQuoteInput {\n quoteUid: string;\n duplicatedQuoteUid: string;\n hasOutOfStockItems?: boolean;\n}\n\nexport const duplicateQuote = async (\n input: DuplicateQuoteInput\n): Promise<NegotiableQuoteModel | null> => {\n\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n const { quoteUid, duplicatedQuoteUid, hasOutOfStockItems } = input;\n\n if (!quoteUid || !quoteUid.trim()) {\n throw new Error('Quote UID is required');\n }\n\n if (!duplicatedQuoteUid || !duplicatedQuoteUid.trim()) {\n throw new Error('Duplicated Quote UID is required');\n }\n\n return fetchGraphQl(DUPLICATE_NEGOTIABLE_QUOTE_MUTATION, {\n variables: { quoteUid, duplicatedQuoteUid },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to duplicate quote: ${errorMessages}`);\n }\n\n const quoteData = transformQuote(\n response.data?.duplicateNegotiableQuote?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n events.emit('quote-management/quote-duplicated', {\n quote: quoteData,\n input: { quoteUid, duplicatedQuoteUid },\n hasOutOfStockItems,\n });\n\n return quoteData;\n });\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const UPDATE_NEGOTIABLE_QUOTE_QUANTITIES_MUTATION = `\n mutation UPDATE_NEGOTIABLE_QUOTE_QUANTITIES_MUTATION(\n $quoteUid: ID!\n $items: [NegotiableQuoteItemQuantityInput!]!\n ) {\n updateNegotiableQuoteQuantities(\n input: {\n quote_uid: $quoteUid\n items: $items\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { state } from '@/quote-management/lib/state';\nimport { UPDATE_NEGOTIABLE_QUOTE_QUANTITIES_MUTATION } from './graphql/UpdateNegotiableQuoteQuantitiesMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\n\nexport interface QuantityItem {\n /** The unique ID of the quote item */\n quoteItemUid: string;\n /** The new quantity for the item (must be greater than 0) */\n quantity: number;\n}\n\nexport interface UpdateQuantitiesInput {\n /** The unique ID of the negotiable quote */\n quoteUid: string;\n /** Array of items with their new quantities */\n items: QuantityItem[];\n}\n\n/**\n * Updates the quantities of items in a negotiable quote.\n *\n * @param input - The input parameters for updating quantities\n * @param input.quoteUid - The unique ID of the negotiable quote\n * @param input.items - Array of items with their new quantities\n * @returns Promise that resolves to the updated quote model\n * @throws Error if validation fails or GraphQL operation fails\n *\n * @example\n * ```ts\n * const quote = await updateQuantities({\n * quoteUid: 'quote-123',\n * items: [\n * { quoteItemUid: 'item-1', quantity: 5 },\n * { quoteItemUid: 'item-2', quantity: 3 }\n * ]\n * });\n * ```\n */\nexport const updateQuantities = async (\n input: UpdateQuantitiesInput\n): Promise<NegotiableQuoteModel | null> => {\n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n const { quoteUid, items } = input;\n\n // Validate quoteUid\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n // Validate items array\n if (!items || !Array.isArray(items) || items.length === 0) {\n throw new Error('Items array is required and must not be empty');\n }\n\n // Validate each item\n for (const item of items) {\n if (!item.quoteItemUid) {\n throw new Error('Each item must have a quoteItemUid');\n }\n if (typeof item.quantity !== 'number' || item.quantity <= 0) {\n throw new Error(\n `Invalid quantity for item ${item.quoteItemUid}: quantity must be a positive number`\n );\n }\n // Ensure quantity is an integer\n if (!Number.isInteger(item.quantity)) {\n throw new Error(\n `Invalid quantity for item ${item.quoteItemUid}: quantity must be an integer`\n );\n }\n }\n\n // Transform items to snake_case for GraphQL\n const transformedItems = items.map((item) => ({\n quote_item_uid: item.quoteItemUid,\n quantity: item.quantity,\n }));\n\n return fetchGraphQl(UPDATE_NEGOTIABLE_QUOTE_QUANTITIES_MUTATION, {\n variables: {\n quoteUid,\n items: transformedItems,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to update quote quantities: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(\n response.data?.updateNegotiableQuoteQuantities?.quote\n );\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/quantities-updated', {\n quote: quoteData,\n input: { quoteUid, items },\n });\n\n return quoteData;\n });\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const REMOVE_NEGOTIABLE_QUOTE_ITEMS_MUTATION = `\n mutation REMOVE_NEGOTIABLE_QUOTE_ITEMS_MUTATION(\n $quoteUid: ID!\n $quoteItemUids: [ID!]!\n ) {\n removeNegotiableQuoteItems(\n input: {\n quote_uid: $quoteUid\n quote_item_uids: $quoteItemUids\n }\n ) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { state } from '@/quote-management/lib/state';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\nimport { REMOVE_NEGOTIABLE_QUOTE_ITEMS_MUTATION } from './graphql/RemoveNegotiableQuoteItemsMutation';\n\nexport interface RemoveNegotiableQuoteItemsInput {\n quoteUid: string;\n quoteItemUids: string[];\n}\n\nexport const removeNegotiableQuoteItems = async (\n input: RemoveNegotiableQuoteItemsInput\n): Promise<NegotiableQuoteModel | null> => {\n if (!state.authenticated) {\n return Promise.reject(new Error('Unauthorized'));\n }\n\n const { quoteUid, quoteItemUids } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n if (!Array.isArray(quoteItemUids) || quoteItemUids.length === 0) {\n throw new Error('At least one quote item UID is required');\n }\n\n const response = await fetchGraphQl(REMOVE_NEGOTIABLE_QUOTE_ITEMS_MUTATION, {\n variables: {\n quoteUid,\n quoteItemUids,\n },\n });\n\n const { errors, data } = response;\n\n if (errors?.length) {\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(\n `Failed to remove negotiable quote items: ${errorMessages}`\n );\n }\n\n const quote = transformQuote(data?.removeNegotiableQuoteItems?.quote);\n\n if (!quote) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n events.emit('quote-management/quote-items-removed', {\n quote,\n removedItemUids: quoteItemUids,\n input,\n });\n\n return quote;\n};\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { NEGOTIABLE_QUOTE_FRAGMENT } from '@/quote-management/api/graphql/NegotiableQuoteFragment';\n\nexport const SET_LINE_ITEM_NOTE_MUTATION = /* GraphQL */ `\n mutation SET_LINE_ITEM_NOTE_MUTATION($input: LineItemNoteInput!) {\n setLineItemNote(input: $input) {\n quote {\n ...NegotiableQuoteFragment\n }\n }\n }\n ${NEGOTIABLE_QUOTE_FRAGMENT}\n`;\n","/********************************************************************\n * Copyright 2025 Adobe\n * All Rights Reserved.\n *\n * NOTICE: Adobe permits you to use, modify, and distribute this\n * file in accordance with the terms of the Adobe license agreement\n * accompanying it.\n *******************************************************************/\n\nimport { fetchGraphQl } from '@/quote-management/api';\nimport { events } from '@adobe-commerce/event-bus';\nimport { SET_LINE_ITEM_NOTE_MUTATION } from './graphql/SetLineItemNoteMutation';\nimport { NegotiableQuoteModel } from '@/quote-management/data/models/negotiable-quote-model';\nimport { transformQuote } from '@/quote-management/data/transforms';\nimport { state } from '@/quote-management/lib/state';\n\nexport interface SetLineItemNoteInput {\n quoteUid: string;\n itemUid: string;\n note: string;\n quantity?: number;\n}\n\nexport const setLineItemNote = async (\n input: SetLineItemNoteInput\n): Promise<NegotiableQuoteModel | null> => {\n if (!state.authenticated) {\n throw new Error('Unauthorized');\n }\n\n const { quoteUid, itemUid, note, quantity } = input;\n\n if (!quoteUid) {\n throw new Error('Quote UID is required');\n }\n\n if (!itemUid) {\n throw new Error('Item UID is required');\n }\n\n if (!note) {\n throw new Error('Note is required');\n }\n\n // Build the mutation input\n const mutationInput: any = {\n quote_uid: quoteUid,\n quote_item_uid: itemUid,\n note: note.trim(),\n };\n\n return fetchGraphQl(SET_LINE_ITEM_NOTE_MUTATION, {\n variables: {\n input: mutationInput,\n },\n }).then((response) => {\n const { errors } = response;\n\n if (errors) {\n // Provide more detailed error information\n const errorMessages = errors.map((error) => error.message).join('; ');\n throw new Error(`Failed to set line item note: ${errorMessages}`);\n }\n\n // Transform the quote data\n const quoteData = transformQuote(response.data?.setLineItemNote?.quote);\n\n if (!quoteData) {\n throw new Error(\n 'Failed to transform quote data: Invalid response structure'\n );\n }\n\n // Emit event with transformed quote data on success\n events.emit('quote-management/line-item-note-set', {\n quote: quoteData,\n input: { quoteUid, itemUid, note, quantity },\n });\n\n // Also emit the general quote-data event to update all listeners\n events.emit('quote-management/quote-data', {\n quote: quoteData,\n permissions: state.permissions,\n });\n\n return quoteData;\n });\n};\n"],"names":["NegotiableQuoteStatus","NegotiableQuoteTemplateStatus","QuoteDisplayAmount","DEFAULT_PERMISSIONS","DEFAULT_CONFIG","_state","state","target","key","value","mapAuthPermissions","payload","hasAllQuotePermissions","hasAllTemplatePermissions","hasManagePermission","loadQuoteData","permissions","config","initialize","quoteId","quoteTemplateId","getQuoteData","quote","events","error","getQuoteTemplateData","Initializer","defaultConfig","getStoreConfig","authenticated","data","setEndpoint","setFetchGraphQlHeader","removeFetchGraphQlHeader","setFetchGraphQlHeaders","fetchGraphQl","getConfig","FetchGraphQL","SELECTED_SHIPPING_METHOD_FRAGMENT","NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_FRAGMENT","NEGOTIABLE_QUOTE_FRAGMENT","REQUEST_NEGOTIABLE_QUOTE_MUTATION","transformStoreConfig","transformQuoteDisplayAmountSetting","quoteDisplayAmountSetting","transformHistoryEntry","historyEntry","_a","_b","_c","_d","_e","_f","change","_g","transformHistory","historyEntries","findApplicablePriceTier","priceTiers","quantity","a","b","tier","getImage","item","getLinks","link","getDiscounted","isConfigurable","priceRange","applicableTier","getDiscountPercentage","percent_off","_h","getRegularPrice","getSavingsAmount","amount_off","currency","transformQuoteItem","discount","note","option","transformQuoteItems","items","EDITABLE_QUOTE_STATUSES","getTotalQuantity","checkAllItemsHaveStock","transformSingleQuote","isQuoteNew","isNewQuote","isGeneratedFromTemplate","quoteItems","comment","baseComment","tax","calculateTotal","transformShippingPrices","address","shippingAddress","transformQuote","quoteData","history","transformNegotiableQuoteListEntry","transformNegotiableQuotesList","quotesData","transformedModel","paginationInfo","transformPaginationInfo","currentPage","pageSize","totalPages","totalCount","startItem","endItem","getDefaultPageSizeOptions","acc","selectedShippingMethod","transformQuoteTemplate","templateData","doc","transformQuoteTemplatesList","templatesData","template","requestNegotiableQuote","input","cartId","quoteName","attachments","isDraft","response","errors","errorMessages","QUOTE_DATA_QUERY","results","transformedQuote","NEGOTIABLE_QUOTE_LIST_FRAGMENT","SEARCH_RESULT_PAGE_INFO_FRAGMENT","SORT_FIELDS_FRAGMENT","NEGOTIABLE_QUOTES_QUERY","FilterMatchTypeEnum","SortEnum","NegotiableQuoteSortableField","negotiableQuotes","params","variables","transformedData","STORE_CONFIG_QUERY","errorMessage","e","DELETE_QUOTE_MUTATION","deleteQuote","quoteUids","quoteUidsArray","raw","transformed","result","err","deletedUids","res","SET_NEGOTIABLE_QUOTE_SHIPPING_ADDRESS_MUTATION","transformAddressToSnakeCase","additionalInput","standardFields","transformedStandardFields","setShippingAddress","quoteUid","addressId","addressData","transformedAddressData","SEND_NEGOTIABLE_QUOTE_FOR_REVIEW_MUTATION","sendForReview","commentInput","INITIATE_UPLOAD_MUTATION","FINISH_UPLOAD_MUTATION","uploadFile","file","mediaResourceType","filename","formatGraphQLErrors","initialData","initialErrors","upload_url","put","finishData","finishErrors","success","finalizedKey","message","CLOSE_NEGOTIABLE_QUOTE_MUTATION","closeNegotiableQuote","failures","failureMessages","failure","closedUids","NEGOTIABLE_QUOTE_TEMPLATE_FRAGMENT","GET_QUOTE_TEMPLATE_DATA","templateId","CREATE_QUOTE_TEMPLATE_MUTATION","createQuoteTemplate","transformedQuoteTemplate","QUOTE_TEMPLATES_QUERY","QuoteTemplateFilterStatus","QuoteTemplateSortField","SortDirection","getQuoteTemplates","SEND_QUOTE_TEMPLATE_FOR_REVIEW_MUTATION","sendQuoteTemplateForReview","referenceDocumentLinks","att","SET_QUOTE_TEMPLATE_EXPIRATION_DATE_MUTATION","setQuoteTemplateExpirationDate","ACCEPT_QUOTE_TEMPLATE_MUTATION","acceptQuoteTemplate","CANCEL_QUOTE_TEMPLATE_MUTATION","cancelQuoteTemplate","DELETE_QUOTE_TEMPLATE_MUTATION","deleteQuoteTemplate","OPEN_QUOTE_TEMPLATE_MUTATION","openQuoteTemplate","SET_NEGOTIABLE_QUOTE_TEMPLATE_SHIPPING_ADDRESS_MUTATION","addQuoteTemplateShippingAddress","UPDATE_NEGOTIABLE_QUOTE_TEMPLATE_QUANTITIES_MUTATION","updateQuoteTemplateItemQuantities","REMOVE_NEGOTIABLE_QUOTE_TEMPLATE_ITEMS_MUTATION","removeQuoteTemplateItems","SET_QUOTE_TEMPLATE_LINE_ITEM_NOTE_MUTATION","addQuoteTemplateLineItemNote","GENERATE_NEGOTIABLE_QUOTE_FROM_TEMPLATE_MUTATION","generateQuoteFromTemplate","RENAME_NEGOTIABLE_QUOTE_MUTATION","renameNegotiableQuote","quoteComment","DUPLICATE_NEGOTIABLE_QUOTE_MUTATION","duplicateQuote","duplicatedQuoteUid","hasOutOfStockItems","UPDATE_NEGOTIABLE_QUOTE_QUANTITIES_MUTATION","updateQuantities","transformedItems","REMOVE_NEGOTIABLE_QUOTE_ITEMS_MUTATION","removeNegotiableQuoteItems","quoteItemUids","SET_LINE_ITEM_NOTE_MUTATION","setLineItemNote","itemUid","mutationInput"],"mappings":"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AA;AAAA;AAAA;AAAA,IAyBpED,CAAiC;AAAA,ECzBxBE,EAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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"}
|