@veloceapps/sdk 11.0.0-2 → 11.0.0-21

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 (158) 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 +19 -40
  8. package/core/index.d.ts +0 -1
  9. package/core/modules/configuration/index.d.ts +1 -4
  10. package/core/modules/configuration/services/configuration-runtime.service.d.ts +3 -22
  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/flow-configuration/index.d.ts +0 -3
  14. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +10 -39
  15. package/core/services/catalog-products.service.d.ts +11 -0
  16. package/core/services/flow-info.service.d.ts +25 -11
  17. package/core/services/flow-state-configuration.service.d.ts +2 -8
  18. package/core/services/flow-state.service.d.ts +13 -22
  19. package/core/services/index.d.ts +2 -3
  20. package/core/services/integration.state.d.ts +1 -1
  21. package/core/services/sales-transaction.service.d.ts +30 -0
  22. package/core/types/flow-state.types.d.ts +2 -2
  23. package/core/types/index.d.ts +0 -1
  24. package/core/utils/index.d.ts +2 -2
  25. package/core/utils/transaction-item.utils.d.ts +7 -0
  26. package/core/utils/transaction-item.worker.d.ts +8 -0
  27. package/esm2020/cms/cms.actions.mjs +93 -71
  28. package/esm2020/cms/cms.default.mjs +2 -3
  29. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
  30. package/esm2020/cms/components/preview/preview.component.mjs +3 -3
  31. package/esm2020/cms/services/element-context.service.mjs +1 -1
  32. package/esm2020/cms/types/common.types.mjs +1 -1
  33. package/esm2020/cms/types/index.mjs +1 -2
  34. package/esm2020/cms/utils/element.utils.mjs +3 -3
  35. package/esm2020/cms/utils/path.utils.mjs +1 -10
  36. package/esm2020/cms/vendor-map.mjs +12 -17
  37. package/esm2020/core/core.module.mjs +9 -7
  38. package/esm2020/core/index.mjs +1 -2
  39. package/esm2020/core/modules/configuration/configuration.module.mjs +3 -4
  40. package/esm2020/core/modules/configuration/index.mjs +2 -5
  41. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +9 -102
  42. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +60 -76
  43. package/esm2020/core/modules/configuration/services/configuration.service.mjs +96 -225
  44. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
  45. package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
  46. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +33 -126
  47. package/esm2020/core/services/catalog-products.service.mjs +25 -0
  48. package/esm2020/core/services/flow-info.service.mjs +77 -29
  49. package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
  50. package/esm2020/core/services/flow-state.service.mjs +62 -169
  51. package/esm2020/core/services/index.mjs +3 -4
  52. package/esm2020/core/services/integration.state.mjs +2 -2
  53. package/esm2020/core/services/sales-transaction.service.mjs +68 -0
  54. package/esm2020/core/types/flow-state.types.mjs +1 -1
  55. package/esm2020/core/types/index.mjs +1 -2
  56. package/esm2020/core/utils/index.mjs +3 -3
  57. package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
  58. package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
  59. package/esm2020/src/components/flow-header/flow-header.component.mjs +3 -7
  60. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +3 -7
  61. package/esm2020/src/flow-routing.module.mjs +11 -41
  62. package/esm2020/src/flow.component.mjs +5 -5
  63. package/esm2020/src/guards/flow.guard.mjs +13 -14
  64. package/esm2020/src/guards/product-unload.guard.mjs +7 -9
  65. package/esm2020/src/index.mjs +1 -3
  66. package/esm2020/src/pages/assets/assets.component.mjs +3 -4
  67. package/esm2020/src/pages/catalog/catalog.component.mjs +3 -4
  68. package/esm2020/src/pages/debug/debug.component.mjs +12 -21
  69. package/esm2020/src/pages/product/product.component.mjs +12 -82
  70. package/esm2020/src/pages/product/product.module.mjs +5 -5
  71. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
  72. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +3 -4
  73. package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
  74. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +83 -0
  75. package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
  76. package/esm2020/src/services/flow-dialog.service.mjs +8 -8
  77. package/esm2020/src/services/flow-router.service.mjs +16 -33
  78. package/esm2020/src/services/flow.service.mjs +13 -54
  79. package/esm2020/src/types/index.mjs +2 -3
  80. package/esm2020/src/types/route.types.mjs +1 -1
  81. package/fesm2015/veloceapps-sdk-cms.mjs +126 -268
  82. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  83. package/fesm2015/veloceapps-sdk-core.mjs +712 -1644
  84. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  85. package/fesm2015/veloceapps-sdk.mjs +167 -763
  86. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  87. package/fesm2020/veloceapps-sdk-cms.mjs +114 -262
  88. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  89. package/fesm2020/veloceapps-sdk-core.mjs +758 -1725
  90. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  91. package/fesm2020/veloceapps-sdk.mjs +167 -757
  92. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  93. package/package.json +1 -1
  94. package/src/components/flow-header/flow-header.component.d.ts +1 -1
  95. package/src/components/guided-selling/guided-selling.component.d.ts +1 -1
  96. package/src/flow-routing.module.d.ts +1 -2
  97. package/src/flow.component.d.ts +2 -2
  98. package/src/guards/product-unload.guard.d.ts +5 -6
  99. package/src/index.d.ts +0 -2
  100. package/src/pages/assets/assets.component.d.ts +1 -1
  101. package/src/pages/catalog/catalog.component.d.ts +1 -1
  102. package/src/pages/debug/debug.component.d.ts +1 -4
  103. package/src/pages/product/product.component.d.ts +5 -14
  104. package/src/pages/product/product.module.d.ts +1 -1
  105. package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
  106. package/src/pages/shopping-cart/shopping-cart.component.d.ts +1 -1
  107. package/src/resolvers/flow.resolver.d.ts +5 -6
  108. package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
  109. package/src/resolvers/ui-definition.resolver.d.ts +3 -0
  110. package/src/services/flow-dialog.service.d.ts +5 -4
  111. package/src/services/flow-router.service.d.ts +4 -6
  112. package/src/services/flow.service.d.ts +2 -7
  113. package/src/types/index.d.ts +1 -2
  114. package/src/types/route.types.d.ts +0 -5
  115. package/cms/plugins/configuration.plugin.d.ts +0 -23
  116. package/cms/types/configuration.types.d.ts +0 -21
  117. package/core/modules/configuration/helpers.d.ts +0 -6
  118. package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
  119. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -6
  120. package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
  121. package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
  122. package/core/services/context.service.d.ts +0 -23
  123. package/core/services/quote-draft.service.d.ts +0 -50
  124. package/core/types/runtime.types.d.ts +0 -30
  125. package/core/utils/line-item.utils.d.ts +0 -25
  126. package/core/utils/line-item.worker.d.ts +0 -9
  127. package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
  128. package/esm2020/cms/types/configuration.types.mjs +0 -2
  129. package/esm2020/core/modules/configuration/helpers.mjs +0 -73
  130. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -43
  131. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +0 -2
  132. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
  133. package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
  134. package/esm2020/core/services/context.service.mjs +0 -91
  135. package/esm2020/core/services/quote-draft.service.mjs +0 -192
  136. package/esm2020/core/types/runtime.types.mjs +0 -16
  137. package/esm2020/core/utils/line-item.utils.mjs +0 -187
  138. package/esm2020/core/utils/line-item.worker.mjs +0 -19
  139. package/esm2020/src/guards/context.guard.mjs +0 -91
  140. package/esm2020/src/guards/index.mjs +0 -2
  141. package/esm2020/src/pages/remote/remote.component.mjs +0 -342
  142. package/esm2020/src/pages/remote/remote.module.mjs +0 -20
  143. package/esm2020/src/pages/remote/remote.types.mjs +0 -2
  144. package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
  145. package/esm2020/src/types/context-route.types.mjs +0 -2
  146. package/esm2020/src/types/metrics.types.mjs +0 -2
  147. package/esm2020/src/utils/flow.utils.mjs +0 -25
  148. package/esm2020/src/utils/index.mjs +0 -2
  149. package/src/guards/context.guard.d.ts +0 -19
  150. package/src/guards/index.d.ts +0 -1
  151. package/src/pages/remote/remote.component.d.ts +0 -46
  152. package/src/pages/remote/remote.module.d.ts +0 -10
  153. package/src/pages/remote/remote.types.d.ts +0 -4
  154. package/src/resolvers/quote.resolver.d.ts +0 -19
  155. package/src/types/context-route.types.d.ts +0 -5
  156. package/src/types/metrics.types.d.ts +0 -5
  157. package/src/utils/flow.utils.d.ts +0 -8
  158. package/src/utils/index.d.ts +0 -1
