@veloceapps/sdk 11.0.0-3 → 11.0.0-31

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 (168) hide show
  1. package/cms/cms.actions.d.ts +92 -29
  2. package/cms/components/element-renderer/element-renderer.component.d.ts +3 -10
  3. package/cms/services/element-context.service.d.ts +0 -1
  4. package/cms/types/common.types.d.ts +2 -0
  5. package/cms/types/index.d.ts +0 -1
  6. package/cms/utils/path.utils.d.ts +1 -2
  7. package/cms/vendor-map.d.ts +13 -39
  8. package/core/index.d.ts +0 -1
  9. package/core/modules/configuration/index.d.ts +2 -4
  10. package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
  11. package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
  12. package/core/modules/configuration/services/configuration.service.d.ts +23 -47
  13. package/core/modules/configuration/services/test-mode-configuration.service.d.ts +20 -0
  14. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -3
  15. package/core/modules/flow-configuration/index.d.ts +0 -3
  16. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -40
  17. package/core/services/catalog-products.service.d.ts +11 -0
  18. package/core/services/flow-info.service.d.ts +27 -12
  19. package/core/services/flow-state-configuration.service.d.ts +2 -8
  20. package/core/services/flow-state.service.d.ts +13 -22
  21. package/core/services/index.d.ts +2 -3
  22. package/core/services/integration.state.d.ts +1 -1
  23. package/core/services/product-images.service.d.ts +3 -3
  24. package/core/services/runtime-settings.service.d.ts +1 -1
  25. package/core/services/sales-transaction.service.d.ts +29 -0
  26. package/core/types/flow-customization.types.d.ts +2 -2
  27. package/core/types/flow-state.types.d.ts +2 -2
  28. package/core/types/index.d.ts +0 -1
  29. package/core/utils/index.d.ts +2 -2
  30. package/core/utils/transaction-item.utils.d.ts +7 -0
  31. package/core/utils/transaction-item.worker.d.ts +8 -0
  32. package/esm2020/cms/cms.actions.mjs +93 -71
  33. package/esm2020/cms/cms.default.mjs +2 -3
  34. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
  35. package/esm2020/cms/components/preview/preview.component.mjs +3 -3
  36. package/esm2020/cms/services/element-context.service.mjs +1 -1
  37. package/esm2020/cms/types/common.types.mjs +1 -1
  38. package/esm2020/cms/types/index.mjs +1 -2
  39. package/esm2020/cms/utils/element.utils.mjs +3 -3
  40. package/esm2020/cms/utils/path.utils.mjs +1 -10
  41. package/esm2020/cms/vendor-map.mjs +13 -17
  42. package/esm2020/core/core.module.mjs +9 -7
  43. package/esm2020/core/index.mjs +1 -2
  44. package/esm2020/core/modules/configuration/configuration.module.mjs +14 -4
  45. package/esm2020/core/modules/configuration/index.mjs +3 -5
  46. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -99
  47. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +60 -76
  48. package/esm2020/core/modules/configuration/services/configuration.service.mjs +97 -223
  49. package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +53 -0
  50. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
  51. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
  52. package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
  53. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +34 -127
  54. package/esm2020/core/services/catalog-products.service.mjs +25 -0
  55. package/esm2020/core/services/flow-info.service.mjs +92 -31
  56. package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
  57. package/esm2020/core/services/flow-state.service.mjs +60 -172
  58. package/esm2020/core/services/index.mjs +3 -4
  59. package/esm2020/core/services/integration.state.mjs +2 -2
  60. package/esm2020/core/services/product-images.service.mjs +8 -8
  61. package/esm2020/core/services/runtime-settings.service.mjs +3 -3
  62. package/esm2020/core/services/sales-transaction.service.mjs +65 -0
  63. package/esm2020/core/types/flow-customization.types.mjs +1 -1
  64. package/esm2020/core/types/flow-state.types.mjs +1 -1
  65. package/esm2020/core/types/index.mjs +1 -2
  66. package/esm2020/core/utils/index.mjs +3 -3
  67. package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
  68. package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
  69. package/esm2020/src/components/flow-header/flow-header.component.mjs +8 -12
  70. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +8 -12
  71. package/esm2020/src/flow-routing.module.mjs +12 -41
  72. package/esm2020/src/flow.component.mjs +5 -5
  73. package/esm2020/src/guards/flow.guard.mjs +13 -14
  74. package/esm2020/src/guards/product-unload.guard.mjs +7 -9
  75. package/esm2020/src/index.mjs +1 -3
  76. package/esm2020/src/pages/assets/assets.component.mjs +8 -9
  77. package/esm2020/src/pages/catalog/catalog.component.mjs +8 -9
  78. package/esm2020/src/pages/debug/debug.component.mjs +14 -23
  79. package/esm2020/src/pages/product/product.component.mjs +12 -82
  80. package/esm2020/src/pages/product/product.module.mjs +5 -5
  81. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
  82. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +8 -9
  83. package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
  84. package/esm2020/src/resolvers/pcm-model.resolver.mjs +12 -0
  85. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +83 -0
  86. package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
  87. package/esm2020/src/services/flow-dialog.service.mjs +8 -8
  88. package/esm2020/src/services/flow-router.service.mjs +16 -33
  89. package/esm2020/src/services/flow.service.mjs +13 -54
  90. package/esm2020/src/types/index.mjs +2 -3
  91. package/esm2020/src/types/route.types.mjs +1 -1
  92. package/fesm2015/veloceapps-sdk-cms.mjs +119 -270
  93. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  94. package/fesm2015/veloceapps-sdk-core.mjs +793 -1655
  95. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  96. package/fesm2015/veloceapps-sdk.mjs +191 -778
  97. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  98. package/fesm2020/veloceapps-sdk-cms.mjs +115 -262
  99. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  100. package/fesm2020/veloceapps-sdk-core.mjs +831 -1729
  101. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  102. package/fesm2020/veloceapps-sdk.mjs +191 -772
  103. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  104. package/package.json +1 -1
  105. package/src/components/flow-header/flow-header.component.d.ts +3 -3
  106. package/src/components/guided-selling/guided-selling.component.d.ts +3 -3
  107. package/src/flow-routing.module.d.ts +1 -2
  108. package/src/flow.component.d.ts +2 -2
  109. package/src/guards/product-unload.guard.d.ts +5 -6
  110. package/src/index.d.ts +0 -2
  111. package/src/pages/assets/assets.component.d.ts +3 -3
  112. package/src/pages/catalog/catalog.component.d.ts +3 -3
  113. package/src/pages/debug/debug.component.d.ts +2 -5
  114. package/src/pages/product/product.component.d.ts +5 -14
  115. package/src/pages/product/product.module.d.ts +1 -1
  116. package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
  117. package/src/pages/shopping-cart/shopping-cart.component.d.ts +3 -3
  118. package/src/resolvers/flow.resolver.d.ts +5 -6
  119. package/src/resolvers/pcm-model.resolver.d.ts +3 -0
  120. package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
  121. package/src/resolvers/ui-definition.resolver.d.ts +3 -0
  122. package/src/services/flow-dialog.service.d.ts +5 -4
  123. package/src/services/flow-router.service.d.ts +4 -6
  124. package/src/services/flow.service.d.ts +2 -7
  125. package/src/types/index.d.ts +1 -2
  126. package/src/types/route.types.d.ts +0 -5
  127. package/cms/plugins/configuration.plugin.d.ts +0 -23
  128. package/cms/types/configuration.types.d.ts +0 -21
  129. package/core/modules/configuration/helpers.d.ts +0 -6
  130. package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
  131. package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
  132. package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
  133. package/core/services/context.service.d.ts +0 -23
  134. package/core/services/quote-draft.service.d.ts +0 -50
  135. package/core/types/runtime.types.d.ts +0 -30
  136. package/core/utils/line-item.utils.d.ts +0 -25
  137. package/core/utils/line-item.worker.d.ts +0 -9
  138. package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
  139. package/esm2020/cms/types/configuration.types.mjs +0 -2
  140. package/esm2020/core/modules/configuration/helpers.mjs +0 -73
  141. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -43
  142. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
  143. package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
  144. package/esm2020/core/services/context.service.mjs +0 -91
  145. package/esm2020/core/services/quote-draft.service.mjs +0 -192
  146. package/esm2020/core/types/runtime.types.mjs +0 -16
  147. package/esm2020/core/utils/line-item.utils.mjs +0 -187
  148. package/esm2020/core/utils/line-item.worker.mjs +0 -19
  149. package/esm2020/src/guards/context.guard.mjs +0 -91
  150. package/esm2020/src/guards/index.mjs +0 -2
  151. package/esm2020/src/pages/remote/remote.component.mjs +0 -342
  152. package/esm2020/src/pages/remote/remote.module.mjs +0 -20
  153. package/esm2020/src/pages/remote/remote.types.mjs +0 -2
  154. package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
  155. package/esm2020/src/types/context-route.types.mjs +0 -2
  156. package/esm2020/src/types/metrics.types.mjs +0 -2
  157. package/esm2020/src/utils/flow.utils.mjs +0 -25
  158. package/esm2020/src/utils/index.mjs +0 -2
  159. package/src/guards/context.guard.d.ts +0 -19
  160. package/src/guards/index.d.ts +0 -1
  161. package/src/pages/remote/remote.component.d.ts +0 -46
  162. package/src/pages/remote/remote.module.d.ts +0 -10
  163. package/src/pages/remote/remote.types.d.ts +0 -4
  164. package/src/resolvers/quote.resolver.d.ts +0 -19
  165. package/src/types/context-route.types.d.ts +0 -5
  166. package/src/types/metrics.types.d.ts +0 -5
  167. package/src/utils/flow.utils.d.ts +0 -8
  168. package/src/utils/index.d.ts +0 -1
@@ -1,219 +1,324 @@
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, switchMap, of, forkJoin, throwError, noop, filter, Subject, catchError, combineLatest, finalize, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil } 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, catchError as catchError$1, tap as tap$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 templates() {
239
+ return this.templatesSubj$.value;
240
+ }
241
+ get isFlowEngineInitialized$() {
242
+ return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
173
243
  }
174
244
  get isStateful() {
175
245
  var _a;
176
246
  return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
177
247
  }
