@veloceapps/sdk 11.0.0-11 → 11.0.0-110

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.
Files changed (183) hide show
  1. package/cms/cms.actions.d.ts +94 -29
  2. package/cms/components/element-renderer/element-renderer.component.d.ts +3 -10
  3. package/cms/components/preview/preview.component.d.ts +5 -6
  4. package/cms/components/preview/preview.types.d.ts +0 -4
  5. package/cms/services/element-context.service.d.ts +0 -1
  6. package/cms/types/common.types.d.ts +2 -0
  7. package/cms/types/index.d.ts +0 -1
  8. package/cms/utils/path.utils.d.ts +1 -2
  9. package/cms/vendor-map.d.ts +18 -40
  10. package/core/index.d.ts +1 -1
  11. package/core/modules/configuration/index.d.ts +4 -4
  12. package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
  13. package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
  14. package/core/modules/configuration/services/configuration.service.d.ts +24 -52
  15. package/core/modules/configuration/services/guided-selling.service.d.ts +15 -0
  16. package/core/modules/configuration/services/test-mode-configuration.service.d.ts +26 -0
  17. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -5
  18. package/core/modules/configuration/types/configuration.types.d.ts +4 -2
  19. package/core/modules/configuration/types/index.d.ts +2 -0
  20. package/core/modules/flow-configuration/index.d.ts +0 -3
  21. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -38
  22. package/core/operators/filter-successful-execute.operator.d.ts +3 -0
  23. package/core/operators/index.d.ts +1 -0
  24. package/core/services/catalog-products.service.d.ts +11 -0
  25. package/core/services/flow-info.service.d.ts +27 -12
  26. package/core/services/flow-state-configuration.service.d.ts +9 -8
  27. package/core/services/flow-state.service.d.ts +12 -24
  28. package/core/services/index.d.ts +3 -3
  29. package/core/services/integration.state.d.ts +1 -1
  30. package/core/services/product-images.service.d.ts +3 -3
  31. package/core/services/runtime-settings.service.d.ts +1 -1
  32. package/core/services/sales-transaction.service.d.ts +27 -0
  33. package/core/types/flow-customization.types.d.ts +2 -2
  34. package/core/types/flow-state.types.d.ts +2 -2
  35. package/core/types/index.d.ts +0 -1
  36. package/core/utils/index.d.ts +2 -2
  37. package/core/utils/transaction-item.utils.d.ts +7 -0
  38. package/core/utils/transaction-item.worker.d.ts +8 -0
  39. package/esm2020/cms/cms.actions.mjs +93 -71
  40. package/esm2020/cms/cms.default.mjs +2 -3
  41. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
  42. package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +3 -3
  43. package/esm2020/cms/components/preview/preview.component.mjs +19 -28
  44. package/esm2020/cms/components/preview/preview.types.mjs +1 -1
  45. package/esm2020/cms/services/element-context.service.mjs +1 -1
  46. package/esm2020/cms/types/common.types.mjs +1 -1
  47. package/esm2020/cms/types/index.mjs +1 -2
  48. package/esm2020/cms/utils/element.utils.mjs +3 -3
  49. package/esm2020/cms/utils/elements-resolver.mjs +16 -5
  50. package/esm2020/cms/utils/path.utils.mjs +1 -10
  51. package/esm2020/cms/vendor-map.mjs +18 -18
  52. package/esm2020/core/core.module.mjs +7 -7
  53. package/esm2020/core/index.mjs +2 -2
  54. package/esm2020/core/modules/configuration/configuration.module.mjs +17 -4
  55. package/esm2020/core/modules/configuration/index.mjs +5 -5
  56. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -101
  57. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +69 -77
  58. package/esm2020/core/modules/configuration/services/configuration.service.mjs +125 -247
  59. package/esm2020/core/modules/configuration/services/guided-selling.service.mjs +62 -0
  60. package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +97 -0
  61. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
  62. package/esm2020/core/modules/configuration/types/configuration.types.mjs +1 -1
  63. package/esm2020/core/modules/configuration/types/index.mjs +3 -0
  64. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
  65. package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
  66. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +44 -128
  67. package/esm2020/core/operators/filter-successful-execute.operator.mjs +5 -0
  68. package/esm2020/core/operators/index.mjs +2 -0
  69. package/esm2020/core/services/catalog-products.service.mjs +25 -0
  70. package/esm2020/core/services/flow-info.service.mjs +82 -31
  71. package/esm2020/core/services/flow-state-configuration.service.mjs +55 -25
  72. package/esm2020/core/services/flow-state.service.mjs +58 -180
  73. package/esm2020/core/services/index.mjs +4 -4
  74. package/esm2020/core/services/integration.state.mjs +2 -2
  75. package/esm2020/core/services/product-images.service.mjs +8 -8
  76. package/esm2020/core/services/runtime-settings.service.mjs +3 -3
  77. package/esm2020/core/services/sales-transaction.service.mjs +67 -0
  78. package/esm2020/core/types/flow-customization.types.mjs +1 -1
  79. package/esm2020/core/types/flow-state.types.mjs +1 -1
  80. package/esm2020/core/types/index.mjs +1 -2
  81. package/esm2020/core/utils/index.mjs +3 -3
  82. package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
  83. package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
  84. package/esm2020/src/components/flow-header/flow-header.component.mjs +8 -12
  85. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +8 -12
  86. package/esm2020/src/flow-routing.module.mjs +12 -41
  87. package/esm2020/src/flow.component.mjs +5 -5
  88. package/esm2020/src/guards/flow.guard.mjs +13 -14
  89. package/esm2020/src/guards/product-unload.guard.mjs +7 -9
  90. package/esm2020/src/index.mjs +1 -3
  91. package/esm2020/src/pages/assets/assets.component.mjs +8 -9
  92. package/esm2020/src/pages/catalog/catalog.component.mjs +8 -9
  93. package/esm2020/src/pages/debug/debug.component.mjs +14 -23
  94. package/esm2020/src/pages/product/product.component.mjs +17 -91
  95. package/esm2020/src/pages/product/product.module.mjs +5 -5
  96. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
  97. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +8 -9
  98. package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
  99. package/esm2020/src/resolvers/pcm-model.resolver.mjs +12 -0
  100. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +64 -0
  101. package/esm2020/src/resolvers/ui-definition.resolver.mjs +44 -0
  102. package/esm2020/src/services/flow-dialog.service.mjs +10 -31
  103. package/esm2020/src/services/flow-router.service.mjs +16 -33
  104. package/esm2020/src/services/flow.service.mjs +15 -54
  105. package/esm2020/src/types/index.mjs +2 -3
  106. package/esm2020/src/types/route.types.mjs +1 -1
  107. package/fesm2015/veloceapps-sdk-cms.mjs +163 -309
  108. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  109. package/fesm2015/veloceapps-sdk-core.mjs +922 -1670
  110. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  111. package/fesm2015/veloceapps-sdk.mjs +197 -824
  112. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  113. package/fesm2020/veloceapps-sdk-cms.mjs +159 -300
  114. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  115. package/fesm2020/veloceapps-sdk-core.mjs +997 -1755
  116. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  117. package/fesm2020/veloceapps-sdk.mjs +197 -818
  118. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  119. package/package.json +1 -1
  120. package/src/components/flow-header/flow-header.component.d.ts +3 -3
  121. package/src/components/guided-selling/guided-selling.component.d.ts +3 -3
  122. package/src/flow-routing.module.d.ts +1 -2
  123. package/src/flow.component.d.ts +2 -2
  124. package/src/guards/product-unload.guard.d.ts +5 -6
  125. package/src/index.d.ts +0 -2
  126. package/src/pages/assets/assets.component.d.ts +3 -3
  127. package/src/pages/catalog/catalog.component.d.ts +3 -3
  128. package/src/pages/debug/debug.component.d.ts +2 -5
  129. package/src/pages/product/product.component.d.ts +6 -14
  130. package/src/pages/product/product.module.d.ts +1 -1
  131. package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
  132. package/src/pages/shopping-cart/shopping-cart.component.d.ts +3 -3
  133. package/src/resolvers/flow.resolver.d.ts +5 -6
  134. package/src/resolvers/pcm-model.resolver.d.ts +3 -0
  135. package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
  136. package/src/resolvers/ui-definition.resolver.d.ts +3 -0
  137. package/src/services/flow-dialog.service.d.ts +6 -8
  138. package/src/services/flow-router.service.d.ts +4 -6
  139. package/src/services/flow.service.d.ts +3 -7
  140. package/src/types/index.d.ts +1 -2
  141. package/src/types/route.types.d.ts +0 -5
  142. package/cms/plugins/configuration.plugin.d.ts +0 -23
  143. package/cms/types/configuration.types.d.ts +0 -21
  144. package/core/modules/configuration/helpers.d.ts +0 -6
  145. package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
  146. package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
  147. package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
  148. package/core/services/context.service.d.ts +0 -23
  149. package/core/services/quote-draft.service.d.ts +0 -50
  150. package/core/types/runtime.types.d.ts +0 -30
  151. package/core/utils/line-item.utils.d.ts +0 -25
  152. package/core/utils/line-item.worker.d.ts +0 -9
  153. package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
  154. package/esm2020/cms/types/configuration.types.mjs +0 -2
  155. package/esm2020/core/modules/configuration/helpers.mjs +0 -73
  156. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -45
  157. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
  158. package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
  159. package/esm2020/core/services/context.service.mjs +0 -91
  160. package/esm2020/core/services/quote-draft.service.mjs +0 -192
  161. package/esm2020/core/types/runtime.types.mjs +0 -16
  162. package/esm2020/core/utils/line-item.utils.mjs +0 -187
  163. package/esm2020/core/utils/line-item.worker.mjs +0 -19
  164. package/esm2020/src/guards/context.guard.mjs +0 -91
  165. package/esm2020/src/guards/index.mjs +0 -2
  166. package/esm2020/src/pages/remote/remote.component.mjs +0 -342
  167. package/esm2020/src/pages/remote/remote.module.mjs +0 -20
  168. package/esm2020/src/pages/remote/remote.types.mjs +0 -2
  169. package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
  170. package/esm2020/src/types/context-route.types.mjs +0 -2
  171. package/esm2020/src/types/metrics.types.mjs +0 -2
  172. package/esm2020/src/utils/flow.utils.mjs +0 -25
  173. package/esm2020/src/utils/index.mjs +0 -2
  174. package/src/guards/context.guard.d.ts +0 -19
  175. package/src/guards/index.d.ts +0 -1
  176. package/src/pages/remote/remote.component.d.ts +0 -46
  177. package/src/pages/remote/remote.module.d.ts +0 -10
  178. package/src/pages/remote/remote.types.d.ts +0 -4
  179. package/src/resolvers/quote.resolver.d.ts +0 -19
  180. package/src/types/context-route.types.d.ts +0 -5
  181. package/src/types/metrics.types.d.ts +0 -5
  182. package/src/utils/flow.utils.d.ts +0 -8
  183. package/src/utils/index.d.ts +0 -1
@@ -1,219 +1,314 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
3
- import { UUID, ConfigurationContextMode, ConfigurationContext, UITemplateType, QuoteDraft, isDefined, ConfigurationProcessorTypes, EntityUtil, ChargeGroupUtils, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, ConfigurationMode, extractErrorDetails, ConfigurationTranslatorUtils, RuntimeModel, isNotLegacyUIDefinition, SalesforceIdUtils, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
4
- import { BehaviorSubject, switchMap, map as map$1, tap as tap$1, noop, catchError, throwError, forkJoin, of, zip, combineLatest, Subject, filter as filter$1, shareReplay as shareReplay$1, finalize, takeUntil, buffer, debounceTime, share, take as take$1, distinctUntilChanged } from 'rxjs';
5
- import { map, filter, tap, switchMap as switchMap$1, skip, take, shareReplay, catchError as catchError$1, finalize as finalize$1, first } from 'rxjs/operators';
6
- import * as i1 from '@veloceapps/api';
2
+ import { Injectable, InjectionToken, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
3
+ import { isDefined, UUID, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, UITemplateType, SalesforceIdUtils, ConfigurationProcessorTypes, EntityUtil, extractErrorDetails, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
4
+ import * as i3 from '@veloceapps/api';
7
5
  import { ApiModule } from '@veloceapps/api';
8
- import { merge, isEqual, cloneDeep, assign, flatten, entries, sortBy, map as map$2, omit, uniqBy, transform } from 'lodash';
9
6
  import * as i6 from '@veloceapps/components';
10
- import { ToastType, ConfirmationComponent, ConfirmationDialogModule } from '@veloceapps/components';
11
- import moment from 'moment';
12
- import { HttpErrorResponse } from '@angular/common/http';
13
- import * as i5 from 'primeng/api';
14
- import * as i6$1 from 'primeng/dynamicdialog';
7
+ import { ToastType, ConfirmationDialogModule } from '@veloceapps/components';
8
+ import { tap, BehaviorSubject, map, filter, switchMap, of, forkJoin, throwError, noop, Subject, catchError, combineLatest, finalize, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil, first } from 'rxjs';
9
+ import * as i1 from '@veloceapps/api/v2';
10
+ import { flatten, omit, uniqBy, cloneDeep, assign, isEqual } from 'lodash';
11
+ import { filter as filter$1, map as map$1, tap as tap$1, catchError as catchError$1, finalize as finalize$1 } from 'rxjs/operators';
12
+ import * as i2 from 'primeng/api';
15
13
  import { NgControl } from '@angular/forms';
16
14
  import { DATE_PIPE_DEFAULT_OPTIONS, formatDate } from '@angular/common';
17
15
 
18
- const getDefaultLineItem = (context, uiDefinitionProperties, qty = 1) => {
19
- var _a, _b, _c;
20
- const id = UUID.UUID();
21
- const attributes = [];
22
- const lineItems = [];
23
- return Object.assign({ id, type: (_a = uiDefinitionProperties.rootType) !== null && _a !== void 0 ? _a : '', cfgStatus: 'Default', actionCode: 'ADD', qty,
24
- attributes,
25
- lineItems, productName: ((_b = context.properties) === null || _b === void 0 ? void 0 : _b['displayName']) || context.productName, productId: (_c = context.productId) !== null && _c !== void 0 ? _c : '' }, (uiDefinitionProperties.offeringId ? { offeringId: uiDefinitionProperties.offeringId } : {}));
16
+ class ConfigurationRuntimeService {
17
+ constructor(pcmApiService) {
18
+ this.pcmApiService = pcmApiService;
19
+ this.uiDefinitionContainer = null;
20
+ }
21
+ get uiDefinitionProps() {
22
+ var _a, _b;
23
+ return (_b = (_a = this.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
24
+ }
25
+ reset() {
26
+ this.uiDefinitionContainer = null;
27
+ this.initializationProps = undefined;
28
+ this.pcmModel = undefined;
29
+ }
30
+ init$(props) {
31
+ this.initializationProps = props;
32
+ return this.pcmApiService.fetchPCMByProductId(props.productId).pipe(tap(pcmModel => (this.pcmModel = pcmModel)));
33
+ }
34
+ }
35
+ ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [{ token: i1.PCMApiService }], target: i0.ɵɵFactoryTarget.Injectable });
36
+ ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
38
+ type: Injectable
39
+ }], ctorParameters: function () { return [{ type: i1.PCMApiService }]; } });
40
+
41
+ const findTransactionItem = (id, items) => {
42
+ return findTransactionItemWithComparator(items, (ti) => ti.id === id);
26
43
  };