@@ -1,219 +1,304 @@
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';
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';
6
4
  import * as i1 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 { flatten, omit, uniqBy, cloneDeep, assign, isEqual } from 'lodash';
9
+ import { BehaviorSubject, map, tap, switchMap, of, forkJoin, filter, Subject, noop, catchError, throwError, combineLatest, finalize, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil } from 'rxjs';
10
+ import { filter as filter$1, map as map$1, catchError as catchError$1, tap as tap$1, finalize as finalize$1 } from 'rxjs/operators';
11
+ import * as i4 from '@veloceapps/api/v2';
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() {
18
+ this.uiDefinitionContainer = null;
19
+ }
20
+ get uiDefinitionProps() {
21
+ var _a, _b;
22
+ return (_b = (_a = this.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
23
+ }
24
+ reset() {
25
+ this.uiDefinitionContainer = null;
26
+ }
27
+ }
28
+ ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
29
+ ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
30
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
31
+ type: Injectable
32
+ }] });
33
+
34
+ const findTransactionItem = (id, items) => {
35
+ return findTransactionItemWithComparator(items, (ti) => ti.id === id);
26
36
  };
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
- };
37
+ const findTransactionItemWithComparator = (items, comparator) => {
38
+ let currentLevel = items;
39
+ while (currentLevel.length) {
40
+ const found = currentLevel.find(comparator);
41
+ if (found) {
42
+ return found;
43
+ }
44
+ currentLevel = flatten(currentLevel.map(parent => parent.children));
45
+ }
46
+ return;
47
+ };
48
+ const insertTransactionItem = (item, parentId, toInsert) => {
49
+ const insertData = item.id === parentId ? [toInsert] : [];
50
+ return Object.assign(Object.assign({}, item), { children: [
51
+ ...insertData,
52
+ ...item.children.map(ti => {
53
+ return insertTransactionItem(ti, parentId, toInsert);
54
+ }),
55
+ ] });
56
+ };
57
+ const removeTransactionItem = (item, idToRemove) => {
58
+ return Object.assign(Object.assign({}, item), { children: item.children
59
+ .map(ti => {
60
+ if (ti.id === idToRemove) {
61
+ return;
62
+ }
63
+ else if (ti.children.length) {
64
+ return removeTransactionItem(ti, idToRemove);
65
+ }
66
+ return ti;
67
+ })
68
+ .filter(isDefined) });
50
69
  };
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 = [];
70
+ const replaceTransactionItem = (item, replaceTo) => {
71
+ if (item.id === replaceTo.id) {
72
+ return Object.assign({}, replaceTo);
73
+ }
74
+ return Object.assign(Object.assign({}, item), { children: item.children.map(ti => replaceTransactionItem(ti, replaceTo)) });
75
+ };
76
+ const generateTransactionItem = (productId) => {
60
77
  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 : '',
78
+ id: UUID.UUID(),
79
+ productId,
70
80
  };
71
81
  };
72
82
 
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);
83
+ class TransactionItemWorker {
84
+ constructor(src) {
85
+ this.ti = Object.assign({}, src);
99
86
  }
100
- get isInitialized() {
101
- return Boolean(this.context.value);
87
+ insert(parentId, toInsert) {
88
+ return new TransactionItemWorker(insertTransactionItem(this.ti, parentId, toInsert));
102
89
  }
103
- get isInitialized$() {
104
- return this.context.pipe(map(Boolean));
90
+ remove(id) {
91
+ return new TransactionItemWorker(removeTransactionItem(this.ti, id));
92
+ }
93
+ replace(toReplace) {
94
+ return new TransactionItemWorker(replaceTransactionItem(this.ti, toReplace));
105
95
  }
106
- get mode() {
107
- return this.resolve().properties['#mode'];
96
+ }
97
+
98
+ function extractMetadata(uiDefinition) {
99
+ return omit(uiDefinition, [
100
+ 'children',
101
+ 'pages',
102
+ 'components',
103
+ ]);
104
+ }
105
+
106
+ const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
107
+
108
+ class RuntimeSettingsService {
109
+ constructor(configurationSettingsApiService) {
110
+ this.configurationSettingsApiService = configurationSettingsApiService;
111
+ this.configurationSettings$ = new BehaviorSubject({});
112
+ this.currencySettings$ = new BehaviorSubject({
113
+ iso: DEFAULT_CURRENCY_ISO_CODE,
114
+ symbol: DEFAULT_CURRENCY_SYMBOL,
115
+ });
116
+ this.shoppingCartSettings$ = new BehaviorSubject([]);
117
+ this.getCurrencySymbol = (locale, currency) => {
118
+ return (0)
119
+ .toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
120
+ .replace(/\d/g, '')
121
+ .trim();
122
+ };
108
123
  }
109
- get isEditMode$() {
110
- return this.resolve$().pipe(map(() => this.isEditMode));
124
+ create() {
125
+ return this.configurationSettingsApiService.fetchSettings().pipe(map(settings => this.parseConfigurationSettings(settings)), tap(configurationSettings => {
126
+ var _a;
127
+ this.configurationSettings$.next(configurationSettings);
128
+ this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
129
+ this.formattingSettings = this.getFormattingSettings();
130
+ }), map(() => undefined));
111
131
  }
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';
132
+ initCurrency(iso) {
133
+ if (iso) {
134
+ const symbol = this.getCurrencySymbol('en-US', iso);
135
+ this.currencySettings$.next({ iso, symbol });
136
+ if (this.formattingSettings) {
137
+ this.formattingSettings.currencySymbol = symbol;
138
+ }
119
139
  }
120
- return false;
121
140
  }
122
- resolve() {
123
- if (!this.context.value) {
124
- throw new Error('Context is not initialized yet!');
141
+ getFormattingSettings() {
142
+ var _a, _b;
143
+ if (this.formattingSettings) {
144
+ return this.formattingSettings;
125
145
  }
126
- return Object.assign({}, this.context.value);
127
- }
128
- resolve$() {
129
- return this.context.pipe(filter((ctx) => Boolean(ctx)));
146
+ const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
147
+ return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
148
+ }, {});
149
+ const currencySettings = this.getCurrencySettings();
150
+ 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)) ||
151
+ DEFAULT_DATE_FORMAT;
152
+ const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
153
+ const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
154
+ // the number of decimal places can be 0
155
+ const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
156
+ const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
157
+ ? Number(priceScale)
158
+ : DEFAULT_DECIMALS_COUNT;
159
+ const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
160
+ return {
161
+ currencySymbol: currencySettings.symbol,
162
+ dateFormats: getSupportedDateFormats(dateFormat),
163
+ decimalsCount,
164
+ decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
165
+ ? decimalSeparator
166
+ : DEFAULT_DECIMAL_SEPARATOR,
167
+ // thousands separator can be a blank value, so it can also be null
168
+ thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
169
+ ? thousandsSeparator || ''
170
+ : DEFAULT_THOUSANDS_SEPARATOR,
171
+ actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
172
+ ? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
173
+ : DEFAULT_ACTION_CODE_LABELS,
174
+ };
130
175
  }
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()));
176
+ getConfigurationSettings() {
177
+ return this.configurationSettings$.value;
133
178
  }
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
- }));
179
+ getShoppingCartSettings() {
180
+ return this.shoppingCartSettings$.value;
140
181
  }
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;
182
+ getCurrencySettings() {
183
+ return this.currencySettings$.value;
146
184
  }
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;
185
+ parseConfigurationSettings(settings) {
186
+ return settings.reduce((acc, setting) => {
187
+ switch (setting.key) {
188
+ case 'shopping-cart':
189
+ acc['shopping-cart'] = parseJsonSafely(setting.value, []);
190
+ break;
191
+ case 'navigation':
192
+ acc.navigation = parseJsonSafely(setting.value, {});
193
+ break;
194
+ case 'flows':
195
+ acc.flows = parseJsonSafely(setting.value, []);
196
+ break;
197
+ default:
198
+ acc[setting.key] = setting.value;
199
+ }
200
+ return acc;
201
+ }, {});
152
202
  }