178
- constructor(flowsApiService, templatesApiService, customizationService) {
179
- this.flowsApiService = flowsApiService;
180
- this.templatesApiService = templatesApiService;
248
+ constructor(runtimeSettingsService, templatesAdminApiService, customizationService) {
249
+ this.runtimeSettingsService = runtimeSettingsService;
250
+ this.templatesAdminApiService = templatesAdminApiService;
181
251
  this.customizationService = customizationService;
182
- this.templates = {};
183
252
  this.defaultTemplates = {
184
253
  flowEngine: 'Flow Engine',
185
254
  };
186
255
  this.flowSubj$ = new BehaviorSubject(null);
256
+ this.templatesSubj$ = new BehaviorSubject({});
257
+ this.contextSubj$ = new BehaviorSubject(null);
187
258
  this.flow$ = this.flowSubj$.asObservable();
259
+ this.templates$ = this.templatesSubj$.asObservable();
260
+ }
261
+ reset() {
262
+ this.flowSubj$.next(null);
263
+ this.templatesSubj$.next({});
264
+ this.contextSubj$.next(null);
188
265
  }
189
266
  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
- }));
267
+ return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
197
268
  }
198
- cleanup() {
199
- this.flowSubj$.next(null);
200
- this.params = undefined;
201
- this.templates = {};
269
+ initTestFlow$(productId) {
270
+ this.contextSubj$.next({
271
+ mode: 'QUOTE',
272
+ headerId: '0Q0-test-quote-id',
273
+ productId,
274
+ });
275
+ this.flowSubj$.next({
276
+ id: 'preview-flow-id',
277
+ properties: { entryPath: '/product', queryParams: {} },
278
+ version: 2,
279
+ });
280
+ return of(undefined);
281
+ }
282
+ updateContext(update) {
283
+ this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
284
+ }
285
+ initFlow$(flowId, routeQueryParams) {
286
+ var _a;
287
+ const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
288
+ if (!flow) {
289
+ this.flowSubj$.next(null);
290
+ throw new Error(`Flow with flowId=${flowId} is not defined`);
291
+ }
292
+ const headerId = routeQueryParams['headerId'];
293
+ if (typeof headerId !== 'string') {
294
+ throw new Error(`Please provide 'headerId'`);
295
+ }
296
+ const mode = this.getFlowContextMode(headerId);
297
+ // Restrict if mode is not defined
298
+ if (mode == null) {
299
+ throw new Error('Mode is undefined');
300
+ }
301
+ this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
302
+ this.flowSubj$.next(flow);
303
+ return of(undefined);
202
304
  }
203
- initFlowTemplates$(flow) {
305
+ initFlowTemplates$() {
204
306
  var _a, _b, _c;
205
307
  return forkJoin([
206
- this.templatesApiService.fetchTemplates$(),
308
+ this.templatesAdminApiService.fetchTemplates$(),
207
309
  (_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]) => {
310
+ ]).pipe(map(([templates, localTemplates]) => {
311
+ var _a, _b;
312
+ const newValue = {};
313
+ 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
314
  var _a;
211
315
  const type = this.remapTemplateName(key);
212
316
  if (type) {
213
- this.templates[type] =
317
+ newValue[type] =
214
318
  (_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
319
  }
216
320
  });
321
+ this.templatesSubj$.next(newValue);
217
322
  }));
218
323
  }
219
324
  remapTemplateName(templateType) {
@@ -239,13 +344,20 @@ class FlowInfoService {
239
344
  }
240
345
  return undefined;
241
346
  }
347
+ getFlowContextMode(headerId) {
348
+ const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
349
+ if (!objectName) {
350
+ return;
351
+ }
352
+ return objectName.toUpperCase();
353
+ }
242
354
  }
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 });
355
+ 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
356
  FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
245
357
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
246
358
  type: Injectable
247
359
  }], ctorParameters: function () {
248
- return [{ type: i1.FlowsApiService }, { type: i1.UITemplatesApiService }, { type: undefined, decorators: [{
360
+ return [{ type: RuntimeSettingsService }, { type: i1.UITemplatesAdminApiService }, { type: undefined, decorators: [{
249
361
  type: Optional
250
362
  }, {
251
363
  type: Inject,
@@ -253,186 +365,183 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
253
365
  }] }];
254
366
  } });
255
367
 
256
- class QuoteDraftService {
368
+ class TestModeConfigurationService {
369
+ constructor(flowInfoService, configurationService, configurationRuntimeService, salesTransactionService) {
370
+ this.flowInfoService = flowInfoService;
371
+ this.configurationService = configurationService;
372
+ this.configurationRuntimeService = configurationRuntimeService;
373
+ this.salesTransactionService = salesTransactionService;
374
+ this.isInitialized = false;
375
+ }
376
+ initTestMode$(uiDefinitionContainer) {
377
+ var _a;
378
+ this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
379
+ if (this.checkInitialized(uiDefinitionContainer)) {
380
+ this.configurationRuntimeService.pcmModel = this.pcmModel;
381
+ return of(undefined);
382
+ }
383
+ this.configurationService.reset();
384
+ const { productId, quoteId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
385
+ if (!productId) {
386
+ return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
387
+ }
388
+ if (!quoteId) {
389
+ return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
390
+ }
391
+ return this.flowInfoService.initTestFlow$(productId).pipe(switchMap(() => this.configurationRuntimeService.init$({ productId })), tap(pcmModel => (this.pcmModel = pcmModel)), tap(() => this.salesTransactionService.setState(this.getTestSalesTransaction(quoteId))), switchMap(() => this.configurationService.init$()), switchMap(() => this.configurationService.state
392
+ ? this.configurationService.configureRequest$(this.configurationService.state)
393
+ : of(undefined)), tap(() => (this.isInitialized = true)), map(noop));
394
+ }
395
+ getTestSalesTransaction(quoteId) {
396
+ const testTransaction = {
397
+ id: quoteId,
398
+ businessObjectType: 'Quote',
399
+ salesTransactionItems: [],
400
+ };
401
+ return testTransaction;
402
+ }
403
+ checkInitialized(uiDefinitionContainer) {
404
+ var _a;
405
+ return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
406
+ }
407
+ }
408
+ 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 }], target: i0.ɵɵFactoryTarget.Injectable });
409
+ TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
410
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
411
+ type: Injectable
412
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }]; } });
413
+
414
+ class SalesTransactionService {
257
415
  get isInitialized$() {
258
416
  return this.isInitializedSubj$.asObservable();
259
417
  }
260
418
  get isInitialized() {
261
419
  return this.isInitializedSubj$.getValue();
262
420
  }
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
421
  set hasUnsavedChanges(value) {
272
422
  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 : [];
423
+ this.hasUnsavedChangesSubj$.next(value);
424
+ if (!this.hasUnsavedChanges) {
425
+ this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
276
426
  }
277
427
  }
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);
428
+ get hasUnsavedChanges() {
429
+ return this.hasUnsavedChangesSubj$.getValue();
284
430
  }
285
- get hasAssets$() {
286
- return this.assetsSubj$.pipe(map(() => this.hasAssets));
431
+ get state() {
432
+ return this.stateSubj$.getValue();
287
433
  }
288
- get hasAssets() {
434
+ get hasProducts() {
289
435
  var _a;
290
- return Boolean((_a = this.assetsSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
436
+ return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems.length);
291
437
  }
292
- get assetsState() {
293
- return this.assetsSubj$.value;
294
- }
295
- constructor(context, flowInfoService, accountApiService, quoteApiService) {
296
- this.context = context;
438
+ constructor(flowInfoService, salesTransactionApiService) {
297
439
  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);
440
+ this.salesTransactionApiService = salesTransactionApiService;
441
+ this.stateSubj$ = new BehaviorSubject(null);
303
442
  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;
443
+ this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
444
+ this.initialState = [];
445
+ this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
446
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
317
447
  }
318
448
  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);
334
- }
335
- }), map(() => noop()), take(1));
449
+ return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
336
450
  }
337
451
  finalizeInit() {
338
- this.isInitialized = true;
452
+ this.isInitializedSubj$.next(true);
339
453
  this.hasUnsavedChanges = false;
340
454
  }
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 }));
347
- }
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);
371
- }
372
- get quoteDraft$() {
373
- return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
455
+ reset() {
456
+ this.stateSubj$.next(null);
457
+ this.isInitializedSubj$.next(false);
458
+ this.hasUnsavedChangesSubj$.next(false);
374
459
  }
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() });
460
+ getInitialState() {
461
+ return this.initialState;
381
462
  }
382
- get currentState$() {
383
- return this.quoteDraft$.pipe(map(quote => quote.currentState));
463
+ setState(state) {
464
+ this.stateSubj$.next(state);
384
465
  }
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 : [];
466
+ }
467
+ SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: FlowInfoService }, { token: i1.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
468
+ SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
470
+ type: Injectable
471
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i1.SalesTransactionApiService }]; } });
472
+
473
+ class FlowConfigurationService {
474
+ constructor(orchestrationsApiService, salesTransactionService) {
475
+ this.orchestrationsApiService = orchestrationsApiService;
476
+ this.salesTransactionService = salesTransactionService;
477
+ this.updatedSubj$ = new Subject();
478
+ this.updated$ = this.updatedSubj$.asObservable();
388
479
  }
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;
480
+ calculate$(state) {
481
+ return this.orchestrationsApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
392
482
  }
393
- get isStandalone$() {
394
- return this.flowInfoService.flow$.pipe(map(() => this.isStandalone));
483
+ calculate(state) {
484
+ this.calculate$(state).subscribe();
395
485
  }
396
- getInitialCurrentState() {
397
- return this.initialCurrentState;
486
+ revert$(transactionItemId) {
487
+ var _a;
488
+ const state = this.salesTransactionService.state;
489
+ const initialState = this.salesTransactionService.getInitialState();
490
+ const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
491
+ const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
492
+ const currentItem = currentState[currentItemIndex];
493
+ const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
494
+ if (!state || !currentItem || !initialItem) {
495
+ return of(null);
496
+ }
497
+ const updatedState = cloneDeep(currentState);
498
+ updatedState.splice(currentItemIndex, 1, initialItem);
499
+ return of([]).pipe(tap(() => {
500
+ this.salesTransactionService.setState(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }));
501
+ }), switchMap(() => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
398
502
  }
399
- isEditMode$() {
400
- return this.context.resolve$().pipe(map(() => this.isEditMode()));
503
+ revert(transactionItemId) {
504
+ this.revert$(transactionItemId).subscribe();
401
505
  }
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';
506
+ delete$(ids) {
507
+ const state = this.salesTransactionService.state;
508
+ if (!state) {
509
+ return of(null);
409
510
  }
410
- return false;
511
+ return of([]).pipe(map(() => state.salesTransactionItems.filter(({ id }) => !ids.includes(id))), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
411
512
  }
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
- }
513
+ delete(ids) {
514
+ this.delete$(ids).subscribe();
419
515
  }
420
- }
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: [{
424
- type: Injectable
425
- }], ctorParameters: function () { return [{ type: ContextService }, { type: FlowInfoService }, { type: i1.AccountApiService }, { type: i1.QuoteApiService }]; } });
516
+ handleErrorAndBounceBack() {
517
+ return (source$) => {
518
+ return source$.pipe(catchError(error => {
519
+ console.error(error);
520
+ // bounce back if configuration call has failed
521
+ const state = this.salesTransactionService.state;
522
+ if (state) {
523
+ this.salesTransactionService.setState(state);
524
+ this.updatedSubj$.next();
525
+ }
526
+ return throwError(() => error);
527
+ }));
528
+ };
529
+ }
530
+ }
531
+ FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i1.OrchestrationsApiService }, { token: SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
532
+ FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
533
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
534
+ type: Injectable
535
+ }], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }]; } });
426
536
 
