{ "version": 3, "sources": ["apps/partner-center-client/src/app/activation/core/interface.ts", "apps/partner-center-client/src/app/activation/core/utils.ts", "apps/partner-center-client/src/app/core/reseller/billed-product.service.ts"], "sourcesContent": ["import { AppPrice } from '@galaxy/marketplace-apps';\nimport { EditionIdentifier } from '@galaxy/marketplace-apps/v1';\nimport { ListAppsAndAddonsActivationsStatusesForBusinessResponseAppsAndAddonsActivationStatusesInterface as ActivationStatusesInterface } from '@vendasta/accounts/legacy';\nimport { Pricing } from '../../common/table-pricing/interface';\n\nexport interface ActivatableItem {\n appId: string;\n requiredAppIds?: string[];\n requiredEditions?: EditionIdentifier[];\n parentAppId?: string;\n billingId?: string;\n name: string;\n icon: string;\n allowMultipleActivations: boolean;\n usesOrderForm: boolean;\n pricing?: Pricing;\n appPrice?: AppPrice;\n restrictedReason?: string;\n activeState?: ActivationStatusesInterface[];\n children?: ActivatableItem[]; // add-ons\n descriptor?: string;\n // TODO This field is a bit of tech debt around single-product center workflows that exist in here\n isActiveAccount?: boolean;\n isTrial?: boolean;\n trialStatus?: ActivationStatus;\n editionData?: EditionData;\n editionId?: string;\n usesCustomPricing?: boolean;\n partnerCurrency?: string;\n}\n\n//TODO: extend these edition interfaces as required\nexport interface EditionData {\n usesEditions: boolean;\n currentlyActiveEditionId?: string;\n editions?: Edition[];\n}\n\nexport interface Edition {\n appId: string;\n editionId: string;\n editionName: string;\n billingId: string;\n pricing?: Pricing;\n}\n\nexport interface ProductEdition {\n appId: string;\n editionId: string;\n}\n\nexport interface ProductEditionName {\n appId: string;\n editionName: string;\n}\n\nexport interface ProductName {\n appId: string;\n appName: string;\n}\n\nexport type ProductEditionMap = Map;\n\nexport type AppIdToEditionIdToEditionMap = Map>;\n\nexport function isValidEditionId(editionId: string): boolean {\n return typeof editionId === 'string';\n}\n\nexport interface SelectedItem {\n appId: string;\n quantity: number;\n editionId?: string;\n}\n\nexport interface QuantityEditionIdPair {\n quantity: number;\n editionId?: string;\n}\n\nexport type SelectedItems = Map;\n\nexport interface SelectedItemQueryParams {\n accountGroupId: string;\n appIds: string;\n addonIds: string;\n partnerId: string;\n navigationSource: string;\n}\n\nexport type SortDirection = 'ASCENDING' | 'DESCENDING';\n\nexport interface ProductBoxItems {\n appId: string;\n name: string;\n editionId?: string;\n editionName?: string;\n icon: string;\n count: number;\n status: number;\n descriptor?: string;\n isTrial?: boolean;\n trialStatus?: ActivationStatus;\n}\n\nexport enum ActivationStatus {\n NOT_SPECIFIED = 0,\n ACTIVATED = 1,\n PENDING = 2,\n CANCELED = 3,\n}\n\nexport const agid_key = 'accountGroupId';\n\nexport interface ActivatablePackage {\n activatableItemCount: ActivatableItemCount[];\n name: string;\n icon: string;\n packageId: string;\n restricted?: boolean;\n}\n\nexport interface ActivatableItemCount {\n status: ActivationStatus;\n activatableItem: ActivatableItem;\n editionId?: string;\n editionName?: string;\n currentlyActivatedEditionName?: string;\n quantity: number;\n isTrial?: boolean;\n trialStatus?: ActivationStatus;\n}\n\nexport enum OrderFormType {\n NONE = 0,\n COMMON = 1,\n CUSTOM = 2,\n DYNAMIC = 3,\n ERROR = 4,\n}\n\nexport const UWM_PID = 'USFS';\n", "import { PageEvent } from '@angular/material/paginator';\nimport { Params } from '@angular/router';\nimport { ProductPricing } from '@galaxy/billing';\nimport { AppPrice, AppPrices } from '@galaxy/marketplace-apps';\nimport { EditionIdentifier } from '@galaxy/marketplace-apps/v1';\nimport {\n AppAndAddonActivationStatus,\n ListAppsAndAddonsActivationsStatusesForBusinessResponseAppsAndAddonsActivationStatusesInterface as ActivationStatusesInterface,\n PendingActivationStatus,\n} from '@vendasta/accounts/legacy';\nimport { LineItem, Package } from '@vendasta/marketplace-packages';\nimport { ResellerItem } from '@vendasta/store';\nimport { Pricing } from '../../common/table-pricing/interface';\nimport { convertPricingToTablePricing } from '../../common/table-pricing/utils';\nimport { Activation } from '../../core/account.service';\nimport { PurchaseCost } from '../../core/billing/purchase-cost';\nimport { getResellerItemUniqueId, resellerItemUsesOrderForm } from '../../core/reseller/utils';\nimport { DynamicOrderFormAppIds } from '../../marketplace-app/global-brands-constants';\nimport { ItemIdAndQuantity, UniqueIdToItemIdAndQuantityMap } from '../order-form-page/interface';\nimport {\n ActivatableItem,\n ActivatableItemCount,\n ActivatablePackage,\n ActivationStatus,\n Edition,\n EditionData,\n isValidEditionId,\n OrderFormType,\n ProductBoxItems,\n ProductEditionMap,\n QuantityEditionIdPair,\n SelectedItem,\n SelectedItemQueryParams,\n SelectedItems,\n SortDirection,\n} from './interface';\nimport { PendingActivationDisplay } from './pending-activations.service';\n\nexport function convertResellerItemsToFlatActivatableItems(\n resellerItems: ResellerItem[],\n pricingMap: Map,\n country: string,\n partnerFeatures: string[],\n activeStates: ActivationStatusesInterface[],\n editionsMap: ProductEditionMap,\n pendingActivations: PendingActivationDisplay[],\n appPriceMap: Map,\n partnerCurrency: string,\n): ActivatableItem[] {\n const resellerItemsWithPricing = pairResellerItemsWithPricing(resellerItems, pricingMap, appPriceMap);\n const resellerItemsWithPricingAndStatus = pairResellerPricingWithActiveStatuses(\n resellerItemsWithPricing,\n activeStates,\n pendingActivations,\n );\n return (resellerItemsWithPricingAndStatus || []).map((ri) => {\n const idToCheck = ri.resellerItem.addonId ? ri.resellerItem.addonId : ri.resellerItem.appId;\n let editions = null;\n if (editionsMap) {\n editions = editionsMap.get(idToCheck) || null;\n }\n return convertResellerItemToActivatableItem(\n ri.resellerItem,\n ri.pricing,\n ri.pricingPurchaseCost,\n country,\n partnerFeatures,\n ri.activeStatuses,\n editions,\n ri.appPrice,\n partnerCurrency,\n );\n });\n}\n\nexport function nestActivatableItems(activatableItems: ActivatableItem[]): ActivatableItem[] {\n if (!activatableItems || activatableItems.length === 0) {\n return [];\n }\n const parentApps = getAppsWithoutParents(activatableItems);\n const childMap = buildChildMap(activatableItems);\n const nestedItems = setChildAppsOnClonedParentApps(parentApps, childMap);\n return applyRestrictedReasonToChildren(nestedItems);\n}\n\nexport function convertResellerItemToActivatableItem(\n resellerItem: ResellerItem,\n pricing: ProductPricing,\n pricingPurchaseCost: PurchaseCost,\n country: string,\n partnerFeatures: string[],\n activeState: ActivationStatusesInterface[],\n editions: Edition[],\n appPrice: AppPrice,\n partnerCurrency: string,\n): ActivatableItem {\n const valueTotalCost = pricingPurchaseCost && pricingPurchaseCost ? pricingPurchaseCost.totalCost : 0;\n\n let convertedPricing = convertPricingToTablePricing(pricing, valueTotalCost);\n // if billing doesn't have a pricing model for the product, fall back to the products pricing\n if (!convertedPricing) {\n convertedPricing = {\n currency: resellerItem.currency,\n frequency: resellerItem.billingFrequency,\n prices: [{ price: resellerItem.price }],\n purchaseCostTotal: valueTotalCost,\n } as Pricing;\n }\n const withinCountryRestrictions = isCountryAllowedByResellerItemCountry(resellerItem, country);\n const partnerFeaturesValid = partnerHasRequiredFeatures(resellerItem, partnerFeatures);\n let restrictedReason: string;\n if (!withinCountryRestrictions) {\n restrictedReason = `Unavailable in ${country}`;\n } else if (!partnerFeaturesValid) {\n restrictedReason = 'Subscription upgrade required';\n }\n\n // For now, don't support AND and OR logic, just support a single set of required app IDs.\n // Also, edition IDs need to be mapped because pro editions are often blank, which are returned as undefined.\n const appRules = resellerItem.restrictions?.appRequirement?.rules ?? [];\n const requiredAppIds = appRules[0]?.appIds ?? [];\n const requiredEditions = (appRules[0]?.requiredEditions ?? []).map((rei) => ({\n appId: rei.appId,\n editionId: rei.editionId ?? '',\n }));\n const parentAppId = resellerItem.addonId ? resellerItem.appId : '';\n return {\n appId: getResellerItemUniqueId(resellerItem),\n requiredAppIds: requiredAppIds,\n requiredEditions: requiredEditions,\n parentAppId: parentAppId,\n // editions not handled here as we don't know WHICH edition the item is at this point\n billingId: resellerItem.billingId,\n name: resellerItem.name,\n icon: resellerItem.icon,\n allowMultipleActivations: resellerItem.allowMultipleActivations,\n pricing: convertedPricing,\n activeState: activeState,\n usesOrderForm: resellerItemUsesOrderForm(resellerItem),\n restrictedReason: restrictedReason,\n editionData: setUpEditionsData(editions),\n usesCustomPricing: resellerItem.usesCustomPricing,\n appPrice: appPrice,\n partnerCurrency: partnerCurrency,\n } as ActivatableItem;\n}\n\nfunction setUpEditionsData(editions: Edition[]): EditionData {\n if (!(editions && editions.length > 0)) {\n return {\n usesEditions: false,\n } as EditionData;\n }\n\n return {\n usesEditions: true,\n editions: editions,\n } as EditionData;\n}\n\nfunction getEditionBillingId(appId: string, editionId: string, editionMap: ProductEditionMap): string {\n const editions = editionMap.get(appId) || [];\n for (const edition of editions) {\n if (edition.editionId === editionId) {\n return edition.billingId;\n }\n }\n return '';\n}\n\nexport function getEditionName(appId: string, editionId: string, editionMap: ProductEditionMap): string {\n const editions = editionMap.get(appId) || [];\n for (const edition of editions) {\n if (edition.editionId === editionId) {\n return edition.editionName;\n }\n }\n return '';\n}\n\nexport function getEditionDisplayName(appName: string, editionName?: string): string {\n if (!editionName) {\n return appName;\n }\n return `${appName} | ${editionName}`;\n}\n\nexport function partnerHasRequiredFeatures(resellerItem: ResellerItem, partnerFeatures: string[]): boolean {\n if (\n !(\n resellerItem.restrictions &&\n resellerItem.restrictions.requiredFeatures &&\n resellerItem.restrictions.requiredFeatures.whitelist\n )\n ) {\n return true;\n }\n const whitelist = resellerItem.restrictions.requiredFeatures.whitelist;\n if (whitelist.length < 1) {\n return true;\n }\n if (!partnerFeatures || partnerFeatures.length === 0) {\n return false;\n }\n return whitelist.every((requiredFeature) => {\n return partnerFeatures.includes(requiredFeature);\n });\n}\n\nexport function isCountryAllowedByResellerItemCountry(resellerItem: ResellerItem, country: string): boolean {\n if (!(resellerItem.restrictions && resellerItem.restrictions.country)) {\n return true;\n }\n const countryRestrictions = resellerItem.restrictions.country;\n\n // Prioritize blacklist\n\n if (countryRestrictions.blacklist && countryRestrictions.blacklist.length > 0) {\n const upperCased = countryRestrictions.blacklist.map((c) => c.toUpperCase());\n return upperCased.indexOf((country || '').toUpperCase()) < 0;\n }\n\n if (countryRestrictions.whitelist && countryRestrictions.whitelist.length > 0) {\n const upperCased = countryRestrictions.whitelist.map((c) => c.toUpperCase());\n return upperCased.indexOf((country || '').toUpperCase()) >= 0;\n }\n\n return true;\n}\n\nexport function sortActivatableItems(\n activatableItems: ActivatableItem[],\n sortDirection: SortDirection,\n): ActivatableItem[] {\n // Note: This is a base case for recursion\n if (!activatableItems || activatableItems.length <= 0) {\n return activatableItems;\n }\n if (sortDirection !== 'ASCENDING' && sortDirection !== 'DESCENDING') {\n return activatableItems;\n }\n\n let items = activatableItems.slice(); // Don't mutate original array\n items = items.map((item) => {\n item = { ...item }; // Don't mutate item\n item.children = sortActivatableItems(item.children, sortDirection);\n return item;\n });\n items.sort((child1, child2) => sortByName(child1, child2, sortDirection));\n return items;\n}\n\nfunction sortByName(child1: ActivatableItem, child2: ActivatableItem, sortDirection: SortDirection): number {\n const child1Name = child1 && child1.name ? child1.name : '';\n const child2Name = child2 && child2.name ? child2.name : '';\n return sortDirection === 'ASCENDING' ? child1Name.localeCompare(child2Name) : child2Name.localeCompare(child1Name);\n}\n\nexport function doItemsHaveRestrictionReasons(activatableItems: ActivatableItem[]): boolean {\n if (!activatableItems || activatableItems.length <= 0) {\n return false;\n }\n return activatableItems.some((activatableItem) =>\n Boolean(activatableItem.restrictedReason || doItemsHaveRestrictionReasons(activatableItem.children)),\n );\n}\n\nexport function filterRestrictedItems(activatableItems: ActivatableItem[]): ActivatableItem[] {\n if (!activatableItems || activatableItems.length <= 0) {\n return [];\n }\n const filteredItems = activatableItems.filter((activatableItem) => !activatableItem.restrictedReason);\n const filteredWithChildren = filteredItems.map((filteredItem) => {\n if (filteredItem.children) {\n filteredItem = { ...filteredItem }; // Don't mutate item\n filteredItem.children = filterRestrictedItems(filteredItem.children);\n }\n return filteredItem;\n });\n return filteredWithChildren;\n}\n\n/* Search rules\n * If parent matches, itself and all of its children are matched. (keeps all children)\n * If a child matches, only the children that match and the parent are matched. (limits children)\n */\nexport function searchActivatableItems(activatableItems: ActivatableItem[], searchTerm: string): ActivatableItem[] {\n if (!activatableItems || activatableItems.length <= 0 || !searchTerm) {\n return activatableItems || [];\n }\n\n searchTerm = searchTerm.trim().toUpperCase();\n const matchedAtRoot = activatableItems.filter((item) => {\n const uppercaseItemName = item.name.toUpperCase();\n const uppercaseItemId = item.appId.toUpperCase();\n const itemMatched = uppercaseItemName.indexOf(searchTerm) >= 0 || uppercaseItemId.indexOf(searchTerm) >= 0;\n if (itemMatched) {\n return true;\n }\n });\n\n const filteredChildren = activatableItems.map((item) => {\n item = { ...item, children: searchActivatableItems(item.children, searchTerm) };\n return item;\n });\n\n const matchedAtChildren = filteredChildren.filter((item) => item.children && item.children.length > 0);\n\n const m = new Map();\n matchedAtRoot.forEach((item) => m.set(item.appId, item));\n matchedAtChildren.forEach((item) => {\n if (!m.has(item.appId)) {\n m.set(item.appId, item);\n }\n });\n\n return Array.from(m.values());\n}\n\nexport function pageArray(array: T[], pageEvent: PageEvent, startPageSize = 25): T[] {\n if (!array || array.length === 0) {\n return [];\n }\n\n let index: number;\n let pageSize: number;\n if (!pageEvent) {\n index = 0;\n pageSize = startPageSize;\n } else {\n index = pageEvent.pageIndex;\n pageSize = pageEvent.pageSize;\n }\n const offset = index * pageSize;\n return array.slice(offset, Math.min(pageSize + offset, array.length));\n}\n\nexport function getSelectedItemRequiredAppIds(selectedId: string, activatableItems: ActivatableItem[]): string[] {\n const app = (activatableItems ?? []).find((activatableItem) => activatableItem.appId === selectedId);\n return app?.requiredAppIds ?? [];\n}\n\nexport function getSelectedItemRequiredEditionIds(\n selectedId: string,\n activatableItems: ActivatableItem[],\n): EditionIdentifier[] {\n const app = (activatableItems ?? []).find((activatableItem) => activatableItem.appId === selectedId);\n return app?.requiredEditions ?? [];\n}\n\nexport function getSelectedItemParentId(appId: string, activatableItems: ActivatableItem[]): string {\n const parent = activatableItems.find((activatableItem) =>\n activatableItem.children.some((child) => child.appId === appId),\n );\n if (parent) {\n return parent.appId;\n }\n return '';\n}\n\nexport function getSelectedAppRequiredApps(selectedId: string, activatableItems: ActivatableItem[]): ActivatableItem[] {\n const requiredAppIds = getSelectedItemRequiredAppIds(selectedId, activatableItems);\n return (activatableItems || []).filter((activatableItem) =>\n requiredAppIds.some((appIds) => appIds.includes(activatableItem.appId)),\n );\n}\n\nexport function getSelectedAppDependents(selectedId: string, activatableItems: ActivatableItem[]): ActivatableItem[] {\n return (activatableItems || []).filter((activatableItem) =>\n (activatableItem.requiredAppIds || []).some((appId) => appId === selectedId),\n );\n}\n\nexport function getSelectedItemChildren(productId: string, activatableItems: ActivatableItem[]): ActivatableItem[] {\n const selectedActivatableItem = activatableItems.filter((activatableItem) => activatableItem.appId === productId);\n if (selectedActivatableItem && selectedActivatableItem.length > 0) {\n return selectedActivatableItem[0].children;\n }\n return null;\n}\n\n// Signifier that selected events have been cleared; static interface\nexport interface ClearEvent {\n clear: true;\n}\n\nexport interface CurrentSelection {\n event: SelectedItem | ClearEvent;\n items: ActivatableItem[];\n appStatus: ActivationStatusesInterface[];\n}\n\nexport function updateSelectedItems(selectedItemsMap: SelectedItems, current: CurrentSelection): SelectedItems {\n if ((current.event as any).clear) {\n return new Map() as SelectedItems; // clear all selections\n }\n\n const selected = current.event as SelectedItem;\n const data = {\n selected: selected,\n items: current.items,\n appStatus: current.appStatus,\n };\n const quantityEditionPair = {\n quantity: selected.quantity,\n editionId: selected.editionId,\n } as QuantityEditionIdPair;\n\n selectedItemsMap.set(selected.appId, quantityEditionPair);\n if (selected.quantity <= 0) {\n selectedItemsMap.delete(selected.appId);\n }\n\n selectedItemsMap = removeActivatedAppsWithoutDependentsOrAddons(selectedItemsMap, data);\n return selectedItemsMap;\n}\n\nexport function areAddonDependenciesSatisfied(\n selectedItemsMap: SelectedItems,\n current: { selected: SelectedItem; items: ActivatableItem[]; appStatus: ActivationStatusesInterface[] },\n): boolean {\n const selectedItem = current.selected;\n const app = current.items.find((item) => item.children.some((child) => child.appId === selectedItem.appId));\n if (!app) {\n return true;\n }\n\n return selectedItemsMap.has(app.appId) && selectedItemsMap.get(app.appId).quantity > 0;\n}\n\nexport function isRequiredAppActive(productId: string, statuses: ActivationStatusesInterface[]): boolean {\n const appStatus = statuses.find((status) => status.appId === productId);\n const activated = appStatus?.status === AppAndAddonActivationStatus.ACTIVATED;\n const pending = appStatus?.status === AppAndAddonActivationStatus.PENDING;\n const cancelled = appStatus?.status === AppAndAddonActivationStatus.CANCELED;\n return appStatus?.appId === productId && (activated || pending || cancelled);\n}\n\n// Returns a list of the activatable items and their children as a flattened list.\nexport function flattenActivatableItems(activatableItems: ActivatableItem[]): ActivatableItem[] {\n return (\n activatableItems?.reduce(\n (result, activatableItem) => result.concat([activatableItem, ...(activatableItem.children || [])]),\n [],\n ) || []\n );\n}\n\nexport function isAppMultiactivatable(appId: string, activatableItems: ActivatableItem[]): boolean {\n return activatableItems?.find((item) => item.appId === appId)?.allowMultipleActivations || false;\n}\n\nexport function isTrialActivatableItem(appId: string, activatableItems: ActivatableItem[]): boolean {\n return activatableItems?.find((item) => item.appId === appId)?.isTrial || false;\n}\n\nexport function isActivatableItemWithEditions(appId: string, activatableItems: ActivatableItem[]): boolean {\n return activatableItems?.find((item) => item.appId === appId)?.editionData?.usesEditions || false;\n}\n\nexport function getFirstEditionIdForRequiredApp(appId: string, activatableItems: ActivatableItem[]): string {\n if (!appId || !activatableItems || activatableItems.length < 1) {\n return '';\n }\n\n const app = activatableItems.find((item) => item.appId === appId);\n if (app?.editionData?.editions?.length > 0) {\n return app.editionData.editions[0].editionId;\n }\n return '';\n}\n\nexport function removeActivatedAppsWithoutDependentsOrAddons(\n selectedItemsMap: SelectedItems,\n current: { selected: SelectedItem; items: ActivatableItem[]; appStatus: ActivationStatusesInterface[] },\n): SelectedItems {\n const items = current.items;\n const flattenedItems = flattenActivatableItems(items);\n selectedItemsMap.forEach((_, appId) => {\n if (\n !isRequiredAppActive(appId, current.appStatus) ||\n isAppMultiactivatable(appId, flattenedItems) ||\n isTrialActivatableItem(appId, flattenedItems) ||\n isActivatableItemWithEditions(appId, flattenedItems)\n ) {\n return;\n }\n\n const dependants = getSelectedAppDependents(appId, items);\n const addons = getSelectedItemChildren(appId, items);\n const hasDependants =\n dependants?.length > 0 && dependants.some((dependant) => selectedItemsMap.has(dependant.appId));\n const hasAddons = addons?.length > 0 && addons.some((addon) => selectedItemsMap.has(addon.appId));\n if (!hasDependants && !hasAddons) {\n selectedItemsMap.delete(appId);\n }\n });\n return selectedItemsMap;\n}\n\nexport function removeActivatedParentIfChildIsRemoved(\n selectedItemsMap: SelectedItems,\n parentId: string,\n current: { selected: SelectedItem; items: ActivatableItem[]; appStatus: ActivationStatusesInterface[] },\n): SelectedItems {\n const items = current.items;\n const selected = current.selected;\n const active = isRequiredAppActive(parentId, current.appStatus);\n if (parentId && selected.quantity === 0 && active) {\n const parentsChildren = getSelectedItemChildren(parentId, items);\n let keepParent = false;\n parentsChildren.forEach((child) => {\n if (selectedItemsMap.has(child.appId) && selectedItemsMap.get(child.appId).quantity > 0) {\n keepParent = true;\n }\n });\n if (!keepParent) {\n selectedItemsMap.delete(parentId);\n }\n }\n return selectedItemsMap;\n}\n\nexport function filterResellerItemQuantity(\n resellerItemMap: Map,\n resellerQuantityMap: UniqueIdToItemIdAndQuantityMap,\n appStatuses: ActivationStatusesInterface[],\n activations?: Activation[],\n): UniqueIdToItemIdAndQuantityMap {\n const filteredMap = new Map() as UniqueIdToItemIdAndQuantityMap;\n Array.from(resellerQuantityMap.keys()).forEach((key) => {\n const item = resellerItemMap.get(key);\n if (!item) {\n return;\n }\n let isTrial = false;\n if (activations) {\n const activation = activations.find((act) => act.appId === getResellerItemUniqueId(item));\n isTrial = activation && activation.trial;\n }\n if (!item.allowMultipleActivations) {\n const isActive = isAppActive(getResellerItemUniqueId(item), appStatuses, isTrial);\n if (isActive) {\n return;\n }\n }\n\n filteredMap.set(key, resellerQuantityMap.get(key));\n });\n return filteredMap;\n}\n\nexport function isAppActive(appId: string, appStatuses: ActivationStatusesInterface[], isTrial?: boolean): boolean {\n const as = (appStatuses || []).find((status) => status.appId === appId);\n if (!as) {\n return false;\n }\n if (as) {\n const active = as.status === AppAndAddonActivationStatus.ACTIVATED && !isTrial;\n const pending = as.status === AppAndAddonActivationStatus.PENDING && !isTrial;\n const cancelled = as.status === AppAndAddonActivationStatus.CANCELED && !isTrial;\n return active || pending || cancelled;\n }\n}\n\nexport function doItemsRequireOrderForm(\n selectedItems: string[],\n activatableItems: ActivatableItem[],\n appStatus: ActivationStatusesInterface[],\n): OrderFormType {\n const itemsThatRequiresDynamicOrderForm = (DynamicOrderFormAppIds || []).filter((dynamicAppId) => {\n return selectedItems.indexOf(dynamicAppId) >= 0;\n });\n const itemThatRequiresCustomOrderForm = (activatableItems || []).find((activatableItem) => {\n const isSelected =\n selectedItems.indexOf(activatableItem.appId) >= 0 &&\n (activatableItem.usesOrderForm || activatableItem.usesCustomPricing);\n const active = isAppActive(activatableItem.appId, appStatus);\n return isSelected && (!active || activatableItem.allowMultipleActivations);\n });\n if (itemsThatRequiresDynamicOrderForm.length > 0) {\n // TODO: resolve dynamic order forms in a chain when there are multiple apps\n if (itemsThatRequiresDynamicOrderForm.length > 1) {\n throw Error('Please activate these products separately.');\n }\n return OrderFormType.DYNAMIC;\n } else if (itemThatRequiresCustomOrderForm) {\n return OrderFormType.CUSTOM; // Might also be just COMMON\n } else {\n return OrderFormType.NONE;\n }\n}\n\nfunction getAppsWithoutParents(activatableItems: ActivatableItem[]): ActivatableItem[] {\n return (activatableItems || []).filter((item) => !item.parentAppId);\n}\n\nfunction buildChildMap(activatableItems: ActivatableItem[]): Map {\n return (activatableItems || []).reduce((acc, current) => {\n const currentArray = acc.get(current.parentAppId) || [];\n currentArray.push(current);\n acc.set(current.parentAppId, currentArray);\n return acc;\n }, new Map());\n}\n\nfunction setChildAppsOnClonedParentApps(\n parentApps: ActivatableItem[],\n childMap: Map,\n): ActivatableItem[] {\n return parentApps.map((app) => {\n const children = childMap.get(app.appId) || [];\n return { ...app, children: children };\n });\n}\n\nexport function applyRestrictedReasonToChildren(parentApps: ActivatableItem[]): ActivatableItem[] {\n (parentApps || []).forEach((app) => {\n app.children = (app.children || []).map((child) => {\n return { ...child, restrictedReason: app.restrictedReason || child.restrictedReason };\n });\n });\n return parentApps;\n}\n\nexport interface ResellerItemWithPricing {\n pricing: ProductPricing;\n pricingPurchaseCost?: PurchaseCost;\n resellerItem: ResellerItem;\n appPrice: AppPrice;\n}\n\nexport interface ResellerItemPricingWithActiveStatus extends ResellerItemWithPricing {\n activeStatuses: ActivationStatusesInterface[];\n}\n\nfunction pairResellerItemsWithPricing(\n resellerItems: ResellerItem[],\n pricingMap: Map,\n appPriceMap: Map,\n): ResellerItemWithPricing[] {\n return (resellerItems || []).map((resellerItem) => {\n const pricing = pricingMap ? pricingMap.get(resellerItem.billingId) : undefined;\n\n const appPrice = appPriceMap\n ? appPriceMap.get(resellerItem.addonId || resellerItem.appId)?.pricesForContexts['wholesale']\n : undefined;\n return {\n resellerItem: resellerItem,\n pricing: pricing,\n appPrice: appPrice,\n };\n });\n}\n\nexport function pairResellerPricingWithActiveStatuses(\n resellerItemsWithPricing: ResellerItemWithPricing[],\n activeStatuses: ActivationStatusesInterface[],\n pendingActivations: PendingActivationDisplay[],\n): ResellerItemPricingWithActiveStatus[] {\n return (resellerItemsWithPricing || []).map((resellerItemWithPricing) => {\n const id = getResellerItemUniqueId(resellerItemWithPricing.resellerItem);\n let activeStates = [];\n if (activeStatuses) {\n activeStates = activeStatuses.filter((status) => status.appId === id);\n }\n let pendingStates = [];\n if (pendingActivations) {\n pendingStates = pendingActivations.filter((pending) => pending.itemId === id);\n }\n // pendingStates should contain activeStates (they both have the accounts stuff in them), so we should just be able to use pending states for all pending\n // remove all activeStates that are pending and append the converted pendingStates to the array\n // `pendingStatesWithoutRejected` will filter rejected product out since it's not \"Pending\". And allowed user activated the same product again once it rejected.\n // status 2 = PENDING\n const activeStatesWithoutPending = activeStates.filter((state) => state.status !== 2);\n const pendingStatesWithoutRejected = pendingStates.filter(\n (state) => state.status !== PendingActivationStatus.REJECTED,\n );\n const convertedPendingStates = pendingStatesWithoutRejected.map(\n transformPendingActivationDisplayToActivationStatus,\n );\n const statuses = [...activeStatesWithoutPending, ...convertedPendingStates];\n return {\n ...resellerItemWithPricing,\n activeStatuses: statuses,\n };\n });\n}\n\n/**\n * transformPendingActivationDisplayToActivationStatus transforms a PendingActivationDisplay into an ActivationStatusesInterface\n * @param {PendingActivationDisplay} pendingState - Display interface for pending activation\n * @returns {ActivationStatusesInterface}\n */\nfunction transformPendingActivationDisplayToActivationStatus(\n pendingState: PendingActivationDisplay,\n): ActivationStatusesInterface {\n return {\n appId: pendingState.itemId,\n // pending status\n status: 2,\n } as ActivationStatusesInterface;\n}\n\nexport function addActivationToItems(\n activatableItems: ActivatableItem[],\n activations: Activation[],\n): ActivatableItem[] {\n const currentTime = new Date();\n return (activatableItems || []).map((activatableItem) => {\n const foundActivation = activations.find((actiavtion) => actiavtion.appId === activatableItem.appId);\n activatableItem.isTrial = foundActivation && foundActivation.trial;\n if (foundActivation && foundActivation.deactivation) {\n activatableItem.trialStatus =\n foundActivation.deactivation > currentTime ? ActivationStatus.ACTIVATED : ActivationStatus.CANCELED;\n }\n if (foundActivation && foundActivation.editionId) {\n activatableItem.editionId = foundActivation.editionId;\n activatableItem.editionData.currentlyActiveEditionId = foundActivation.editionId;\n }\n return activatableItem;\n });\n}\n\n/**\n * assembleActiveProducts assembles product information for active items on the account\n * @param {ResellerItem[]} items - List of items that could be active\n * @param {AppsAndAddonsActivationStatusesInterface[]} appStatuses - Status objects for active items on the account\n * @returns {ProductBoxItems[]}\n */\nexport function assembleActiveProducts(\n items: ResellerItem[],\n appStatuses: ActivationStatusesInterface[],\n): ProductBoxItems[] {\n const products: ProductBoxItems[] = [];\n appStatuses.forEach((appStatus) => {\n const activeItems = items.filter((item) => checkIfShouldTreatItemAsActive(item.addonId || item.appId, appStatus));\n activeItems.forEach((activeItem) => {\n products.push({\n appId: activeItem.addonId || activeItem.appId,\n name: activeItem.name,\n icon: activeItem.icon,\n count: appStatus.count,\n status: appStatus.status,\n } as ProductBoxItems);\n });\n });\n return products;\n}\n\n/**\n * checkIfShouldTreatItemAsActive determines whether or not an ite should be treated as active\n * @param {string} itemAppOrAddonId - Unique identifier of the item to be checked\n * @param {AppsAndAddonsActivationStatusesInterface} appStatus - Status object for the item on the account\n * @returns {boolean}\n */\nexport function checkIfShouldTreatItemAsActive(\n itemAppOrAddonId: string,\n appStatus: ActivationStatusesInterface,\n): boolean {\n if (!appStatus) {\n return false;\n }\n const statusMatchesItemAppOrAddonId = itemAppOrAddonId === appStatus.appId;\n const isActivated = appStatus.status === AppAndAddonActivationStatus.ACTIVATED;\n const isPending = appStatus.status === AppAndAddonActivationStatus.PENDING;\n const isCancelled = appStatus.status === AppAndAddonActivationStatus.CANCELED;\n return statusMatchesItemAppOrAddonId && (isActivated || isPending || isCancelled);\n}\n\n/**\n * mergeActivationsIntoProducts merges a list of activations into products for currently active items on the business\n * @param {Activation[]} activations - Activations for currently active items on the business\n * @param {ProductBoxItems[]} products - Product representations of active items on the business\n * @param {ProductEditionMap} editionMap - Map of edition data for each product\n * @returns {ProductBoxItems[]}\n */\nexport function mergeActivationsIntoProducts(\n activations: Activation[],\n products: ProductBoxItems[],\n editionMap: ProductEditionMap,\n): ProductBoxItems[] {\n const currentTime = new Date();\n\n const productBoxItems = products.map((product) => {\n // Handle pending activations\n if (product.status === ActivationStatus.PENDING) {\n return product;\n }\n\n return (\n activations\n .filter(\n // Find the correct addon or app\n (activation) =>\n activation.addonId ? activation.addonId === product.appId : activation.appId === product.appId,\n )\n // Dedupe (for addons)\n .filter(\n (activation, index, self) =>\n !activation.addonId || self.findIndex((a) => a.appId === activation.appId) === index,\n )\n // Create a ProductBoxItems with the descriptor\n .map((activation) => {\n if (activation) {\n product.isTrial = activation.trial;\n if (activation.deactivation) {\n product.trialStatus =\n activation.deactivation > currentTime ? ActivationStatus.ACTIVATED : ActivationStatus.CANCELED;\n }\n if (isValidEditionId(activation.editionId)) {\n product.editionId = activation.editionId;\n product.editionName = getEditionName(product.appId, activation.editionId, editionMap);\n }\n return { ...product, descriptor: activation.activationDescriptor };\n }\n return { ...product };\n })\n );\n });\n\n // Map over every product\n const result = productBoxItems.flat();\n\n return result;\n}\n\n/**\n * generateSelectedItemQueryParameters assembles the information about selected items into the SelectedItemQueryParams object\n * @param {ActivatableItem[]} activatableItems - List of activatable items for the account\n * @param {SelectedItems} selectedItems - Currently selected items with their quantities and edition information\n * @param {string} partnerId - Unique identifier of the partner\n * @param {string} accountGroupId - Unique identifier of the business\n * @param {ProductBoxItems[]} activeItems - Currently active items on the business\n * @param {string} navigationSource - String describing how the user got into the activation flow\n * @returns {SelectedItemQueryParams}\n */\nexport function generateSelectedItemQueryParameters(\n activatableItems: ActivatableItem[],\n selectedItems: SelectedItems,\n partnerId: string,\n accountGroupId: string,\n activeItems: ProductBoxItems[],\n navigationSource: string,\n): SelectedItemQueryParams {\n const appIdsAndQuantities: ItemIdAndQuantity[] = [];\n const addonIdsAndQuantities: ItemIdAndQuantity[] = [];\n if (selectedItems) {\n selectedItems.forEach((quantityEditionPair, id) => {\n const isActive = activeItems.some((i) => i.appId === id && !i.isTrial);\n const item = activatableItems.find((i) => i.appId === id);\n if (item && quantityEditionPair.quantity > 0 && (!isActive || item.allowMultipleActivations)) {\n if (item.parentAppId) {\n addonIdsAndQuantities.push({ quantity: quantityEditionPair.quantity, addonId: item.appId });\n } else {\n appIdsAndQuantities.push({\n quantity: quantityEditionPair.quantity,\n appId: item.appId,\n editionId: quantityEditionPair.editionId,\n });\n }\n }\n });\n }\n\n return {\n accountGroupId: accountGroupId,\n appIds: JSON.stringify(appIdsAndQuantities),\n addonIds: JSON.stringify(addonIdsAndQuantities),\n partnerId: partnerId,\n navigationSource: navigationSource,\n };\n}\n\n/**\n * assembleAppCartItems assembles the information about selected items and their activation data for display in the cart\n * @param {SelectedItems} selectedItems - Currently selected items with their quantities and edition information\n * @param {ActivatableItem[]} activatableItems - List of activatable items for the account\n * @param {ProductEditionMap} editionMap - Map of product edition data\n * @param {AppsAndAddonsActivationStatusesInterface[]} appStatuses - Status objects for active items on the account\n * @param {Activation[]} activations - Activation instances for the active items on the account\n * @param {Date} currentTime - Current time\n * @returns {ActivatableItemCount[]}\n */\nexport function assembleAppCartItems(\n selectedItems: SelectedItems,\n activatableItems: ActivatableItem[],\n editionMap: ProductEditionMap,\n appStatuses: ActivationStatusesInterface[],\n activations: Activation[],\n currentTime: Date,\n): ActivatableItemCount[] {\n const appCartItems: ActivatableItemCount[] = [];\n selectedItems.forEach((quantityEditionPair, id) => {\n const indexOfSelectedItem = activatableItems.findIndex((item) => item.appId === id);\n if (indexOfSelectedItem < 0) {\n return;\n }\n let appStatus = appStatuses.find((a) => a.appId === id);\n if (!appStatus || !appStatus.status) {\n appStatus = { status: ActivationStatus.NOT_SPECIFIED.valueOf() };\n }\n const activation = activations.find((act) => act.appId === id);\n const isTrial = activation && activation.trial;\n let trialStatus = ActivationStatus.ACTIVATED;\n if (activation && activation.deactivation) {\n trialStatus = activation.deactivation > currentTime ? ActivationStatus.ACTIVATED : ActivationStatus.CANCELED;\n }\n\n if (quantityEditionPair.editionId) {\n activatableItems[indexOfSelectedItem].billingId = getEditionBillingId(\n id,\n quantityEditionPair.editionId,\n editionMap,\n );\n }\n\n const appCartItem: ActivatableItemCount = {\n activatableItem: activatableItems[indexOfSelectedItem],\n quantity: quantityEditionPair.quantity,\n editionId: quantityEditionPair.editionId,\n editionName: getEditionName(id, quantityEditionPair.editionId, editionMap),\n status: appStatus.status.valueOf(),\n isTrial: isTrial,\n trialStatus: trialStatus,\n };\n appCartItems.push(appCartItem);\n });\n return appCartItems;\n}\n\n/**\n * assembleActivatablePackages assembles the information about available packages, selected items and their activation data\n * @param {Package[]} packages - Packages that partner has available for the account\n * @param {ActivatableItem[]} activatableItems - List of activatable items for the account\n * @param {AppsAndAddonsActivationStatusesInterface[]} appStatuses - Status objects for active items on the account\n * @param {Activation[]} activations - Activation instances for the active items on the account\n * @returns {ActivatablePackage[]}\n */\nexport function assembleActivatablePackages(\n packages: Package[],\n activatableItems: ActivatableItem[],\n appStatuses: ActivationStatusesInterface[],\n activations: Activation[],\n): ActivatablePackage[] {\n const activatablePackages: ActivatablePackage[] = [];\n for (const pkg of packages || []) {\n const activatablePkg = generateActivatablePackage(pkg, activatableItems, appStatuses, activations);\n if (activatablePkg) {\n activatablePackages.push(activatablePkg);\n }\n }\n return activatablePackages;\n}\n\n/**\n * generateActivatablePackage constructs a single ActavatablePackage from available activation data on the account\n * @param {Package} pkg - Input package\n * @param {ActivatableItem[]} activatableItems - List of activatable items for the account\n * @param {AppsAndAddonsActivationStatusesInterface[]} appStatuses - Status objects for active items on the account\n * @param {Activation[]} activations - Activation instances for the active items on the account\n * @returns {ActivatablePackage}\n */\nfunction generateActivatablePackage(\n pkg: Package,\n activatableItems: ActivatableItem[],\n appStatuses: ActivationStatusesInterface[],\n activations: Activation[],\n): ActivatablePackage {\n if (pkg.lineItems && pkg.lineItems.lineItems && pkg.lineItems.lineItems.length > 0) {\n let restricted = false;\n const activatablePkg = initializeActivatablePackage(pkg);\n\n for (const li of pkg.lineItems.lineItems) {\n const activatableItemActivationPair = getActivationAndActivatableItem(li.id, activatableItems, activations);\n if (!restricted) {\n restricted = checkIfRestricted(activatableItemActivationPair.activatableItem);\n }\n const activatableItemCount = buildActivatableItemCount(\n li.id,\n activatableItemActivationPair,\n appStatuses,\n li.quantity,\n li,\n );\n if (activatableItemCount) {\n activatablePkg.activatableItemCount.push(activatableItemCount);\n }\n }\n\n activatablePkg.restricted = restricted;\n return activatablePkg;\n }\n}\n\n/**\n * initializeActivatablePackage initializes an ActivatablePackage from a Package\n * @param {Package} pkg - Activatable item to be checked\n * @returns {ActivatablePackage}\n */\nfunction initializeActivatablePackage(pkg: Package): ActivatablePackage {\n if (!pkg) {\n return null;\n }\n return {\n name: pkg.name,\n packageId: pkg.packageId,\n icon: pkg.icon,\n activatableItemCount: [],\n };\n}\n\n/**\n * checkIfRestricted checks if an ActivatableItem is restricted\n * @param {ActivatableItem} activatableItem - Activatable item to be checked\n * @returns {boolean}\n */\nexport function checkIfRestricted(activatableItem: ActivatableItem): boolean {\n return !!(activatableItem && activatableItem.restrictedReason);\n}\n\n/**\n * getAppStatus returns the AppStatus object for a given app or addon id from a list of AppStatuses\n * @param {string} appOrAddonId - App or addon id of the product whose status is sought\n * @param {AppsAndAddonsActivationStatusesInterface[]} appStatuses - Status objects for active items on the account\n * @returns {AppsAndAddonsActivationStatusesInterface}\n */\nexport function getAppStatus(\n appOrAddonId: string,\n appStatuses: ActivationStatusesInterface[],\n): ActivationStatusesInterface {\n if (!appStatuses) {\n return { status: ActivationStatus.NOT_SPECIFIED.valueOf() };\n }\n let appStatus = appStatuses.find((a) => a.appId === appOrAddonId);\n if (!appStatus || !appStatus.status) {\n appStatus = { status: ActivationStatus.NOT_SPECIFIED.valueOf() };\n }\n return appStatus;\n}\n\nexport interface ActivatableItemActivationPair {\n activatableItem: ActivatableItem;\n activation: Activation;\n}\n\n/**\n * getActivationAndActivatableItem returns the ActivatableItem and Activation objects for a given app or addon id from list of those objects\n * @param {string} appOrAddonId - App or addon id of the product whose status is sought\n * @param {ActivatableItem[]} activatableItems - List of activatable items for the account\n * @param {Activation[]} activations - Activation instances for the active items on the account\n * @returns {ActivatableItemActivationPair}\n */\nexport function getActivationAndActivatableItem(\n appOrAddonId: string,\n activatableItems: ActivatableItem[],\n activations: Activation[],\n): ActivatableItemActivationPair {\n let activatableItem = null;\n let activation = null;\n if (activatableItems) {\n activatableItem = activatableItems.find((item) => item.appId === appOrAddonId) || null;\n }\n if (activations) {\n activation = activations.find((act) => act.appId === appOrAddonId) || null;\n }\n return {\n activatableItem,\n activation,\n };\n}\n\n/**\n * constructActivatableItemCount returns the ActivatableItem and Activation objects for a given app or addon id from list of those objects\n * @param {string} appOrAddonId - App or addon id of the product whose status is sought\n * @param {ActivatableItemActivationPair} activatableItemActivationPair - Pair of activatable item and activation\n * @param {number} quantity - Quantity of app or addon in the package\n * @returns {ActivatableItemCount}\n */\nexport function buildActivatableItemCount(\n appOrAddonId: string,\n activatableItemActivationPair: ActivatableItemActivationPair,\n appStatuses: ActivationStatusesInterface[],\n quantity: number,\n lineItem: LineItem,\n): ActivatableItemCount {\n const appStatus = getAppStatus(appOrAddonId, appStatuses);\n let trial = false;\n const { activatableItem, activation } = activatableItemActivationPair;\n if (activation) {\n trial = activation.trial;\n }\n\n if (activatableItem) {\n activatableItem.isTrial = trial;\n return {\n activatableItem: activatableItem,\n quantity: quantity || 1,\n status: appStatus.status.valueOf(),\n editionId: lineItem ? lineItem.editionId : '',\n isTrial: trial,\n };\n }\n return null;\n}\n\n/**\n * extractQueryParameters extracts the information about selected items contained in the query parameters\n * @param {Params} parameters - Query parameters containing information about selected items\n * @returns {UniqueIdToItemIdAndQuantityMap}\n */\nexport function extractQueryParameters(parameters: Params): UniqueIdToItemIdAndQuantityMap {\n if (!parameters) {\n return new Map();\n }\n let appIdsAndQuantity: ItemIdAndQuantity[] = [];\n if (parameters.appIds) {\n appIdsAndQuantity = JSON.parse(parameters.appIds);\n if (appIdsAndQuantity.length) {\n const firstItem = appIdsAndQuantity[0];\n const probablyNotType = typeof firstItem.appId === 'undefined' && firstItem.addonId === 'undefined';\n if (probablyNotType) {\n // TODO get rid of this catch by editing how account create sends its url params\n appIdsAndQuantity = parameters.appIds.split(',');\n }\n }\n }\n const addonIdsAndQuantity: ItemIdAndQuantity[] = parameters.addonIds ? JSON.parse(parameters.addonIds) : [];\n\n return appIdsAndQuantity.concat(addonIdsAndQuantity).reduce((m, itemQuantity) => {\n m.set(getResellerItemUniqueId(itemQuantity), itemQuantity);\n return m;\n }, new Map() as UniqueIdToItemIdAndQuantityMap);\n}\n\n/**\n * convertExtractedQueryParamsToSelectedItems converts extracted information about selected items to selected items form\n * @param {UniqueIdToItemIdAndQuantityMap} itemQuantityMap - Information about selected items\n * @returns {SelectedItem[]}\n */\nexport function convertExtractedQueryParamsToSelectedItems(\n itemQuantityMap: UniqueIdToItemIdAndQuantityMap,\n): SelectedItem[] {\n if (!itemQuantityMap) {\n return [];\n }\n return Array.from(itemQuantityMap.keys()).reduce((arr, key) => {\n // Some pro editions have an empty edition ID.\n let editionId = itemQuantityMap.get(key).editionId;\n if (!editionId && editionId !== '') {\n editionId = null;\n }\n arr.push({ appId: key, quantity: itemQuantityMap.get(key).quantity, editionId: editionId } as SelectedItem);\n return arr;\n }, []);\n}\n\n/**\n * extractIdsOfItemsUsingEditions extracts the app ids of reseller items that use editions\n * @param {ResellerItem[]} resellerItems - Query parameters containing information about selected items\n * @returns {string[]}\n */\nexport function extractIdsOfItemsUsingEditions(resellerItems: ResellerItem[]): string[] {\n if (!resellerItems) {\n return [];\n }\n return resellerItems\n .filter((ri) => !ri.addonId)\n .filter((ri) => ri.usesEditions)\n .map((ri) => ri.appId);\n}\n\n/**\n * getBillingId extracts the billingId of a resellerItem, it can be from the resellerItem if the resellerItem is not editioned,\n * or from a list of editions according to the editionId on the resellerItem.\n * @param {ResellerItem} item - Query parameters containing information about selected reseller item\n * @param {Edition[]} productEditions - Query parameters containing information about editions\n * @returns {string}\n */\nexport function getBillingId(item: ResellerItem, productEditions: Edition[]): string {\n // If it's not an edition, we don't need to search for the billing ID\n if (!item.editionId) {\n return item.billingId;\n }\n\n const edition = productEditions.find((e) => e.editionId === item.editionId);\n return edition ? edition.billingId : item.billingId;\n}\n", "import { HttpErrorResponse } from '@angular/common/http';\nimport { Inject, Injectable } from '@angular/core';\nimport { ProductPricing } from '@galaxy/billing';\nimport { retryer } from '@vendasta/rx-utils';\nimport { BilledProduct } from '@vendasta/shared';\nimport { ResellerItem } from '@vendasta/store';\nimport { forkJoin as observableForkJoin, Observable, of as observableOf, throwError } from 'rxjs';\nimport { catchError, filter, map, shareReplay, switchMap, withLatestFrom } from 'rxjs/operators';\nimport { pricingOnlyBilledProduct } from '../billing/pricing-adapter';\nimport { PricingService } from '../billing/pricing.service';\nimport { ResellerItemService } from './reseller-item.service';\nimport { chunk } from './utils';\n\n@Injectable({ providedIn: 'root' })\nexport class BilledProductService {\n resellerItems$: Observable;\n billedProductsLoaded: Map = new Map();\n retailProductsLoaded: Map = new Map();\n private billedProductMap$: Observable>;\n private _billedProducts$: Observable;\n private retailProductMap$: Observable>;\n private _retailProducts$: Observable;\n\n private errorStrategy$ = retryer({\n maxAttempts: 3,\n retryDelay: 200,\n timeoutMilliseconds: 10000,\n customRetryChecker: (errResp: HttpErrorResponse) => errResp.status === 503 || errResp.status === 504,\n });\n\n constructor(\n private resellerItemService: ResellerItemService,\n @Inject('PARTNER_ID') private partnerId$: Observable,\n private pricingService: PricingService,\n ) {\n this.resellerItems$ = this.resellerItemService.getPartnerData().pipe(shareReplay(1));\n\n const products$ = this.resellerItems$.pipe(\n filter((resellerItems) => Boolean(resellerItems) && resellerItems.length > 0),\n map((resellerItems) => {\n return (resellerItems || []).map((item) => item.billingId);\n }),\n map((skus) => {\n if (!skus || skus.length === 0) {\n return [];\n }\n return chunk(skus, 100);\n }),\n withLatestFrom(partnerId$),\n );\n this._billedProducts$ = products$.pipe(\n switchMap(([skuChunks, partnerId]) => {\n if (!skuChunks || skuChunks.length === 0) {\n return observableOf([]);\n }\n const calls: Observable[] = skuChunks.map((thisChunk) => {\n return this.pricingService.getMultiProductPricing(partnerId, thisChunk).pipe(\n this.errorStrategy$,\n map((pricingMap: { [sku: string]: ProductPricing }) => {\n const billedProducts = [];\n const keys = Object.keys(pricingMap);\n keys.forEach((key) => {\n if (pricingMap[key]) {\n billedProducts.push(pricingOnlyBilledProduct(key, pricingMap[key]));\n this.billedProductsLoaded.set(key, true);\n }\n });\n return billedProducts;\n }),\n ) as Observable;\n });\n return observableForkJoin(calls);\n }),\n map(this.flattenedBilledProducts),\n map(this.filterBilledProducts),\n catchError(this.handleError),\n shareReplay(1),\n );\n\n this.billedProductMap$ = this._billedProducts$.pipe(\n map((billedProducts) => {\n const billedProductMap = new Map();\n billedProducts.forEach((billedProduct) => {\n if (billedProduct) {\n billedProductMap.set(billedProduct.productId, billedProduct);\n }\n });\n return billedProductMap;\n }),\n shareReplay(1),\n );\n this._retailProducts$ = products$.pipe(\n switchMap(([skuChunks, partnerId]) => {\n if (!skuChunks || skuChunks.length === 0) {\n return observableOf([]);\n }\n const calls: Observable[] = skuChunks.map((thisChunk) => {\n return this.pricingService.getMultiRetailPricing(partnerId, thisChunk).pipe(\n this.errorStrategy$,\n map((pricingMap: { [sku: string]: ProductPricing }) => {\n const retailProducts = [];\n const keys = Object.keys(pricingMap);\n keys.forEach((key) => {\n if (pricingMap[key]) {\n retailProducts.push(pricingOnlyBilledProduct(key, pricingMap[key]));\n this.retailProductsLoaded.set(key, true);\n }\n });\n return retailProducts;\n }),\n ) as Observable;\n });\n return observableForkJoin(calls);\n }),\n map(this.flattenedBilledProducts),\n map(this.filterBilledProducts),\n catchError(this.handleError),\n shareReplay(1),\n );\n this.retailProductMap$ = this._retailProducts$.pipe(\n map((retailProducts) => {\n const retailProductMap = new Map();\n retailProducts.forEach((retailProduct) => {\n if (retailProduct) {\n retailProductMap.set(retailProduct.productId, retailProduct);\n }\n });\n return retailProductMap;\n }),\n shareReplay(1),\n );\n }\n private flattenedBilledProducts(results: BilledProduct[][]): BilledProduct[] {\n const flatProducts: BilledProduct[] = [];\n results.forEach((bps) => {\n flatProducts.push(...bps);\n });\n return flatProducts;\n }\n private filterBilledProducts(products: BilledProduct[]): BilledProduct[] {\n if (!products) {\n return [];\n }\n return products.filter(Boolean);\n }\n private handleError(err: any): Observable {\n console.error(err);\n return throwError(err);\n }\n getBillableProduct(sku: string): Observable {\n if (!sku) {\n return observableOf(undefined);\n }\n return this.partnerId$.pipe(\n switchMap((partnerId) => this.pricingService.getProductPricing(partnerId, sku)),\n map((pricingMap: ProductPricing) => {\n if (pricingMap) {\n return pricingOnlyBilledProduct(sku, pricingMap);\n }\n return undefined;\n }),\n shareReplay(1),\n );\n }\n\n getBillableProducts(skus: string[]): Observable {\n if (!skus || skus.length === 0) {\n return observableOf([]);\n }\n return this.billedProductMap$.pipe(\n map((billedProductMap) => {\n return skus.map((sku) => {\n return billedProductMap.get(sku);\n });\n }),\n );\n }\n getRetailProducts(skus: string[]): Observable {\n if (!skus || skus.length === 0) {\n return observableOf([]);\n }\n return this.retailProductMap$.pipe(\n map((retailProductMap) => {\n return skus.map((sku) => {\n return retailProductMap.get(sku);\n });\n }),\n );\n }\n}\n"], "mappings": "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", "names": ["isValidEditionId", "editionId", "ActivationStatus", "OrderFormType", "convertResellerItemsToFlatActivatableItems", "resellerItems", "pricingMap", "country", "partnerFeatures", "activeStates", "editionsMap", "pendingActivations", "appPriceMap", "partnerCurrency", "resellerItemsWithPricing", "pairResellerItemsWithPricing", "pairResellerPricingWithActiveStatuses", "map", "ri", "idToCheck", "resellerItem", "addonId", "appId", "editions", "get", "convertResellerItemToActivatableItem", "pricing", "pricingPurchaseCost", "activeStatuses", "appPrice", "nestActivatableItems", "activatableItems", "length", "parentApps", "getAppsWithoutParents", "childMap", "buildChildMap", "nestedItems", "setChildAppsOnClonedParentApps", "applyRestrictedReasonToChildren", "activeState", "valueTotalCost", "totalCost", "convertedPricing", "convertPricingToTablePricing", "currency", "frequency", "billingFrequency", "prices", "price", "purchaseCostTotal", "withinCountryRestrictions", "isCountryAllowedByResellerItemCountry", "partnerFeaturesValid", "partnerHasRequiredFeatures", "restrictedReason", "appRules", "restrictions", "appRequirement", "rules", "requiredAppIds", "appIds", "requiredEditions", "rei", "editionId", "parentAppId", "getResellerItemUniqueId", "billingId", "name", "icon", "allowMultipleActivations", "usesOrderForm", "resellerItemUsesOrderForm", "editionData", "setUpEditionsData", "usesCustomPricing", "usesEditions", "getEditionBillingId", "editionMap", "edition", "getEditionName", "editionName", "getEditionDisplayName", "appName", "requiredFeatures", "whitelist", "every", "requiredFeature", "includes", "countryRestrictions", "blacklist", "c", "toUpperCase", "indexOf", "sortActivatableItems", "sortDirection", "items", "slice", "item", "__spreadValues", "children", "sort", "child1", "child2", "sortByName", "child1Name", "child2Name", "localeCompare", "doItemsHaveRestrictionReasons", "some", "activatableItem", "Boolean", "filterRestrictedItems", "filter", "filteredItem", "searchActivatableItems", "searchTerm", "trim", "matchedAtRoot", "uppercaseItemName", "uppercaseItemId", "matchedAtChildren", "__spreadProps", "m", "Map", "forEach", "set", "has", "Array", "from", "values", "pageArray", "array", "pageEvent", "startPageSize", "index", "pageSize", "pageIndex", "offset", "Math", "min", "getSelectedAppDependents", "selectedId", "activatableItems", "filter", "activatableItem", "requiredAppIds", "some", "appId", "getSelectedItemChildren", "productId", "selectedActivatableItem", "length", "children", "updateSelectedItems", "selectedItemsMap", "current", "event", "clear", "Map", "selected", "data", "items", "appStatus", "quantityEditionPair", "quantity", "editionId", "set", "delete", "removeActivatedAppsWithoutDependentsOrAddons", "isRequiredAppActive", "productId", "statuses", "appStatus", "find", "status", "appId", "activated", "AppAndAddonActivationStatus", "ACTIVATED", "pending", "PENDING", "cancelled", "CANCELED", "flattenActivatableItems", "activatableItems", "reduce", "result", "activatableItem", "concat", "children", "isAppMultiactivatable", "item", "allowMultipleActivations", "isTrialActivatableItem", "isTrial", "isActivatableItemWithEditions", "editionData", "usesEditions", "removeActivatedAppsWithoutDependentsOrAddons", "selectedItemsMap", "current", "items", "flattenedItems", "flattenActivatableItems", "forEach", "_", "appId", "isRequiredAppActive", "appStatus", "isAppMultiactivatable", "isTrialActivatableItem", "isActivatableItemWithEditions", "dependants", "getSelectedAppDependents", "addons", "getSelectedItemChildren", "hasDependants", "length", "some", "dependant", "has", "hasAddons", "addon", "delete", "filterResellerItemQuantity", "resellerItemMap", "resellerQuantityMap", "appStatuses", "activations", "filteredMap", "Map", "Array", "from", "keys", "forEach", "key", "item", "get", "isTrial", "activation", "find", "act", "appId", "getResellerItemUniqueId", "trial", "allowMultipleActivations", "isAppActive", "set", "as", "status", "active", "AppAndAddonActivationStatus", "ACTIVATED", "pending", "PENDING", "cancelled", "CANCELED", "doItemsRequireOrderForm", "selectedItems", "activatableItems", "appStatus", "itemsThatRequiresDynamicOrderForm", "DynamicOrderFormAppIds", "filter", "dynamicAppId", "indexOf", "itemThatRequiresCustomOrderForm", "activatableItem", "isSelected", "usesOrderForm", "usesCustomPricing", "length", "Error", "OrderFormType", "DYNAMIC", "CUSTOM", "NONE", "getAppsWithoutParents", "parentAppId", "buildChildMap", "reduce", "acc", "current", "currentArray", "push", "setChildAppsOnClonedParentApps", "parentApps", "childMap", "map", "app", "children", "__spreadProps", "__spreadValues", "applyRestrictedReasonToChildren", "child", "restrictedReason", "pairResellerItemsWithPricing", "resellerItems", "pricingMap", "appPriceMap", "resellerItem", "pricing", "billingId", "undefined", "appPrice", "addonId", "pricesForContexts", "pairResellerPricingWithActiveStatuses", "resellerItemsWithPricing", "activeStatuses", "pendingActivations", "resellerItemWithPricing", "id", "activeStates", "pendingStates", "itemId", "activeStatesWithoutPending", "state", "convertedPendingStates", "PendingActivationStatus", "REJECTED", "transformPendingActivationDisplayToActivationStatus", "statuses", "pendingState", "addActivationToItems", "currentTime", "Date", "foundActivation", "actiavtion", "deactivation", "trialStatus", "ActivationStatus", "editionId", "editionData", "currentlyActiveEditionId", "assembleActiveProducts", "items", "products", "checkIfShouldTreatItemAsActive", "activeItem", "name", "icon", "count", "itemAppOrAddonId", "statusMatchesItemAppOrAddonId", "isActivated", "isPending", "isCancelled", "mergeActivationsIntoProducts", "editionMap", "product", "index", "self", "findIndex", "a", "isValidEditionId", "editionName", "getEditionName", "descriptor", "activationDescriptor", "flat", "generateSelectedItemQueryParameters", "partnerId", "accountGroupId", "activeItems", "navigationSource", "appIdsAndQuantities", "addonIdsAndQuantities", "quantityEditionPair", "isActive", "some", "i", "quantity", "appIds", "JSON", "stringify", "addonIds", "assembleAppCartItems", "appCartItems", "indexOfSelectedItem", "NOT_SPECIFIED", "valueOf", "getEditionBillingId", "appCartItem", "assembleActivatablePackages", "packages", "activatablePackages", "pkg", "activatablePkg", "generateActivatablePackage", "lineItems", "restricted", "initializeActivatablePackage", "li", "activatableItemActivationPair", "getActivationAndActivatableItem", "checkIfRestricted", "activatableItemCount", "buildActivatableItemCount", "packageId", "getAppStatus", "appOrAddonId", "lineItem", "extractQueryParameters", "parameters", "appIdsAndQuantity", "parse", "firstItem", "split", "addonIdsAndQuantity", "concat", "m", "itemQuantity", "convertExtractedQueryParamsToSelectedItems", "itemQuantityMap", "arr", "extractIdsOfItemsUsingEditions", "ri", "usesEditions", "BilledProductService", "constructor", "resellerItemService", "partnerId$", "pricingService", "billedProductsLoaded", "Map", "retailProductsLoaded", "errorStrategy$", "retryer", "maxAttempts", "retryDelay", "timeoutMilliseconds", "customRetryChecker", "errResp", "status", "resellerItems$", "getPartnerData", "pipe", "shareReplay", "products$", "filter", "resellerItems", "Boolean", "length", "map", "item", "billingId", "skus", "chunk", "withLatestFrom", "_billedProducts$", "switchMap", "skuChunks", "partnerId", "observableOf", "calls", "thisChunk", "getMultiProductPricing", "pricingMap", "billedProducts", "keys", "Object", "forEach", "key", "push", "pricingOnlyBilledProduct", "set", "observableForkJoin", "flattenedBilledProducts", "filterBilledProducts", "catchError", "handleError", "billedProductMap$", "billedProductMap", "billedProduct", "productId", "_retailProducts$", "getMultiRetailPricing", "retailProducts", "retailProductMap$", "retailProductMap", "retailProduct", "results", "flatProducts", "bps", "products", "err", "console", "error", "throwError", "getBillableProduct", "sku", "getProductPricing", "undefined", "getBillableProducts", "get", "getRetailProducts", "\u0275\u0275inject", "ResellerItemService", "PricingService", "factory", "\u0275fac", "providedIn", "_BilledProductService"] }