27
- const getGuidedSellingConfigurationRequest = (data, context) => {
28
- const _context = Object.assign({}, context);
29
- delete _context.configurationToken;
30
- const properties = Object.assign({}, context.properties);
31
- delete properties['ConfigurationToken'];
32
- return {
33
- mode: 'SEARCH',
34
- step: 'START',
35
- attributeDomainMode: 'ALL',
36
- context: Object.assign(Object.assign({}, _context), { mode: ConfigurationContextMode.TEST, properties: Object.assign(Object.assign({}, properties), { ModelId: data.modelId, Name: 'Veloce Guided Selling', PricingEnabled: 'false', RuntimeMode: 'TEST' }) }),
37
- lineItem: {
38
- actionCode: 'ADD',
39
- cfgStatus: 'Default',
40
- id: UUID.UUID(),
41
- qty: 1,
42
- type: data.modelType,
43
- attributes: Object.entries(data.attributesMap).map(([name, value]) => ({
44
- name,
45
- value,
46
- cfgStatus: 'User',
47
- })),
48
- },
49
- };
44
+ const findTransactionItemWithComparator = (items, comparator) => {
45
+ let currentLevel = items;
46
+ while (currentLevel.length) {
47
+ const found = currentLevel.find(comparator);
48
+ if (found) {
49
+ return found;
50
+ }
51
+ currentLevel = flatten(currentLevel.map(parent => parent.children));
52
+ }
53
+ return;
54
+ };
55
+ const insertTransactionItem = (item, parentId, toInsert) => {
56
+ const insertData = item.id === parentId ? [toInsert] : [];
57
+ return Object.assign(Object.assign({}, item), { children: [
58
+ ...insertData,
59
+ ...item.children.map(ti => {
60
+ return insertTransactionItem(ti, parentId, toInsert);
61
+ }),
62
+ ] });
63
+ };
64
+ const removeTransactionItem = (item, idToRemove) => {
65
+ return Object.assign(Object.assign({}, item), { children: item.children
66
+ .map(ti => {
67
+ if (ti.id === idToRemove) {
68
+ return;
69
+ }
70
+ else if (ti.children.length) {
71
+ return removeTransactionItem(ti, idToRemove);
72
+ }
73
+ return ti;
74
+ })
75
+ .filter(isDefined) });
76
+ };
77
+ const replaceTransactionItem = (item, replaceTo) => {
78
+ if (item.id === replaceTo.id) {
79
+ return Object.assign({}, replaceTo);
80
+ }
81
+ return Object.assign(Object.assign({}, item), { children: item.children.map(ti => replaceTransactionItem(ti, replaceTo)) });
50
82
  };
51
- const generateConfigurationLineItem = (props, qty = 1) => {
52
- var _a, _b, _c;
53
- const id = UUID.UUID();
54
- const attributes = Object.entries((_a = props.attributesMap) !== null && _a !== void 0 ? _a : {}).map(([name, value]) => ({
55
- name,
56
- value,
57
- cfgStatus: 'User',
58
- }));
59
- const lineItems = [];
83
+ const generateTransactionItem = (productId) => {
60
84
  return {
61
- id,
62
- type: (_b = props.product.typeName) !== null && _b !== void 0 ? _b : '',
63
- cfgStatus: 'Default',
64
- actionCode: 'ADD',
65
- qty,
66
- attributes,
67
- lineItems,
68
- productName: props.product.name,
69
- productId: (_c = props.product.id) !== null && _c !== void 0 ? _c : '',
85
+ id: UUID.UUID(),
86
+ productId,
70
87
  };
71
88
  };
72
89
 
73
- const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
74
-
75
- const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
76
-
77
- var RuntimeMode;
78
- (function (RuntimeMode) {
79
- RuntimeMode[RuntimeMode["TEST"] = 0] = "TEST";
80
- RuntimeMode[RuntimeMode["PROD"] = 1] = "PROD";
81
- })(RuntimeMode || (RuntimeMode = {}));
82
- var RuntimeOperation;
83
- (function (RuntimeOperation) {
84
- RuntimeOperation["INIT"] = "INIT";
85
- RuntimeOperation["UPDATE"] = "UPDATE";
86
- })(RuntimeOperation || (RuntimeOperation = {}));
87
- var RuntimeStep;
88
- (function (RuntimeStep) {
89
- RuntimeStep["START"] = "START";
90
- RuntimeStep["UPDATE"] = "UPDATE";
91
- })(RuntimeStep || (RuntimeStep = {}));
92
-
93
- const UI_DEFINITION_VERSION = 3;
94
-
95
- class ContextService {
96
- constructor(contextApiService) {
97
- this.contextApiService = contextApiService;
98
- this.context = new BehaviorSubject(null);
90
+ class TransactionItemWorker {
91
+ constructor(src) {
92
+ this.ti = Object.assign({}, src);
99
93
  }
100
- get isInitialized() {
101
- return Boolean(this.context.value);
94
+ insert(parentId, toInsert) {
95
+ return new TransactionItemWorker(insertTransactionItem(this.ti, parentId, toInsert));
102
96
  }
103
- get isInitialized$() {
104
- return this.context.pipe(map(Boolean));
97
+ remove(id) {
98
+ return new TransactionItemWorker(removeTransactionItem(this.ti, id));
105
99
  }
106
- get mode() {
107
- return this.resolve().properties['#mode'];
100
+ replace(toReplace) {
101
+ return new TransactionItemWorker(replaceTransactionItem(this.ti, toReplace));
102
+ }
103
+ }
104
+
105
+ function extractMetadata(uiDefinition) {
106
+ return omit(uiDefinition, [
107
+ 'children',
108
+ 'pages',
109
+ 'components',
110
+ ]);
111
+ }
112
+
113
+ const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
114
+
115
+ class RuntimeSettingsService {
116
+ constructor(configurationSettingsApiService) {
117
+ this.configurationSettingsApiService = configurationSettingsApiService;
118
+ this.configurationSettings$ = new BehaviorSubject({});
119
+ this.currencySettings$ = new BehaviorSubject({
120
+ iso: DEFAULT_CURRENCY_ISO_CODE,
121
+ symbol: DEFAULT_CURRENCY_SYMBOL,
122
+ });
123
+ this.shoppingCartSettings$ = new BehaviorSubject([]);
124
+ this.getCurrencySymbol = (locale, currency) => {
125
+ return (0)
126
+ .toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
127
+ .replace(/\d/g, '')
128
+ .trim();
129
+ };
108
130
  }
109
- get isEditMode$() {
110
- return this.resolve$().pipe(map(() => this.isEditMode));
131
+ create() {
132
+ return this.configurationSettingsApiService.fetchSettings().pipe(map(settings => this.parseConfigurationSettings(settings)), tap(configurationSettings => {
133
+ var _a;
134
+ this.configurationSettings$.next(configurationSettings);
135
+ this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
136
+ this.formattingSettings = this.getFormattingSettings();
137
+ }), map(() => undefined));
111
138
  }
112
- get isEditMode() {
113
- const context = this.resolve();
114
- if (context.properties['#mode'] === ConfigurationContextMode.ACCOUNT) {
115
- return true;
116
- }
117
- if (context.properties['#mode'] === ConfigurationContextMode.QUOTE) {
118
- return context.properties.Status === 'Draft';
139
+ initCurrency(iso) {
140
+ if (iso) {
141
+ const symbol = this.getCurrencySymbol('en-US', iso);
142
+ this.currencySettings$.next({ iso, symbol });
143
+ if (this.formattingSettings) {
144
+ this.formattingSettings.currencySymbol = symbol;
145
+ }
119
146
  }
120
- return false;
121
147
  }
122
- resolve() {
123
- if (!this.context.value) {
124
- throw new Error('Context is not initialized yet!');
148
+ getFormattingSettings() {
149
+ var _a, _b;
150
+ if (this.formattingSettings) {
151
+ return this.formattingSettings;
125
152
  }
126
- return Object.assign({}, this.context.value);
127
- }
128
- resolve$() {
129
- return this.context.pipe(filter((ctx) => Boolean(ctx)));
153
+ const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
154
+ return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
155
+ }, {});
156
+ const currencySettings = this.getCurrencySettings();
157
+ const dateFormat = (validateDateFormat((_b = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT) !== null && _b !== void 0 ? _b : '') && (shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT)) ||
158
+ DEFAULT_DATE_FORMAT;
159
+ const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
160
+ const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
161
+ // the number of decimal places can be 0
162
+ const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
163
+ const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
164
+ ? Number(priceScale)
165
+ : DEFAULT_DECIMALS_COUNT;
166
+ const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
167
+ return {
168
+ currencySymbol: currencySettings.symbol,
169
+ dateFormats: getSupportedDateFormats(dateFormat),
170
+ decimalsCount,
171
+ decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
172
+ ? decimalSeparator
173
+ : DEFAULT_DECIMAL_SEPARATOR,
174
+ // thousands separator can be a blank value, so it can also be null
175
+ thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
176
+ ? thousandsSeparator || ''
177
+ : DEFAULT_THOUSANDS_SEPARATOR,
178
+ actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
179
+ ? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
180
+ : DEFAULT_ACTION_CODE_LABELS,
181
+ };
130
182
  }
131
- create(headerId, mode) {
132
- return this.contextApiService.getContext(headerId, mode).pipe(tap(context => this.context.next(merge(new ConfigurationContext(headerId, mode), context))), map(() => this.resolve()));
183
+ getConfigurationSettings() {
184
+ return this.configurationSettings$.value;
133
185
  }
134
- initTestMode() {
135
- return this.create('TestId', ConfigurationContextMode.TEST).pipe(map(context => {
136
- return this.update({
137
- properties: Object.assign(Object.assign({}, context.properties), { RuntimeMode: ConfigurationContextMode.TEST, StartDate: new Date().toISOString().substring(0, 10), standalone: 'true' }),
138
- });
139
- }));
186
+ getShoppingCartSettings() {
187
+ return this.shoppingCartSettings$.value;
140
188
  }
141
- update(partialContext) {
142
- const originalContext = this.resolve();
143
- const updatedContext = Object.assign(Object.assign(Object.assign({}, originalContext), partialContext), { properties: Object.assign(Object.assign({}, originalContext.properties), partialContext.properties) });
144
- this.context.next(updatedContext);
145
- return updatedContext;
189
+ getCurrencySettings() {
190
+ return this.currencySettings$.value;
146
191
  }
147
- set(context) {
148
- const originalContext = this.resolve();
149
- const updatedContext = Object.assign(Object.assign({}, originalContext), context);
150
- this.context.next(updatedContext);
151
- return updatedContext;
192
+ parseConfigurationSettings(settings) {
193
+ return settings.reduce((acc, setting) => {
194
+ switch (setting.key) {
195
+ case 'shopping-cart':
196
+ acc['shopping-cart'] = parseJsonSafely(setting.value, []);
197
+ break;
198
+ case 'navigation':
199
+ acc.navigation = parseJsonSafely(setting.value, {});
200
+ break;
201
+ case 'flows':
202
+ acc.flows = parseJsonSafely(setting.value, []);
203
+ break;
204
+ default:
205
+ acc[setting.key] = setting.value;
206
+ }
207
+ return acc;
208
+ }, {});
152
209
  }
153
- delete() {
154
- this.context.next(null);
210
+ addShoppingCartSettings(settings) {
211
+ // uniqBy removes items with the biggest index
212
+ const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
213
+ this.shoppingCartSettings$.next(newSettings);
155
214
  }
156
215
  }
157
- ContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService, deps: [{ token: i1.ContextApiService }], target: i0.ɵɵFactoryTarget.Injectable });
158
- ContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService });
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService, decorators: [{
216
+ RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
217
+ RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
218
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
160
219
  type: Injectable
161
- }], ctorParameters: function () { return [{ type: i1.ContextApiService }]; } });
220
+ }], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
162
221
 
163
222
  class FlowInfoService {
164
223
  get flow() {
224
+ if (!this.flowSubj$.value) {
225
+ throw new Error(`Flow not initialized yet`);
226
+ }
165
227
  return this.flowSubj$.value;
166
228
  }
167
- set flow(value) {
168
- this.flowSubj$.next(value);
229
+ get isFlowInitialized() {
230
+ return Boolean(this.flowSubj$.value);
169
231
  }
170
- get isLegacy() {
171
- var _a;
172
- return !!this.flow && ((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) == null;
232
+ get context() {
233
+ if (!this.contextSubj$.value) {
234
+ throw new Error('Context is not initialized yet!');
235
+ }
236
+ return Object.assign({}, this.contextSubj$.value);
237
+ }
238
+ get context$() {
239
+ return this.contextSubj$.asObservable().pipe(filter(isDefined));
240
+ }
241
+ get templates() {
242
+ return this.templatesSubj$.value;
243
+ }
244
+ get isFlowEngineInitialized$() {
245
+ return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
173
246
  }
174
247
  get isStateful() {
175
248
  var _a;
176
249
  return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
177
250
  }
178
- constructor(flowsApiService, templatesApiService, customizationService) {
179
- this.flowsApiService = flowsApiService;
180
- this.templatesApiService = templatesApiService;
251
+ constructor(runtimeSettingsService, templatesAdminApiService, customizationService) {
252
+ this.runtimeSettingsService = runtimeSettingsService;
253
+ this.templatesAdminApiService = templatesAdminApiService;
181
254
  this.customizationService = customizationService;
182
- this.templates = {};
183
255
  this.defaultTemplates = {
184
256
  flowEngine: 'Flow Engine',
185
257
  };
186
258
  this.flowSubj$ = new BehaviorSubject(null);
259
+ this.templatesSubj$ = new BehaviorSubject({});
260
+ this.contextSubj$ = new BehaviorSubject(null);
187
261
  this.flow$ = this.flowSubj$.asObservable();
262
+ this.templates$ = this.templatesSubj$.asObservable();
263
+ }
264
+ reset() {
265
+ this.flowSubj$.next(null);
266
+ this.templatesSubj$.next({});
267
+ this.contextSubj$.next(null);
188
268
  }
189
269
  init$(flowId, routeQueryParams) {
190
- return this.flowsApiService.getFlow(flowId).pipe(switchMap(flow => this.initFlowTemplates$(flow).pipe(map$1(() => flow))), tap$1(flow => {
191
- this.params = Object.assign(Object.assign({}, routeQueryParams), flow.properties.queryParams);
192
- this.flowSubj$.next(flow);
193
- }), map$1(noop), catchError(e => {
194
- this.flowSubj$.next(null);
195
- return throwError(() => e);
196
- }));
270
+ return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
197
271
  }
198
- cleanup() {
199
- this.flowSubj$.next(null);
200
- this.params = undefined;
201
- this.templates = {};
272
+ updateContext(update) {
273
+ this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
274
+ }
275
+ initFlow$(flowId, routeQueryParams) {
276
+ var _a;
277
+ const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
278
+ if (!flow) {
279
+ this.flowSubj$.next(null);
280
+ throw new Error(`Flow with flowId=${flowId} is not defined`);
281
+ }
282
+ const headerId = routeQueryParams['headerId'];
283
+ if (typeof headerId !== 'string') {
284
+ throw new Error(`Please provide 'headerId'`);
285
+ }
286
+ const mode = this.getFlowContextMode(headerId);
287
+ // Restrict if mode is not defined
288
+ if (mode == null) {
289
+ throw new Error('Mode is undefined');
290
+ }
291
+ this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
292
+ this.flowSubj$.next(flow);
293
+ return of(undefined);
202
294
  }
203
- initFlowTemplates$(flow) {
295
+ initFlowTemplates$() {
204
296
  var _a, _b, _c;
205
297
  return forkJoin([
206
- this.templatesApiService.fetchTemplates$(),
298
+ this.templatesAdminApiService.fetchTemplates$(),
207
299
  (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplates) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : of([]),
208
- ]).pipe(map$1(([templates, localTemplates]) => {
209
- Object.entries(Object.assign(Object.assign({}, this.defaultTemplates), flow.properties.templates)).forEach(([key, name]) => {
300
+ ]).pipe(map(([templates, localTemplates]) => {
301
+ var _a, _b;
302
+ const newValue = {};
303
+ Object.entries(Object.assign(Object.assign({}, this.defaultTemplates), ((_b = (_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.templates) !== null && _b !== void 0 ? _b : {}))).forEach(([key, name]) => {
210
304
  var _a;
211
305
  const type = this.remapTemplateName(key);
212
306
  if (type) {
213
- this.templates[type] =
307
+ newValue[type] =
214
308
  (_a = localTemplates.find(template => template.name === name && template.type === type)) !== null && _a !== void 0 ? _a : templates.find(template => template.name === name && template.type === type);
215
309
  }
216
310
  });
311
+ this.templatesSubj$.next(newValue);
217
312
  }));
218
313
  }
219
314
  remapTemplateName(templateType) {
@@ -239,13 +334,20 @@ class FlowInfoService {
239
334
  }
240
335
  return undefined;
241
336
  }
337
+ getFlowContextMode(headerId) {
338
+ const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
339
+ if (!objectName) {
340
+ return;
341
+ }
342
+ return objectName.toUpperCase();
343
+ }
242
344
  }
243
- FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: i1.FlowsApiService }, { token: i1.UITemplatesApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
345
+ FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token: i1.UITemplatesAdminApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
244
346
  FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
245
347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
246
348
  type: Injectable
247
349
  }], ctorParameters: function () {
248
- return [{ type: i1.FlowsApiService }, { type: i1.UITemplatesApiService }, { type: undefined, decorators: [{
350
+ return [{ type: RuntimeSettingsService }, { type: i1.UITemplatesAdminApiService }, { type: undefined, decorators: [{
249
351
  type: Optional
250
352
  }, {
251
353
  type: Inject,
@@ -253,186 +355,287 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
253
355
  }] }];
254
356
  } });
255
357
 
256
- class QuoteDraftService {
358
+ class TestModeConfigurationService {
359
+ constructor(flowInfoService, configurationService, configurationRuntimeService, salesTransactionService, runtimeSettingsService, sfApiService) {
360
+ this.flowInfoService = flowInfoService;
361
+ this.configurationService = configurationService;
362
+ this.configurationRuntimeService = configurationRuntimeService;
363
+ this.salesTransactionService = salesTransactionService;
364
+ this.runtimeSettingsService = runtimeSettingsService;
365
+ this.sfApiService = sfApiService;
366
+ this.isInitialized = false;
367
+ }
368
+ initTestMode$(uiDefinitionContainer, options) {
369
+ var _a;
370
+ this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
371
+ if (this.checkInitialized(uiDefinitionContainer)) {
372
+ this.configurationRuntimeService.pcmModel = this.pcmModel;
373
+ return of(undefined);
374
+ }
375
+ this.configurationService.reset();
376
+ const { productId, quoteId, flowId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
377
+ if (!productId) {
378
+ return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
379
+ }
380
+ if (!quoteId) {
381
+ return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
382
+ }
383
+ if (!flowId) {
384
+ return throwError(() => `Unable to start the Configuration Preview: Flow is missing.`);
385
+ }
386
+ return this.runtimeSettingsService.create().pipe(switchMap(() => this.flowInfoService.init$(flowId, { productId, headerId: quoteId, testMode: true })), switchMap(() => this.configurationRuntimeService.init$({ productId })), tap(pcmModel => (this.pcmModel = pcmModel)), switchMap(() => {
387
+ if (options === null || options === void 0 ? void 0 : options.customizationMode) {
388
+ return of(undefined);
389
+ }
390
+ return this.initConfiguration$(quoteId);
391
+ }), tap(() => (this.isInitialized = true)), map(noop));
392
+ }
393
+ initConfiguration$(quoteId) {
394
+ return this.getPriceBookId(quoteId).pipe(map(priceBookId => this.getTestTransactionContext(quoteId, priceBookId)), tap(state => this.salesTransactionService.setState(state)), switchMap(() => this.configurationService.init$()), switchMap(() => this.configurationService.state
395
+ ? this.configurationService.configure$(this.configurationService.state)
396
+ : of(undefined)), map(noop));
397
+ }
398
+ getPriceBookId(quoteId) {
399
+ return this.sfApiService
400
+ .query({ count: 1, fields: ['Pricebook2Id'], rawCondition: `Id = '${quoteId}'` }, 'Quote')
401
+ .pipe(map(r => { var _a, _b; return (_b = (_a = r === null || r === void 0 ? void 0 : r[0]) === null || _a === void 0 ? void 0 : _a.Pricebook2Id) !== null && _b !== void 0 ? _b : null; }));
402
+ }
403
+ getTestTransactionContext(quoteId, priceBookId) {
404
+ var _a;
405
+ const dateStr = (_a = new Date().toISOString().split('T')[0]) !== null && _a !== void 0 ? _a : '';
406
+ const testTransaction = {
407
+ id: quoteId,
408
+ businessObjectType: 'Quote',
409
+ salesTransactionItems: [],
410
+ salesTransactionName: 'Test Quote',
411
+ account: '',
412
+ quoteAccount: '',
413
+ pricebook: '',
414
+ status: 'Draft',
415
+ totalAmount: 0,
416
+ subtotal: 0,
417
+ activatedDate: dateStr,
418
+ effectiveDate: dateStr,
419
+ startDate: dateStr,
420
+ attributes: {},
421
+ nodes: {},
422
+ };
423
+ if (priceBookId) {
424
+ testTransaction.pricebook = priceBookId;
425
+ }
426
+ return {
427
+ salesTransaction: testTransaction,
428
+ transactionId: quoteId,
429
+ businessObjectType: 'Quote',
430
+ nodes: {},
431
+ id: UUID.UUID(),
432
+ attributes: {},
433
+ };
434
+ }
435
+ checkInitialized(uiDefinitionContainer) {
436
+ var _a;
437
+ return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
438
+ }
439
+ }
440
+ TestModeConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, deps: [{ token: FlowInfoService }, { token: ConfigurationService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: RuntimeSettingsService }, { token: i1.SalesforceApiService }], target: i0.ɵɵFactoryTarget.Injectable });
441
+ TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
442
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
443
+ type: Injectable
444
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: RuntimeSettingsService }, { type: i1.SalesforceApiService }]; } });
445
+
446
+ class GuidedSellingService {
447
+ constructor(orchestrationsApiService) {
448
+ this.orchestrationsApiService = orchestrationsApiService;
449
+ this.guidedSellingResult$ = new BehaviorSubject({});
450
+ }
451
+ get guidedSellingResult() {
452
+ return this.guidedSellingResult$.value;
453
+ }
454
+ configureGuidedSelling$(data) {
455
+ return this.orchestrationsApiService
456
+ .apply$({
457
+ transactionContext: this.getTransactionContext(data.attributesMap),
458
+ orchestrationName: data.orchestrationName,
459
+ })
460
+ .pipe(map(transactionContext => {
461
+ var _a, _b;
462
+ const guidedSellingNode = (_a = transactionContext.nodes['GuidedSelling']) === null || _a === void 0 ? void 0 : _a[0];
463
+ const guidedSellingResult = ((_b = guidedSellingNode === null || guidedSellingNode === void 0 ? void 0 : guidedSellingNode.attributes) === null || _b === void 0 ? void 0 : _b['result']) || {};
464
+ this.guidedSellingResult$.next(guidedSellingResult);
465
+ return guidedSellingResult;
466
+ }));
467
+ }
468
+ clearGuidedSelling$() {
469
+ this.guidedSellingResult$.next({});
470
+ }
471
+ getTransactionContext(guidedSellingAttributes) {
472
+ const testTransaction = {
473
+ id: UUID.UUID(),
474
+ businessObjectType: 'Quote',
475
+ salesTransactionItems: [],
476
+ attributes: {},
477
+ };
478
+ return {
479
+ salesTransaction: testTransaction,
480
+ transactionId: UUID.UUID(),
481
+ businessObjectType: 'Quote',
482
+ nodes: {
483
+ GuidedSelling: [
484
+ {
485
+ id: UUID.UUID(),
486
+ attributes: {},
487
+ nodes: {},
488
+ properties: { guidedSellingAttributes },
489
+ },
490
+ ],
491
+ },
492
+ id: UUID.UUID(),
493
+ attributes: {},
494
+ };
495
+ }
496
+ }
497
+ GuidedSellingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService, deps: [{ token: i1.OrchestrationsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
498
+ GuidedSellingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService });
499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService, decorators: [{
500
+ type: Injectable
501
+ }], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }]; } });
502
+
503
+ class SalesTransactionService {
257
504
  get isInitialized$() {
258
505
  return this.isInitializedSubj$.asObservable();
259
506
  }
260
507
  get isInitialized() {
261
508
  return this.isInitializedSubj$.getValue();
262
509
  }
263
- set isInitialized(value) {
264
- if (this.isInitialized !== value) {
265
- this.isInitializedSubj$.next(value);
266
- }
267
- }
268
- get hasUnsavedChanges() {
269
- return this._hasUnsavedChanges;
270
- }
271
510
  set hasUnsavedChanges(value) {
272
511
  var _a, _b;
273
- this._hasUnsavedChanges = value;
274
- if (!this._hasUnsavedChanges) {
275
- this.initialCurrentState = (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.currentState) !== null && _b !== void 0 ? _b : [];
512
+ this.hasUnsavedChangesSubj$.next(value);
513
+ if (!this.hasUnsavedChanges) {
514
+ this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
276
515
  }
277
516
  }
278
- get hasProducts$() {
279
- return this.quoteSubj$.pipe(map(() => this.hasProducts));
280
- }
281
- get hasProducts() {
282
- var _a;
283
- return Boolean((_a = this.quoteSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
517
+ get hasUnsavedChanges() {
518
+ return this.hasUnsavedChangesSubj$.getValue();
284
519
  }
285
- get hasAssets$() {
286
- return this.assetsSubj$.pipe(map(() => this.hasAssets));
520
+ get state() {
521
+ return this.stateSubj$.getValue();
287
522
  }
288
- get hasAssets() {
523
+ get hasProducts() {
289
524
  var _a;
290
- return Boolean((_a = this.assetsSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
525
+ return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems.length);
291
526
  }
292
- get assetsState() {
293
- return this.assetsSubj$.value;
294
- }
295
- constructor(context, flowInfoService, accountApiService, quoteApiService) {
296
- this.context = context;
297
- this.flowInfoService = flowInfoService;
298
- this.accountApiService = accountApiService;
299
- this.quoteApiService = quoteApiService;
300
- this.quoteSubj$ = new BehaviorSubject(null);
301
- this.assetsSubj$ = new BehaviorSubject(null);
302
- this.resetSubj$ = new BehaviorSubject(true);
527
+ constructor(salesTransactionApiService) {
528
+ this.salesTransactionApiService = salesTransactionApiService;
529
+ this.stateSubj$ = new BehaviorSubject(null);
303
530
  this.isInitializedSubj$ = new BehaviorSubject(false);
304
- this.initialCurrentState = [];
305
- this._hasUnsavedChanges = false;
306
- this.reset$ = this.resetSubj$.asObservable();
307
- this.isInitializedSubj$
308
- .pipe(filter(isInitialized => isInitialized), switchMap$1(() => this.quoteSubj$.asObservable()), skip(1), tap(quote => this.markAsUpdated(quote)))
309
- .subscribe();
310
- }
311
- reset() {
312
- this.resetSubj$.next(true);
313
- this.quoteSubj$.next(null);
314
- this.assetsSubj$.next(null);
315
- this.isInitialized = false;
316
- this.hasUnsavedChanges = false;
531
+ this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
532
+ this.initialState = [];
533
+ this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
534
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
317
535
  }
318
536
  init(headerId, params) {
319
- const ctx = this.context.resolve();
320
- const isAccountMode = this.context.mode === ConfigurationContextMode.ACCOUNT;
321
- const accountId = isAccountMode ? headerId : ctx.properties.AccountId;
322
- return zip(accountId ? this.accountApiService.getAssetsState(accountId, params) : of(null), isAccountMode
323
- ? of(QuoteDraft.emptyQuote(ConfigurationContextMode.ACCOUNT))
324
- : this.quoteApiService.getQuoteState(headerId, params)).pipe(tap(([assets, quote]) => {
325
- if (assets) {
326
- this.assetsSubj$.next(assets);
327
- }
328
- this.quoteSubj$.next(quote);
329
- if (assets && isAccountMode) {
330
- this.context.update(assets.context);
331
- }
332
- else {
333
- this.context.update(quote.context);
537
+ return this.salesTransactionApiService.query(headerId, params).pipe(tap(res => {
538
+ if (!res.salesTransaction) {
539
+ throw new Error('SalesTransaction is not defined. Please check Query Orchestration.');
334
540
  }
335
- }), map(() => noop()), take(1));
541
+ this.stateSubj$.next(res);
542
+ }));
336
543
  }
337
544
  finalizeInit() {
338
- this.isInitialized = true;
545
+ this.isInitializedSubj$.next(true);
339
546
  this.hasUnsavedChanges = false;
340
547
  }
341
- setCurrentLineItemState(lineItems) {
342
- const quoteDraft = this.quoteSubj$.value;
343
- if (!quoteDraft) {
344
- return;
345
- }
346
- this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: lineItems }));
548
+ reset() {
549
+ this.stateSubj$.next(null);
550
+ this.isInitializedSubj$.next(false);
551
+ this.hasUnsavedChangesSubj$.next(false);
347
552
  }
348
- updateQuoteDraft(update) {
349
- const quoteDraft = this.quoteSubj$.value;
350
- if (!quoteDraft) {
351
- return;
352
- }
353
- if (update.context) {
354
- this.context.set(update.context);
355
- }
356
- this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), update));
357
- }
358
- updateByPriceSummary(priceSummary) {
359
- const quoteDraft = this.quoteSubj$.value;
360
- if (!quoteDraft) {
361
- return;
362
- }
363
- const updatedCurrentState = this.currentState.map(lineItem => {
364
- const updated = priceSummary.lineItems.find(li => li.id === lineItem.id);
365
- return updated !== null && updated !== void 0 ? updated : lineItem;
366
- });
367
- this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedCurrentState, totalPrices: priceSummary.totalPrices, approvalItems: priceSummary.approvalItems }));
368
- }
369
- setAssetsState(assetsState) {
370
- this.assetsSubj$.next(assetsState);
553
+ getInitialState() {
554
+ return this.initialState;
371
555
  }
372
- get quoteDraft$() {
373
- return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
556
+ setState(state) {
557
+ this.stateSubj$.next(state);
374
558
  }
375
- get quoteDraft() {
376
- const quote = this.quoteSubj$.value;
377
- if (!quote) {
378
- return null;
379
- }
380
- return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
381
- }
382
- get currentState$() {
383
- return this.quoteDraft$.pipe(map(quote => quote.currentState));
384
- }
385
- get currentState() {
386
- var _a, _b;
387
- return (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.currentState) !== null && _b !== void 0 ? _b : [];
559
+ }
560
+ SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: i1.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
561
+ SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
562
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
563
+ type: Injectable
564
+ }], ctorParameters: function () { return [{ type: i1.SalesTransactionApiService }]; } });
565
+
566
+ class FlowConfigurationService {
567
+ constructor(orchestrationsApiService, salesTransactionService, flowInfoService) {
568
+ this.orchestrationsApiService = orchestrationsApiService;
569
+ this.salesTransactionService = salesTransactionService;
570
+ this.flowInfoService = flowInfoService;
571
+ this.updatedSubj$ = new Subject();
572
+ this.updated$ = this.updatedSubj$.asObservable();
388
573
  }
389
- get isStandalone() {
390
- var _a, _b;
391
- return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.standalone) !== null && _b !== void 0 ? _b : false;
574
+ calculate$(state) {
575
+ return this.orchestrationsApiService
576
+ .apply$({ transactionContext: state, flowId: this.flowInfoService.flow.id })
577
+ .pipe(tap(result => this.salesTransactionService.setState(result)), map(noop));
392
578
  }
393
- get isStandalone$() {
394
- return this.flowInfoService.flow$.pipe(map(() => this.isStandalone));
579
+ calculate(state) {
580
+ this.calculate$(state).subscribe();
395
581
  }
396
- getInitialCurrentState() {
397
- return this.initialCurrentState;
582
+ revert$(transactionItemId) {
583
+ var _a;
584
+ const state = this.salesTransactionService.state;
585
+ const initialState = this.salesTransactionService.getInitialState();
586
+ const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
587
+ const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
588
+ const currentItem = currentState[currentItemIndex];
589
+ const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
590
+ if (!state || !currentItem || !initialItem) {
591
+ return of(null);
592
+ }
593
+ const updatedState = cloneDeep(currentState);
594
+ updatedState.splice(currentItemIndex, 1, initialItem);
595
+ return of([]).pipe(map(() => (Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: updatedState }) }))), tap(newState => this.salesTransactionService.setState(newState)), switchMap(newState => this.calculate$(newState)), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
398
596
  }
399
- isEditMode$() {
400
- return this.context.resolve$().pipe(map(() => this.isEditMode()));
597
+ revert(transactionItemId) {
598
+ this.revert$(transactionItemId).subscribe();
401
599
  }
402
- isEditMode() {
403
- const context = this.context.resolve();
404
- if (context.mode === ConfigurationContextMode.ACCOUNT) {
405
- return true;
406
- }
407
- if (context.mode === ConfigurationContextMode.QUOTE) {
408
- return context.properties.Status === 'Draft';
600
+ delete$(ids) {
601
+ const state = this.salesTransactionService.state;
602
+ if (!state) {
603
+ return of(null);
409
604
  }
410
- return false;
605
+ return of([]).pipe(map(() => state.salesTransaction.salesTransactionItems.filter(({ id }) => !ids.includes(id))), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: updatedState }) }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
411
606
  }
412
- markAsUpdated(quote) {
413
- if ((quote === null || quote === void 0 ? void 0 : quote.context.properties['#mode']) === ConfigurationContextMode.ACCOUNT) {
414
- this.hasUnsavedChanges = !!quote && !quote.currentState.every(li => li.actionCode === 'EXIST');
415
- }
416
- else {
417
- this.hasUnsavedChanges = !isEqual(this.initialCurrentState, quote === null || quote === void 0 ? void 0 : quote.currentState);
418
- }
607
+ delete(ids) {
608
+ this.delete$(ids).subscribe();
609
+ }
610
+ handleErrorAndBounceBack() {
611
+ return (source$) => {
612
+ return source$.pipe(catchError(error => {
613
+ console.error(error);
614
+ // bounce back if configuration call has failed
615
+ const state = this.salesTransactionService.state;
616
+ if (state) {
617
+ this.salesTransactionService.setState(state);
618
+ this.updatedSubj$.next();
619
+ }
620
+ return throwError(() => error);
621
+ }));
622
+ };
419
623
  }
420
624
  }
421
- QuoteDraftService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, deps: [{ token: ContextService }, { token: FlowInfoService }, { token: i1.AccountApiService }, { token: i1.QuoteApiService }], target: i0.ɵɵFactoryTarget.Injectable });
422
- QuoteDraftService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService });
423
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, decorators: [{
625
+ FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i1.OrchestrationsApiService }, { token: SalesTransactionService }, { token: FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
626
+ FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
627
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
424
628
  type: Injectable
425
- }], ctorParameters: function () { return [{ type: ContextService }, { type: FlowInfoService }, { type: i1.AccountApiService }, { type: i1.QuoteApiService }]; } });
629
+ }], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }, { type: FlowInfoService }]; } });
426
630
 