427
537
  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;
538
+ constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
432
539
  this.flowConfiguration = flowConfiguration;
433
- this.processorsApiService = processorsApiService;
540
+ this.flowInfoService = flowInfoService;
434
541
  this.flowStateApiService = flowStateApiService;
435
- this.quoteApiService = quoteApiService;
542
+ this.processorsApiService = processorsApiService;
543
+ this.salesTransactionApiService = salesTransactionApiService;
544
+ this.salesTransactionService = salesTransactionService;
436
545
  this.toastService = toastService;
437
546
  this.customizationService = customizationService;
438
547
  this.NOT_INITIALIZED = Symbol();
@@ -449,68 +558,22 @@ class FlowStateService {
449
558
  this.cleanup$ = new Subject();
450
559
  this.statefulExecutionRequest$ = this.initBufferedRequest$();
451
560
  /*
452
- In stateless mode watch QuoteDraft changes and call executeRequest so that
453
- all subscriptions get their updates according to updated QuoteDraft
561
+ In stateless mode watch State changes and call executeRequest so that
562
+ all subscriptions get their updates according to updated State
454
563
  */
455
564
  this.isInitialized$()
456
- .pipe(filter$1(Boolean), filter$1(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
565
+ .pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
457
566
  .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
567
  }
503
568
  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
- }));
569
+ if (this.flowInfoService.flow.properties.stateful) {
570
+ return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
571
+ }
572
+ else {
573
+ return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
574
+ }
512
575
  }
513
- cleanup() {
576
+ reset() {
514
577
  Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
515
578
  this.subscriptions = {};
516
579
  if (this.stateId$.value) {
@@ -522,9 +585,9 @@ class FlowStateService {
522
585
  this.cleanup$.next();
523
586
  }
524
587
  get hasUnsavedChanges() {
525
- return this.getFlowSafe().properties.stateful
588
+ return this.flowInfoService.flow.properties.stateful
526
589
  ? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
527
- : this.quoteDraftService.hasUnsavedChanges;
590
+ : this.salesTransactionService.hasUnsavedChanges;
528
591
  }
529
592
  get stateId() {
530
593
  return this.stateId$.value;
@@ -533,14 +596,14 @@ class FlowStateService {
533
596
  return this.executionInProgress$.asObservable();
534
597
  }
535
598
  isInitialized$() {
536
- return combineLatest([this.stateId$, this.quoteDraftService.isInitialized$]).pipe(map$1(values => values.some(Boolean)));
599
+ return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
537
600
  }
538
601
  isInitialized() {
539
- return Boolean(this.stateId$.value) || this.quoteDraftService.isInitialized;
602
+ return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
540
603
  }
541
604
  execute$(scope, exec) {
542
605
  const request = this.execToRequest(scope, exec);
543
- return this.executeRequest$(request).pipe(map$1(result => {
606
+ return this.executeRequest$(request).pipe(map(result => {
544
607
  // Keep only requested results
545
608
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
546
609
  var _a;
@@ -557,7 +620,7 @@ class FlowStateService {
557
620
  actions: [{ name: action, inputData }],
558
621
  };
559
622
  const request = this.execToRequest(scope, exec);
560
- return this.executeRequest$(request).pipe(map$1(noop));
623
+ return this.executeRequest$(request).pipe(map(noop));
561
624
  }
562
625
  select$(scope, selectorName, inputData) {
563
626
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -569,7 +632,7 @@ class FlowStateService {
569
632
  },
570
633
  },
571
634
  });
572
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
635
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
573
636
  }
574
637
  subscribe$(scope, selectorName, inputData, options) {
575
638
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -595,7 +658,7 @@ class FlowStateService {
595
658
  this.executeRequest$(request).subscribe();
596
659
  }
597
660
  }
598
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), finalize(() => {
661
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
599
662
  var _a;
600
663
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
601
664
  delete this.subscriptions[requestId];
@@ -603,9 +666,9 @@ class FlowStateService {
603
666
  }));
604
667
  }
605
668
  save$() {
606
- if (this.getFlowSafe().properties.stateful) {
669
+ if (this.flowInfoService.flow.properties.stateful) {
607
670
  if (this.stateId$.value) {
608
- return this.flowStateApiService.save(this.stateId$.value).pipe(tap$1(() => {
671
+ return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
609
672
  Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
610
673
  this.trackedStatefulChangesMap.set(key, false);
611
674
  });
@@ -613,30 +676,26 @@ class FlowStateService {
613
676
  }
614
677
  }
615
678
  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
- }));
679
+ const state = this.salesTransactionService.state;
680
+ if (state) {
681
+ return this.salesTransactionApiService.upsert(state);
621
682
  }
622
683
  }
623
- return of({ quoteId: '' });
684
+ return of({ id: '' });
624
685
  }
625
686
  submit$() {
626
- if (this.getFlowSafe().properties.stateful) {
687
+ if (this.flowInfoService.flow.properties.stateful) {
627
688
  if (this.stateId$.value) {
628
- return this.flowStateApiService.submit(this.stateId$.value);
689
+ return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
629
690
  }
630
691
  }
631
692
  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
- }));
693
+ const state = this.salesTransactionService.state;
694
+ if (state) {
695
+ return this.salesTransactionApiService.submit(state);
637
696
  }
638
697
  }
639
- return of({ quoteId: '' });
698
+ return of({ id: '' });
640
699
  }
641
700
  getFlowStore() {
642
701
  return this.flowStore;
@@ -677,10 +736,10 @@ class FlowStateService {
677
736
  fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
678
737
  }
679
738
  }
680
- const execution$ = this.getFlowSafe().properties.stateful
739
+ const execution$ = this.flowInfoService.flow.properties.stateful
681
740
  ? this.executeStateful$(fullRequest)
682
741
  : this.executeStateless$(fullRequest);
683
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
742
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
684
743
  }
685
744
  handleSelectorsResponse(selectors) {
686
745
  Object.entries(selectors).forEach(([requestId, selectorResult]) => {
@@ -696,32 +755,21 @@ class FlowStateService {
696
755
  });
697
756
  }
698
757
  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
758
  const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
709
759
  const processors = processorsList.length ? processorsList : undefined;
710
760
  const selectors = Object.values(this.subscriptions)
711
761
  .map(({ request }) => request.selectors)
712
762
  .filter(isDefined)
713
763
  .reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
714
- const request = this.getDefaultExecutionRequestDTO();
715
764
  return this.flowStateApiService
716
765
  .init({
717
- quoteId: this.contextService.resolve().headerId,
718
- params: (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {},
766
+ quoteId: this.flowInfoService.context.headerId,
767
+ params: this.flowInfoService.context,
719
768
  actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
720
769
  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,
770
+ selectors: selectors,
723
771
  })
724
- .pipe(map$1(({ stateId, selectors }) => {
772
+ .pipe(map(({ stateId, selectors }) => {
725
773
  this.handleSelectorsResponse(selectors);
726
774
  this.stateId$.next(stateId);
727
775
  }));
@@ -741,80 +789,50 @@ class FlowStateService {
741
789
  };
742
790
  this.executionInProgress$.next(true);
743
791
  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 => {
792
+ }), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
745
793
  this.executionInProgress$.next(false);
746
794
  return throwError(() => e);
747
795
  }));
748
796
  }
749
797
  executeStateful$(request) {
750
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
798
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
751
799
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
752
800
  combineLatest([
753
801
  this.statefulExecutionRequest$,
754
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
755
- ])), map$1(([response]) => response), take$1(1));
802
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
803
+ ])), map(([response]) => response), take(1));
756
804
  }
757
805
  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);
806
+ 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
807
  }
792
808
  executeStateless$(request) {
793
809
  this.executionInProgress$.next(true);
794
- return of(undefined).pipe(tap$1(() => this.executeStatelessActions(request)), switchMap(() => {
810
+ return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
795
811
  var _a;
796
812
  /*
797
813
  Skip price calculation in case
798
814
  1. No actions in the request
799
815
  2. Initialization process execution (state not initialized yet)
800
816
  */
801
- if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
817
+ const { state } = this.salesTransactionService;
818
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
802
819
  return of(undefined);
803
820
  }
804
821
  else {
805
- return this.calculate$();
822
+ return this.flowConfiguration.calculate$(state);
806
823
  }
807
- }), map$1(() => this.executeStatelessSelectors(request)), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
824
+ }), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
808
825
  this.executionInProgress$.next(false);
809
826
  return throwError(() => e);
810
827
  }));
811
828
  }