153
- delete() {
154
- this.context.next(null);
203
+ addShoppingCartSettings(settings) {
204
+ // uniqBy removes items with the biggest index
205
+ const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
206
+ this.shoppingCartSettings$.next(newSettings);
155
207
  }
156
208
  }
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: [{
209
+ RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
210
+ RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
160
212
  type: Injectable
161
- }], ctorParameters: function () { return [{ type: i1.ContextApiService }]; } });
213
+ }], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
162
214
 
163
215
  class FlowInfoService {
164
216
  get flow() {
217
+ if (!this.flowSubj$.value) {
218
+ throw new Error(`Flow not initialized yet`);
219
+ }
165
220
  return this.flowSubj$.value;
166
221
  }
167
- set flow(value) {
168
- this.flowSubj$.next(value);
222
+ get isFlowInitialized() {
223
+ return Boolean(this.flowSubj$.value);
169
224
  }
170
- get isLegacy() {
171
- var _a;
172
- return !!this.flow && ((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) == null;
225
+ get context() {
226
+ if (!this.contextSubj$.value) {
227
+ throw new Error('Context is not initialized yet!');
228
+ }
229
+ return Object.assign({}, this.contextSubj$.value);
230
+ }
231
+ get templates() {
232
+ return this.templatesSubj$.value;
233
+ }
234
+ get isFlowEngineInitialized$() {
235
+ return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
173
236
  }
174
237
  get isStateful() {
175
238
  var _a;
176
239
  return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
177
240
  }
178
- constructor(flowsApiService, templatesApiService, customizationService) {
179
- this.flowsApiService = flowsApiService;
241
+ constructor(runtimeSettingsService, templatesApiService, customizationService) {
242
+ this.runtimeSettingsService = runtimeSettingsService;
180
243
  this.templatesApiService = templatesApiService;
181
244
  this.customizationService = customizationService;
182
- this.templates = {};
183
245
  this.defaultTemplates = {
184
246
  flowEngine: 'Flow Engine',
185
247
  };
186
248
  this.flowSubj$ = new BehaviorSubject(null);
249
+ this.templatesSubj$ = new BehaviorSubject({});
250
+ this.contextSubj$ = new BehaviorSubject(null);
187
251
  this.flow$ = this.flowSubj$.asObservable();
252
+ this.templates$ = this.templatesSubj$.asObservable();
253
+ }
254
+ reset() {
255
+ this.flowSubj$.next(null);
256
+ this.templatesSubj$.next({});
257
+ this.contextSubj$.next(null);
188
258
  }
189
259
  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
- }));
260
+ return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
197
261
  }
198
- cleanup() {
199
- this.flowSubj$.next(null);
200
- this.params = undefined;
201
- this.templates = {};
262
+ updateContext(update) {
263
+ this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
264
+ }
265
+ initFlow$(flowId, routeQueryParams) {
266
+ var _a;
267
+ const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
268
+ if (!flow) {
269
+ this.flowSubj$.next(null);
270
+ throw new Error(`Flow with flowId=${flowId} is not defined`);
271
+ }
272
+ const headerId = routeQueryParams['headerId'];
273
+ if (typeof headerId !== 'string') {
274
+ throw new Error(`Please provide 'headerId'`);
275
+ }
276
+ const mode = this.getFlowContextMode(headerId);
277
+ // Restrict if mode is not defined
278
+ if (mode == null) {
279
+ throw new Error('Mode is undefined');
280
+ }
281
+ this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
282
+ this.flowSubj$.next(flow);
283
+ return of(undefined);
202
284
  }
203
- initFlowTemplates$(flow) {
285
+ initFlowTemplates$() {
204
286
  var _a, _b, _c;
205
287
  return forkJoin([
206
288
  this.templatesApiService.fetchTemplates$(),
207
289
  (_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]) => {
290
+ ]).pipe(map(([templates, localTemplates]) => {
291
+ var _a, _b;
292
+ const newValue = {};
293
+ 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
294
  var _a;
211
295
  const type = this.remapTemplateName(key);
212
296
  if (type) {
213
- this.templates[type] =
297
+ newValue[type] =
214
298
  (_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
299
  }
216
300
  });
301
+ this.templatesSubj$.next(newValue);
217
302
  }));
218
303
  }
219
304
  remapTemplateName(templateType) {
@@ -239,13 +324,20 @@ class FlowInfoService {
239
324
  }
240
325
  return undefined;
241
326
  }
327
+ getFlowContextMode(headerId) {
328
+ const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
329
+ if (!objectName) {
330
+ return;
331
+ }
332
+ return objectName.toUpperCase();
333
+ }
242
334
  }
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 });
335
+ FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token: i4.UITemplatesApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
244
336
  FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
245
337
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
246
338
  type: Injectable
247
339
  }], ctorParameters: function () {
248
- return [{ type: i1.FlowsApiService }, { type: i1.UITemplatesApiService }, { type: undefined, decorators: [{
340
+ return [{ type: RuntimeSettingsService }, { type: i4.UITemplatesApiService }, { type: undefined, decorators: [{
249
341
  type: Optional
250
342
  }, {
251
343
  type: Inject,
@@ -253,186 +345,141 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
253
345
  }] }];
254
346
  } });
255
347
 
256
- class QuoteDraftService {
348
+ class SalesTransactionService {
257
349
  get isInitialized$() {
258
350
  return this.isInitializedSubj$.asObservable();
259
351
  }
260
352
  get isInitialized() {
261
353
  return this.isInitializedSubj$.getValue();
262
354
  }
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
355
  set hasUnsavedChanges(value) {
272
356
  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 : [];
357
+ this.hasUnsavedChangesSubj$.next(value);
358
+ if (!this.hasUnsavedChanges) {
359
+ this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
276
360
  }
277
361
  }
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);
362
+ get hasUnsavedChanges() {
363
+ return this.hasUnsavedChangesSubj$.getValue();
284
364
  }
285
- get hasAssets$() {
286
- return this.assetsSubj$.pipe(map(() => this.hasAssets));
365
+ get state() {
366
+ return this.stateSubj$.getValue();
287
367
  }
288
368
  get hasAssets() {
289
369
  var _a;
290
- return Boolean((_a = this.assetsSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
370
+ return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.assets.length);
291
371
  }
292
- get assetsState() {
293
- return this.assetsSubj$.value;
372
+ get hasProducts() {
373
+ var _a;
374
+ return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransactionItems.length);
294
375
  }
295
- constructor(context, flowInfoService, accountApiService, quoteApiService) {
296
- this.context = context;
376
+ constructor(flowInfoService, salesTransactionApiService) {
297
377
  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);
378
+ this.salesTransactionApiService = salesTransactionApiService;
379
+ this.stateSubj$ = new BehaviorSubject(null);
303
380
  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;
381
+ this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
382
+ this.initialState = [];
383
+ this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
384
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
317
385
  }
318
386
  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));
387
+ return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res.salesTransaction)), map(res => res.salesTransaction));
336
388
  }
337
389
  finalizeInit() {
338
- this.isInitialized = true;
390
+ this.isInitializedSubj$.next(true);
339
391
  this.hasUnsavedChanges = false;
340
392
  }
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());
393
+ reset() {
394
+ this.stateSubj$.next(null);
395
+ this.isInitializedSubj$.next(false);
396
+ this.hasUnsavedChangesSubj$.next(false);
374
397
  }
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() });
398
+ getInitialState() {
399
+ return this.initialState;
381
400
  }