427
631
  class FlowStateService {
428
- constructor(contextService, quoteDraftService, flowInfoService, flowConfiguration, processorsApiService, flowStateApiService, quoteApiService, toastService, customizationService) {
429
- this.contextService = contextService;
430
- this.quoteDraftService = quoteDraftService;
431
- this.flowInfoService = flowInfoService;
632
+ constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
432
633
  this.flowConfiguration = flowConfiguration;
433
- this.processorsApiService = processorsApiService;
634
+ this.flowInfoService = flowInfoService;
434
635
  this.flowStateApiService = flowStateApiService;
435
- this.quoteApiService = quoteApiService;
636
+ this.processorsApiService = processorsApiService;
637
+ this.salesTransactionApiService = salesTransactionApiService;
638
+ this.salesTransactionService = salesTransactionService;
436
639
  this.toastService = toastService;
437
640
  this.customizationService = customizationService;
438
641
  this.NOT_INITIALIZED = Symbol();
@@ -449,68 +652,22 @@ class FlowStateService {
449
652
  this.cleanup$ = new Subject();
450
653
  this.statefulExecutionRequest$ = this.initBufferedRequest$();
451
654
  /*
452
- In stateless mode watch QuoteDraft changes and call executeRequest so that
453
- all subscriptions get their updates according to updated QuoteDraft
655
+ In stateless mode watch State changes and call executeRequest so that
656
+ all subscriptions get their updates according to updated State
454
657
  */
455
658
  this.isInitialized$()
456
- .pipe(filter$1(Boolean), filter$1(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
659
+ .pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
457
660
  .subscribe();
458
- this.charges$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
459
- if (this.flowInfoService.isLegacy) {
460
- return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.charges));
461
- }
462
- else {
463
- return this.subscribe$(UITemplateType.FLOW_ENGINE, 'CHARGES', null, {
464
- cold: true,
465
- }).pipe(map$1(response => (response.success ? response.result : {})));
466
- }
467
- }), shareReplay$1(1));
468
- this.charges$.subscribe();
469
- this.pricePlans$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
470
- if (this.flowInfoService.isLegacy) {
471
- return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.pricePlans));
472
- }
473
- else {
474
- return this.subscribe$(UITemplateType.FLOW_ENGINE, 'PRICE_PLANS', null, {
475
- cold: true,
476
- }).pipe(map$1(response => (response.success ? response.result : {})));
477
- }
478
- }), shareReplay$1(1));
479
- this.pricePlans$.subscribe();
480
- this.activeMetrics$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
481
- if (this.flowInfoService.isLegacy) {
482
- return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.activeMetrics));
483
- }
484
- else {
485
- return this.subscribe$(UITemplateType.FLOW_ENGINE, 'ACTIVE_METRICS', null, {
486
- cold: true,
487
- }).pipe(map$1(response => (response.success ? response.result : [])));
488
- }
489
- }), shareReplay$1(1));
490
- this.activeMetrics$.subscribe();
491
- this.isPriceListLocked$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
492
- if (this.flowInfoService.isLegacy) {
493
- return of(false);
494
- }
495
- else {
496
- return this.subscribe$(UITemplateType.FLOW_ENGINE, 'IS_PRICE_LIST_LOCKED', null, {
497
- cold: true,
498
- }).pipe(map$1(response => (response.success ? response.result : false)));
499
- }
500
- }), shareReplay$1(1));
501
- this.isPriceListLocked$.subscribe();
502
661
  }
503
662
  init$() {
504
- return this.initProcessors$().pipe(switchMap(() => {
505
- if (this.getFlowSafe().properties.stateful) {
506
- return this.initStateful$();
507
- }
508
- else {
509
- return this.initStateless$();
510
- }
511
- }));
663
+ if (this.flowInfoService.flow.properties.stateful) {
664
+ return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
665
+ }
666
+ else {
667
+ return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
668
+ }
512
669
  }