812
829
  executeStatelessActions(request) {
813
830
  var _a;
814
- if (!this.quoteDraftService.quoteDraft || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
831
+ const state = this.salesTransactionService.state;
832
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
815
833
  return;
816
834
  }
817
- let flowState = this.quoteDraftService.quoteDraft;
835
+ let flowState = state;
818
836
  request.actions.forEach(action => {
819
837
  var _a;
820
838
  try {
@@ -826,1022 +844,126 @@ class FlowStateService {
826
844
  throw e;
827
845
  }
828
846
  });
829
- this.quoteDraftService.updateQuoteDraft(flowState);
847
+ this.salesTransactionService.setState(flowState);
830
848
  }
831
849
  executeStatelessSelectors(request) {
832
850
  var _a;
833
- if (!this.quoteDraftService.quoteDraft) {
834
- throw 'QuoteDraft is not initialized';
851
+ if (!this.salesTransactionService.state) {
852
+ throw 'State is not initialized';
835
853
  }
836
- const flowState = this.quoteDraftService.quoteDraft;
854
+ const flowState = this.salesTransactionService.state;
837
855
  return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
838
856
  try {
839
857
  result.selectors[key] = {
840
- success: true,
841
- result: this.executeSelectorScript(flowState, selector),
842
- };
843
- }
844
- catch (e) {
845
- console.error(e);
846
- 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) {
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.mode = ConfigurationMode.SEARCH;
1434
- this.configurationState = new BehaviorSubject(null);
1435
- this.previousConfigurationState = new BehaviorSubject(null);
1436
- this.isLoadingSubj$ = new BehaviorSubject(false);
1437
- this.isLoading$ = this.isLoadingSubj$.asObservable();
1438
- this.hasUnsavedChanges = false;
1439
- }
1440
- reset() {
1441
- this.hasUnsavedChanges = false;
1442
- this.runtimeService.reset();
1443
- this.configurableRamp = undefined;
1444
- this.configurationState.next(null);
1445
- this.previousConfigurationState.next(null);
1446
- }
1447
- patch$(lineItem, options) {
1448
- const source = this.getSnapshot();
1449
- if (!source) {
1450
- return throwError(() => new Error(`Source LineItem not found`));
1451
- }
1452
- const skipCardinalityCalculation = (options === null || options === void 0 ? void 0 : options.skipCardinalityCalculation) || this.contextSnapshot.properties['#skipCardinalityCalculation'] === 'true';
1453
- this.configurableRamp = new LineItemWorker(source).replace(lineItem, skipCardinalityCalculation).li;
1454
- return this.configure().pipe(catchError$1(error => {
1455
- console.error(error);
1456
- if (!this.runtimeService.uiDefinitionProperties.suppressToastMessages) {
1457
- this.messageService.add({ severity: 'error', summary: error });
1458
- }
1459
- // bounce back if configuration call has failed
1460
- const prevState = this.configurationState.value;
1461
- this.configurationState.next(prevState ? Object.assign({}, prevState) : null);
1462
- return throwError(() => error);
1463
- }), tap(() => {
1464
- if (!this.hasUnsavedChanges) {
1465
- this.hasUnsavedChanges = true;
1466
- }
1467
- }));
1468
- }
1469
- patch(lineItem, options) {
1470
- this.patch$(lineItem, options).subscribe();
1471
- }
1472
- setConfigurableRamp(lineItem) {
1473
- this.configurableRamp = lineItem;
1474
- }
1475
- get() {
1476
- return this.configurationState.pipe(map(state => state === null || state === void 0 ? void 0 : state.lineItem), shareReplay$1());
1477
- }
1478
- getSnapshot() {
1479
- var _a, _b;
1480
- 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;
1481
- }
1482
- getRuntimeModel() {
1483
- const runtimeModel = this.runtimeService.runtimeModel;
1484
- if (!runtimeModel) {
1485
- throw new Error('Runtime model not initialized');
1486
- }
1487
- return runtimeModel;
1488
- }
1489
- getRuntimeContext() {
1490
- const runtimeContext = this.runtimeService.runtimeContext;
1491
- if (!runtimeContext) {
1492
- throw new Error('Runtime context not initialized');
1493
- }
1494
- return runtimeContext;
1495
- }
1496
- get state$() {
1497
- return this.configurationState.asObservable();
1498
- }
1499
- get stateSnapshot() {
1500
- return this.configurationState.value;
1501
- }
1502
- get previousStateSnapshot() {
1503
- return this.previousConfigurationState.value;
1504
- }
1505
- get contextSnapshot() {
1506
- return this.contextService.resolve();
1507
- }
1508
- get context$() {
1509
- return this.contextService.resolve$();
1510
- }
1511
- get charges$() {
1512
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.charges) !== null && _a !== void 0 ? _a : {}; }));
1513
- }
1514
- get chargesSnapshot() {
1515
- var _a, _b;
1516
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
1517
- }
1518
- get pricePlans$() {
1519
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.pricePlans) !== null && _a !== void 0 ? _a : {}; }));
1520
- }
1521
- get pricePlansSnapshot() {
1522
- var _a, _b;
1523
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
1524
- }
1525
- get procedureContext$() {
1526
- return this.configurationState.pipe(map(state => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.procedureContext) !== null && _a !== void 0 ? _a : {}; }));
1527
- }
1528
- get procedureContextSnapshot() {
1529
- var _a, _b;
1530
- return (_b = (_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.procedureContext) !== null && _b !== void 0 ? _b : {};
1531
- }
1532
- configure() {
1533
- return this.configureRequest$(this.generateRequest());
1534
- }
1535
- configureRequest$(configurationRequest) {
1536
- var _a;
1537
- const runtimeContext = this.getRuntimeContext();
1538
- const runtimeModel = this.getRuntimeModel();
1539
- const uiDefinitionProperties = this.getUIDefinitionProperties();
1540
- const mainPricingEnabled = (_a = runtimeContext.properties) === null || _a === void 0 ? void 0 : _a.PricingEnabled;
1541
- const pricingEnabled = mainPricingEnabled ? mainPricingEnabled === 'true' : uiDefinitionProperties.pricingEnabled;
1542
- const customPriceApi = this.runtimeSettings.getConfigurationSettings()['CUSTOM_PRICE_API'];
1543
- this.isLoadingSubj$.next(true);
1544
- const configure$ = pricingEnabled && customPriceApi
1545
- ? this.configurationApiService.customConfigurePrice({ url: customPriceApi, configurationRequest, runtimeModel })
1546
- : this.configurationApiService.configureLineItem({
1547
- configurationRequest,
1548
- runtimeModel,
1549
- pricingEnabled,
1550
- });
1551
- return configure$.pipe(tap(result => {
1552
- var _a;
1553
- this.contextService.update(result.context);
1554
- this.configurationState.next(result);
1555
- this.previousConfigurationState.next(cloneDeep(result));
1556
- if ((_a = result.deletedLineItems) === null || _a === void 0 ? void 0 : _a.length) {
1557
- this.showInactiveProductsConfirmation();
1558
- }
1559
- this.configurableRamp = result.lineItem;
1560
- }), map(({ lineItem }) => lineItem), catchError$1(error => throwError(() => {
1561
- const resetState = this.previousConfigurationState.value;
1562
- if (resetState) {
1563
- this.previousConfigurationState.next(cloneDeep(resetState));
1564
- this.configurationState.next(resetState);
1565
- }
1566
- if (error.error) {
1567
- return extractErrorDetails(error.error).join('. ');
1568
- }
1569
- return error.message || JSON.stringify(error);
1570
- })), finalize$1(() => this.isLoadingSubj$.next(false)));
1571
- }
1572
- configureExternal$(props) {
1573
- return this.runtimeService
1574
- .init({ productId: props.productId, defaultQty: props.qty, attributesMap: props.attributesMap })
1575
- .pipe(switchMap$1(() => this.configure()), first(), catchError$1(error => {
1576
- this.messageService.add({ severity: ToastType.error, summary: error });
1577
- throw error;
1578
- }), finalize$1(() => this.reset()));
1579
- }
1580
- configureGuidedSelling$(data) {
1581
- return this.configurationApiService
1582
- .configureLineItem({
1583
- configurationRequest: getGuidedSellingConfigurationRequest(data, this.contextService.resolve()),
1584
- })
1585
- .pipe(catchError$1(error => {
1586
- if (error instanceof HttpErrorResponse) {
1587
- this.messageService.add({ severity: ToastType.error, summary: error.error.message || error.error });
1588
- }
1589
- throw error;
1590
- }));
1591
- }
1592
- generateRequest(lightMode = true) {
1593
- var _a, _b;
1594
- const lineItem = this.generateLineItem();
1595
- let request = {
1596
- lineItem,
1597
- mode: this.mode,
1598
- step: !((_a = this.configurationState.value) === null || _a === void 0 ? void 0 : _a.lineItem) ? RuntimeStep.START : RuntimeStep.UPDATE,
1599
- attributeDomainMode: 'ALL',
1600
- context: this.contextService.resolve(),
1601
- lineItems: ((_b = this.quoteDraftService.quoteDraft) === null || _b === void 0 ? void 0 : _b.currentState) || [],
1602
- asset: this.getAsset(),
1603
- };
1604
- if (lightMode) {
1605
- request = ConfigurationTranslatorUtils.lightenConfigurationRequest(request);
1606
- }
1607
- return request;
1608
- }
1609
- generateLineItem() {
1610
- var _a;
1611
- const runtimeContext = this.getRuntimeContext();
1612
- const uiDefinitionProperties = this.getUIDefinitionProperties();
1613
- let lineItem = this.configurableRamp;
1614
- if (!lineItem) {
1615
- const { initializationProps } = (_a = this.runtimeService) !== null && _a !== void 0 ? _a : {};
1616
- lineItem = getDefaultLineItem(runtimeContext, uiDefinitionProperties, initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.defaultQty);
1617
- // Set default attributes
1618
- if (initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap) {
1619
- const attributes = transform(initializationProps === null || initializationProps === void 0 ? void 0 : initializationProps.attributesMap, (acc, value, name) => acc.push({ name, value }), []);
1620
- lineItem = new LineItemWorker(lineItem).patchAttribute(attributes).li;
1621
- }
1622
- }
1623
- return lineItem;
1624
- }
1625
- getAsset() {
1626
- var _a, _b;
1627
- const lineItem = this.configurableRamp;
1628
- if (!lineItem) {
1629
- return;
1630
- }
1631
- const assetId = (_a = lineItem.assetId) !== null && _a !== void 0 ? _a : lineItem.openOrderLineItemId;
1632
- return (_b = this.quoteDraftService.assetsState) === null || _b === void 0 ? void 0 : _b.initialState.find(li => assetPredicateFn(li, assetId));
1633
- }
1634
- getUIDefinitionProperties() {
1635
- var _a, _b, _c;
1636
- 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 : {}));
1637
- }
1638
- showInactiveProductsConfirmation() {
1639
- const confirmationConfig = {
1640
- title: ' ',
1641
- description: 'This quote contains inactive products. Do you want to remove them?',
1642
- primaryButtonLabel: 'Remove products',
1643
- secondaryButtonLabel: 'Back to Quote',
1644
- };
1645
- this.dialogService
1646
- .open(ConfirmationComponent, {
1647
- dismissableMask: false,
1648
- closeOnEscape: false,
1649
- closable: false,
1650
- showHeader: true,
1651
- header: `Inactive Products in Quote`,
1652
- width: '440px',
1653
- data: { confirmationConfig },
1654
- })
1655
- .onClose.subscribe(result => {
1656
- if (!result) {
1657
- const context = this.contextService.resolve();
1658
- window['VELO_BACK_FN'].apply(null, [context.headerId]);
1659
- }
1660
- });
1661
- }
1662
- }
1663
- 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 }], target: i0.ɵɵFactoryTarget.Injectable });
1664
- ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1665
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
1666
- type: Injectable
1667
- }], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: ConfigurationRuntimeService }, { type: ContextService }, { type: i1.ConfigurationApiService }, { type: i5.MessageService }, { type: i6$1.DialogService }, { type: RuntimeSettingsService }]; } });
1668
-
1669
- class FlowConfigurationService {
1670
- constructor(proceduresApiService, contextService, quoteDraftService, updateService, configurationService, flowInfoService) {
1671
- this.proceduresApiService = proceduresApiService;
1672
- this.contextService = contextService;
1673
- this.quoteDraftService = quoteDraftService;
1674
- this.updateService = updateService;
1675
- this.configurationService = configurationService;
1676
- this.flowInfoService = flowInfoService;
1677
- this.updatedSubj$ = new Subject();
1678
- this.updated$ = this.updatedSubj$.asObservable();
1679
- }
1680
- calculate$(quoteDraft) {
1681
- return this.extendedApply$(quoteDraft).pipe(tap$1(result => {
1682
- // sort the result current state based on the quote draft initial state
1683
- const initialStateIds = quoteDraft.initialState.map(lineItem => lineItem.integrationId);
1684
- result.currentState = result.currentState
1685
- .slice()
1686
- .sort((a, b) => initialStateIds.indexOf(a.integrationId) - initialStateIds.indexOf(b.integrationId));
1687
- this.quoteDraftService.updateQuoteDraft(result);
1688
- }), map$1(noop));
1689
- }
1690
- calculate(quoteDraft) {
1691
- this.calculate$(quoteDraft).subscribe();
858
+ success: true,
859
+ result: this.executeSelectorScript(flowState, selector),
860
+ };
861
+ }
862
+ catch (e) {
863
+ console.error(e);
864
+ result.selectors[key] = {
865
+ success: false,
866
+ errorMessage: String(e),
867
+ };
868
+ }
869
+ return result;
870
+ }, { stateId: '', selectors: {} });
1692
871
  }