382
- get currentState$() {
383
- return this.quoteDraft$.pipe(map(quote => quote.currentState));
401
+ setState(state) {
402
+ this.stateSubj$.next(state);
384
403
  }
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 : [];
404
+ }
405
+ SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: FlowInfoService }, { token: i4.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
406
+ SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
408
+ type: Injectable
409
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i4.SalesTransactionApiService }]; } });
410
+
411
+ class FlowConfigurationService {
412
+ constructor(proceduresApiService, salesTransactionService) {
413
+ this.proceduresApiService = proceduresApiService;
414
+ this.salesTransactionService = salesTransactionService;
415
+ this.updatedSubj$ = new Subject();
416
+ this.updated$ = this.updatedSubj$.asObservable();
388
417
  }
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;
418
+ calculate$(state) {
419
+ return this.proceduresApiService.apply$({ salesTransaction: state }).pipe(tap(result => this.salesTransactionService.setState(result.salesTransaction)), map(noop));
392
420
  }
393
- get isStandalone$() {
394
- return this.flowInfoService.flow$.pipe(map(() => this.isStandalone));
421
+ calculate(state) {
422
+ this.calculate$(state).subscribe();
395
423
  }
396
- getInitialCurrentState() {
397
- return this.initialCurrentState;
424
+ revert$(transactionItemId) {
425
+ var _a;
426
+ const state = this.salesTransactionService.state;
427
+ const initialState = this.salesTransactionService.getInitialState();
428
+ const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
429
+ const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
430
+ const currentItem = currentState[currentItemIndex];
431
+ const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
432
+ if (!state || !currentItem || !initialItem) {
433
+ return of(null);
434
+ }
435
+ const updatedState = cloneDeep(currentState);
436
+ updatedState.splice(currentItemIndex, 1, initialItem);
437
+ return of([]).pipe(tap(() => {
438
+ this.salesTransactionService.setState(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }));
439
+ }), switchMap(() => this.calculate$(Object.assign(Object.assign({}, state), { salesTransactionItems: updatedState }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
398
440
  }
399
- isEditMode$() {
400
- return this.context.resolve$().pipe(map(() => this.isEditMode()));
441
+ revert(transactionItemId) {
442
+ this.revert$(transactionItemId).subscribe();
401
443
  }
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';
444
+ delete$(ids) {
445
+ const state = this.salesTransactionService.state;
446
+ if (!state) {
447
+ return of(null);
409
448
  }
410
- return false;
449
+ 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
450
  }
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
- }
451
+ delete(ids) {
452
+ this.delete$(ids).subscribe();
453
+ }
454
+ handleErrorAndBounceBack() {
455
+ return (source$) => {
456
+ return source$.pipe(catchError(error => {
457
+ console.error(error);
458
+ // bounce back if configuration call has failed
459
+ const state = this.salesTransactionService.state;
460
+ if (state) {
461
+ this.salesTransactionService.setState(state);
462
+ this.updatedSubj$.next();
463
+ }
464
+ return throwError(() => error);
465
+ }));
466
+ };
419
467
  }
420
468
  }
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: [{
469
+ FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i4.ProceduresApiService }, { token: SalesTransactionService }], target: i0.ɵɵFactoryTarget.Injectable });
470
+ FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
424
472
  type: Injectable
425
- }], ctorParameters: function () { return [{ type: ContextService }, { type: FlowInfoService }, { type: i1.AccountApiService }, { type: i1.QuoteApiService }]; } });
473
+ }], ctorParameters: function () { return [{ type: i4.ProceduresApiService }, { type: SalesTransactionService }]; } });
426
474
 
427
475
  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;
476
+ constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
432
477
  this.flowConfiguration = flowConfiguration;
433
- this.processorsApiService = processorsApiService;
478
+ this.flowInfoService = flowInfoService;
434
479
  this.flowStateApiService = flowStateApiService;
435
- this.quoteApiService = quoteApiService;
480
+ this.processorsApiService = processorsApiService;
481
+ this.salesTransactionApiService = salesTransactionApiService;
482
+ this.salesTransactionService = salesTransactionService;
436
483
  this.toastService = toastService;
437
484
  this.customizationService = customizationService;
438
485
  this.NOT_INITIALIZED = Symbol();
@@ -449,68 +496,22 @@ class FlowStateService {
449
496
  this.cleanup$ = new Subject();
450
497
  this.statefulExecutionRequest$ = this.initBufferedRequest$();
451
498
  /*
452
- In stateless mode watch QuoteDraft changes and call executeRequest so that
453
- all subscriptions get their updates according to updated QuoteDraft
499
+ In stateless mode watch State changes and call executeRequest so that
500
+ all subscriptions get their updates according to updated State
454
501
  */
455
502
  this.isInitialized$()
456
- .pipe(filter$1(Boolean), filter$1(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
503
+ .pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
457
504
  .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
505
  }
503
506
  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
- }));
507
+ if (this.flowInfoService.flow.properties.stateful) {
508
+ return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
509
+ }
510
+ else {
511
+ return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
512
+ }
512
513
  }
513
- cleanup() {
514
+ reset() {
514
515
  Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
515
516
  this.subscriptions = {};
516
517
  if (this.stateId$.value) {
@@ -522,9 +523,9 @@ class FlowStateService {
522
523
  this.cleanup$.next();
523
524
  }
524
525
  get hasUnsavedChanges() {
525
- return this.getFlowSafe().properties.stateful
526
+ return this.flowInfoService.flow.properties.stateful
526
527
  ? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
527
- : this.quoteDraftService.hasUnsavedChanges;
528
+ : this.salesTransactionService.hasUnsavedChanges;
528
529
  }
529
530
  get stateId() {
530
531
  return this.stateId$.value;
@@ -533,14 +534,14 @@ class FlowStateService {
533
534
  return this.executionInProgress$.asObservable();
534
535
  }
535
536
  isInitialized$() {
536
- return combineLatest([this.stateId$, this.quoteDraftService.isInitialized$]).pipe(map$1(values => values.some(Boolean)));
537
+ return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
537
538
  }
538
539
  isInitialized() {
539
- return Boolean(this.stateId$.value) || this.quoteDraftService.isInitialized;
540
+ return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
540
541
  }
541
542
  execute$(scope, exec) {
542
543
  const request = this.execToRequest(scope, exec);
543
- return this.executeRequest$(request).pipe(map$1(result => {
544
+ return this.executeRequest$(request).pipe(map(result => {
544
545
  // Keep only requested results
545
546
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
546
547
  var _a;
@@ -557,7 +558,7 @@ class FlowStateService {
557
558
  actions: [{ name: action, inputData }],
558
559
  };
559
560
  const request = this.execToRequest(scope, exec);
560
- return this.executeRequest$(request).pipe(map$1(noop));
561
+ return this.executeRequest$(request).pipe(map(noop));
561
562
  }
562
563
  select$(scope, selectorName, inputData) {
563
564
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -569,7 +570,7 @@ class FlowStateService {
569
570
  },
570
571
  },
571
572
  });
572
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
573
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
573
574
  }
574
575
  subscribe$(scope, selectorName, inputData, options) {
575
576
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -595,7 +596,7 @@ class FlowStateService {
595
596
  this.executeRequest$(request).subscribe();
596
597
  }
597
598
  }
598
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), finalize(() => {
599
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
599
600
  var _a;
600
601
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
601
602
  delete this.subscriptions[requestId];
@@ -603,9 +604,9 @@ class FlowStateService {
603
604
  }));
604
605
  }
605
606
  save$() {
606
- if (this.getFlowSafe().properties.stateful) {
607
+ if (this.flowInfoService.flow.properties.stateful) {
607
608
  if (this.stateId$.value) {
608
- return this.flowStateApiService.save(this.stateId$.value).pipe(tap$1(() => {
609
+ return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
609
610
  Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
610
611
  this.trackedStatefulChangesMap.set(key, false);
611
612
  });
@@ -613,30 +614,26 @@ class FlowStateService {
613
614
  }
614
615
  }
615
616
  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
- }));
617
+ const state = this.salesTransactionService.state;
618
+ if (state) {
619
+ return this.salesTransactionApiService.upsert(state);
621
620
  }
622
621
  }
623
- return of({ quoteId: '' });
622
+ return of({ id: '' });
624
623
  }
625
624
  submit$() {
626
- if (this.getFlowSafe().properties.stateful) {
625
+ if (this.flowInfoService.flow.properties.stateful) {
627
626
  if (this.stateId$.value) {
628
- return this.flowStateApiService.submit(this.stateId$.value);
627
+ return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
629
628
  }
630
629
  }
631
630
  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
- }));
631
+ const state = this.salesTransactionService.state;
632
+ if (state) {
633
+ return this.salesTransactionApiService.submit(state);
637
634
  }
638
635
  }
639
- return of({ quoteId: '' });
636
+ return of({ id: '' });
640
637
  }
641
638
  getFlowStore() {
642
639
  return this.flowStore;
@@ -677,10 +674,10 @@ class FlowStateService {
677
674
  fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
678
675
  }
679
676
  }
680
- const execution$ = this.getFlowSafe().properties.stateful
677
+ const execution$ = this.flowInfoService.flow.properties.stateful
681
678
  ? this.executeStateful$(fullRequest)
682
679
  : this.executeStateless$(fullRequest);
683
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
680
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
684
681
  }