513
- cleanup() {
670
+ reset() {
514
671
  Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
515
672
  this.subscriptions = {};
516
673
  if (this.stateId$.value) {
@@ -522,9 +679,9 @@ class FlowStateService {
522
679
  this.cleanup$.next();
523
680
  }
524
681
  get hasUnsavedChanges() {
525
- return this.getFlowSafe().properties.stateful
682
+ return this.flowInfoService.flow.properties.stateful
526
683
  ? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
527
- : this.quoteDraftService.hasUnsavedChanges;
684
+ : this.salesTransactionService.hasUnsavedChanges;
528
685
  }
529
686
  get stateId() {
530
687
  return this.stateId$.value;
@@ -533,14 +690,14 @@ class FlowStateService {
533
690
  return this.executionInProgress$.asObservable();
534
691
  }
535
692
  isInitialized$() {
536
- return combineLatest([this.stateId$, this.quoteDraftService.isInitialized$]).pipe(map$1(values => values.some(Boolean)));
693
+ return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
537
694
  }
538
695
  isInitialized() {
539
- return Boolean(this.stateId$.value) || this.quoteDraftService.isInitialized;
696
+ return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
540
697
  }
541
698
  execute$(scope, exec) {
542
699
  const request = this.execToRequest(scope, exec);
543
- return this.executeRequest$(request).pipe(map$1(result => {
700
+ return this.executeRequest$(request).pipe(map(result => {
544
701
  // Keep only requested results
545
702
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
546
703
  var _a;
@@ -557,7 +714,7 @@ class FlowStateService {
557
714
  actions: [{ name: action, inputData }],
558
715
  };
559
716
  const request = this.execToRequest(scope, exec);
560
- return this.executeRequest$(request).pipe(map$1(noop));
717
+ return this.executeRequest$(request).pipe(map(noop));
561
718
  }
562
719
  select$(scope, selectorName, inputData) {
563
720
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -569,7 +726,7 @@ class FlowStateService {
569
726
  },
570
727
  },
571
728
  });
572
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
729
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
573
730
  }
574
731
  subscribe$(scope, selectorName, inputData, options) {
575
732
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -595,7 +752,7 @@ class FlowStateService {
595
752
  this.executeRequest$(request).subscribe();
596
753
  }
597
754
  }
598
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), finalize(() => {
755
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
599
756
  var _a;
600
757
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
601
758
  delete this.subscriptions[requestId];
@@ -603,9 +760,9 @@ class FlowStateService {
603
760
  }));
604
761
  }
605
762
  save$() {
606
- if (this.getFlowSafe().properties.stateful) {
763
+ if (this.flowInfoService.flow.properties.stateful) {
607
764
  if (this.stateId$.value) {
608
- return this.flowStateApiService.save(this.stateId$.value).pipe(tap$1(() => {
765
+ return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
609
766
  Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
610
767
  this.trackedStatefulChangesMap.set(key, false);
611
768
  });
@@ -613,30 +770,16 @@ class FlowStateService {
613
770
  }
614
771
  }
615
772
  else {
616
- const quoteDraft = this.quoteDraftService.quoteDraft;
617
- if (quoteDraft) {
618
- return this.quoteApiService.upsertQuote(quoteDraft).pipe(tap$1(({ versionId }) => {
619
- this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
620
- }));
621
- }
622
- }
623
- return of({ quoteId: '' });
624
- }
625
- submit$() {
626
- if (this.getFlowSafe().properties.stateful) {
627
- if (this.stateId$.value) {
628
- return this.flowStateApiService.submit(this.stateId$.value);
629
- }
630
- }
631
- else {
632
- const quoteDraft = this.quoteDraftService.quoteDraft;
633
- if (quoteDraft) {
634
- return this.quoteApiService.submitQuote(quoteDraft).pipe(tap$1(({ versionId }) => {
635
- this.contextService.update({ properties: { VELOCE_PRISM__VersionId__c: versionId } });
636
- }));
773
+ const state = this.salesTransactionService.state;
774
+ if (state) {
775
+ const request = {
776
+ transactionContext: state,
777
+ flowId: this.flowInfoService.flow.id,
778
+ };
779
+ return this.salesTransactionApiService.save(request).pipe(map(id => ({ id })));
637
780
  }
638
781
  }
639
- return of({ quoteId: '' });
782
+ return of({ id: '' });
640
783
  }
641
784
  getFlowStore() {
642
785
  return this.flowStore;
@@ -677,10 +820,10 @@ class FlowStateService {
677
820
  fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
678
821
  }
679
822
  }
680
- const execution$ = this.getFlowSafe().properties.stateful
823
+ const execution$ = this.flowInfoService.flow.properties.stateful
681
824
  ? this.executeStateful$(fullRequest)
682
825
  : this.executeStateless$(fullRequest);
683
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
826
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
684
827
  }
685
828
  handleSelectorsResponse(selectors) {
686
829
  Object.entries(selectors).forEach(([requestId, selectorResult]) => {
@@ -696,32 +839,21 @@ class FlowStateService {
696
839
  });
697
840
  }
698
841
  initStateful$() {
699
- var _a;
700
- // Subscriptions
701
- this.subscribe$(UITemplateType.FLOW_ENGINE, 'CONTEXT', null, { cold: true })
702
- .pipe(tap$1(response => {
703
- if (response.success) {
704
- this.contextService.update(response.result);
705
- }
706
- }), takeUntil(this.cleanup$))
707
- .subscribe();
708
842
  const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
709
843
  const processors = processorsList.length ? processorsList : undefined;
710
844
  const selectors = Object.values(this.subscriptions)
711
845
  .map(({ request }) => request.selectors)
712
846
  .filter(isDefined)
713
847
  .reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
714
- const request = this.getDefaultExecutionRequestDTO();
715
848
  return this.flowStateApiService
716
849
  .init({
717
- quoteId: this.contextService.resolve().headerId,
718
- params: (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {},
850
+ quoteId: this.flowInfoService.context.headerId,
851
+ params: this.flowInfoService.context,
719
852
  actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
720
853
  selectorsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
721
- selectors: Object.assign(Object.assign({}, selectors), request.selectors),
722
- actions: request.actions,
854
+ selectors: selectors,
723
855
  })
724
- .pipe(map$1(({ stateId, selectors }) => {
856
+ .pipe(map(({ stateId, selectors }) => {
725
857
  this.handleSelectorsResponse(selectors);
726
858
  this.stateId$.next(stateId);
727
859
  }));
@@ -741,80 +873,50 @@ class FlowStateService {
741
873
  };
742
874
  this.executionInProgress$.next(true);
743
875
  return this.flowStateApiService.execute(this.stateId$.value, request);
744
- }), tap$1(({ stateId }) => this.stateId$.next(stateId)), share(), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
876
+ }), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
745
877
  this.executionInProgress$.next(false);
746
878
  return throwError(() => e);
747
879
  }));
748
880
  }
749
881
  executeStateful$(request) {
750
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
882
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
751
883
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
752
884
  combineLatest([
753
885
  this.statefulExecutionRequest$,
754
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
755
- ])), map$1(([response]) => response), take$1(1));
886
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
887
+ ])), map(([response]) => response), take(1));
756
888
  }
757
889
  initStateless$() {
758
- var _a;
759
- const { headerId } = this.contextService.resolve();
760
- return this.quoteDraftService.init(headerId, (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {}).pipe(tap$1(() => {
761
- const assets = this.quoteDraftService.assetsState;
762
- if (assets) {
763
- this.flowStore = Object.assign(Object.assign({}, this.flowStore), { assets });
764
- }
765
- }), switchMap(() => {
766
- if (this.flowInfoService.isLegacy) {
767
- return of(null);
768
- }
769
- return this.executeRequest$(this.getDefaultExecutionRequestDTO());
770
- }), switchMap(() => this.calculate$()), tap$1(() => this.quoteDraftService.finalizeInit()), map$1(noop));
771
- }
772
- calculate$() {
773
- var _a;
774
- const flowState = this.quoteDraftService.quoteDraft;
775
- if (!flowState) {
776
- return of(undefined);
777
- }
778
- /*
779
- Don't execute procedures when:
780
- * Initializing a standalone product configuration UI, as procedure is execute in /price call
781
- * Initializing an empty account (account with no assets)
782
- */
783
- const isEmptyAccountMode = this.contextService.mode === ConfigurationContextMode.ACCOUNT &&
784
- !this.quoteDraftService.hasProducts &&
785
- !this.quoteDraftService.hasAssets &&
786
- !((_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.initialState.length);
787
- if (this.quoteDraftService.isStandalone || isEmptyAccountMode) {
788
- return of(undefined);
789
- }
790
- return this.flowConfiguration.calculate$(flowState);
890
+ return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
791
891
  }
792
892
  executeStateless$(request) {
793
893
  this.executionInProgress$.next(true);
794
- return of(undefined).pipe(tap$1(() => this.executeStatelessActions(request)), switchMap(() => {
894
+ return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
795
895
  var _a;
796
896
  /*
797
897
  Skip price calculation in case
798
898
  1. No actions in the request
799
899
  2. Initialization process execution (state not initialized yet)
800
900
  */
801
- if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
901
+ const { state } = this.salesTransactionService;
902
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
802
903
  return of(undefined);
803
904
  }
804
905
  else {
805
- return this.calculate$();
906
+ return this.flowConfiguration.calculate$(state);
806
907
  }
807
- }), map$1(() => this.executeStatelessSelectors(request)), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
908
+ }), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
808
909
  this.executionInProgress$.next(false);
809
910
  return throwError(() => e);
810
911
  }));
811
912
  }