1693
- update$(updates) {
1694
- const quoteDraft = this.quoteDraftService.quoteDraft;
1695
- if (!quoteDraft) {
1696
- return of(null);
872
+ initProcessors$() {
873
+ var _a;
874
+ const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
875
+ if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
876
+ // Skip initialization as backend will take processors from SF
877
+ return of(undefined);
1697
878
  }
1698
- return of([]).pipe(map$1(() => {
1699
- const updatedState = cloneDeep(quoteDraft.currentState);
1700
- this.updateService.update(updatedState, updates, quoteDraft.charges);
1701
- return updatedState;
1702
- }), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1703
- }
1704
- update(updates) {
1705
- this.update$(updates).subscribe();
1706
- }
1707
- revert$(lineItemId) {
1708
- const quoteDraft = this.quoteDraftService.quoteDraft;
1709
- const initialCurrentState = this.quoteDraftService.getInitialCurrentState();
1710
- const currentState = this.quoteDraftService.currentState;
1711
- const currentLineItemIndex = currentState.findIndex(({ id }) => id === lineItemId);
1712
- const currentLineItem = currentState[currentLineItemIndex];
1713
- const initialLineItem = initialCurrentState.find(({ integrationId }) => integrationId === (currentLineItem === null || currentLineItem === void 0 ? void 0 : currentLineItem.integrationId));
1714
- if (!quoteDraft || !currentLineItem || !initialLineItem) {
1715
- return of(null);
879
+ const owners$ = Object.values(this.flowInfoService.templates)
880
+ .map(template => {
881
+ var _a, _b, _c;
882
+ if (!template) {
883
+ return;
884
+ }
885
+ 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);
886
+ return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
887
+ const processorsMap = processors.reduce((acc, p) => {
888
+ acc[p.apiName] = p;
889
+ return acc;
890
+ }, {});
891
+ this.processors[template.id] = processorsMap;
892
+ }));
893
+ })
894
+ .filter(isDefined);
895
+ if (!owners$.length) {
896
+ return of(undefined);
1716
897
  }
1717
- const updatedState = cloneDeep(currentState);
1718
- updatedState.splice(currentLineItemIndex, 1, initialLineItem);
1719
- return of([]).pipe(tap$1(() => {
1720
- this.quoteDraftService.setCurrentLineItemState(updatedState);
1721
- }), switchMap(() => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
898
+ return forkJoin(owners$).pipe(map(noop));
1722
899
  }
1723
- revert(lineItemId) {
1724
- this.revert$(lineItemId).subscribe();
1725
- }
1726
- delete$(ids) {
1727
- const quoteDraft = this.quoteDraftService.quoteDraft;
1728
- const currentState = this.quoteDraftService.currentState;
1729
- if (!quoteDraft) {
1730
- return of(null);
900
+ executeActionScript(request, executable) {
901
+ var _a;
902
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
903
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
904
+ const scope = this.getScopeByOwnerId(executable.ownerId);
905
+ const scopeText = scope ? ` in ${scope}` : '';
906
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1731
907
  }
1732
- 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());
1733
- }
1734
- delete(ids) {
1735
- this.delete$(ids).subscribe();
908
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1736
909
  }
1737
- addTerm$(term) {
1738
- const quoteDraft = this.quoteDraftService.quoteDraft;
1739
- if (!quoteDraft) {
1740
- return of(null);
910
+ executeSelectorScript(request, executable) {
911
+ var _a;
912
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
913
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
914
+ const scope = this.getScopeByOwnerId(executable.ownerId);
915
+ const scopeText = scope ? ` in ${scope}` : '';
916
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1741
917
  }
1742
- const updatedState = [...quoteDraft.currentState, term];
1743
- 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());
918
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1744
919
  }
1745
- addToCart$(props) {
1746
- const quoteDraft = this.quoteDraftService.quoteDraft;
1747
- if (!quoteDraft) {
1748
- return of(null);
920
+ executeProcessorScript(request, configurationProcessor, inputData) {
921
+ var _a;
922
+ const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
923
+ let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
924
+ if (!functionToExecute) {
925
+ const script = `${configurationProcessor.script}\nreturn transform;`;
926
+ const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
927
+ functionToExecute = new Function(script + sourceMap)();
928
+ this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
1749
929
  }
1750
- return this.configurationService.configureExternal$(props).pipe(map$1(lineItem => {
1751
- var _a, _b, _c;
1752
- const model = this.configurationService.getRuntimeModel();
1753
- 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;
1754
- const lineItems = multiplyLineItems(lineItem, (_c = props.qty) !== null && _c !== void 0 ? _c : 1, split);
1755
- return [...quoteDraft.currentState, ...lineItems];
1756
- }), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1757
- }
1758
- get() {
1759
- return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.currentState), shareReplay$1());
1760
- }
1761
- getSnapshot() {
1762
- var _a, _b;
1763
- return (_b = (_a = this.quoteDraftService) === null || _a === void 0 ? void 0 : _a.currentState.slice()) !== null && _b !== void 0 ? _b : [];
1764
- }
1765
- get charges$() {
1766
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ charges }) => charges));
1767
- }
1768
- get pricePlans$() {
1769
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ pricePlans }) => pricePlans));
1770
- }
1771
- get activeMetrics$() {
1772
- return this.quoteDraftService.quoteDraft$.pipe(map$1(({ activeMetrics }) => activeMetrics));
1773
- }
1774
- get chargesSnapshot() {
1775
- var _a, _b;
1776
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.charges) !== null && _b !== void 0 ? _b : {};
1777
- }
1778
- get pricePlansSnapshot() {
1779
- var _a, _b;
1780
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.pricePlans) !== null && _b !== void 0 ? _b : {};
1781
- }
1782
- get activeMetricsSnapshot() {
1783
- var _a, _b;
1784
- return (_b = (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.activeMetrics) !== null && _b !== void 0 ? _b : [];
1785
- }
1786
- get contextSnapshot() {
1787
- return this.contextService.resolve();
1788
- }
1789
- get context$() {
1790
- return this.contextService.resolve$();
930
+ return functionToExecute({
931
+ request,
932
+ inputData,
933
+ flowStore: this.flowStore,
934
+ });
1791
935
  }
1792
- handleErrorAndBounceBack() {
1793
- return (source$) => {
1794
- return source$.pipe(catchError(error => {
1795
- console.error(error);
1796
- // bounce back if configuration call has failed
1797
- const quoteDraft = this.quoteDraftService.quoteDraft;
1798
- if (quoteDraft) {
1799
- this.quoteDraftService.updateQuoteDraft(quoteDraft);
1800
- this.updatedSubj$.next();
1801
- }
1802
- return throwError(() => error);
1803
- }));
1804
- };
936
+ generateRequestId(scope, selectorName, inputData) {
937
+ const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
938
+ return `${scope}/${selectorName}/${inputDataHash}`;
1805
939
  }
1806
- extendedApply$(quoteDraft) {
1807
- var _a;
1808
- const request = Object.assign({}, quoteDraft);
1809
- const procedureName = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.procedureName;
1810
- if (procedureName) {
1811
- request.procedureName = procedureName;
940
+ checkStatefulChanges(requestId, selectorResult) {
941
+ if (this.trackedStatefulChangesMap.has(requestId)) {
942
+ if (!this.initialStatefulData[requestId]) {
943
+ this.initialStatefulData[requestId] = selectorResult;
944
+ }
945
+ const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
946
+ this.trackedStatefulChangesMap.set(requestId, hasChanges);
1812
947
  }
1813
- return this.proceduresApiService.apply$(request);
1814
948
  }
1815
949
  }
1816
- 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 });
1817
- FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
1818
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
950
+ 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 });
951
+ FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
952
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
1819
953
  type: Injectable
1820
- }], ctorParameters: function () { return [{ type: i1.ProceduresApiService }, { type: ContextService }, { type: QuoteDraftService }, { type: FlowUpdateService }, { type: ConfigurationService }, { type: FlowInfoService }]; } });
1821
-
1822
- class FlowConfigurationModule {
1823
- }
1824
- FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1825
- FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1826
- FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService, FlowUpdateService], imports: [ApiModule] });
1827
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1828
- type: NgModule,
1829
- args: [{
1830
- imports: [ApiModule],
1831
- providers: [FlowConfigurationService, FlowUpdateService],
1832
- }]
1833
- }] });
954
+ }], ctorParameters: function () {
955
+ return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
956
+ type: Optional
957
+ }, {
958
+ type: Inject,
959
+ args: [FLOW_CUSTOMIZATION]
960
+ }] }];
961
+ } });
1834
962
 