685
682
  handleSelectorsResponse(selectors) {
686
683
  Object.entries(selectors).forEach(([requestId, selectorResult]) => {
@@ -696,32 +693,21 @@ class FlowStateService {
696
693
  });
697
694
  }
698
695
  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
696
  const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
709
697
  const processors = processorsList.length ? processorsList : undefined;
710
698
  const selectors = Object.values(this.subscriptions)
711
699
  .map(({ request }) => request.selectors)
712
700
  .filter(isDefined)
713
701
  .reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
714
- const request = this.getDefaultExecutionRequestDTO();
715
702
  return this.flowStateApiService
716
703
  .init({
717
- quoteId: this.contextService.resolve().headerId,
718
- params: (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {},
704
+ quoteId: this.flowInfoService.context.headerId,
705
+ params: this.flowInfoService.context,
719
706
  actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
720
707
  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,
708
+ selectors: selectors,
723
709
  })
724
- .pipe(map$1(({ stateId, selectors }) => {
710
+ .pipe(map(({ stateId, selectors }) => {
725
711
  this.handleSelectorsResponse(selectors);
726
712
  this.stateId$.next(stateId);
727
713
  }));
@@ -741,80 +727,56 @@ class FlowStateService {
741
727
  };
742
728
  this.executionInProgress$.next(true);
743
729
  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 => {
730
+ }), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
745
731
  this.executionInProgress$.next(false);
746
732
  return throwError(() => e);
747
733
  }));
748
734
  }
749
735
  executeStateful$(request) {
750
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
736
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
751
737
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
752
738
  combineLatest([
753
739
  this.statefulExecutionRequest$,
754
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
755
- ])), map$1(([response]) => response), take$1(1));
740
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
741
+ ])), map(([response]) => response), take(1));
756
742
  }
757
743
  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;
744
+ return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(tap(() => {
745
+ var _a;
746
+ const assets = (_a = this.salesTransactionService.state) === null || _a === void 0 ? void 0 : _a.assets;
762
747
  if (assets) {
763
748
  this.flowStore = Object.assign(Object.assign({}, this.flowStore), { assets });
764
749
  }
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);
750
+ }), switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
791
751
  }
792
752
  executeStateless$(request) {
793
753
  this.executionInProgress$.next(true);
794
- return of(undefined).pipe(tap$1(() => this.executeStatelessActions(request)), switchMap(() => {
754
+ return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
795
755
  var _a;
796
756
  /*
797
757
  Skip price calculation in case
798
758
  1. No actions in the request
799
759
  2. Initialization process execution (state not initialized yet)
800
760
  */
801
- if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
761
+ const { state } = this.salesTransactionService;
762
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
802
763
  return of(undefined);
803
764
  }
804
765
  else {
805
- return this.calculate$();
766
+ return this.flowConfiguration.calculate$(state);
806
767
  }
807
- }), map$1(() => this.executeStatelessSelectors(request)), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
768
+ }), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
808
769
  this.executionInProgress$.next(false);
809
770
  return throwError(() => e);
810
771
  }));
811
772
  }
812
773
  executeStatelessActions(request) {
813
774
  var _a;
814
- if (!this.quoteDraftService.quoteDraft || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
775
+ const state = this.salesTransactionService.state;
776
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
815
777
  return;
816
778
  }
817
- let flowState = this.quoteDraftService.quoteDraft;
779
+ let flowState = state;
818
780
  request.actions.forEach(action => {
819
781
  var _a;
820
782
  try {
@@ -826,1022 +788,126 @@ class FlowStateService {
826
788
  throw e;
827
789
  }
828
790
  });
829
- this.quoteDraftService.updateQuoteDraft(flowState);
791
+ this.salesTransactionService.setState(flowState);
830
792
  }
831
793
  executeStatelessSelectors(request) {
832
794
  var _a;
833
- if (!this.quoteDraftService.quoteDraft) {
834
- throw 'QuoteDraft is not initialized';
835
- }
836
- const flowState = this.quoteDraftService.quoteDraft;
837
- return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
838
- try {
839
- 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;
795
+ if (!this.salesTransactionService.state) {
796
+ throw 'State is not initialized';
1630
797
  }
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();
798
+ const flowState = this.salesTransactionService.state;
799
+ return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
800
+ try {
801
+ result.selectors[key] = {
802
+ success: true,
803
+ result: this.executeSelectorScript(flowState, selector),
804
+ };
805
+ }
806
+ catch (e) {
807
+ console.error(e);
808
+ result.selectors[key] = {
809
+ success: false,
810
+ errorMessage: String(e),
811
+ };
812
+ }
813
+ return result;
814
+ }, { stateId: '', selectors: {} });
1692
815
  }
1693
- update$(updates) {
1694
- const quoteDraft = this.quoteDraftService.quoteDraft;
1695
- if (!quoteDraft) {
1696
- return of(null);
816
+ initProcessors$() {
817
+ var _a;
818
+ const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
819
+ if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
820
+ // Skip initialization as backend will take processors from SF
821
+ return of(undefined);
1697
822
  }
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);
823
+ const owners$ = Object.values(this.flowInfoService.templates)
824
+ .map(template => {
825
+ var _a, _b, _c;
826
+ if (!template) {
827
+ return;
828
+ }
829
+ 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);
830
+ return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
831
+ const processorsMap = processors.reduce((acc, p) => {
832
+ acc[p.apiName] = p;
833
+ return acc;
834
+ }, {});
835
+ this.processors[template.id] = processorsMap;
836
+ }));
837
+ })
838
+ .filter(isDefined);
839
+ if (!owners$.length) {
840
+ return of(undefined);
1716
841
  }
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());
1722
- }
1723
- revert(lineItemId) {
1724
- this.revert$(lineItemId).subscribe();
842
+ return forkJoin(owners$).pipe(map(noop));
1725
843
  }
1726
- delete$(ids) {
1727
- const quoteDraft = this.quoteDraftService.quoteDraft;
1728
- const currentState = this.quoteDraftService.currentState;
1729
- if (!quoteDraft) {
1730
- return of(null);
844
+ executeActionScript(request, executable) {
845
+ var _a;
846
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
847
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
848
+ const scope = this.getScopeByOwnerId(executable.ownerId);
849
+ const scopeText = scope ? ` in ${scope}` : '';
850
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1731
851
  }
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();
852
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1736
853
  }
1737
- addTerm$(term) {
1738
- const quoteDraft = this.quoteDraftService.quoteDraft;
1739
- if (!quoteDraft) {
1740
- return of(null);
854
+ executeSelectorScript(request, executable) {
855
+ var _a;
856
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
857
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
858
+ const scope = this.getScopeByOwnerId(executable.ownerId);
859
+ const scopeText = scope ? ` in ${scope}` : '';
860
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1741
861
  }
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());
862
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1744
863
  }
1745
- addToCart$(props) {
1746
- const quoteDraft = this.quoteDraftService.quoteDraft;
1747
- if (!quoteDraft) {
1748
- return of(null);
864
+ executeProcessorScript(request, configurationProcessor, inputData) {
865
+ var _a;
866
+ const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
867
+ let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
868
+ if (!functionToExecute) {
869
+ const script = `${configurationProcessor.script}\nreturn transform;`;
870
+ const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
871
+ functionToExecute = new Function(script + sourceMap)();
872
+ this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
1749
873
  }
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$();
874
+ return functionToExecute({
875
+ request,
876
+ inputData,
877
+ flowStore: this.flowStore,
878
+ });
1791
879
  }
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
- };
880
+ generateRequestId(scope, selectorName, inputData) {
881
+ const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
882
+ return `${scope}/${selectorName}/${inputDataHash}`;
1805
883
  }
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;
884
+ checkStatefulChanges(requestId, selectorResult) {
885
+ if (this.trackedStatefulChangesMap.has(requestId)) {
886
+ if (!this.initialStatefulData[requestId]) {
887
+ this.initialStatefulData[requestId] = selectorResult;
888
+ }
889
+ const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
890
+ this.trackedStatefulChangesMap.set(requestId, hasChanges);
1812
891
  }
1813
- return this.proceduresApiService.apply$(request);
1814
892
  }
1815
893
  }
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: [{
894
+ FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: FlowConfigurationService }, { token: FlowInfoService }, { token: i1.FlowStateApiService }, { token: i4.ConfigurationProcessorsApiService }, { token: i4.SalesTransactionApiService }, { token: SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
895
+ FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
896
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
1819
897
  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
- }] });
898
+ }], ctorParameters: function () {
899
+ return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i1.FlowStateApiService }, { type: i4.ConfigurationProcessorsApiService }, { type: i4.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
900
+ type: Optional
901
+ }, {
902
+ type: Inject,
903
+ args: [FLOW_CUSTOMIZATION]
904
+ }] }];
905
+ } });
1834
906
 