812
913
  executeStatelessActions(request) {
813
914
  var _a;
814
- if (!this.quoteDraftService.quoteDraft || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
915
+ const state = this.salesTransactionService.state;
916
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
815
917
  return;
816
918
  }
817
- let flowState = this.quoteDraftService.quoteDraft;
919
+ let flowState = state;
818
920
  request.actions.forEach(action => {
819
921
  var _a;
820
922
  try {
@@ -826,14 +928,14 @@ class FlowStateService {
826
928
  throw e;
827
929
  }
828
930
  });
829
- this.quoteDraftService.updateQuoteDraft(flowState);
931
+ this.salesTransactionService.setState(flowState);
830
932
  }
831
933
  executeStatelessSelectors(request) {
832
934
  var _a;
833
- if (!this.quoteDraftService.quoteDraft) {
834
- throw 'QuoteDraft is not initialized';
935
+ if (!this.salesTransactionService.state) {
936
+ throw 'State is not initialized';
835
937
  }
836
- const flowState = this.quoteDraftService.quoteDraft;
938
+ const flowState = this.salesTransactionService.state;
837
939
  return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
838
940
  try {
839
941
  result.selectors[key] = {
@@ -844,1019 +946,111 @@ class FlowStateService {
844
946
  catch (e) {
845
947
  console.error(e);
846
948
  result.selectors[key] = {
847
- success: false,
848
- errorMessage: String(e),
849
- };
850
- }
851
- return result;
852
- }, { stateId: '', selectors: {} });
853
- }
854
- getFlowSafe() {
855
- if (!this.flowInfoService.flow) {
856
- throw 'Flow is not defined';
857
- }
858
- return this.flowInfoService.flow;
859
- }
860
- initProcessors$() {
861
- var _a;
862
- const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
863
- const flow = this.getFlowSafe();
864
- if (flow.properties.stateful && !hasOverrides) {
865
- // Skip initialization as backend will take processors from SF
866
- return of(undefined);
867
- }
868
- const owners$ = Object.values(this.flowInfoService.templates)
869
- .map(template => {
870
- var _a, _b, _c;
871
- if (!template) {
872
- return;
873
- }
874
- const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
875
- return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap$1(processors => {
876
- const processorsMap = processors.reduce((acc, p) => {
877
- acc[p.apiName] = p;
878
- return acc;
879
- }, {});
880
- this.processors[template.id] = processorsMap;
881
- }));
882
- })
883
- .filter(isDefined);
884
- if (!owners$.length) {
885
- return of(undefined);
886
- }
887
- return forkJoin(owners$).pipe(map$1(noop));
888
- }
889
- executeActionScript(request, executable) {
890
- var _a;
891
- const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
892
- if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
893
- const scope = this.getScopeByOwnerId(executable.ownerId);
894
- const scopeText = scope ? ` in ${scope}` : '';
895
- throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
896
- }
897
- return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
898
- }
899
- executeSelectorScript(request, executable) {
900
- var _a;
901
- const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
902
- if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
903
- const scope = this.getScopeByOwnerId(executable.ownerId);
904
- const scopeText = scope ? ` in ${scope}` : '';
905
- throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
906
- }
907
- return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
908
- }
909
- executeProcessorScript(request, configurationProcessor, inputData) {
910
- var _a;
911
- const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
912
- let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
913
- if (!functionToExecute) {
914
- const script = `${configurationProcessor.script}\nreturn transform;`;
915
- const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
916
- functionToExecute = new Function(script + sourceMap)();
917
- this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
918
- }
919
- return functionToExecute({
920
- request,
921
- inputData,
922
- flowStore: this.flowStore,
923
- });
924
- }
925
- generateRequestId(scope, selectorName, inputData) {
926
- const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
927
- return `${scope}/${selectorName}/${inputDataHash}`;
928
- }
929
- getDefaultExecutionRequestDTO() {
930
- var _a;
931
- const request = {
932
- actions: [],
933
- selectors: {},
934
- };
935
- if (this.getFlowSafe().properties.standalone) {
936
- return request;
937
- }
938
- const flowEngineTemplateId = this.getOwnerIdByScope(UITemplateType.FLOW_ENGINE);
939
- (_a = request.actions) === null || _a === void 0 ? void 0 : _a.push({
940
- apiName: 'UPDATE_CONTEXT_PROPERTIES',
941
- ownerId: flowEngineTemplateId,
942
- inputData: this.contextService.resolve().properties,
943
- });
944
- return request;
945
- }
946
- checkStatefulChanges(requestId, selectorResult) {
947
- if (this.trackedStatefulChangesMap.has(requestId)) {
948
- if (!this.initialStatefulData[requestId]) {
949
- this.initialStatefulData[requestId] = selectorResult;
950
- }
951
- const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
952
- this.trackedStatefulChangesMap.set(requestId, hasChanges);
953
- }
954
- }
955
- }
956
- FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: ContextService }, { token: QuoteDraftService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i1.ConfigurationProcessorsApiService }, { token: i1.FlowStateApiService }, { token: i1.QuoteApiService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
957
- FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
958
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
959
- type: Injectable
960
- }], ctorParameters: function () {
961
- return [{ type: ContextService }, { type: QuoteDraftService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }, { type: i6.ToastService }, { type: undefined, decorators: [{
962
- type: Optional
963
- }, {
964
- type: Inject,
965
- args: [FLOW_CUSTOMIZATION]
966
- }] }];
967
- } });
968
-
969
- const findLineItem = (id, lineItems) => {
970
- return findLineItemWithComparator(lineItems, (li) => li.id === id);
971
- };
972
- const findLineItemWithComparator = (lineItems, comparator) => {
973
- let currentLevel = lineItems;
974
- while (currentLevel.length) {
975
- const found = currentLevel.find(comparator);
976
- if (found) {
977
- return found;
978
- }
979
- currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
980
- }
981
- return;
982
- };
983
- const insertLineItem = (lineItem, parentId, toInsert) => {
984
- const insertData = lineItem.id === parentId ? [toInsert] : [];
985
- return Object.assign(Object.assign({}, lineItem), { lineItems: [
986
- ...insertData,
987
- ...lineItem.lineItems.map(li => {
988
- return insertLineItem(li, parentId, toInsert);
989
- }),
990
- ] });
991
- };
992
- const removeLineItem = (lineItem, idToRemove) => {
993
- return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems
994
- .map(li => {
995
- if (li.id === idToRemove) {
996
- return;
997
- }
998
- else if (li.lineItems.length) {
999
- return removeLineItem(li, idToRemove);
1000
- }
1001
- return li;
1002
- })
1003
- .filter(r => !!r) });
1004
- };
1005
- const replaceLineItem = (lineItem, replaceTo, skipCardinalityCalculation = false) => {
1006
- if (lineItem.id === replaceTo.id) {
1007
- if (!skipCardinalityCalculation) {
1008
- return Object.assign({}, recalculateCardinalityVariables(lineItem, replaceTo));
1009
- }
1010
- else {
1011
- return Object.assign({}, replaceTo);
1012
- }
1013
- }
1014
- return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems.map(li => replaceLineItem(li, replaceTo, skipCardinalityCalculation)) });
1015
- };
1016
- const collectCardinalityComputations = (portDomains) => {
1017
- const cardinalityComputations = new Map();
1018
- entries(portDomains).forEach(([key, portDomain]) => {
1019
- cardinalityComputations.set(key, portDomain.properties['cardinalityComputation'] === 'true');
1020
- });
1021
- return cardinalityComputations;
1022
- };
1023
- const calculateCardinalityVariables = (lineItems, cardinalityComputations) => {
1024
- const cardVars = new Map();
1025
- lineItems
1026
- .filter(({ port, type }) => !!port && !!type)
1027
- .forEach(li => {
1028
- var _a;
1029
- if (cardinalityComputations.get(`${li.port}`)) {
1030
- const cardinalityVariableName = `#CV-${li.type}@${li.port}`;
1031
- cardVars.set(cardinalityVariableName, ((_a = cardVars.get(cardinalityVariableName)) !== null && _a !== void 0 ? _a : 0) + li.qty);
1032
- }
1033
- });
1034
- return cardVars;
1035
- };
1036
- const cardinalityRegexp = new RegExp('#CV-[a-zA-Z0-9_]+@(?<portName>[a-zA-Z0-9_]+)');
1037
- const recalculateCardinalityVariables = (original, updated) => {
1038
- var _a, _b;
1039
- const cardinalityComputations = collectCardinalityComputations((_b = (_a = updated.portDomains) !== null && _a !== void 0 ? _a : original.portDomains) !== null && _b !== void 0 ? _b : {});
1040
- const cardinalityVariables = calculateCardinalityVariables(updated.lineItems, cardinalityComputations);
1041
- const originalCardinalityVariables = calculateCardinalityVariables(original.lineItems, cardinalityComputations);
1042
- originalCardinalityVariables.forEach((value, key) => {
1043
- var _a;
1044
- const execArray = cardinalityRegexp.exec(key);
1045
- const portName = (_a = execArray === null || execArray === void 0 ? void 0 : execArray.groups) === null || _a === void 0 ? void 0 : _a['portName'];
1046
- if (!portName || cardinalityComputations.get(portName)) {
1047
- if (cardinalityVariables.get(key) === value) {
1048
- // no need to update cardinality if no changes
1049
- cardinalityVariables.delete(key);
1050
- }
1051
- else if (!cardinalityVariables.has(key)) {
1052
- // remove last item from port
1053
- cardinalityVariables.set(key, 0);
1054
- }
1055
- }
1056
- });
1057
- return Object.assign(Object.assign({}, updated), { attributes: upsertAttributes(updated.attributes, [...cardinalityVariables].map(([name, value]) => ({ name, value, cfgStatus: 'Changed' }))) });
1058
- };
1059
- const mapAttributes = (attributes) => {
1060
- return attributes.reduce((acc, { name, value }) => (Object.assign(Object.assign({}, acc), { [name]: value })), {});
1061
- };
1062
- const getAttributes = (attributes, names = []) => {
1063
- const filtered = attributes.filter(({ name }) => names.includes(name));
1064
- return sortBy(filtered, [({ name }) => names.indexOf(name)]);
1065
- };
1066
- const upsertAttributes = (originalAttributes, attributesToUpsert) => {
1067
- return attributesToUpsert.reduce((acc, { name, value }) => {
1068
- const [origAttr] = getAttributes(acc, [name]);
1069
- return [
1070
- ...acc.filter(attr => attr.name !== name),
1071
- Object.assign(Object.assign({}, (origAttr !== null && origAttr !== void 0 ? origAttr : { name, type: '' })), { cfgStatus: origAttr ? 'Changed' : 'User', value }),
1072
- ];
1073
- }, originalAttributes);
1074
- };
1075
- const patchAttributes = (rootLineItem, id, attrs, skipCardinalityCalculation = false) => {
1076
- const lineItem = findLineItem(id, [rootLineItem]);
1077
- if (!lineItem) {
1078
- return rootLineItem;
1079
- }
1080
- const attributes = upsertAttributes(lineItem.attributes, attrs);
1081
- return replaceLineItem(rootLineItem, Object.assign(Object.assign({}, lineItem), { attributes }), skipCardinalityCalculation);
1082
- };
1083
- const getAttributeValue = (attributes, name) => { var _a; return (_a = attributes.find(attr => attr.name === name)) === null || _a === void 0 ? void 0 : _a.value; };
1084
- const generateLineItem = (port, type, parentId, attributes = [], lineItems = []) => {
1085
- return {
1086
- id: UUID.UUID(),
1087
- port,
1088
- type,
1089
- actionCode: 'ADD',
1090
- cfgStatus: 'New',
1091
- attributes: attributes.map(({ name, value }) => ({ cfgStatus: 'User', name, value })),
1092
- lineItems,
1093
- parentId,
1094
- qty: 1,
1095
- };
1096
- };
1097
- const getRecommendedPrices = (portDomain, type) => {
1098
- var _a, _b;
1099
- const domainType = portDomain.domainTypes.find(({ name }) => name === type);
1100
- const [net, list] = (_b = (_a = domainType === null || domainType === void 0 ? void 0 : domainType.recommendedPrices) === null || _a === void 0 ? void 0 : _a.filter(({ chargeMethod }) => chargeMethod === 'ONE_TIME').reduce((acc, rp) => {
1101
- const [netPrice, listPrice] = acc;
1102
- return [netPrice + rp.netPrice, listPrice + rp.listPrice];
1103
- }, [0, 0])) !== null && _b !== void 0 ? _b : [0, 0];
1104
- return { net, list };
1105
- };
1106
- const getOriginParent = (lineItems, currentLineItem) => {
1107
- let target = currentLineItem;
1108
- while (target && target.rampInstanceId) {
1109
- target = lineItems.find(sub => sub.id === currentLineItem.rampInstanceId);
1110
- }
1111
- return target;
1112
- };
1113
- const assetPredicateFn = (lineItem, assetId) => {
1114
- if (!assetId) {
1115
- return false;
1116
- }
1117
- return lineItem.assetId === assetId || lineItem.openOrderLineItemId === assetId;
1118
- };
1119
- const multiplyLineItems = (lineItem, qty, split) => {
1120
- if (split) {
1121
- const unifyIds = (lineItem) => (Object.assign(Object.assign({}, lineItem), { id: UUID.UUID(), lineItems: lineItem.lineItems.map(unifyIds) }));
1122
- return map$2(new Array(qty), () => unifyIds(lineItem));
1123
- }
1124
- else {
1125
- return [
1126
- Object.assign(Object.assign({}, lineItem), { qty: qty }),
1127
- ];
1128
- }
1129
- };
1130
- const isTechnicalAttribute = (name) => {
1131
- return name.startsWith('#') || name.startsWith('$');
1132
- };
1133
- const filterOutTechnicalAttributes = (attributes) => {
1134
- return attributes.filter(({ name }) => !isTechnicalAttribute(name));
1135
- };
1136
-
1137
- var lineItem_utils = /*#__PURE__*/Object.freeze({
1138
- __proto__: null,
1139
- assetPredicateFn: assetPredicateFn,
1140
- filterOutTechnicalAttributes: filterOutTechnicalAttributes,
1141
- findLineItem: findLineItem,
1142
- findLineItemWithComparator: findLineItemWithComparator,
1143
- generateLineItem: generateLineItem,
1144
- getAttributeValue: getAttributeValue,
1145
- getAttributes: getAttributes,
1146
- getOriginParent: getOriginParent,
1147
- getRecommendedPrices: getRecommendedPrices,
1148
- insertLineItem: insertLineItem,
1149
- isTechnicalAttribute: isTechnicalAttribute,
1150
- mapAttributes: mapAttributes,
1151
- multiplyLineItems: multiplyLineItems,
1152
- patchAttributes: patchAttributes,
1153
- recalculateCardinalityVariables: recalculateCardinalityVariables,
1154
- removeLineItem: removeLineItem,
1155
- replaceLineItem: replaceLineItem,
1156
- upsertAttributes: upsertAttributes
1157
- });
1158
-
1159
- class LineItemWorker {
1160
- constructor(src) {
1161
- this.li = Object.assign({}, src);
1162
- }
1163
- insert(parentId, toInsert) {
1164
- return new LineItemWorker(insertLineItem(this.li, parentId, toInsert));
1165
- }
1166
- remove(id) {
1167
- return new LineItemWorker(removeLineItem(this.li, id));
1168
- }
1169
- replace(toReplace, skipCardinalityCalculation = false) {
1170
- return new LineItemWorker(replaceLineItem(this.li, toReplace, skipCardinalityCalculation));
1171
- }
1172
- patchAttribute(attrs, id, skipCardinalityCalculation = false) {
1173
- return new LineItemWorker(patchAttributes(this.li, id !== null && id !== void 0 ? id : this.li.id, attrs, skipCardinalityCalculation));
1174
- }
1175
- }
1176
-
1177
- function extractMetadata(uiDefinition) {
1178
- return omit(uiDefinition, [
1179
- 'children',
1180
- 'pages',
1181
- 'components',
1182
- ]);
1183
- }
1184
-
1185
- class FlowUpdateService {
1186
- update(rootLineItems, updates, charges) {
1187
- let remainingUpdates = [...updates];
1188
- let currentLevel = rootLineItems;
1189
- while (currentLevel.length && remainingUpdates.length) {
1190
- currentLevel.forEach(li => {
1191
- const unhandledUpdates = [];
1192
- remainingUpdates.forEach(update => {
1193
- let updated = false;
1194
- switch (update.dataType) {
1195
- case 'LINEITEM':
1196
- updated = this.applyLineItemUpdate(li, update, charges);
1197
- break;
1198
- case 'CHARGE':
1199
- updated = this.applyChargeUpdate(li, update);
1200
- break;
1201
- case 'GROUP_CHARGE':
1202
- updated = this.applyChargeGroupUpdate(li, update);
1203
- break;
1204
- default:
1205
- // Unknown dataType. Do not try to handle it anymore
1206
- updated = true;
1207
- }
1208
- if (!updated) {
1209
- unhandledUpdates.push(update);
1210
- }
1211
- });
1212
- remainingUpdates = unhandledUpdates;
1213
- });
1214
- currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
1215
- }
1216
- }
1217
- delete(lineItems, id) {
1218
- const idsToRemove = [id];
1219
- const topLevelLineItem = lineItems.find(li => li.id === id);
1220
- if (topLevelLineItem) {
1221
- // find term-related line items (which are only top level)
1222
- // expired term line items won't be deleted
1223
- let foundTermLineItem = topLevelLineItem;
1224
- while (foundTermLineItem) {
1225
- foundTermLineItem = lineItems.find(li => foundTermLineItem && li.rampInstanceId === foundTermLineItem.id);
1226
- if (foundTermLineItem) {
1227
- idsToRemove.push(foundTermLineItem.id);
1228
- }
1229
- }
1230
- }
1231
- const filtered = lineItems.filter(lineItem => !idsToRemove.includes(lineItem.id));
1232
- return filtered.map(lineItem => new LineItemWorker(lineItem).remove(id).li);
1233
- }
1234
- applyLineItemUpdate(lineItem, update, charges) {
1235
- if (lineItem.id !== update.id) {
1236
- return false;
1237
- }
1238
- switch (update.attributeType) {
1239
- case 'QTY':
1240
- lineItem.qty = update.newValue;
1241
- break;
1242
- case 'EFFECTIVE_START_DATE':
1243
- lineItem.properties['StartDate'] = moment(update.newValue).format('YYYY-MM-DD');
1244
- break;
1245
- case 'END_DATE':
1246
- lineItem.properties['EndDate'] = moment(update.newValue).format('YYYY-MM-DD');
1247
- break;
1248
- case 'PRICE_ADJUSTMENT':
1249
- {
1250
- const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
1251
- if (charge) {
1252
- charge.priceAdjustment = update.newValue;
1253
- }
1254
- }
1255
- break;
1256
- case 'LIST_PRICE_ADJUSTMENT':
1257
- case 'MARGIN_ADJUSTMENT':
1258
- {
1259
- const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
1260
- if (charge) {
1261
- charge.listPriceAdjustment = update.newValue;
1262
- }
1263
- }
1264
- break;
1265
- case 'COST_ADJUSTMENT':
1266
- {
1267
- const charge = lineItem.chargeItems.find(charge => { var _a; return (_a = (charges || {})[charge.chargeId]) === null || _a === void 0 ? void 0 : _a.main; });
1268
- if (charge) {
1269
- charge.costAdjustment = update.newValue;
1270
- }
1271
- }
1272
- break;
1273
- default:
1274
- throw new Error(`Not suppored AttributeType for LineItem update: ${update.attributeType}`);
1275
- }
1276
- return true;
1277
- }
1278
- applyChargeUpdate(lineItem, update) {
1279
- const foundCharge = lineItem.chargeItems.find(({ id }) => id === update.id);
1280
- if (!foundCharge) {
1281
- return false;
1282
- }
1283
- if (update.attributeType === 'PRICE_ADJUSTMENT') {
1284
- foundCharge.priceAdjustment = update.newValue;
1285
- }
1286
- else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
1287
- foundCharge.listPriceAdjustment = update.newValue;
1288
- }
1289
- else {
1290
- throw new Error(`Not suppored AttributeType for Charge Item update: ${update.attributeType}`);
1291
- }
1292
- return true;
1293
- }
1294
- applyChargeGroupUpdate(lineItem, update) {
1295
- const foundChargeGroup = ChargeGroupUtils.findChargeGroupById(update.id, lineItem);
1296
- if (!foundChargeGroup) {
1297
- return false;
1298
- }
1299
- if (update.attributeType === 'PRICE_ADJUSTMENT') {
1300
- foundChargeGroup.priceAdjustment = update.newValue;
1301
- }
1302
- else if (update.attributeType === 'LIST_PRICE_ADJUSTMENT') {
1303
- foundChargeGroup.listPriceAdjustment = update.newValue;
1304
- }
1305
- else {
1306
- throw new Error(`Not suppored AttributeType for Charge Group Item update: ${update.attributeType}`);
1307
- }
1308
- return true;
1309
- }
1310
- }
1311
- FlowUpdateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1312
- FlowUpdateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService });
1313
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowUpdateService, decorators: [{
1314
- type: Injectable
1315
- }] });
1316
-
1317
- class RuntimeSettingsService {
1318
- constructor(configurationSettingsApiService) {
1319
- this.configurationSettingsApiService = configurationSettingsApiService;
1320
- this.configurationSettings$ = new BehaviorSubject({});
1321
- this.currencySettings$ = new BehaviorSubject({
1322
- iso: DEFAULT_CURRENCY_ISO_CODE,
1323
- symbol: DEFAULT_CURRENCY_SYMBOL,
1324
- });
1325
- this.shoppingCartSettings$ = new BehaviorSubject([]);
1326
- this.getCurrencySymbol = (locale, currency) => {
1327
- return (0)
1328
- .toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
1329
- .replace(/\d/g, '')
1330
- .trim();
1331
- };
1332
- }
1333
- create() {
1334
- return this.configurationSettingsApiService.fetchSettings().pipe(map$1(settings => this.parseConfigurationSettings(settings)), tap$1(configurationSettings => {
1335
- var _a;
1336
- this.configurationSettings$.next(configurationSettings);
1337
- this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
1338
- this.formattingSettings = this.getFormattingSettings();
1339
- }), map$1(() => undefined));
1340
- }
1341
- initCurrency(iso) {
1342
- if (iso) {
1343
- const symbol = this.getCurrencySymbol('en-US', iso);
1344
- this.currencySettings$.next({ iso, symbol });
1345
- if (this.formattingSettings) {
1346
- this.formattingSettings.currencySymbol = symbol;
1347
- }
1348
- }
1349
- }
1350
- getFormattingSettings() {
1351
- var _a, _b;
1352
- if (this.formattingSettings) {
1353
- return this.formattingSettings;
1354
- }
1355
- const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
1356
- return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
1357
- }, {});
1358
- const currencySettings = this.getCurrencySettings();
1359
- const dateFormat = (validateDateFormat((_b = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT) !== null && _b !== void 0 ? _b : '') && (shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT)) ||
1360
- DEFAULT_DATE_FORMAT;
1361
- const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
1362
- const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
1363
- // the number of decimal places can be 0
1364
- const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
1365
- const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
1366
- ? Number(priceScale)
1367
- : DEFAULT_DECIMALS_COUNT;
1368
- const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
1369
- return {
1370
- currencySymbol: currencySettings.symbol,
1371
- dateFormats: getSupportedDateFormats(dateFormat),
1372
- decimalsCount,
1373
- decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
1374
- ? decimalSeparator
1375
- : DEFAULT_DECIMAL_SEPARATOR,
1376
- // thousands separator can be a blank value, so it can also be null
1377
- thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
1378
- ? thousandsSeparator || ''
1379
- : DEFAULT_THOUSANDS_SEPARATOR,
1380
- actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
1381
- ? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
1382
- : DEFAULT_ACTION_CODE_LABELS,
1383
- };
1384
- }
1385
- getConfigurationSettings() {
1386
- return this.configurationSettings$.value;
1387
- }
1388
- getShoppingCartSettings() {
1389
- return this.shoppingCartSettings$.value;
1390
- }
1391
- getCurrencySettings() {
1392
- return this.currencySettings$.value;
1393
- }
1394
- parseConfigurationSettings(settings) {
1395
- return settings.reduce((acc, setting) => {
1396
- switch (setting.key) {
1397
- case 'shopping-cart':
1398
- acc['shopping-cart'] = parseJsonSafely(setting.value, []);
1399
- break;
1400
- case 'navigation':
1401
- acc.navigation = parseJsonSafely(setting.value, {});
1402
- break;
1403
- case 'flows':
1404
- acc.flows = parseJsonSafely(setting.value, []);
1405
- break;
1406
- default:
1407
- acc[setting.key] = setting.value;
1408
- }
1409
- return acc;
1410
- }, {});
1411
- }
1412
- addShoppingCartSettings(settings) {
1413
- // uniqBy removes items with the biggest index
1414
- const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
1415
- this.shoppingCartSettings$.next(newSettings);
1416
- }
1417
- }
1418
- RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1419
- RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
1420
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
1421
- type: Injectable
1422
- }], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
1423
-
1424
- class ConfigurationService {
1425
- constructor(quoteDraftService, runtimeService, contextService, configurationApiService, messageService, dialogService, runtimeSettings, flowInfoService) {
1426
- this.quoteDraftService = quoteDraftService;
1427
- this.runtimeService = runtimeService;
1428
- this.contextService = contextService;
1429
- this.configurationApiService = configurationApiService;
1430
- this.messageService = messageService;
1431
- this.dialogService = dialogService;
1432
- this.runtimeSettings = runtimeSettings;
1433
- this.flowInfoService = flowInfoService;
1434
- this.mode = ConfigurationMode.SEARCH;
1435
- this.configurationState = new BehaviorSubject(null);
1436
- this.previousConfigurationState = new BehaviorSubject(null);
1437
- this.isLoadingSubj$ = new BehaviorSubject(false);
1438
- this.isLoading$ = this.isLoadingSubj$.asObservable();
1439
- this.hasUnsavedChanges = false;
1440
- }
1441
- reset() {
1442
- this.hasUnsavedChanges = false;
1443
- this.runtimeService.reset();
1444
- this.configurableRamp = undefined;
1445
- this.configurationState.next(null);
1446
- this.previousConfigurationState.next(null);
1447
- }
1448
- patch$(lineItem, options) {
1449
- const source = this.getSnapshot();
1450
- if (!source) {
1451
- return throwError(() => new Error(`Source LineItem not found`));
1452
- }
1453
- const skipCardinalityCalculation = (options === null || options === void 0 ? void 0 : options.skipCardinalityCalculation) || this.contextSnapshot.properties['#skipCardinalityCalculation'] === 'true';
1454
- this.configurableRamp = new LineItemWorker(source).replace(lineItem, skipCardinalityCalculation).li;
1455
- return this.configure().pipe(catchError$1(error => {
1456
- console.error(error);
1457
- if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
1458
- this.messageService.add({ severity: 'error', summary: error });
1459
- }
1460
- // bounce back if configuration call has failed
1461
- const prevState = this.configurationState.value;
1462
- this.configurationState.next(prevState ? Object.assign({}, prevState) : null);
1463
- return throwError(() => error);
1464
- }), tap(() => {
1465
- if (!this.hasUnsavedChanges) {
1466
- this.hasUnsavedChanges = true;
1467
- }
1468
- }));
1469
- }
1470
- patch(lineItem, options) {
1471
- this.patch$(lineItem, options).subscribe();
1472
- }
1473
- setConfigurableRamp(lineItem) {
1474
- this.configurableRamp = lineItem;
1475
- }
1476
- get() {
1477
- return this.configurationState.pipe(map(state => state === null || state === void 0 ? void 0 : state.lineItem), shareReplay$1());
1478
- }
1479
- getSnapshot() {
1480
- var _a, _b;
1481
- return ((_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.lineItem) ? Object.assign({}, (_b = this.configurationState.value) === null || _b === void 0 ? void 0 : _b.lineItem) : undefined;
1482
- }
1483
- getRuntimeModel() {
1484
- const runtimeModel = this.runtimeService.runtimeModel;
1485
- if (!runtimeModel) {
1486
- throw new Error('Runtime model not initialized');
1487
- }
1488
- return runtimeModel;
1489
- }
1490
- getRuntimeContext() {
1491
- const runtimeContext = this.runtimeService.runtimeContext;
1492
- if (!runtimeContext) {
1493
- throw new Error('Runtime context not initialized');
1494
- }
1495
- return runtimeContext;
1496
- }
1497
- get state$() {
1498
- return this.configurationState.asObservable();
1499
- }
1500
- get stateSnapshot() {
1501
- return this.configurationState.value;
1502
- }
1503
- get previousStateSnapshot() {
1504
- return this.previousConfigurationState.value;
1505
- }
1506
- get contextSnapshot() {
1507
- return this.contextService.resolve();
1508
- }
1509
- get context$() {
1510
- return this.contextService.resolve$();
1511
- }
1512
- get charges$() {
1513
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.charges) !== null && _a !== void 0 ? _a : {}; }));
1514
- }
1515
- get chargesSnapshot() {
1516
- var _a, _b;
1517
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
1518
- }
1519
- get pricePlans$() {
1520
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.pricePlans) !== null && _a !== void 0 ? _a : {}; }));
1521
- }
1522
- get pricePlansSnapshot() {
1523
- var _a, _b;
1524
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
1525
- }
1526
- get procedureContext$() {
1527
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.procedureContext) !== null && _a !== void 0 ? _a : {}; }));
1528
- }
1529
- get procedureContextSnapshot() {
1530
- var _a, _b;
1531
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.procedureContext) !== null && _b !== void 0 ? _b : {};
1532
- }
1533
- configure() {
1534
- return this.configureRequest$(this.generateRequest());
1535
- }
1536
- configureRequest$(configurationRequest) {
1537
- var _a;
1538
- const runtimeContext = this.getRuntimeContext();
1539
- const runtimeModel = this.getRuntimeModel();
1540
- const uiDefinitionProperties = this.getUIDefinitionProperties();
1541
- const mainPricingEnabled = (_a = runtimeContext.properties) === null || _a === void 0 ? void 0 : _a.PricingEnabled;
1542
- const pricingEnabled = mainPricingEnabled ? mainPricingEnabled === 'true' : uiDefinitionProperties.pricingEnabled;
1543
- const customPriceApi = this.runtimeSettings.getConfigurationSettings()['CUSTOM_PRICE_API'];
1544
- this.isLoadingSubj$.next(true);
1545
- const configure$ = pricingEnabled && customPriceApi
1546
- ? this.configurationApiService.customConfigurePrice({
1547
- url: customPriceApi,
1548
- configurationRequest: this.extendConfigurationRequest(configurationRequest),
1549
- runtimeModel,
1550
- })
1551
- : this.extendedConfigureLineItem$({
1552
- configurationRequest,
1553
- runtimeModel,
1554
- pricingEnabled,
1555
- });
1556
- return configure$.pipe(tap(result => {
1557
- var _a;
1558
- this.contextService.update(result.context);
1559
- this.configurationState.next(result);
1560
- this.previousConfigurationState.next(cloneDeep(result));
1561
- if ((_a = result.deletedLineItems) === null || _a === void 0 ? void 0 : _a.length) {
1562
- this.showInactiveProductsConfirmation();
1563
- }
1564
- this.configurableRamp = result.lineItem;
1565
- }), map(({ lineItem }) => lineItem), catchError$1(error => throwError(() => {
1566
- const resetState = this.previousConfigurationState.value;
1567
- if (resetState) {
1568
- this.previousConfigurationState.next(cloneDeep(resetState));
1569
- this.configurationState.next(resetState);
1570
- }
1571
- if (error.error) {
1572
- return extractErrorDetails(error.error).join('. ');
1573
- }
1574
- return error.message || JSON.stringify(error);
1575
- })), finalize$1(() => this.isLoadingSubj$.next(false)));
1576
- }
1577
- configureExternal$(props) {
1578
- return this.runtimeService
1579
- .init({ productId: props.productId, defaultQty: props.qty, attributesMap: props.attributesMap })
1580
- .pipe(switchMap$1(() => this.configure()), first(), catchError$1(error => {
1581
- this.messageService.add({ severity: ToastType.error, summary: error });
1582
- throw error;
1583
- }), finalize$1(() => this.reset()));
1584
- }
1585
- configureGuidedSelling$(data) {
1586
- return this.extendedConfigureLineItem$({
1587
- configurationRequest: getGuidedSellingConfigurationRequest(data, this.contextService.resolve()),
1588
- }).pipe(catchError$1(error => {
1589
- if (error instanceof HttpErrorResponse) {
1590
- this.messageService.add({ severity: ToastType.error, summary: error.error.message || error.error });
1591
- }
1592
- throw error;
1593
- }));
1594
- }
1595
- generateRequest(lightMode = true) {
1596
- var _a, _b;
1597
- const lineItem = this.generateLineItem();
1598
- let request = {
1599
- lineItem,
1600
- mode: this.mode,
1601
- step: !((_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.lineItem) ? RuntimeStep.START : RuntimeStep.UPDATE,
1602
- attributeDomainMode: 'ALL',
1603
- context: this.contextService.resolve(),
1604
- lineItems: ((_b = this.quoteDraftService.quoteDraft) === null || _b === void 0 ? void 0 : _b.currentState) || [],
1605
- asset: this.getAsset(),
1606
- };
1607
- if (lightMode) {
1608
- request = ConfigurationTranslatorUtils.lightenConfigurationRequest(request);
1609
- }
1610
- return request;
1611
- }
1612
- generateLineItem() {
1613
- var _a;
1614
- const runtimeContext = this.getRuntimeContext();
1615
- const uiDefinitionProperties = this.getUIDefinitionProperties();
1616
- let lineItem = this.configurableRamp;
1617
- if (!lineItem) {
1618
- const { initializationProps } = (_a = this.runtimeService) !== null && _a !== void 0 ? _a : {};
1619
- lineItem = getDefaultLineItem(runtimeContext, uiDefinitionProperties, initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.defaultQty);
1620
- // Set default attributes
1621
- if (initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap) {
1622
- const attributes = transform(initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap, (acc, value, name) => acc.push({ name, value }), []);
1623
- lineItem = new LineItemWorker(lineItem).patchAttribute(attributes).li;
1624
- }
1625
- }
1626
- return lineItem;
1627
- }
1628
- getAsset() {
1629
- var _a, _b;
1630
- const lineItem = this.configurableRamp;
1631
- if (!lineItem) {
1632
- return;
1633
- }
1634
- const assetId = (_a = lineItem.assetId) !== null && _a !== void 0 ? _a : lineItem.openOrderLineItemId;
1635
- return (_b = this.quoteDraftService.assetsState) === null || _b === void 0 ? void 0 : _b.initialState.find(li => assetPredicateFn(li, assetId));
1636
- }
1637
- getUIDefinitionProperties() {
1638
- var _a, _b, _c;
1639
- return Object.assign(Object.assign({}, ((_b = (_a = this.getRuntimeContext().uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {})), ((_c = this.runtimeService.uiDefinitionProperties) !== null && _c !== void 0 ? _c : {}));
1640
- }
1641
- showInactiveProductsConfirmation() {
1642
- const confirmationConfig = {
1643
- title: ' ',
1644
- description: 'This quote contains inactive products. Do you want to remove them?',
1645
- primaryButtonLabel: 'Remove products',
1646
- secondaryButtonLabel: 'Back to Quote',
1647
- };
1648
- this.dialogService
1649
- .open(ConfirmationComponent, {
1650
- dismissableMask: false,
1651
- closeOnEscape: false,
1652
- closable: false,
1653
- showHeader: true,
1654
- header: `Inactive Products in Quote`,
1655
- width: '440px',
1656
- data: { confirmationConfig },
1657
- })
1658
- .onClose.subscribe(result => {
1659
- if (!result) {
1660
- const context = this.contextService.resolve();
1661
- window['VELO_BACK_FN'].apply(null, [context.headerId]);
1662
- }
1663
- });
1664
- }
1665
- extendedConfigureLineItem$({ configurationRequest, runtimeModel, pricingEnabled, }) {
1666
- return this.configurationApiService.configureLineItem({
1667
- configurationRequest: this.extendConfigurationRequest(configurationRequest),
1668
- runtimeModel,
1669
- pricingEnabled,
1670
- });
1671
- }
1672
- extendConfigurationRequest(configurationRequest) {
1673
- var _a;
1674
- const procedureName = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.procedureName;
1675
- return Object.assign(Object.assign({}, configurationRequest), (procedureName ? { procedureName } : {}));
1676
- }
1677
- }
1678
- ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: QuoteDraftService }, { token: ConfigurationRuntimeService }, { token: ContextService }, { token: i1.ConfigurationApiService }, { token: i5.MessageService }, { token: i6$1.DialogService }, { token: RuntimeSettingsService }, { token: FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
1679
- ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1680
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
1681
- type: Injectable
1682
- }], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: ConfigurationRuntimeService }, { type: ContextService }, { type: i1.ConfigurationApiService }, { type: i5.MessageService }, { type: i6$1.DialogService }, { type: RuntimeSettingsService }, { type: FlowInfoService }]; } });
1683
-
1684
- class FlowConfigurationService {
1685
- constructor(proceduresApiService, contextService, quoteDraftService, updateService, configurationService, flowInfoService) {
1686
- this.proceduresApiService = proceduresApiService;
1687
- this.contextService = contextService;
1688
- this.quoteDraftService = quoteDraftService;
1689
- this.updateService = updateService;
1690
- this.configurationService = configurationService;
1691
- this.flowInfoService = flowInfoService;
1692
- this.updatedSubj$ = new Subject();
1693
- this.updated$ = this.updatedSubj$.asObservable();
1694
- }
1695
- calculate$(quoteDraft) {
1696
- return this.extendedApply$(quoteDraft).pipe(tap$1(result => {
1697
- // sort the result current state based on the quote draft initial state
1698
- const initialStateIds = quoteDraft.initialState.map(lineItem => lineItem.integrationId);
1699
- result.currentState = result.currentState
1700
- .slice()
1701
- .sort((a, b) => initialStateIds.indexOf(a.integrationId) - initialStateIds.indexOf(b.integrationId));
1702
- this.quoteDraftService.updateQuoteDraft(result);
1703
- }), map$1(noop));
1704
- }
1705
- calculate(quoteDraft) {
1706
- this.calculate$(quoteDraft).subscribe();
949
+ success: false,
950
+ errorMessage: String(e),
951
+ };
952
+ }
953
+ return result;
954
+ }, { stateId: '', selectors: {} });
1707
955
  }