1835
963
  class FlowStateConfigurationService {
1836
- constructor(flowInfoService, flowConfigurationService, flowStateApiService, flowStateService) {
964
+ constructor(flowInfoService, flowStateService) {
1837
965
  this.flowInfoService = flowInfoService;
1838
- this.flowConfigurationService = flowConfigurationService;
1839
- this.flowStateApiService = flowStateApiService;
1840
966
  this.flowStateService = flowStateService;
1841
- this.configurationStateId$ = new BehaviorSubject(null);
1842
- }
1843
- get configurationStateId() {
1844
- return this.configurationStateId$.value;
1845
967
  }
1846
968
  addToCart$(props) {
1847
969
  var _a;
@@ -1853,26 +975,22 @@ class FlowStateConfigurationService {
1853
975
  request$ = of();
1854
976
  }
1855
977
  else {
1856
- const lineItem = generateConfigurationLineItem(props, props.qty);
1857
- request$ = this.flowStateApiService.newConfiguration(stateId, { lineItem }).pipe(tap$1(r => this.configurationStateId$.next(r.stateId)), switchMap(() => {
1858
- if (!this.configurationStateId) {
1859
- return of();
1860
- }
1861
- return this.flowStateApiService.saveConfiguration(stateId, this.configurationStateId).pipe(tap$1(() => this.configurationStateId$.next(null)), map$1(noop));
1862
- }));
978
+ // TODO: Implement
979
+ request$ = of();
1863
980
  }
1864
981
  }
1865
982
  else {
1866
- request$ = this.flowConfigurationService.addToCart$(props).pipe(map$1(noop));
983
+ // TODO: Implement
984
+ request$ = of();
1867
985
  }
1868
- return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map$1(noop));
986
+ return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
1869
987
  }
1870
988
  }
1871
- 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 });
989
+ FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token: FlowStateService }], target: i0.ɵɵFactoryTarget.Injectable });
1872
990
  FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
1873
991
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
1874
992
  type: Injectable
1875
- }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: FlowStateService }]; } });
993
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
1876
994
 
1877
995
  class IntegrationState {
1878
996
  constructor() {
@@ -1892,12 +1010,12 @@ class IntegrationState {
1892
1010
  this.action$.next(action);
1893
1011
  }
1894
1012
  listen$(actionType) {
1895
- return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
1013
+ return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
1896
1014
  }
1897
1015
  listenAll$() {
1898
1016
  return this.action$.asObservable();
1899
1017
  }
1900
- clear() {
1018
+ reset() {
1901
1019
  this.stateSubj$.next({});
1902
1020
  }
1903
1021
  }
@@ -1908,8 +1026,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1908
1026
  }] });
1909
1027
 
1910
1028
  class ProductImagesService {
1911
- constructor(productApiService) {
1912
- this.productApiService = productApiService;
1029
+ constructor(productsAdminApiService) {
1030
+ this.productsAdminApiService = productsAdminApiService;
1913
1031
  this.imagesMap$ = new BehaviorSubject({});
1914
1032
  }
1915
1033
  getImageUrl$(productId) {
@@ -1917,157 +1035,151 @@ class ProductImagesService {
1917
1035
  this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
1918
1036
  this.fetchProductImage(productId);
1919
1037
  }
1920
- return this.imagesMap$.pipe(map$1(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1038
+ return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1921
1039
  }
1922
1040
  fetchProductImage(productId) {
1923
- this.productApiService
1041
+ this.productsAdminApiService
1924
1042
  .fetchImage$(productId)
1925
- .pipe(map$1(file => URL.createObjectURL(file)), catchError(() => of('')), tap$1(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1043
+ .pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1926
1044
  .subscribe();
1927
1045
  }
1928
1046
  }
1929
- ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1047
+ ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductsAdminApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1930
1048
  ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
1931
1049
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
1932
1050
  type: Injectable
1933
- }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
1051
+ }], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
1934
1052
 
1935
- class RuntimeContextService {
1936
- constructor(configurationApiService) {
1937
- this.configurationApiService = configurationApiService;
1938
- }
1939
- getRuntimeContext(productId, offeringId) {
1940
- return this.configurationApiService.getRuntimeDataByProductId(productId, offeringId).pipe(map(runtimeData => {
1941
- var _a;
1942
- const uiDefinitionContainer = this.getUIDefinitionContainer(runtimeData);
1943
- const runtimeModel = RuntimeModel.create(runtimeData.types, runtimeData.products);
1944
- const { productName, properties } = (_a = Array.from(runtimeModel.components.values()).find(c => c.productId === productId)) !== null && _a !== void 0 ? _a : {};
1945
- const uiDefinitionProperties = uiDefinitionContainer === null || uiDefinitionContainer === void 0 ? void 0 : uiDefinitionContainer.source.properties;
1946
- return {
1947
- modelId: runtimeData.modelId,
1948
- uiDefinitionContainer: uiDefinitionContainer,
1949
- runtimeModel: runtimeModel,
1950
- runtimeMode: RuntimeMode.PROD,
1951
- productId: productId,
1952
- productType: (properties === null || properties === void 0 ? void 0 : properties['displayName']) || productName,
1953
- offeringId: offeringId,
1954
- properties: {
1955
- PricingEnabled: (uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.pricingEnabled) ? 'true' : 'false',
1956
- PriceListId: uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.priceList,
1957
- },
1958
- };
1959
- }));
1053
+ class ConfigurationService {
1054
+ get state$() {
1055
+ return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
1960
1056
  }
1961
- getUIDefinitionContainer(runtimeData) {
1962
- var _a;
1963
- const containers = runtimeData.uiDefinitions.filter(container => isNotLegacyUIDefinition(container.source));
1964
- return (_a = containers.find(container => container.source.primary)) !== null && _a !== void 0 ? _a : containers[0];
1057
+ get state() {
1058
+ return this.configurationStateSubj$.getValue();
1965
1059
  }
1966
- }
1967
- RuntimeContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, deps: [{ token: i1.ConfigurationApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1968
- RuntimeContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService });
1969
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, decorators: [{
1970
- type: Injectable
1971
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }]; } });
1972
-
1973
- class ConfigurationRuntimeService {
1974
- constructor(apiService, contextService, runtimeContextService) {
1975
- this.apiService = apiService;
1976
- this.contextService = contextService;
1977
- this.runtimeContextService = runtimeContextService;
1978
- this._isInitialized = false;
1979
- this.uiDefinitionProperties = {};
1060
+ get previousState() {
1061
+ return this.previousConfigurationStateSubj$.getValue();
1980
1062
  }
1981
- reset() {
1982
- this._isInitialized = false;
1983
- this._runtimeContext = undefined;
1984
- this.initializationProps = undefined;
1985
- this.uiDefinitionProperties = {};
1063
+ get root$() {
1064
+ return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter$1(isDefined));
1986
1065
  }
1987
- initTestMode(uiDefinitionContainer) {
1066
+ get root() {
1988
1067
  var _a, _b;
1989
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1990
- const uiDefinitionExternals = (_b = uiDefinitionContainer.source.externals) !== null && _b !== void 0 ? _b : {};
1991
- return combineLatest([
1992
- this.apiService.getRuntimeDataByModelId(uiDefinitionContainer.modelId),
1993
- this.contextService.initTestMode(),
1994
- ]).pipe(first(), map(([runtimeData, context]) => {
1995
- var _a;
1996
- this.contextService.update({
1997
- 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),
1998
- });
1999
- this._runtimeContext = {
2000
- modelId: uiDefinitionContainer.modelId,
2001
- runtimeModel: RuntimeModel.create(runtimeData.types, runtimeData.products),
2002
- runtimeMode: RuntimeMode.TEST,
2003
- uiDefinitionContainer,
2004
- };
2005
- return this._runtimeContext;
2006
- }), tap(() => (this._isInitialized = true)));
1068
+ return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
2007
1069
  }
2008
- init(props) {
2009
- this.initializationProps = props;
2010
- const context = this.contextService.resolve();
2011
- return this.runtimeContextService.getRuntimeContext(props.productId, props.offeringId).pipe(tap(runtimeContext => {
2012
- var _a, _b, _c, _d;
2013
- this.uiDefinitionProperties = (_b = (_a = runtimeContext.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
2014
- const { PriceListId } = (_c = context.properties) !== null && _c !== void 0 ? _c : {};
2015
- const mergeContext = Object.assign(Object.assign({}, runtimeContext), { properties: Object.assign(Object.assign(Object.assign({}, runtimeContext.properties), context.properties), { PricingEnabled: PriceListId ? 'true' : 'false' }) });
2016
- this.id15to18('AccountId', mergeContext.properties);
2017
- this._runtimeContext = mergeContext;
2018
- if (context.properties && ((_d = this._runtimeContext.properties) === null || _d === void 0 ? void 0 : _d.StartDate)) {
2019
- this.contextService.update({
2020
- properties: Object.assign(Object.assign({}, this._runtimeContext.properties), context.properties),
2021
- });
2022
- }
2023
- return this._runtimeContext;
2024
- }), tap(() => (this._isInitialized = true)));
1070
+ constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService) {
1071
+ this.flowInfoService = flowInfoService;
1072
+ this.messageService = messageService;
1073
+ this.configurationRuntimeService = configurationRuntimeService;
1074
+ this.salesTransactionService = salesTransactionService;
1075
+ this.orchestrationsApiService = orchestrationsApiService;
1076
+ this.hasUnsavedChanges = false;
1077
+ this.configurationStateSubj$ = new BehaviorSubject(null);
1078
+ this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
1079
+ this.isLoadingSubj$ = new BehaviorSubject(false);
1080
+ this.isLoading$ = this.isLoadingSubj$.asObservable();
2025
1081
  }
2026
- overrideUIDefinition(uiDefinitionContainer) {
1082
+ reset() {
1083
+ this.hasUnsavedChanges = false;
1084
+ this.configurationStateSubj$.next(null);
1085
+ this.previousConfigurationStateSubj$.next(null);
1086
+ }
1087
+ init$() {
2027
1088
  var _a;
2028
- if (!this._runtimeContext) {
2029
- return;
1089
+ const { state } = this.salesTransactionService;
1090
+ const { productId, transactionItemId } = this.flowInfoService.context;
1091
+ if (!state) {
1092
+ return of(undefined);
2030
1093
  }
2031
- this._runtimeContext.uiDefinitionContainer = uiDefinitionContainer;
2032
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1094
+ let transactionItem = state === null || state === void 0 ? void 0 : state.salesTransactionItems.find(item => item.id === transactionItemId);
1095
+ if (!transactionItem && productId) {
1096
+ transactionItem =
1097
+ (_a = state.salesTransactionItems.find(item => item.productId === productId)) !== null && _a !== void 0 ? _a : generateTransactionItem(productId);
1098
+ }
1099
+ const configurationState = Object.assign(Object.assign({}, state), { salesTransactionItems: transactionItem ? [transactionItem] : [] });
1100
+ this.configurationStateSubj$.next(configurationState);
1101
+ this.previousConfigurationStateSubj$.next(configurationState);
1102
+ return of(undefined);
2033
1103
  }
2034
- id15to18(propertyName, source) {
2035
- if (!source) {
2036
- return;
1104
+ patch$(transactionItem) {
1105
+ const { state, root } = this;
1106
+ if (!state) {
1107
+ return throwError(() => new Error(`Configuration State is not initialized`));
2037
1108
  }
2038
- const value = source[propertyName];
2039
- if (typeof value === 'string' && value.length === 15) {
2040
- source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
1109
+ if (!root) {
1110
+ return throwError(() => new Error(`Root SalesTransactionItem not found`));
2041
1111
  }
1112
+ const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
1113
+ const newSalesTransaction = Object.assign(Object.assign({}, state), { salesTransactionItems: [newRoot] });
1114
+ return this.configureRequest$(newSalesTransaction).pipe(catchError$1(error => {
1115
+ console.error(error);
1116
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
1117
+ this.messageService.add({ severity: 'error', summary: error });
1118
+ }
1119
+ return throwError(() => error);
1120
+ }), tap$1(() => {
1121
+ if (!this.hasUnsavedChanges) {
1122
+ this.hasUnsavedChanges = true;
1123
+ }
1124
+ }), map$1(noop));
2042
1125
  }
2043
- get isInitialized() {
2044
- return this._isInitialized;
1126
+ patch(transactionItem) {
1127
+ this.patch$(transactionItem).subscribe();
2045
1128
  }
2046
- get runtimeModel() {
2047
- var _a;
2048
- return (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.runtimeModel;
1129
+ configureRequest$(salesTransaction) {
1130
+ const request = {
1131
+ salesTransaction,
1132
+ };
1133
+ this.isLoadingSubj$.next(true);
1134
+ return this.orchestrationsApiService.apply$(request).pipe(tap$1(result => {
1135
+ const newState = result.salesTransaction;
1136
+ this.configurationStateSubj$.next(newState);
1137
+ this.previousConfigurationStateSubj$.next(cloneDeep(newState));
1138
+ }), map$1(response => response.salesTransaction), catchError$1(error => throwError(() => {
1139
+ const resetState = this.previousConfigurationStateSubj$.getValue();
1140
+ if (resetState) {
1141
+ this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
1142
+ this.configurationStateSubj$.next(resetState);
1143
+ }
1144
+ if (error.error) {
1145
+ return extractErrorDetails(error.error).join('. ');
1146
+ }
1147
+ return error.message || JSON.stringify(error);
1148
+ })), finalize$1(() => this.isLoadingSubj$.next(false)));
1149
+ }
1150
+ configureExternal$(props) {
1151
+ // TODO: implement
1152
+ throw new Error('Not implemented');
1153
+ }
1154
+ configureGuidedSelling$(data) {
1155
+ // TODO: implement
1156
+ throw new Error('Not implemented');
2049
1157
  }
2050
- get runtimeContext() {
2051
- return this._runtimeContext;
1158
+ getPCMModel() {
1159
+ const pcmModel = this.configurationRuntimeService.pcmModel;
1160
+ if (!pcmModel) {
1161
+ throw new Error('PCM model not initialized');
1162
+ }
1163
+ return pcmModel;
2052
1164
  }
2053
1165
  }
2054
- 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 });
2055
- ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
2056
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
1166
+ 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 }], target: i0.ɵɵFactoryTarget.Injectable });
1167
+ ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1168
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
2057
1169
  type: Injectable
2058
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }, { type: ContextService }, { type: RuntimeContextService }]; } });
1170
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }]; } });
2059
1171
 