1835
907
  class FlowStateConfigurationService {
1836
- constructor(flowInfoService, flowConfigurationService, flowStateApiService, flowStateService) {
908
+ constructor(flowInfoService, flowStateService) {
1837
909
  this.flowInfoService = flowInfoService;
1838
- this.flowConfigurationService = flowConfigurationService;
1839
- this.flowStateApiService = flowStateApiService;
1840
910
  this.flowStateService = flowStateService;
1841
- this.configurationStateId$ = new BehaviorSubject(null);
1842
- }
1843
- get configurationStateId() {
1844
- return this.configurationStateId$.value;
1845
911
  }
1846
912
  addToCart$(props) {
1847
913
  var _a;
@@ -1853,26 +919,22 @@ class FlowStateConfigurationService {
1853
919
  request$ = of();
1854
920
  }
1855
921
  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
- }));
922
+ // TODO: Implement
923
+ request$ = of();
1863
924
  }
1864
925
  }
1865
926
  else {
1866
- request$ = this.flowConfigurationService.addToCart$(props).pipe(map$1(noop));
927
+ // TODO: Implement
928
+ request$ = of();
1867
929
  }
1868
- return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map$1(noop));
930
+ return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
1869
931
  }
1870
932
  }
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 });
933
+ 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
934
  FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
1873
935
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
1874
936
  type: Injectable
1875
- }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: FlowStateService }]; } });
937
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
1876
938
 
1877
939
  class IntegrationState {
1878
940
  constructor() {
@@ -1892,12 +954,12 @@ class IntegrationState {
1892
954
  this.action$.next(action);
1893
955
  }
1894
956
  listen$(actionType) {
1895
- return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
957
+ return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
1896
958
  }
1897
959
  listenAll$() {
1898
960
  return this.action$.asObservable();
1899
961
  }
1900
- clear() {
962
+ reset() {
1901
963
  this.stateSubj$.next({});
1902
964
  }
1903
965
  }
@@ -1917,12 +979,12 @@ class ProductImagesService {
1917
979
  this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
1918
980
  this.fetchProductImage(productId);
1919
981
  }
1920
- return this.imagesMap$.pipe(map$1(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
982
+ return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1921
983
  }
1922
984
  fetchProductImage(productId) {
1923
985
  this.productApiService
1924
986
  .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 }))))
987
+ .pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1926
988
  .subscribe();
1927
989
  }
1928
990
  }
@@ -1932,142 +994,132 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1932
994
  type: Injectable
1933
995
  }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
1934
996
 
1935
- class RuntimeContextService {
1936
- constructor(configurationApiService) {
1937
- this.configurationApiService = configurationApiService;
997
+ class ConfigurationService {
998
+ get state$() {
999
+ return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
1938
1000
  }
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
- }));
1001
+ get state() {
1002
+ return this.configurationStateSubj$.getValue();
1960
1003
  }
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];
1004
+ get previousState() {
1005
+ return this.previousConfigurationStateSubj$.getValue();
1965
1006
  }
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 = {};
1007
+ get asset() {
1008
+ var _a, _b;
1009
+ return (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.assets[0]) !== null && _b !== void 0 ? _b : null;
1980
1010
  }
1981
- reset() {
1982
- this._isInitialized = false;
1983
- this._runtimeContext = undefined;
1984
- this.initializationProps = undefined;
1985
- this.uiDefinitionProperties = {};
1011
+ get root$() {
1012
+ return this.state$.pipe(map$1(state => state.salesTransactionItems[0]), filter$1(isDefined));
1986
1013
  }
1987
- initTestMode(uiDefinitionContainer) {
1014
+ get root() {
1988
1015
  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)));
2007
- }
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)));
1016
+ return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
2025
1017
  }
2026
- overrideUIDefinition(uiDefinitionContainer) {
2027
- var _a;
2028
- if (!this._runtimeContext) {
2029
- return;
1018
+ constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, proceduresApiService) {
1019
+ this.flowInfoService = flowInfoService;
1020
+ this.messageService = messageService;
1021
+ this.configurationRuntimeService = configurationRuntimeService;
1022
+ this.salesTransactionService = salesTransactionService;
1023
+ this.proceduresApiService = proceduresApiService;
1024
+ this.hasUnsavedChanges = false;
1025
+ this.configurationStateSubj$ = new BehaviorSubject(null);
1026
+ this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
1027
+ this.isLoadingSubj$ = new BehaviorSubject(false);
1028
+ this.isLoading$ = this.isLoadingSubj$.asObservable();
1029
+ }
1030
+ reset() {
1031
+ this.hasUnsavedChanges = false;
1032
+ this.configurationStateSubj$.next(null);
1033
+ this.previousConfigurationStateSubj$.next(null);
1034
+ }
1035
+ init$() {
1036
+ const { state } = this.salesTransactionService;
1037
+ const { productId, transactionItemId } = this.flowInfoService.context;
1038
+ if (!state) {
1039
+ return of(undefined);
2030
1040
  }
2031
- this._runtimeContext.uiDefinitionContainer = uiDefinitionContainer;
2032
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1041
+ let transactionItem = state === null || state === void 0 ? void 0 : state.salesTransactionItems.find(item => item.id === transactionItemId);
1042
+ if (!transactionItem) {
1043
+ transactionItem = state.salesTransactionItems.find(item => item.productId === productId);
1044
+ }
1045
+ const assetItem = transactionItem ? state === null || state === void 0 ? void 0 : state.assets.find(item => item.id === (transactionItem === null || transactionItem === void 0 ? void 0 : transactionItem.assetId)) : undefined;
1046
+ const configurationState = Object.assign(Object.assign({}, state), { salesTransactionItems: transactionItem ? [transactionItem] : [], assets: assetItem ? [assetItem] : [] });
1047
+ this.configurationStateSubj$.next(configurationState);
1048
+ this.previousConfigurationStateSubj$.next(configurationState);
1049
+ return of(undefined);
2033
1050
  }
2034
- id15to18(propertyName, source) {
2035
- if (!source) {
2036
- return;
1051
+ patch$(transactionItem) {
1052
+ const { state, root } = this;
1053
+ if (!state) {
1054
+ return throwError(() => new Error(`Configuration State is not initialized`));
2037
1055
  }
2038
- const value = source[propertyName];
2039
- if (typeof value === 'string' && value.length === 15) {
2040
- source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
1056
+ if (!root) {
1057
+ return throwError(() => new Error(`Root SalesTransactionItem not found`));
2041
1058
  }
1059
+ const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
1060
+ const newSalesTransaction = Object.assign(Object.assign({}, state), { salesTransactionItems: [newRoot] });
1061
+ return this.configureRequest$(newSalesTransaction).pipe(catchError$1(error => {
1062
+ console.error(error);
1063
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
1064
+ this.messageService.add({ severity: 'error', summary: error });
1065
+ }
1066
+ return throwError(() => error);
1067
+ }), tap$1(() => {
1068
+ if (!this.hasUnsavedChanges) {
1069
+ this.hasUnsavedChanges = true;
1070
+ }
1071
+ }), map$1(noop));
2042
1072
  }
2043
- get isInitialized() {
2044
- return this._isInitialized;
1073
+ patch(transactionItem) {
1074
+ this.patch$(transactionItem).subscribe();
2045
1075
  }
2046
- get runtimeModel() {
2047
- var _a;
2048
- return (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.runtimeModel;
1076
+ configureRequest$(salesTransaction) {
1077
+ const request = {
1078
+ salesTransaction,
1079
+ };
1080
+ this.isLoadingSubj$.next(true);
1081
+ return this.proceduresApiService.apply$(request).pipe(tap$1(result => {
1082
+ const newState = result.salesTransaction;
1083
+ this.configurationStateSubj$.next(newState);
1084
+ this.previousConfigurationStateSubj$.next(cloneDeep(newState));
1085
+ }), map$1(response => response.salesTransaction), catchError$1(error => throwError(() => {
1086
+ const resetState = this.previousConfigurationStateSubj$.getValue();
1087
+ if (resetState) {
1088
+ this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
1089
+ this.configurationStateSubj$.next(resetState);
1090
+ }
1091
+ if (error.error) {
1092
+ return extractErrorDetails(error.error).join('. ');
1093
+ }
1094
+ return error.message || JSON.stringify(error);
1095
+ })), finalize$1(() => this.isLoadingSubj$.next(false)));
2049
1096
  }
2050
- get runtimeContext() {
2051
- return this._runtimeContext;
1097
+ configureExternal$(props) {
1098
+ // TODO: implement
1099
+ throw new Error('Not implemented');
1100
+ }
1101
+ configureGuidedSelling$(data) {
1102
+ // TODO: implement
1103
+ throw new Error('Not implemented');
2052
1104
  }
2053
1105
  }
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: [{
1106
+ 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: i4.ProceduresApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1107
+ ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
2057
1109
  type: Injectable
2058
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }, { type: ContextService }, { type: RuntimeContextService }]; } });
1110
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i4.ProceduresApiService }]; } });
2059
1111
 
