@veloceapps/sdk 11.0.0-2 → 11.0.0-21

Sign up to get free protection for your applications and to get access to all the features.
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