2060
1172
  class ConfigurationStateService {
2061
- constructor(configurationRuntimeService, configurationService, quoteDraftService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, quoteApiService) {
1173
+ constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
2062
1174
  this.configurationRuntimeService = configurationRuntimeService;
2063
1175
  this.configurationService = configurationService;
2064
- this.quoteDraftService = quoteDraftService;
2065
- this.toastService = toastService;
2066
1176
  this.flowStateService = flowStateService;
2067
1177
  this.flowInfoService = flowInfoService;
2068
1178
  this.flowConfigurationService = flowConfigurationService;
2069
1179
  this.flowStateApiService = flowStateApiService;
2070
- this.quoteApiService = quoteApiService;
1180
+ this.salesTransactionService = salesTransactionService;
1181
+ this.salesTransactionApiService = salesTransactionApiService;
1182
+ this.toastService = toastService;
2071
1183
  this.isInitialized$ = new BehaviorSubject(false);
2072
1184
  this.canceledConfiguration$ = new Subject();
2073
1185
  this.NOT_INITIALIZED = Symbol();
@@ -2091,9 +1203,9 @@ class ConfigurationStateService {
2091
1203
  request$ = this.initStateful$();
2092
1204
  }
2093
1205
  else {
2094
- request$ = this.initStateless$();
1206
+ request$ = this.configurationService.init$();
2095
1207
  }
2096
- return request$.pipe(finalize(() => {
1208
+ return request$.pipe(take(1), tap(() => {
2097
1209
  this.isInitialized$.next(true);
2098
1210
  this.canceledConfiguration$ = new Subject();
2099
1211
  }));
@@ -2107,10 +1219,11 @@ class ConfigurationStateService {
2107
1219
  this.configurationStore = {};
2108
1220
  this.executedFunctions = {};
2109
1221
  this.configurationService.reset();
1222
+ this.configurationRuntimeService.reset();
2110
1223
  }
2111
1224
  execute$(exec) {
2112
1225
  const request = this.execToRequest(exec);
2113
- return this.executeRequest$(request).pipe(map$1(result => {
1226
+ return this.executeRequest$(request).pipe(map(result => {
2114
1227
  // Keep only requested results
2115
1228
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
2116
1229
  var _a;
@@ -2133,7 +1246,7 @@ class ConfigurationStateService {
2133
1246
  }
2134
1247
  // prevent parallel configuration requests in stateless mode
2135
1248
  if (!this.statelessExecutionRequest$) {
2136
- this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay$1(), take$1(1), finalize(() => (this.statelessExecutionRequest$ = null)));
1249
+ this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
2137
1250
  }
2138
1251
  return this.statelessExecutionRequest$;
2139
1252
  }
@@ -2147,7 +1260,7 @@ class ConfigurationStateService {
2147
1260
  },
2148
1261
  },
2149
1262
  });
2150
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
1263
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
2151
1264
  }
2152
1265
  subscribe$(selectorName, inputData = {}, options) {
2153
1266
  const requestId = UUID.UUID();
@@ -2170,58 +1283,41 @@ class ConfigurationStateService {
2170
1283
  this.executeRequest$(request).subscribe();
2171
1284
  }
2172
1285
  }
2173
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), distinctUntilChanged(), finalize(() => {
1286
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
2174
1287
  var _a;
2175
1288
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
2176
1289
  delete this.subscriptions[requestId];
2177
1290
  }
2178
1291
  }), takeUntil(this.canceledConfiguration$));
2179
1292
  }
2180
- saveConfiguration(flow) {
2181
- var _a, _b, _c, _d;
1293
+ saveConfiguration() {
1294
+ var _a, _b;
2182
1295
  if (this.isStatefulConfiguration) {
2183
- return this.flowStateApiService
2184
- .saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '')
2185
- .pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map$1(() => r))));
1296
+ 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 })));
1297
+ }
1298
+ const state = this.salesTransactionService.state;
1299
+ if (!state) {
1300
+ return of({ id: '' });
1301
+ }
1302
+ const { standalone } = this.flowInfoService.flow.properties;
1303
+ if (standalone) {
1304
+ return this.salesTransactionApiService.upsert(state);
1305
+ }
1306
+ const salesTransaction = this.salesTransactionService.state;
1307
+ const configurationRoot = this.configurationService.root;
1308
+ if (!salesTransaction || !configurationRoot) {
1309
+ return of({ id: '' });
1310
+ }
1311
+ const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
1312
+ let salesTransactionItems;
1313
+ if (isNewTransactionItem) {
1314
+ salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
2186
1315
  }
2187
1316
  else {
2188
- if (!flow) {
2189
- const quoteDraft = this.quoteDraftService.quoteDraft;
2190
- if (!quoteDraft) {
2191
- return of({ quoteId: '' });
2192
- }
2193
- const rootLineItem = this.configurationService.getSnapshot();
2194
- const asset = this.configurationService.getAsset();
2195
- const currentState = rootLineItem ? [rootLineItem] : [];
2196
- const initialState = asset ? [asset] : [];
2197
- return this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }));
2198
- }
2199
- else {
2200
- const quoteDraft = this.quoteDraftService.quoteDraft;
2201
- const lineItem = this.configurationService.getSnapshot();
2202
- if (!quoteDraft || !lineItem) {
2203
- return of({ quoteId: '' });
2204
- }
2205
- const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
2206
- let currentState;
2207
- if (isNewLineItem) {
2208
- currentState = [...quoteDraft.currentState, lineItem];
2209
- }
2210
- else {
2211
- currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
2212
- }
2213
- const asset = this.configurationService.getAsset();
2214
- const initialState = [...((_d = (_c = this.quoteDraftService.quoteDraft) === null || _c === void 0 ? void 0 : _c.initialState) !== null && _d !== void 0 ? _d : [])];
2215
- if (asset) {
2216
- if (!initialState.some(li => li.id === asset.id)) {
2217
- initialState.push(asset);
2218
- }
2219
- }
2220
- return this.flowConfigurationService
2221
- .calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))
2222
- .pipe(map$1(() => ({ quoteId: '' })));
2223
- }
1317
+ salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
2224
1318
  }
1319
+ const newState = Object.assign(Object.assign({}, salesTransaction), { salesTransactionItems });
1320
+ return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
2225
1321
  }