2060
1112
  class ConfigurationStateService {
2061
- constructor(configurationRuntimeService, configurationService, quoteDraftService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, quoteApiService) {
1113
+ constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
2062
1114
  this.configurationRuntimeService = configurationRuntimeService;
2063
1115
  this.configurationService = configurationService;
2064
- this.quoteDraftService = quoteDraftService;
2065
- this.toastService = toastService;
2066
1116
  this.flowStateService = flowStateService;
2067
1117
  this.flowInfoService = flowInfoService;
2068
1118
  this.flowConfigurationService = flowConfigurationService;
2069
1119
  this.flowStateApiService = flowStateApiService;
2070
- this.quoteApiService = quoteApiService;
1120
+ this.salesTransactionService = salesTransactionService;
1121
+ this.salesTransactionApiService = salesTransactionApiService;
1122
+ this.toastService = toastService;
2071
1123
  this.isInitialized$ = new BehaviorSubject(false);
2072
1124
  this.canceledConfiguration$ = new Subject();
2073
1125
  this.NOT_INITIALIZED = Symbol();
@@ -2091,9 +1143,9 @@ class ConfigurationStateService {
2091
1143
  request$ = this.initStateful$();
2092
1144
  }
2093
1145
  else {
2094
- request$ = this.initStateless$();
1146
+ request$ = this.configurationService.init$();
2095
1147
  }
2096
- return request$.pipe(finalize(() => {
1148
+ return request$.pipe(take(1), tap(() => {
2097
1149
  this.isInitialized$.next(true);
2098
1150
  this.canceledConfiguration$ = new Subject();
2099
1151
  }));
@@ -2107,10 +1159,11 @@ class ConfigurationStateService {
2107
1159
  this.configurationStore = {};
2108
1160
  this.executedFunctions = {};
2109
1161
  this.configurationService.reset();
1162
+ this.configurationRuntimeService.reset();
2110
1163
  }
2111
1164
  execute$(exec) {
2112
1165
  const request = this.execToRequest(exec);
2113
- return this.executeRequest$(request).pipe(map$1(result => {
1166
+ return this.executeRequest$(request).pipe(map(result => {
2114
1167
  // Keep only requested results
2115
1168
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
2116
1169
  var _a;
@@ -2133,7 +1186,7 @@ class ConfigurationStateService {
2133
1186
  }
2134
1187
  // prevent parallel configuration requests in stateless mode
2135
1188
  if (!this.statelessExecutionRequest$) {
2136
- this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay$1(), take$1(1), finalize(() => (this.statelessExecutionRequest$ = null)));
1189
+ this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
2137
1190
  }
2138
1191
  return this.statelessExecutionRequest$;
2139
1192
  }
@@ -2147,7 +1200,7 @@ class ConfigurationStateService {
2147
1200
  },
2148
1201
  },
2149
1202
  });
2150
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
1203
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
2151
1204
  }
2152
1205
  subscribe$(selectorName, inputData = {}, options) {
2153
1206
  const requestId = UUID.UUID();
@@ -2170,58 +1223,41 @@ class ConfigurationStateService {
2170
1223
  this.executeRequest$(request).subscribe();
2171
1224
  }
2172
1225
  }
2173
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), distinctUntilChanged(), finalize(() => {
1226
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
2174
1227
  var _a;
2175
1228
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
2176
1229
  delete this.subscriptions[requestId];
2177
1230
  }
2178
1231
  }), takeUntil(this.canceledConfiguration$));
2179
1232
  }
2180
- saveConfiguration(flow) {
2181
- var _a, _b, _c, _d;
1233
+ saveConfiguration() {
1234
+ var _a, _b;
2182
1235
  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))));
1236
+ 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 })));
1237
+ }
1238
+ const state = this.salesTransactionService.state;
1239
+ if (!state) {
1240
+ return of({ id: '' });
1241
+ }
1242
+ const { standalone } = this.flowInfoService.flow.properties;
1243
+ if (standalone) {
1244
+ return this.salesTransactionApiService.upsert(state);
1245
+ }
1246
+ const salesTransaction = this.salesTransactionService.state;
1247
+ const configurationRoot = this.configurationService.root;
1248
+ if (!salesTransaction || !configurationRoot) {
1249
+ return of({ id: '' });
1250
+ }
1251
+ const isNewTransactionItem = salesTransaction.salesTransactionItems.every(li => li.id !== configurationRoot.id);
1252
+ let salesTransactionItems;
1253
+ if (isNewTransactionItem) {
1254
+ salesTransactionItems = [...salesTransaction.salesTransactionItems, configurationRoot];
2186
1255
  }
2187
1256
  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
- }
1257
+ salesTransactionItems = salesTransaction.salesTransactionItems.map(ti => ti.id === configurationRoot.id ? configurationRoot : ti);
2224
1258
  }
1259
+ const newState = Object.assign(Object.assign({}, salesTransaction), { salesTransactionItems });
1260
+ return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
2225
1261
  }
2226
1262
  cancelConfiguration() {
2227
1263
  var _a, _b;
@@ -2242,37 +1278,33 @@ class ConfigurationStateService {
2242
1278
  return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
2243
1279
  }
2244
1280
  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) {
1281
+ var _a, _b, _c, _d, _e, _f;
1282
+ this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
1283
+ const { productId, transactionItemId } = this.flowInfoService.context;
1284
+ if (!productId || !this.flowStateService.stateId) {
2249
1285
  return of(undefined);
2250
1286
  }
2251
- const container = (_f = this.configurationRuntimeService.runtimeContext) === null || _f === void 0 ? void 0 : _f.uiDefinitionContainer;
2252
- const lineItem = this.configurationService.generateLineItem();
1287
+ const container = this.configurationRuntimeService.uiDefinitionContainer;
2253
1288
  let request$;
2254
- if (!lineItemId) {
1289
+ if (!transactionItemId) {
2255
1290
  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 }))),
1291
+ transactionItem: generateTransactionItem(productId),
1292
+ 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 }))),
1293
+ 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
1294
  });
2260
1295
  }