1708
- update$(updates) {
1709
- const quoteDraft = this.quoteDraftService.quoteDraft;
1710
- if (!quoteDraft) {
1711
- return of(null);
956
+ initProcessors$() {
957
+ var _a;
958
+ const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
959
+ if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
960
+ // Skip initialization as backend will take processors from SF
961
+ return of(undefined);
1712
962
  }
1713
- return of([]).pipe(map$1(() => {
1714
- const updatedState = cloneDeep(quoteDraft.currentState);
1715
- this.updateService.update(updatedState, updates, quoteDraft.charges);
1716
- return updatedState;
1717
- }), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1718
- }
1719
- update(updates) {
1720
- this.update$(updates).subscribe();
1721
- }
1722
- revert$(lineItemId) {
1723
- const quoteDraft = this.quoteDraftService.quoteDraft;
1724
- const initialCurrentState = this.quoteDraftService.getInitialCurrentState();
1725
- const currentState = this.quoteDraftService.currentState;
1726
- const currentLineItemIndex = currentState.findIndex(({ id }) => id === lineItemId);
1727
- const currentLineItem = currentState[currentLineItemIndex];
1728
- const initialLineItem = initialCurrentState.find(({ integrationId }) => integrationId === (currentLineItem === null || currentLineItem === void 0 ? void 0 : currentLineItem.integrationId));
1729
- if (!quoteDraft || !currentLineItem || !initialLineItem) {
1730
- return of(null);
963
+ const owners$ = Object.values(this.flowInfoService.templates)
964
+ .map(template => {
965
+ var _a, _b, _c;
966
+ if (!template) {
967
+ return;
968
+ }
969
+ const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
970
+ return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
971
+ const processorsMap = processors.reduce((acc, p) => {
972
+ acc[p.apiName] = p;
973
+ return acc;
974
+ }, {});
975
+ this.processors[template.id] = processorsMap;
976
+ }));
977
+ })
978
+ .filter(isDefined);
979
+ if (!owners$.length) {
980
+ return of(undefined);
1731
981
  }
1732
- const updatedState = cloneDeep(currentState);
1733
- updatedState.splice(currentLineItemIndex, 1, initialLineItem);
1734
- return of([]).pipe(tap$1(() => {
1735
- this.quoteDraftService.setCurrentLineItemState(updatedState);
1736
- }), switchMap(() => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1737
- }
1738
- revert(lineItemId) {
1739
- this.revert$(lineItemId).subscribe();
982
+ return forkJoin(owners$).pipe(map(noop));
1740
983
  }
1741
- delete$(ids) {
1742
- const quoteDraft = this.quoteDraftService.quoteDraft;
1743
- const currentState = this.quoteDraftService.currentState;
1744
- if (!quoteDraft) {
1745
- return of(null);
984
+ executeActionScript(request, executable) {
985
+ var _a;
986
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
987
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
988
+ const scope = this.getScopeByOwnerId(executable.ownerId);
989
+ const scopeText = scope ? ` in ${scope}` : '';
990
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1746
991
  }
1747
- return of([]).pipe(map$1(() => ids.reduce((result, id) => this.updateService.delete(result, id), currentState)), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1748
- }
1749
- delete(ids) {
1750
- this.delete$(ids).subscribe();
992
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1751
993
  }
1752
- addTerm$(term) {
1753
- const quoteDraft = this.quoteDraftService.quoteDraft;
1754
- if (!quoteDraft) {
1755
- return of(null);
994
+ executeSelectorScript(request, executable) {
995
+ var _a;
996
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
997
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
998
+ const scope = this.getScopeByOwnerId(executable.ownerId);
999
+ const scopeText = scope ? ` in ${scope}` : '';
1000
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1756
1001
  }
1757
- const updatedState = [...quoteDraft.currentState, term];
1758
- return of([]).pipe(switchMap(() => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1002
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1759
1003
  }
1760
- addToCart$(props) {
1761
- const quoteDraft = this.quoteDraftService.quoteDraft;
1762
- if (!quoteDraft) {
1763
- return of(null);
1004
+ executeProcessorScript(request, configurationProcessor, inputData) {
1005
+ var _a;
1006
+ const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
1007
+ let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
1008
+ if (!functionToExecute) {
1009
+ const script = `${configurationProcessor.script}\nreturn transform;`;
1010
+ const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
1011
+ functionToExecute = new Function(script + sourceMap)();
1012
+ this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
1764
1013
  }
1765
- return this.configurationService.configureExternal$(props).pipe(map$1(lineItem => {
1766
- var _a, _b, _c;
1767
- const model = this.configurationService.getRuntimeModel();
1768
- const split = (_b = (_a = model === null || model === void 0 ? void 0 : model.types.find(type => type.name === lineItem.type)) === null || _a === void 0 ? void 0 : _a.split) !== null && _b !== void 0 ? _b : false;
1769
- const lineItems = multiplyLineItems(lineItem, (_c = props.qty) !== null && _c !== void 0 ? _c : 1, split);
1770
- return [...quoteDraft.currentState, ...lineItems];
1771
- }), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1772
- }
1773
- get() {
1774
- return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.currentState), shareReplay$1());
1775
- }
1776
- getSnapshot() {
1777
- var _a, _b;
1778
- return (_b = (_a = this.quoteDraftService) === null || _a === void 0 ? void 0 : _a.currentState.slice()) !== null && _b !== void 0 ? _b : [];
1779
- }
1780
- get charges$() {
1781
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ charges }) => charges));
1782
- }
1783
- get pricePlans$() {
1784
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ pricePlans }) => pricePlans));
1785
- }
1786
- get activeMetrics$() {
1787
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ activeMetrics }) => activeMetrics));
1788
- }
1789
- get chargesSnapshot() {
1790
- var _a, _b;
1791
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
1792
- }
1793
- get pricePlansSnapshot() {
1794
- var _a, _b;
1795
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
1796
- }
1797
- get activeMetricsSnapshot() {
1798
- var _a, _b;
1799
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.activeMetrics) !== null && _b !== void 0 ? _b : [];
1800
- }
1801
- get contextSnapshot() {
1802
- return this.contextService.resolve();
1803
- }
1804
- get context$() {
1805
- return this.contextService.resolve$();
1014
+ return functionToExecute({
1015
+ request,
1016
+ inputData,
1017
+ flowStore: this.flowStore,
1018
+ });
1806
1019
  }
1807
- handleErrorAndBounceBack() {
1808
- return (source$) => {
1809
- return source$.pipe(catchError(error => {
1810
- console.error(error);
1811
- // bounce back if configuration call has failed
1812
- const quoteDraft = this.quoteDraftService.quoteDraft;
1813
- if (quoteDraft) {
1814
- this.quoteDraftService.updateQuoteDraft(quoteDraft);
1815
- this.updatedSubj$.next();
1816
- }
1817
- return throwError(() => error);
1818
- }));
1819
- };
1020
+ generateRequestId(scope, selectorName, inputData) {
1021
+ const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
1022
+ return `${scope}/${selectorName}/${inputDataHash}`;
1820
1023
  }
1821
- extendedApply$(quoteDraft) {
1822
- var _a;
1823
- const request = Object.assign({}, quoteDraft);
1824
- const procedureName = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.procedureName;
1825
- if (procedureName) {
1826
- request.procedureName = procedureName;
1024
+ checkStatefulChanges(requestId, selectorResult) {
1025
+ if (this.trackedStatefulChangesMap.has(requestId)) {
1026
+ if (!this.initialStatefulData[requestId]) {
1027
+ this.initialStatefulData[requestId] = selectorResult;
1028
+ }
1029
+ const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
1030
+ this.trackedStatefulChangesMap.set(requestId, hasChanges);
1827
1031
  }
1828
- return this.proceduresApiService.apply$(request);
1829
1032
  }
1830
1033
  }
1831
- FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i1.ProceduresApiService }, { token: ContextService }, { token: QuoteDraftService }, { token: FlowUpdateService }, { token: ConfigurationService }, { token: FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
1832
- FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
1833
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
1034
+ FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: FlowConfigurationService }, { token: FlowInfoService }, { token: i3.FlowStateApiService }, { token: i1.ConfigurationProcessorsApiService }, { token: i1.SalesTransactionApiService }, { token: SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
1035
+ FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
1036
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
1834
1037
  type: Injectable
1835
- }], ctorParameters: function () { return [{ type: i1.ProceduresApiService }, { type: ContextService }, { type: QuoteDraftService }, { type: FlowUpdateService }, { type: ConfigurationService }, { type: FlowInfoService }]; } });
1836
-
1837
- class FlowConfigurationModule {
1838
- }
1839
- FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1840
- FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1841
- FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService, FlowUpdateService], imports: [ApiModule] });
1842
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1843
- type: NgModule,
1844
- args: [{
1845
- imports: [ApiModule],
1846
- providers: [FlowConfigurationService, FlowUpdateService],
1847
- }]
1848
- }] });
1038
+ }], ctorParameters: function () {
1039
+ return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
1040
+ type: Optional
1041
+ }, {
1042
+ type: Inject,
1043
+ args: [FLOW_CUSTOMIZATION]
1044
+ }] }];
1045
+ } });
1849
1046
 