2226
1322
  cancelConfiguration() {
2227
1323
  var _a, _b;
@@ -2242,37 +1338,33 @@ class ConfigurationStateService {
2242
1338
  return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
2243
1339
  }
2244
1340
  initStateful$() {
2245
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
2246
- 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 : '';
2247
- const lineItemId = (_e = (_d = this.configurationRuntimeService.runtimeContext) === null || _d === void 0 ? void 0 : _d.properties) === null || _e === void 0 ? void 0 : _e.lineItemId;
2248
- if (!this.flowStateService.stateId) {
1341
+ var _a, _b, _c, _d, _e, _f;
1342
+ this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
1343
+ const { productId, transactionItemId } = this.flowInfoService.context;
1344
+ if (!productId || !this.flowStateService.stateId) {
2249
1345
  return of(undefined);
2250
1346
  }
2251
- const container = (_f = this.configurationRuntimeService.runtimeContext) === null || _f === void 0 ? void 0 : _f.uiDefinitionContainer;
2252
- const lineItem = this.configurationService.generateLineItem();
1347
+ const container = this.configurationRuntimeService.uiDefinitionContainer;
2253
1348
  let request$;
2254
- if (!lineItemId) {
1349
+ if (!transactionItemId) {
2255
1350
  request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
2256
- lineItem,
2257
- 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 }))),
2258
- 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 }))),
1351
+ transactionItem: generateTransactionItem(productId),
1352
+ 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 }))),
1353
+ 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 }))),
2259
1354
  });
2260
1355
  }
2261
1356
  else {
2262
1357
  request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
2263
- lineItemId,
2264
- 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 }))),
2265
- 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 }))),
1358
+ transactionItemId,
1359
+ 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 }))),
1360
+ 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 }))),
2266
1361
  });
2267
1362
  }
2268
- return request$.pipe(map$1(r => {
1363
+ return request$.pipe(map(r => {
2269
1364
  this.stateId = r.stateId;
2270
1365
  return undefined;
2271
1366
  }));
2272
1367
  }
2273
- initStateless$() {
2274
- return this.configurationService.configure().pipe(map$1(() => undefined));
2275
- }
2276
1368
  execToRequest(exec) {
2277
1369
  var _a;
2278
1370
  return {
@@ -2318,39 +1410,37 @@ class ConfigurationStateService {
2318
1410
  else {
2319
1411
  execution$ = this.executeStateless$(fullRequest);
2320
1412
  }
2321
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
1413
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
2322
1414
  }
2323
1415
  executeStateless$(request) {
2324
1416
  this.executionInProgress$.next(true);
2325
- return of(undefined).pipe(switchMap(() => {
1417
+ return this.configurationService.state$.pipe(switchMap(state => {
2326
1418
  var _a;
2327
1419
  // Apply actions and execute configuration/price call
2328
1420
  // No need to run configuration if no actions in the request
2329
1421
  if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
2330
1422
  return of(undefined);
2331
1423
  }
2332
- let configurationRequest = this.configurationService.generateRequest(false);
2333
1424
  request.actions.forEach(action => {
2334
1425
  var _a;
2335
- configurationRequest = (_a = this.executeActionScript(configurationRequest, action)) !== null && _a !== void 0 ? _a : configurationRequest;
1426
+ state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
2336
1427
  });
2337
- configurationRequest = ConfigurationTranslatorUtils.lightenConfigurationRequest(configurationRequest);
2338
- return this.configurationService.configureRequest$(configurationRequest);
2339
- }), map$1(() => {
1428
+ return this.configurationService.configureRequest$(state);
1429
+ }), map(() => {
2340
1430
  // Run selectors and apply them to the state
2341
- const configurationState = this.configurationService.stateSnapshot;
1431
+ const configurationState = this.configurationService.state;
2342
1432
  if (!configurationState) {
2343
1433
  return { stateId: '', selectors: {} };
2344
1434
  }
2345
1435
  return this.runStatelessSelectors(request, configurationState);
2346
- }), tap$1(() => this.executionInProgress$.next(false)), catchError(error => {
2347
- const configurationState = this.configurationService.previousStateSnapshot;
1436
+ }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
1437
+ const configurationState = this.configurationService.previousState;
2348
1438
  if (configurationState) {
2349
1439
  const selectorsResult = this.runStatelessSelectors(request, configurationState);
2350
1440
  this.handleSelectorsResponse(selectorsResult.selectors);
2351
1441
  }
2352
1442
  this.executionInProgress$.next(false);
2353
- if (!this.configurationRuntimeService.uiDefinitionProperties.suppressToastMessages) {
1443
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
2354
1444
  this.toastService.add({ severity: ToastType.error, summary: String(error) });
2355
1445
  }
2356
1446
  return throwError(() => error);
@@ -2371,22 +1461,22 @@ class ConfigurationStateService {
2371
1461
  };
2372
1462
  this.executionInProgress$.next(true);
2373
1463
  return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
2374
- }), tap$1(({ stateId }) => (this.stateId = stateId)), share(), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
1464
+ }), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
2375
1465
  this.executionInProgress$.next(false);
2376
1466
  return throwError(() => e);
2377
1467
  }));
2378
1468
  }
2379
1469
  executeStateful$(request) {
2380
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
1470
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
2381
1471
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
2382
1472
  combineLatest([
2383
1473
  this.statefulExecutionRequest$,
2384
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
2385
- ])), map$1(([response]) => response), take$1(1));
1474
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
1475
+ ])), map(([response]) => response), take(1));
2386
1476
  }
2387
1477
  executeActionScript(request, processor) {
2388
- var _a, _b;
2389
- const { actions } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1478
+ var _a;
1479
+ const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2390
1480
  const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
2391
1481
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2392
1482
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2394,8 +1484,8 @@ class ConfigurationStateService {
2394
1484
  return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
2395
1485
  }
2396
1486
  executeSelectorScript(request, processor) {
2397
- var _a, _b;
2398
- const { selectors } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1487
+ var _a;
1488
+ const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2399
1489
  const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
2400
1490
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2401
1491
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2437,25 +1527,73 @@ class ConfigurationStateService {
2437
1527
  }, { stateId: '', selectors: {} });
2438
1528
  }
2439
1529
  }
2440
- 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 });
1530
+ 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 });
2441
1531
  ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
2442
1532
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
2443
1533
  type: Injectable
2444
- }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: QuoteDraftService }, { type: i6.ToastService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }]; } });
1534
+ }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i3.FlowStateApiService }, { type: SalesTransactionService }, { type: i1.SalesTransactionApiService }, { type: i6.ToastService }]; } });
2445
1535
 
2446
1536
  class ConfigurationModule {
2447
1537
  }
2448
1538
  ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2449
1539
  ConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, imports: [ConfirmationDialogModule, ApiModule] });
2450
- ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService], imports: [ConfirmationDialogModule, ApiModule] });
1540
+ ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
1541
+ ConfigurationService,
1542
+ ConfigurationStateService,
1543
+ ConfigurationRuntimeService,
1544
+ TestModeConfigurationService,
1545
+ ], imports: [ConfirmationDialogModule, ApiModule] });
2451
1546
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
2452
1547
  type: NgModule,
2453
1548
  args: [{
2454
1549
  imports: [ConfirmationDialogModule, ApiModule],
2455
- providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService],
1550
+ providers: [
1551
+ ConfigurationService,
1552
+ ConfigurationStateService,
1553
+ ConfigurationRuntimeService,
1554
+ TestModeConfigurationService,
1555
+ ],
1556
+ }]
1557
+ }] });
1558
+
1559
+ class FlowConfigurationModule {
1560
+ }
1561
+ FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1562
+ FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1563
+ FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
1564
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1565
+ type: NgModule,
1566
+ args: [{
1567
+ imports: [ApiModule],
1568
+ providers: [FlowConfigurationService],
2456
1569
  }]
2457
1570
  }] });
2458
1571
 
1572
+ class CatalogProductsService {
1573
+ constructor() {
1574
+ this.stateSubj$ = new BehaviorSubject(null);
1575
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
1576
+ }
1577
+ get state() {
1578
+ return this.stateSubj$.getValue();
1579
+ }
1580
+ reset() {
1581
+ this.stateSubj$.next(null);
1582
+ }
1583
+ setState(state) {
1584
+ this.stateSubj$.next(state);
1585
+ }
1586
+ }
1587
+ CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1588
+ CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
1589
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
1590
+ type: Injectable
1591
+ }] });
1592
+
1593
+ const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
1594
+
1595
+ const UI_DEFINITION_VERSION = 3;
1596
+
2459
1597
  const DEFAULT_FORMATTING_SETTINGS = {
2460
1598
  currencySymbol: DEFAULT_CURRENCY_SYMBOL,
2461
1599
  decimalsCount: DEFAULT_DECIMALS_COUNT,
@@ -2469,14 +1607,14 @@ class SdkCoreModule {
2469
1607
  SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2470
1608
  SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
2471
1609
  SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
2472
- ContextService,
2473
1610
  FlowInfoService,
2474
- QuoteDraftService,
2475
1611
  ProductImagesService,
2476
1612
  IntegrationState,
2477
1613
  FlowStateService,
2478
1614
  FlowStateConfigurationService,
2479
1615
  RuntimeSettingsService,
1616
+ SalesTransactionService,
1617
+ CatalogProductsService,
2480
1618
  {
2481
1619
  provide: FORMATTING_SETTINGS_TOKEN,
2482
1620
  useExisting: RuntimeSettingsService,
@@ -2487,14 +1625,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2487
1625
  args: [{
2488
1626
  imports: [ConfigurationModule, FlowConfigurationModule],
2489
1627
  providers: [
2490
- ContextService,
2491
1628
  FlowInfoService,
2492
- QuoteDraftService,
2493
1629
  ProductImagesService,
2494
1630
  IntegrationState,
2495
1631
  FlowStateService,
2496
1632
  FlowStateConfigurationService,
2497
1633
  RuntimeSettingsService,
1634
+ SalesTransactionService,
1635
+ CatalogProductsService,
2498
1636
  {
2499
1637
  provide: FORMATTING_SETTINGS_TOKEN,
2500
1638
  useExisting: RuntimeSettingsService,
@@ -2679,5 +1817,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2679
1817
  * Generated bundle index. Do not edit.
2680
1818
  */
2681
1819
 
2682
- 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 };
1820
+ export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, IntegrationState, NumberPipe, PricePipe, ProductImagesService, RuntimeSettingsService, SalesTransactionService, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, TestModeConfigurationService, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
2683
1821
  //# sourceMappingURL=veloceapps-sdk-core.mjs.map