2261
1296
  else {
2262
1297
  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 }))),
1298
+ transactionItemId,
1299
+ 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 }))),
1300
+ 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
1301
  });
2267
1302
  }
2268
- return request$.pipe(map$1(r => {
1303
+ return request$.pipe(map(r => {
2269
1304
  this.stateId = r.stateId;
2270
1305
  return undefined;
2271
1306
  }));
2272
1307
  }
2273
- initStateless$() {
2274
- return this.configurationService.configure().pipe(map$1(() => undefined));
2275
- }
2276
1308
  execToRequest(exec) {
2277
1309
  var _a;
2278
1310
  return {
@@ -2318,39 +1350,37 @@ class ConfigurationStateService {
2318
1350
  else {
2319
1351
  execution$ = this.executeStateless$(fullRequest);
2320
1352
  }
2321
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
1353
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
2322
1354
  }
2323
1355
  executeStateless$(request) {
2324
1356
  this.executionInProgress$.next(true);
2325
- return of(undefined).pipe(switchMap(() => {
1357
+ return this.configurationService.state$.pipe(switchMap(state => {
2326
1358
  var _a;
2327
1359
  // Apply actions and execute configuration/price call
2328
1360
  // No need to run configuration if no actions in the request
2329
1361
  if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
2330
1362
  return of(undefined);
2331
1363
  }
2332
- let configurationRequest = this.configurationService.generateRequest(false);
2333
1364
  request.actions.forEach(action => {
2334
1365
  var _a;
2335
- configurationRequest = (_a = this.executeActionScript(configurationRequest, action)) !== null && _a !== void 0 ? _a : configurationRequest;
1366
+ state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
2336
1367
  });
2337
- configurationRequest = ConfigurationTranslatorUtils.lightenConfigurationRequest(configurationRequest);
2338
- return this.configurationService.configureRequest$(configurationRequest);
2339
- }), map$1(() => {
1368
+ return this.configurationService.configureRequest$(state);
1369
+ }), map(() => {
2340
1370
  // Run selectors and apply them to the state
2341
- const configurationState = this.configurationService.stateSnapshot;
1371
+ const configurationState = this.configurationService.state;
2342
1372
  if (!configurationState) {
2343
1373
  return { stateId: '', selectors: {} };
2344
1374
  }
2345
1375
  return this.runStatelessSelectors(request, configurationState);
2346
- }), tap$1(() => this.executionInProgress$.next(false)), catchError(error => {
2347
- const configurationState = this.configurationService.previousStateSnapshot;
1376
+ }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
1377
+ const configurationState = this.configurationService.previousState;
2348
1378
  if (configurationState) {
2349
1379
  const selectorsResult = this.runStatelessSelectors(request, configurationState);
2350
1380
  this.handleSelectorsResponse(selectorsResult.selectors);
2351
1381
  }
2352
1382
  this.executionInProgress$.next(false);
2353
- if (!this.configurationRuntimeService.uiDefinitionProperties.suppressToastMessages) {
1383
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
2354
1384
  this.toastService.add({ severity: ToastType.error, summary: String(error) });
2355
1385
  }
2356
1386
  return throwError(() => error);
@@ -2371,22 +1401,22 @@ class ConfigurationStateService {
2371
1401
  };
2372
1402
  this.executionInProgress$.next(true);
2373
1403
  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 => {
1404
+ }), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
2375
1405
  this.executionInProgress$.next(false);
2376
1406
  return throwError(() => e);
2377
1407
  }));
2378
1408
  }
2379
1409
  executeStateful$(request) {
2380
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
1410
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
2381
1411
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
2382
1412
  combineLatest([
2383
1413
  this.statefulExecutionRequest$,
2384
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
2385
- ])), map$1(([response]) => response), take$1(1));
1414
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
1415
+ ])), map(([response]) => response), take(1));
2386
1416
  }
2387
1417
  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 : {};
1418
+ var _a;
1419
+ const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2390
1420
  const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
2391
1421
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2392
1422
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2394,8 +1424,8 @@ class ConfigurationStateService {
2394
1424
  return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
2395
1425
  }
2396
1426
  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 : {};
1427
+ var _a;
1428
+ const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2399
1429
  const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
2400
1430
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2401
1431
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2437,25 +1467,63 @@ class ConfigurationStateService {
2437
1467
  }, { stateId: '', selectors: {} });
2438
1468
  }
2439
1469
  }
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 });
1470
+ 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: i1.FlowStateApiService }, { token: SalesTransactionService }, { token: i4.SalesTransactionApiService }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
2441
1471
  ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
2442
1472
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
2443
1473
  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 }]; } });
1474
+ }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: SalesTransactionService }, { type: i4.SalesTransactionApiService }, { type: i6.ToastService }]; } });
2445
1475
 
2446
1476
  class ConfigurationModule {
2447
1477
  }
2448
1478
  ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2449
1479
  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] });
1480
+ ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService], imports: [ConfirmationDialogModule, ApiModule] });
2451
1481
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
2452
1482
  type: NgModule,
2453
1483
  args: [{
2454
1484
  imports: [ConfirmationDialogModule, ApiModule],
2455
- providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService],
1485
+ providers: [ConfigurationService, ConfigurationStateService, ConfigurationRuntimeService],
1486
+ }]
1487
+ }] });
1488
+
1489
+ class FlowConfigurationModule {
1490
+ }
1491
+ FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1492
+ FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1493
+ FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
1494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1495
+ type: NgModule,
1496
+ args: [{
1497
+ imports: [ApiModule],
1498
+ providers: [FlowConfigurationService],
2456
1499
  }]
2457
1500
  }] });
2458
1501
 
1502
+ class CatalogProductsService {
1503
+ constructor() {
1504
+ this.stateSubj$ = new BehaviorSubject(null);
1505
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
1506
+ }
1507
+ get state() {
1508
+ return this.stateSubj$.getValue();
1509
+ }
1510
+ reset() {
1511
+ this.stateSubj$.next(null);
1512
+ }
1513
+ setState(state) {
1514
+ this.stateSubj$.next(state);
1515
+ }
1516
+ }
1517
+ CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1518
+ CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
1519
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
1520
+ type: Injectable
1521
+ }] });
1522
+
1523
+ const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
1524
+
1525
+ const UI_DEFINITION_VERSION = 3;
1526
+
2459
1527
  const DEFAULT_FORMATTING_SETTINGS = {
2460
1528
  currencySymbol: DEFAULT_CURRENCY_SYMBOL,
2461
1529
  decimalsCount: DEFAULT_DECIMALS_COUNT,
@@ -2469,14 +1537,14 @@ class SdkCoreModule {
2469
1537
  SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2470
1538
  SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
2471
1539
  SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
2472
- ContextService,
2473
1540
  FlowInfoService,
2474
- QuoteDraftService,
2475
1541
  ProductImagesService,
2476
1542
  IntegrationState,
2477
1543
  FlowStateService,
2478
1544
  FlowStateConfigurationService,
2479
1545
  RuntimeSettingsService,
1546
+ SalesTransactionService,
1547
+ CatalogProductsService,
2480
1548
  {
2481
1549
  provide: FORMATTING_SETTINGS_TOKEN,
2482
1550
  useExisting: RuntimeSettingsService,
@@ -2487,14 +1555,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2487
1555
  args: [{
2488
1556
  imports: [ConfigurationModule, FlowConfigurationModule],
2489
1557
  providers: [
2490
- ContextService,
2491
1558
  FlowInfoService,
2492
- QuoteDraftService,
2493
1559
  ProductImagesService,
2494
1560
  IntegrationState,
2495
1561
  FlowStateService,
2496
1562
  FlowStateConfigurationService,
2497
1563
  RuntimeSettingsService,
1564
+ SalesTransactionService,
1565
+ CatalogProductsService,
2498
1566
  {
2499
1567
  provide: FORMATTING_SETTINGS_TOKEN,
2500
1568
  useExisting: RuntimeSettingsService,
@@ -2679,5 +1747,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2679
1747
  * Generated bundle index. Do not edit.
2680
1748
  */
2681
1749
 
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 };
1750
+ 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, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
2683
1751
  //# sourceMappingURL=veloceapps-sdk-core.mjs.map