1850
1047
  class FlowStateConfigurationService {
1851
- constructor(flowInfoService, flowConfigurationService, flowStateApiService, flowStateService) {
1048
+ constructor(flowInfoService, flowStateService, configurationService, salesTransactionService, flowConfigurationService) {
1852
1049
  this.flowInfoService = flowInfoService;
1853
- this.flowConfigurationService = flowConfigurationService;
1854
- this.flowStateApiService = flowStateApiService;
1855
1050
  this.flowStateService = flowStateService;
1856
- this.configurationStateId$ = new BehaviorSubject(null);
1857
- }
1858
- get configurationStateId() {
1859
- return this.configurationStateId$.value;
1051
+ this.configurationService = configurationService;
1052
+ this.salesTransactionService = salesTransactionService;
1053
+ this.flowConfigurationService = flowConfigurationService;
1860
1054
  }
1861
1055
  addToCart$(props) {
1862
1056
  var _a;
@@ -1868,26 +1062,42 @@ class FlowStateConfigurationService {
1868
1062
  request$ = of();
1869
1063
  }
1870
1064
  else {
1871
- const lineItem = generateConfigurationLineItem(props, props.qty);
1872
- request$ = this.flowStateApiService.newConfiguration(stateId, { lineItem }).pipe(tap$1(r => this.configurationStateId$.next(r.stateId)), switchMap(() => {
1873
- if (!this.configurationStateId) {
1874
- return of();
1875
- }
1876
- return this.flowStateApiService.saveConfiguration(stateId, this.configurationStateId).pipe(tap$1(() => this.configurationStateId$.next(null)), map$1(noop));
1877
- }));
1065
+ // TODO: Implement
1066
+ request$ = of();
1878
1067
  }
1879
1068
  }
1880
1069
  else {
1881
- request$ = this.flowConfigurationService.addToCart$(props).pipe(map$1(noop));
1070
+ request$ = this.configureExternal$(props);
1882
1071
  }
1883
- return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map$1(noop));
1072
+ return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
1073
+ }
1074
+ configureExternal$(props) {
1075
+ var _a, _b;
1076
+ const { state } = this.salesTransactionService;
1077
+ if (!state) {
1078
+ return of();
1079
+ }
1080
+ const stateToConfigure = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [
1081
+ Object.assign(Object.assign({}, generateTransactionItem(props.productId)), { qty: (_a = props.qty) !== null && _a !== void 0 ? _a : 1, stiAttributes: Object.entries((_b = props.attributesMap) !== null && _b !== void 0 ? _b : {}).map(([attributeName, value]) => ({
1082
+ attributeName,
1083
+ value,
1084
+ })) }),
1085
+ ] }) });
1086
+ return this.configurationService.justConfigureRequest$(stateToConfigure).pipe(switchMap(configurationResult => {
1087
+ const state = this.salesTransactionService.state;
1088
+ const addedProduct = configurationResult.salesTransaction.salesTransactionItems[0];
1089
+ if (!state || !addedProduct) {
1090
+ return of();
1091
+ }
1092
+ return this.flowConfigurationService.calculate$(Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [...state.salesTransaction.salesTransactionItems, addedProduct] }) }));
1093
+ }));
1884
1094
  }
1885
1095
  }
1886
- FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token: FlowConfigurationService }, { token: i1.FlowStateApiService }, { token: FlowStateService }], target: i0.ɵɵFactoryTarget.Injectable });
1096
+ FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token: FlowStateService }, { token: ConfigurationService }, { token: SalesTransactionService }, { token: FlowConfigurationService }], target: i0.ɵɵFactoryTarget.Injectable });
1887
1097
  FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
1888
1098
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
1889
1099
  type: Injectable
1890
- }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: FlowStateService }]; } });
1100
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }, { type: ConfigurationService }, { type: SalesTransactionService }, { type: FlowConfigurationService }]; } });
1891
1101
 
1892
1102
  class IntegrationState {
1893
1103
  constructor() {
@@ -1907,12 +1117,12 @@ class IntegrationState {
1907
1117
  this.action$.next(action);
1908
1118
  }
1909
1119
  listen$(actionType) {
1910
- return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
1120
+ return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
1911
1121
  }
1912
1122
  listenAll$() {
1913
1123
  return this.action$.asObservable();
1914
1124
  }
1915
- clear() {
1125
+ reset() {
1916
1126
  this.stateSubj$.next({});
1917
1127
  }
1918
1128
  }
@@ -1923,8 +1133,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1923
1133
  }] });
1924
1134
 
1925
1135
  class ProductImagesService {
1926
- constructor(productApiService) {
1927
- this.productApiService = productApiService;
1136
+ constructor(productsAdminApiService) {
1137
+ this.productsAdminApiService = productsAdminApiService;
1928
1138
  this.imagesMap$ = new BehaviorSubject({});
1929
1139
  }
1930
1140
  getImageUrl$(productId) {
@@ -1932,161 +1142,187 @@ class ProductImagesService {
1932
1142
  this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
1933
1143
  this.fetchProductImage(productId);
1934
1144
  }
1935
- return this.imagesMap$.pipe(map$1(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1145
+ return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1936
1146
  }
1937
1147
  fetchProductImage(productId) {
1938
- this.productApiService
1148
+ this.productsAdminApiService
1939
1149
  .fetchImage$(productId)
1940
- .pipe(map$1(file => URL.createObjectURL(file)), catchError(() => of('')), tap$1(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1150
+ .pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1941
1151
  .subscribe();
1942
1152
  }
1943
1153
  }
1944
- ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1154
+ ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductsAdminApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1945
1155
  ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
1946
1156
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
1947
1157
  type: Injectable
1948
- }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
1158
+ }], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
1949
1159
 
1950
- class RuntimeContextService {
1951
- constructor(configurationApiService) {
1952
- this.configurationApiService = configurationApiService;
1953
- }
1954
- getRuntimeContext(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId) {
1955
- return this.configurationApiService
1956
- .getRuntimeDataByProductId(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId)
1957
- .pipe(map(runtimeData => {
1958
- var _a;
1959
- const uiDefinitionContainer = this.getUIDefinitionContainer(runtimeData);
1960
- const runtimeModel = RuntimeModel.create(runtimeData.types, runtimeData.products);
1961
- const { productName, properties } = (_a = Array.from(runtimeModel.components.values()).find(c => c.productId === productId)) !== null && _a !== void 0 ? _a : {};
1962
- const uiDefinitionProperties = uiDefinitionContainer === null || uiDefinitionContainer === void 0 ? void 0 : uiDefinitionContainer.source.properties;
1963
- return {
1964
- modelId: runtimeData.modelId,
1965
- uiDefinitionContainer: uiDefinitionContainer,
1966
- runtimeModel: runtimeModel,
1967
- runtimeMode: RuntimeMode.PROD,
1968
- productId: productId,
1969
- productType: (properties === null || properties === void 0 ? void 0 : properties['displayName']) || productName,
1970
- offeringId: offeringId,
1971
- properties: {
1972
- PricingEnabled: (uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.pricingEnabled) ? 'true' : 'false',
1973
- PriceListId: uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.priceList,
1974
- },
1975
- };
1976
- }));
1160
+ class CatalogProductsService {
1161
+ constructor() {
1162
+ this.stateSubj$ = new BehaviorSubject(null);
1163
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
1977
1164
  }
1978
- getUIDefinitionContainer(runtimeData) {
1979
- var _a;
1980
- const containers = runtimeData.uiDefinitions.filter(container => isNotLegacyUIDefinition(container.source));
1981
- return (_a = containers.find(container => container.source.primary)) !== null && _a !== void 0 ? _a : containers[0];
1165
+ get state() {
1166
+ return this.stateSubj$.getValue();
1167
+ }
1168
+ reset() {
1169
+ this.stateSubj$.next(null);
1170
+ }
1171
+ setState(state) {
1172
+ this.stateSubj$.next(state);
1982
1173
  }
1983
1174
  }
1984
- RuntimeContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, deps: [{ token: i1.ConfigurationApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1985
- RuntimeContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService });
1986
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, decorators: [{
1175
+ CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1176
+ CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
1177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
1987
1178
  type: Injectable
1988
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }]; } });
1179
+ }] });
1989
1180
 
1990
- class ConfigurationRuntimeService {
1991
- constructor(apiService, contextService, runtimeContextService) {
1992
- this.apiService = apiService;
1993
- this.contextService = contextService;
1994
- this.runtimeContextService = runtimeContextService;
1995
- this._isInitialized = false;
1996
- this.uiDefinitionProperties = {};
1181
+ class ConfigurationService {
1182
+ constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService, guidedSellingService) {
1183
+ this.flowInfoService = flowInfoService;
1184
+ this.messageService = messageService;
1185
+ this.configurationRuntimeService = configurationRuntimeService;
1186
+ this.salesTransactionService = salesTransactionService;
1187
+ this.orchestrationsApiService = orchestrationsApiService;
1188
+ this.guidedSellingService = guidedSellingService;
1189
+ this.hasUnsavedChanges = false;
1190
+ this.configurationStateSubj$ = new BehaviorSubject(null);
1191
+ this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
1192
+ this.isLoadingSubj$ = new BehaviorSubject(false);
1193
+ this.isLoading$ = this.isLoadingSubj$.asObservable();
1997
1194
  }
1998
- reset() {
1999
- this._isInitialized = false;
2000
- this._runtimeContext = undefined;
2001
- this.initializationProps = undefined;
2002
- this.uiDefinitionProperties = {};
1195
+ get state$() {
1196
+ return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
1197
+ }
1198
+ get state() {
1199
+ return this.configurationStateSubj$.getValue();
1200
+ }
1201
+ get previousState() {
1202
+ return this.previousConfigurationStateSubj$.getValue();
1203
+ }
1204
+ get root$() {
1205
+ return this.state$.pipe(map$1(state => state.salesTransaction.salesTransactionItems[0]), filter$1(isDefined));
2003
1206
  }
2004
- initTestMode(uiDefinitionContainer) {
1207
+ get root() {
2005
1208
  var _a, _b;
2006
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
2007
- const uiDefinitionExternals = (_b = uiDefinitionContainer.source.externals) !== null && _b !== void 0 ? _b : {};
2008
- return combineLatest([
2009
- this.apiService.getRuntimeDataByModelId(uiDefinitionContainer.modelId),
2010
- this.contextService.initTestMode(),
2011
- ]).pipe(first(), map(([runtimeData, context]) => {
2012
- var _a;
2013
- this.contextService.update({
2014
- properties: Object.assign(Object.assign(Object.assign(Object.assign({}, (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.properties), context.properties), { ModelId: uiDefinitionContainer.modelId, PricingEnabled: this.uiDefinitionProperties.pricingEnabled ? 'true' : 'false', PriceListId: this.uiDefinitionProperties.priceList, offeringId: this.uiDefinitionProperties.offeringId }), uiDefinitionExternals),
2015
- });
2016
- this._runtimeContext = {
2017
- modelId: uiDefinitionContainer.modelId,
2018
- runtimeModel: RuntimeModel.create(runtimeData.types, runtimeData.products),
2019
- runtimeMode: RuntimeMode.TEST,
2020
- uiDefinitionContainer,
2021
- };
2022
- return this._runtimeContext;
2023
- }), tap(() => (this._isInitialized = true)));
1209
+ return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
2024
1210
  }
2025
- init(props) {
2026
- this.initializationProps = props;
2027
- const context = this.contextService.resolve();
2028
- return this.runtimeContextService
2029
- .getRuntimeContext(props.productId, props.offeringId, props.defaultUIDefinitionId, props.requiredUIDefinitionId)
2030
- .pipe(tap(runtimeContext => {
2031
- var _a, _b, _c, _d;
2032
- this.uiDefinitionProperties = (_b = (_a = runtimeContext.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
2033
- const { PriceListId } = (_c = context.properties) !== null && _c !== void 0 ? _c : {};
2034
- const mergeContext = Object.assign(Object.assign({}, runtimeContext), { properties: Object.assign(Object.assign(Object.assign({}, runtimeContext.properties), context.properties), { PricingEnabled: PriceListId ? 'true' : 'false' }) });
2035
- this.id15to18('AccountId', mergeContext.properties);
2036
- this._runtimeContext = mergeContext;
2037
- if (context.properties && ((_d = this._runtimeContext.properties) === null || _d === void 0 ? void 0 : _d.StartDate)) {
2038
- this.contextService.update({
2039
- properties: Object.assign(Object.assign({}, this._runtimeContext.properties), context.properties),
2040
- });
2041
- }
2042
- return this._runtimeContext;
2043
- }), tap(() => (this._isInitialized = true)));
1211
+ reset() {
1212
+ this.hasUnsavedChanges = false;
1213
+ this.configurationStateSubj$.next(null);
1214
+ this.previousConfigurationStateSubj$.next(null);
2044
1215
  }
2045
- overrideUIDefinition(uiDefinitionContainer) {
1216
+ init$() {
2046
1217
  var _a;
2047
- if (!this._runtimeContext) {
2048
- return;
1218
+ const { state } = this.salesTransactionService;
1219
+ const { standalone } = this.flowInfoService.flow.properties;
1220
+ const { productId, transactionItemId, newProductQty } = this.flowInfoService.context;
1221
+ if (!state || !productId) {
1222
+ return of(undefined);
1223
+ }
1224
+ const salesTransactionItems = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
1225
+ let isRootGenerated = false;
1226
+ let transactionItem = salesTransactionItems.find(item => item.id === transactionItemId);
1227
+ if (!transactionItem && standalone) {
1228
+ transactionItem = salesTransactionItems.find(item => item.productId === productId);
1229
+ }
1230
+ if (!transactionItem) {
1231
+ transactionItem = generateTransactionItem(productId);
1232
+ if (typeof newProductQty === 'number' && newProductQty > 0) {
1233
+ transactionItem.qty = newProductQty;
1234
+ }
1235
+ isRootGenerated = true;
1236
+ }
1237
+ const guidedSellingResult = this.guidedSellingService.guidedSellingResult;
1238
+ if (transactionItem && Object.keys(guidedSellingResult).length && isRootGenerated) {
1239
+ transactionItem.stiAttributes = Object.entries(guidedSellingResult).map(([attributeName, value]) => ({
1240
+ attributeName,
1241
+ value,
1242
+ }));
2049
1243
  }
2050
- this._runtimeContext.uiDefinitionContainer = uiDefinitionContainer;
2051
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1244
+ const configurationState = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: transactionItem ? [transactionItem] : [] }) });
1245
+ return (isRootGenerated ? this.configure$(configurationState) : of(configurationState)).pipe(tap$1(configurationState => {
1246
+ this.configurationStateSubj$.next(configurationState);
1247
+ this.previousConfigurationStateSubj$.next(configurationState);
1248
+ }), map$1(noop));
2052
1249
  }
2053
- id15to18(propertyName, source) {
2054
- if (!source) {
2055
- return;
1250
+ patch$(transactionItem) {
1251
+ const { state, root } = this;
1252
+ if (!state) {
1253
+ return throwError(() => new Error(`Configuration State is not initialized`));
2056
1254
  }
2057
- const value = source[propertyName];
2058
- if (typeof value === 'string' && value.length === 15) {
2059
- source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
1255
+ if (!root) {
1256
+ return throwError(() => new Error(`Root SalesTransactionItem not found`));
2060
1257
  }
1258
+ const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
1259
+ const newTransactionContext = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [newRoot] }) });
1260
+ return this.configure$(newTransactionContext).pipe(catchError$1(error => {
1261
+ console.error(error);
1262
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
1263
+ this.messageService.add({ severity: 'error', summary: error });
1264
+ }
1265
+ return throwError(() => error);
1266
+ }), tap$1(() => {
1267
+ if (!this.hasUnsavedChanges) {
1268
+ this.hasUnsavedChanges = true;
1269
+ }
1270
+ }), map$1(noop));
2061
1271
  }
2062
- get isInitialized() {
2063
- return this._isInitialized;
1272
+ patch(transactionItem) {
1273
+ this.patch$(transactionItem).subscribe();
2064
1274
  }
2065
- get runtimeModel() {
2066
- var _a;
2067
- return (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.runtimeModel;
1275
+ configure$(transactionContext) {
1276
+ this.isLoadingSubj$.next(true);
1277
+ return this.justConfigureRequest$(transactionContext).pipe(tap$1(result => {
1278
+ this.configurationStateSubj$.next(result);
1279
+ this.previousConfigurationStateSubj$.next(cloneDeep(result));
1280
+ }), catchError$1(e => {
1281
+ const resetState = this.previousConfigurationStateSubj$.getValue();
1282
+ if (resetState) {
1283
+ this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
1284
+ this.configurationStateSubj$.next(resetState);
1285
+ }
1286
+ return throwError(() => e);
1287
+ }), finalize$1(() => this.isLoadingSubj$.next(false)));
1288
+ }
1289
+ justConfigureRequest$(transactionContext) {
1290
+ const request = {
1291
+ transactionContext,
1292
+ flowId: this.flowInfoService.flow.id,
1293
+ };
1294
+ return this.orchestrationsApiService.apply$(request).pipe(catchError$1(error => throwError(() => {
1295
+ if (error.error) {
1296
+ return extractErrorDetails(error.error).join('. ');
1297
+ }
1298
+ return error.message || JSON.stringify(error);
1299
+ })));
2068
1300
  }
2069
- get runtimeContext() {
2070
- return this._runtimeContext;
1301
+ getPCMModel() {
1302
+ const pcmModel = this.configurationRuntimeService.pcmModel;
1303
+ if (!pcmModel) {
1304
+ throw new Error('PCM model not initialized');
1305
+ }
1306
+ return pcmModel;
2071
1307
  }
2072
1308
  }
2073
- ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [{ token: i1.ConfigurationApiService }, { token: ContextService }, { token: RuntimeContextService }], target: i0.ɵɵFactoryTarget.Injectable });
2074
- ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
2075
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
1309
+ ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: FlowInfoService }, { token: i2.MessageService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: i1.OrchestrationsApiService }, { token: GuidedSellingService }], target: i0.ɵɵFactoryTarget.Injectable });
1310
+ ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1311
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
2076
1312
  type: Injectable
2077
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }, { type: ContextService }, { type: RuntimeContextService }]; } });
1313
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }, { type: GuidedSellingService }]; } });
2078
1314
 
2079
1315
  class ConfigurationStateService {
2080
- constructor(configurationRuntimeService, configurationService, quoteDraftService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, quoteApiService) {
1316
+ constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
2081
1317
  this.configurationRuntimeService = configurationRuntimeService;
2082
1318
  this.configurationService = configurationService;
2083
- this.quoteDraftService = quoteDraftService;
2084
- this.toastService = toastService;
2085
1319
  this.flowStateService = flowStateService;
2086
1320
  this.flowInfoService = flowInfoService;
2087
1321
  this.flowConfigurationService = flowConfigurationService;
2088
1322
  this.flowStateApiService = flowStateApiService;
2089
- this.quoteApiService = quoteApiService;
1323
+ this.salesTransactionService = salesTransactionService;
1324
+ this.salesTransactionApiService = salesTransactionApiService;
1325
+ this.toastService = toastService;
2090
1326
  this.isInitialized$ = new BehaviorSubject(false);
2091
1327
  this.canceledConfiguration$ = new Subject();
2092
1328
  this.NOT_INITIALIZED = Symbol();
@@ -2110,9 +1346,9 @@ class ConfigurationStateService {
2110
1346
  request$ = this.initStateful$();
2111
1347
  }
2112
1348
  else {
2113
- request$ = this.initStateless$();
1349
+ request$ = this.configurationService.init$();
2114
1350
  }
2115
- return request$.pipe(finalize(() => {
1351
+ return request$.pipe(take(1), tap(() => {
2116
1352
  this.isInitialized$.next(true);
2117
1353
  this.canceledConfiguration$ = new Subject();
2118
1354
  }));
@@ -2126,10 +1362,11 @@ class ConfigurationStateService {
2126
1362
  this.configurationStore = {};
2127
1363
  this.executedFunctions = {};
2128
1364
  this.configurationService.reset();
1365
+ this.configurationRuntimeService.reset();
2129
1366
  }
2130
1367
  execute$(exec) {
2131
1368
  const request = this.execToRequest(exec);
2132
- return this.executeRequest$(request).pipe(map$1(result => {
1369
+ return this.executeRequest$(request).pipe(map(result => {
2133
1370
  // Keep only requested results
2134
1371
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
2135
1372
  var _a;
@@ -2152,7 +1389,7 @@ class ConfigurationStateService {
2152
1389
  }
2153
1390
  // prevent parallel configuration requests in stateless mode
2154
1391
  if (!this.statelessExecutionRequest$) {
2155
- this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay$1(), take$1(1), finalize(() => (this.statelessExecutionRequest$ = null)));
1392
+ this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
2156
1393
  }
2157
1394
  return this.statelessExecutionRequest$;
2158
1395
  }
@@ -2166,7 +1403,7 @@ class ConfigurationStateService {
2166
1403
  },
2167
1404
  },
2168
1405
  });
2169
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
1406
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
2170
1407
  }
2171
1408
  subscribe$(selectorName, inputData = {}, options) {
2172
1409
  const requestId = UUID.UUID();
@@ -2189,58 +1426,46 @@ class ConfigurationStateService {
2189
1426
  this.executeRequest$(request).subscribe();
2190
1427
  }
2191
1428
  }
2192
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), distinctUntilChanged(), finalize(() => {
1429
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
2193
1430
  var _a;
2194
1431
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
2195
1432
  delete this.subscriptions[requestId];
2196
1433
  }
2197
1434
  }), takeUntil(this.canceledConfiguration$));
2198
1435
  }
2199
- saveConfiguration(flow) {
2200
- var _a, _b, _c, _d;
1436
+ saveConfiguration() {
1437
+ var _a, _b;
2201
1438
  if (this.isStatefulConfiguration) {
2202
- return this.flowStateApiService
2203
- .saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '')
2204
- .pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map$1(() => r))));
1439
+ return this.flowStateApiService.saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '').pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(r => ({ id: r.quoteId })));
1440
+ }
1441
+ const state = this.salesTransactionService.state;
1442
+ if (!state) {
1443
+ return of({ id: '' });
1444
+ }
1445
+ const { standalone } = this.flowInfoService.flow.properties;
1446
+ if (standalone) {
1447
+ const request = {
1448
+ transactionContext: state,
1449
+ flowId: this.flowInfoService.flow.id,
1450
+ };
1451
+ return this.salesTransactionApiService.save(request).pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(id => ({ id })));
1452
+ }
1453
+ const transactionContext = this.salesTransactionService.state;
1454
+ const configurationRoot = this.configurationService.root;
1455
+ if (!transactionContext || !configurationRoot) {
1456
+ return of({ id: '' });
1457
+ }
1458
+ const stateItems = transactionContext.salesTransaction.salesTransactionItems;
1459
+ const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
1460
+ let salesTransactionItems;
1461
+ if (isNewTransactionItem) {
1462
+ salesTransactionItems = [...stateItems, configurationRoot];
2205
1463
  }
2206
1464
  else {
2207
- if (!flow) {
2208
- const quoteDraft = this.quoteDraftService.quoteDraft;
2209
- if (!quoteDraft) {
2210
- return of({ quoteId: '' });
2211
- }
2212
- const rootLineItem = this.configurationService.getSnapshot();
2213
- const asset = this.configurationService.getAsset();
2214
- const currentState = rootLineItem ? [rootLineItem] : [];
2215
- const initialState = asset ? [asset] : [];
2216
- return this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }));
2217
- }
2218
- else {
2219
- const quoteDraft = this.quoteDraftService.quoteDraft;
2220
- const lineItem = this.configurationService.getSnapshot();
2221
- if (!quoteDraft || !lineItem) {
2222
- return of({ quoteId: '' });
2223
- }
2224
- const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
2225
- let currentState;
2226
- if (isNewLineItem) {
2227
- currentState = [...quoteDraft.currentState, lineItem];
2228
- }
2229
- else {
2230
- currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
2231
- }
2232
- const asset = this.configurationService.getAsset();
2233
- const initialState = [...((_d = (_c = this.quoteDraftService.quoteDraft) === null || _c === void 0 ? void 0 : _c.initialState) !== null && _d !== void 0 ? _d : [])];
2234
- if (asset) {
2235
- if (!initialState.some(li => li.id === asset.id)) {
2236
- initialState.push(asset);
2237
- }
2238
- }
2239
- return this.flowConfigurationService
2240
- .calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))
2241
- .pipe(map$1(() => ({ quoteId: '' })));
2242
- }
1465
+ salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
2243
1466
  }
1467
+ const newState = Object.assign(Object.assign({}, transactionContext), { salesTransaction: Object.assign(Object.assign({}, transactionContext.salesTransaction), { salesTransactionItems }) });
1468
+ return this.flowConfigurationService.calculate$(newState).pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(() => ({ id: '' })));
2244
1469
  }
2245
1470
  cancelConfiguration() {
2246
1471
  var _a, _b;
@@ -2261,37 +1486,33 @@ class ConfigurationStateService {
2261
1486
  return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
2262
1487
  }
2263
1488
  initStateful$() {
2264
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
2265
- this.ownerId = (_c = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) === null || _b === void 0 ? void 0 : _b.id) !== null && _c !== void 0 ? _c : '';
2266
- const lineItemId = (_e = (_d = this.configurationRuntimeService.runtimeContext) === null || _d === void 0 ? void 0 : _d.properties) === null || _e === void 0 ? void 0 : _e.lineItemId;
2267
- if (!this.flowStateService.stateId) {
1489
+ var _a, _b, _c, _d, _e, _f;
1490
+ this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
1491
+ const { productId, transactionItemId } = this.flowInfoService.context;
1492
+ if (!productId || !this.flowStateService.stateId) {
2268
1493
  return of(undefined);
2269
1494
  }
2270
- const container = (_f = this.configurationRuntimeService.runtimeContext) === null || _f === void 0 ? void 0 : _f.uiDefinitionContainer;
2271
- const lineItem = this.configurationService.generateLineItem();
1495
+ const container = this.configurationRuntimeService.uiDefinitionContainer;
2272
1496
  let request$;
2273
- if (!lineItemId) {
1497
+ if (!transactionItemId) {
2274
1498
  request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
2275
- lineItem,
2276
- actionsOverride: (_g = container === null || container === void 0 ? void 0 : container.actions) === null || _g === void 0 ? void 0 : _g.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
2277
- selectorsOverride: (_h = container === null || container === void 0 ? void 0 : container.selectors) === null || _h === void 0 ? void 0 : _h.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
1499
+ transactionItem: generateTransactionItem(productId),
1500
+ actionsOverride: (_c = container === null || container === void 0 ? void 0 : container.actions) === null || _c === void 0 ? void 0 : _c.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
1501
+ selectorsOverride: (_d = container === null || container === void 0 ? void 0 : container.selectors) === null || _d === void 0 ? void 0 : _d.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
2278
1502
  });
2279
1503
  }
2280
1504
  else {
2281
1505
  request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
2282
- lineItemId,
2283
- actionsOverride: (_j = container === null || container === void 0 ? void 0 : container.actions) === null || _j === void 0 ? void 0 : _j.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
2284
- selectorsOverride: (_k = container === null || container === void 0 ? void 0 : container.selectors) === null || _k === void 0 ? void 0 : _k.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
1506
+ transactionItemId,
1507
+ actionsOverride: (_e = container === null || container === void 0 ? void 0 : container.actions) === null || _e === void 0 ? void 0 : _e.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
1508
+ selectorsOverride: (_f = container === null || container === void 0 ? void 0 : container.selectors) === null || _f === void 0 ? void 0 : _f.map(processor => (Object.assign(Object.assign({}, processor), { ownerId: this.ownerId }))),
2285
1509
  });
2286
1510
  }
2287
- return request$.pipe(map$1(r => {
1511
+ return request$.pipe(map(r => {
2288
1512
  this.stateId = r.stateId;
2289
1513
  return undefined;
2290
1514
  }));
2291
1515
  }
2292
- initStateless$() {
2293
- return this.configurationService.configure().pipe(map$1(() => undefined));
2294
- }
2295
1516
  execToRequest(exec) {
2296
1517
  var _a;
2297
1518
  return {
@@ -2337,39 +1558,37 @@ class ConfigurationStateService {
2337
1558
  else {
2338
1559
  execution$ = this.executeStateless$(fullRequest);
2339
1560
  }
2340
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
1561
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
2341
1562
  }
2342
1563
  executeStateless$(request) {
2343
1564
  this.executionInProgress$.next(true);
2344
- return of(undefined).pipe(switchMap(() => {
1565
+ return this.configurationService.state$.pipe(first(), switchMap(state => {
2345
1566
  var _a;
2346
1567
  // Apply actions and execute configuration/price call
2347
1568
  // No need to run configuration if no actions in the request
2348
1569
  if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
2349
1570
  return of(undefined);
2350
1571
  }
2351
- let configurationRequest = this.configurationService.generateRequest(false);
2352
1572
  request.actions.forEach(action => {
2353
1573
  var _a;
2354
- configurationRequest = (_a = this.executeActionScript(configurationRequest, action)) !== null && _a !== void 0 ? _a : configurationRequest;
1574
+ state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
2355
1575
  });
2356
- configurationRequest = ConfigurationTranslatorUtils.lightenConfigurationRequest(configurationRequest);
2357
- return this.configurationService.configureRequest$(configurationRequest);
2358
- }), map$1(() => {
1576
+ return this.configurationService.configure$(state);
1577
+ }), map(() => {
2359
1578
  // Run selectors and apply them to the state
2360
- const configurationState = this.configurationService.stateSnapshot;
1579
+ const configurationState = this.configurationService.state;
2361
1580
  if (!configurationState) {
2362
1581
  return { stateId: '', selectors: {} };
2363
1582
  }
2364
1583
  return this.runStatelessSelectors(request, configurationState);
2365
- }), tap$1(() => this.executionInProgress$.next(false)), catchError(error => {
2366
- const configurationState = this.configurationService.previousStateSnapshot;
1584
+ }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
1585
+ const configurationState = this.configurationService.previousState;
2367
1586
  if (configurationState) {
2368
1587
  const selectorsResult = this.runStatelessSelectors(request, configurationState);
2369
1588
  this.handleSelectorsResponse(selectorsResult.selectors);
2370
1589
  }
2371
1590
  this.executionInProgress$.next(false);
2372
- if (!this.configurationRuntimeService.uiDefinitionProperties.suppressToastMessages) {
1591
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
2373
1592
  this.toastService.add({ severity: ToastType.error, summary: String(error) });
2374
1593
  }
2375
1594
  return throwError(() => error);
@@ -2390,22 +1609,22 @@ class ConfigurationStateService {
2390
1609
  };
2391
1610
  this.executionInProgress$.next(true);
2392
1611
  return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
2393
- }), tap$1(({ stateId }) => (this.stateId = stateId)), share(), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
1612
+ }), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
2394
1613
  this.executionInProgress$.next(false);
2395
1614
  return throwError(() => e);
2396
1615
  }));
2397
1616
  }
2398
1617
  executeStateful$(request) {
2399
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
1618
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
2400
1619
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
2401
1620
  combineLatest([
2402
1621
  this.statefulExecutionRequest$,
2403
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
2404
- ])), map$1(([response]) => response), take$1(1));
1622
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
1623
+ ])), map(([response]) => response), take(1));
2405
1624
  }
2406
1625
  executeActionScript(request, processor) {
2407
- var _a, _b;
2408
- const { actions } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1626
+ var _a;
1627
+ const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2409
1628
  const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
2410
1629
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2411
1630
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2413,8 +1632,8 @@ class ConfigurationStateService {
2413
1632
  return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
2414
1633
  }
2415
1634
  executeSelectorScript(request, processor) {
2416
- var _a, _b;
2417
- const { selectors } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1635
+ var _a;
1636
+ const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2418
1637
  const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
2419
1638
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2420
1639
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2456,25 +1675,54 @@ class ConfigurationStateService {
2456
1675
  }, { stateId: '', selectors: {} });
2457
1676
  }
2458
1677
  }
2459
- ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token: QuoteDraftService }, { token: i6.ToastService }, { token: FlowStateService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i1.FlowStateApiService }, { token: i1.QuoteApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1678
+ ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token: FlowStateService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i3.FlowStateApiService }, { token: SalesTransactionService }, { token: i1.SalesTransactionApiService }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
2460
1679
  ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
2461
1680
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
2462
1681
  type: Injectable
2463
- }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: QuoteDraftService }, { type: i6.ToastService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }]; } });
1682
+ }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i3.FlowStateApiService }, { type: SalesTransactionService }, { type: i1.SalesTransactionApiService }, { type: i6.ToastService }]; } });
2464
1683
 
2465
1684
  class ConfigurationModule {
2466
1685
  }
2467
1686
  ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2468
1687
  ConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, imports: [ConfirmationDialogModule, ApiModule] });
2469
- ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService], imports: [ConfirmationDialogModule, ApiModule] });
1688
+ ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
1689
+ ConfigurationService,
1690
+ ConfigurationStateService,
1691
+ ConfigurationRuntimeService,
1692
+ TestModeConfigurationService,
1693
+ GuidedSellingService,
1694
+ ], imports: [ConfirmationDialogModule, ApiModule] });
2470
1695
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
2471
1696
  type: NgModule,
2472
1697
  args: [{
2473
1698
  imports: [ConfirmationDialogModule, ApiModule],
2474
- providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService],
1699
+ providers: [
1700
+ ConfigurationService,
1701
+ ConfigurationStateService,
1702
+ ConfigurationRuntimeService,
1703
+ TestModeConfigurationService,
1704
+ GuidedSellingService,
1705
+ ],
1706
+ }]
1707
+ }] });
1708
+
1709
+ class FlowConfigurationModule {
1710
+ }
1711
+ FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1712
+ FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1713
+ FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
1714
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1715
+ type: NgModule,
1716
+ args: [{
1717
+ imports: [ApiModule],
1718
+ providers: [FlowConfigurationService],
2475
1719
  }]
2476
1720
  }] });
2477
1721
 
1722
+ const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
1723
+
1724
+ const UI_DEFINITION_VERSION = 3;
1725
+
2478
1726
  const DEFAULT_FORMATTING_SETTINGS = {
2479
1727
  currencySymbol: DEFAULT_CURRENCY_SYMBOL,
2480
1728
  decimalsCount: DEFAULT_DECIMALS_COUNT,
@@ -2488,14 +1736,14 @@ class SdkCoreModule {
2488
1736
  SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2489
1737
  SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
2490
1738
  SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
2491
- ContextService,
2492
1739
  FlowInfoService,
2493
- QuoteDraftService,
2494
1740
  ProductImagesService,
2495
1741
  IntegrationState,
2496
1742
  FlowStateService,
2497
1743
  FlowStateConfigurationService,
2498
1744
  RuntimeSettingsService,
1745
+ SalesTransactionService,
1746
+ CatalogProductsService,
2499
1747
  {
2500
1748
  provide: FORMATTING_SETTINGS_TOKEN,
2501
1749
  useExisting: RuntimeSettingsService,
@@ -2506,14 +1754,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2506
1754
  args: [{
2507
1755
  imports: [ConfigurationModule, FlowConfigurationModule],
2508
1756
  providers: [
2509
- ContextService,
2510
1757
  FlowInfoService,
2511
- QuoteDraftService,
2512
1758
  ProductImagesService,
2513
1759
  IntegrationState,
2514
1760
  FlowStateService,
2515
1761
  FlowStateConfigurationService,
2516
1762
  RuntimeSettingsService,
1763
+ SalesTransactionService,
1764
+ CatalogProductsService,
2517
1765
  {
2518
1766
  provide: FORMATTING_SETTINGS_TOKEN,
2519
1767
  useExisting: RuntimeSettingsService,
@@ -2571,6 +1819,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2571
1819
  }]
2572
1820
  }] });
2573
1821
 
1822
+ function filterSuccessfulExecute() {
1823
+ return (source) => source.pipe(filter((result) => result.success), map(r => r.result));
1824
+ }
1825
+
2574
1826
  class DatePipe {
2575
1827
  constructor() {
2576
1828
  var _a;
@@ -2698,5 +1950,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2698
1950
  * Generated bundle index. Do not edit.
2699
1951
  */
2700
1952
 
2701
- export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationModule, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, FlowUpdateService, IntegrationState, LineItemWorker, NumberPipe, PricePipe, ProductImagesService, QuoteDraftService, RuntimeMode, RuntimeOperation, RuntimeSettingsService, RuntimeStep, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, UI_DEFINITION_VERSION, assetPredicateFn, extractMetadata, filterOutTechnicalAttributes, findLineItem, findLineItemWithComparator, generateConfigurationLineItem, generateLineItem, getAttributeValue, getAttributes, getDefaultLineItem, getGuidedSellingConfigurationRequest, getOriginParent, getRecommendedPrices, insertLineItem, isTechnicalAttribute, lineItem_utils as lineItemUtils, mapAttributes, multiplyLineItems, patchAttributes, recalculateCardinalityVariables, removeLineItem, replaceLineItem, upsertAttributes };
1953
+ export { ActionCodePipe, CalendarDirective, CatalogProductsService, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, GuidedSellingService, IntegrationState, NumberPipe, PricePipe, ProductImagesService, RuntimeSettingsService, SalesTransactionService, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, TestModeConfigurationService, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, filterSuccessfulExecute, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
2702
1954
  //# sourceMappingURL=veloceapps-sdk-core.mjs.map