@veloceapps/sdk 11.0.0-8 → 11.0.0-80

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) 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/components/preview/preview.component.d.ts +5 -6
  4. package/cms/components/preview/preview.types.d.ts +0 -4
  5. package/cms/services/element-context.service.d.ts +0 -1
  6. package/cms/types/common.types.d.ts +2 -0
  7. package/cms/types/index.d.ts +0 -1
  8. package/cms/utils/path.utils.d.ts +1 -2
  9. package/cms/vendor-map.d.ts +17 -40
  10. package/core/index.d.ts +1 -1
  11. package/core/modules/configuration/index.d.ts +3 -4
  12. package/core/modules/configuration/services/configuration-runtime.service.d.ts +8 -19
  13. package/core/modules/configuration/services/configuration-state.service.d.ts +8 -8
  14. package/core/modules/configuration/services/configuration.service.d.ts +23 -47
  15. package/core/modules/configuration/services/test-mode-configuration.service.d.ts +23 -0
  16. package/core/modules/configuration/types/configuration-runtime.types.d.ts +0 -5
  17. package/core/modules/configuration/types/configuration.types.d.ts +4 -2
  18. package/core/modules/configuration/types/index.d.ts +2 -0
  19. package/core/modules/flow-configuration/index.d.ts +0 -3
  20. package/core/modules/flow-configuration/services/flow-configuration.service.d.ts +11 -38
  21. package/core/operators/filter-successful-execute.operator.d.ts +3 -0
  22. package/core/operators/index.d.ts +1 -0
  23. package/core/services/catalog-products.service.d.ts +11 -0
  24. package/core/services/flow-info.service.d.ts +27 -12
  25. package/core/services/flow-state-configuration.service.d.ts +2 -8
  26. package/core/services/flow-state.service.d.ts +13 -22
  27. package/core/services/index.d.ts +3 -3
  28. package/core/services/integration.state.d.ts +1 -1
  29. package/core/services/product-images.service.d.ts +3 -3
  30. package/core/services/runtime-settings.service.d.ts +1 -1
  31. package/core/services/sales-transaction.service.d.ts +27 -0
  32. package/core/types/flow-customization.types.d.ts +2 -2
  33. package/core/types/flow-state.types.d.ts +2 -2
  34. package/core/types/index.d.ts +0 -1
  35. package/core/utils/index.d.ts +2 -2
  36. package/core/utils/transaction-item.utils.d.ts +7 -0
  37. package/core/utils/transaction-item.worker.d.ts +8 -0
  38. package/esm2020/cms/cms.actions.mjs +93 -71
  39. package/esm2020/cms/cms.default.mjs +2 -3
  40. package/esm2020/cms/components/element-renderer/element-renderer.component.mjs +7 -64
  41. package/esm2020/cms/components/element-tools-panel/element-tools-panel.component.mjs +3 -3
  42. package/esm2020/cms/components/preview/preview.component.mjs +19 -28
  43. package/esm2020/cms/components/preview/preview.types.mjs +1 -1
  44. package/esm2020/cms/services/element-context.service.mjs +1 -1
  45. package/esm2020/cms/types/common.types.mjs +1 -1
  46. package/esm2020/cms/types/index.mjs +1 -2
  47. package/esm2020/cms/utils/element.utils.mjs +3 -3
  48. package/esm2020/cms/utils/elements-resolver.mjs +16 -5
  49. package/esm2020/cms/utils/path.utils.mjs +1 -10
  50. package/esm2020/cms/vendor-map.mjs +17 -18
  51. package/esm2020/core/core.module.mjs +7 -7
  52. package/esm2020/core/index.mjs +2 -2
  53. package/esm2020/core/modules/configuration/configuration.module.mjs +14 -4
  54. package/esm2020/core/modules/configuration/index.mjs +4 -5
  55. package/esm2020/core/modules/configuration/services/configuration-runtime.service.mjs +16 -101
  56. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +65 -77
  57. package/esm2020/core/modules/configuration/services/configuration.service.mjs +109 -223
  58. package/esm2020/core/modules/configuration/services/test-mode-configuration.service.mjs +74 -0
  59. package/esm2020/core/modules/configuration/types/configuration-runtime.types.mjs +1 -1
  60. package/esm2020/core/modules/configuration/types/configuration.types.mjs +1 -1
  61. package/esm2020/core/modules/configuration/types/index.mjs +3 -0
  62. package/esm2020/core/modules/flow-configuration/flow-configuration.module.mjs +3 -4
  63. package/esm2020/core/modules/flow-configuration/index.mjs +1 -4
  64. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +44 -128
  65. package/esm2020/core/operators/filter-successful-execute.operator.mjs +5 -0
  66. package/esm2020/core/operators/index.mjs +2 -0
  67. package/esm2020/core/services/catalog-products.service.mjs +25 -0
  68. package/esm2020/core/services/flow-info.service.mjs +82 -31
  69. package/esm2020/core/services/flow-state-configuration.service.mjs +10 -25
  70. package/esm2020/core/services/flow-state.service.mjs +60 -172
  71. package/esm2020/core/services/index.mjs +4 -4
  72. package/esm2020/core/services/integration.state.mjs +2 -2
  73. package/esm2020/core/services/product-images.service.mjs +8 -8
  74. package/esm2020/core/services/runtime-settings.service.mjs +3 -3
  75. package/esm2020/core/services/sales-transaction.service.mjs +62 -0
  76. package/esm2020/core/types/flow-customization.types.mjs +1 -1
  77. package/esm2020/core/types/flow-state.types.mjs +1 -1
  78. package/esm2020/core/types/index.mjs +1 -2
  79. package/esm2020/core/utils/index.mjs +3 -3
  80. package/esm2020/core/utils/transaction-item.utils.mjs +60 -0
  81. package/esm2020/core/utils/transaction-item.worker.mjs +16 -0
  82. package/esm2020/src/components/flow-header/flow-header.component.mjs +8 -12
  83. package/esm2020/src/components/guided-selling/guided-selling.component.mjs +8 -12
  84. package/esm2020/src/flow-routing.module.mjs +12 -41
  85. package/esm2020/src/flow.component.mjs +5 -5
  86. package/esm2020/src/guards/flow.guard.mjs +13 -14
  87. package/esm2020/src/guards/product-unload.guard.mjs +7 -9
  88. package/esm2020/src/index.mjs +1 -3
  89. package/esm2020/src/pages/assets/assets.component.mjs +8 -9
  90. package/esm2020/src/pages/catalog/catalog.component.mjs +8 -9
  91. package/esm2020/src/pages/debug/debug.component.mjs +14 -23
  92. package/esm2020/src/pages/product/product.component.mjs +12 -89
  93. package/esm2020/src/pages/product/product.module.mjs +5 -5
  94. package/esm2020/src/pages/record-not-found/record-not-found.component.mjs +5 -6
  95. package/esm2020/src/pages/shopping-cart/shopping-cart.component.mjs +8 -9
  96. package/esm2020/src/resolvers/flow.resolver.mjs +10 -18
  97. package/esm2020/src/resolvers/pcm-model.resolver.mjs +12 -0
  98. package/esm2020/src/resolvers/sales-transaction.resolver.mjs +64 -0
  99. package/esm2020/src/resolvers/ui-definition.resolver.mjs +42 -0
  100. package/esm2020/src/services/flow-dialog.service.mjs +8 -8
  101. package/esm2020/src/services/flow-router.service.mjs +16 -33
  102. package/esm2020/src/services/flow.service.mjs +13 -54
  103. package/esm2020/src/types/index.mjs +2 -3
  104. package/esm2020/src/types/route.types.mjs +1 -1
  105. package/fesm2015/veloceapps-sdk-cms.mjs +162 -309
  106. package/fesm2015/veloceapps-sdk-cms.mjs.map +1 -1
  107. package/fesm2015/veloceapps-sdk-core.mjs +812 -1657
  108. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  109. package/fesm2015/veloceapps-sdk.mjs +188 -801
  110. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  111. package/fesm2020/veloceapps-sdk-cms.mjs +158 -300
  112. package/fesm2020/veloceapps-sdk-cms.mjs.map +1 -1
  113. package/fesm2020/veloceapps-sdk-core.mjs +875 -1741
  114. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  115. package/fesm2020/veloceapps-sdk.mjs +188 -795
  116. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  117. package/package.json +1 -1
  118. package/src/components/flow-header/flow-header.component.d.ts +3 -3
  119. package/src/components/guided-selling/guided-selling.component.d.ts +3 -3
  120. package/src/flow-routing.module.d.ts +1 -2
  121. package/src/flow.component.d.ts +2 -2
  122. package/src/guards/product-unload.guard.d.ts +5 -6
  123. package/src/index.d.ts +0 -2
  124. package/src/pages/assets/assets.component.d.ts +3 -3
  125. package/src/pages/catalog/catalog.component.d.ts +3 -3
  126. package/src/pages/debug/debug.component.d.ts +2 -5
  127. package/src/pages/product/product.component.d.ts +5 -14
  128. package/src/pages/product/product.module.d.ts +1 -1
  129. package/src/pages/record-not-found/record-not-found.component.d.ts +2 -3
  130. package/src/pages/shopping-cart/shopping-cart.component.d.ts +3 -3
  131. package/src/resolvers/flow.resolver.d.ts +5 -6
  132. package/src/resolvers/pcm-model.resolver.d.ts +3 -0
  133. package/src/resolvers/sales-transaction.resolver.d.ts +18 -0
  134. package/src/resolvers/ui-definition.resolver.d.ts +3 -0
  135. package/src/services/flow-dialog.service.d.ts +5 -4
  136. package/src/services/flow-router.service.d.ts +4 -6
  137. package/src/services/flow.service.d.ts +2 -7
  138. package/src/types/index.d.ts +1 -2
  139. package/src/types/route.types.d.ts +0 -5
  140. package/cms/plugins/configuration.plugin.d.ts +0 -23
  141. package/cms/types/configuration.types.d.ts +0 -21
  142. package/core/modules/configuration/helpers.d.ts +0 -6
  143. package/core/modules/configuration/services/runtime-context.service.d.ts +0 -12
  144. package/core/modules/flow-configuration/services/flow-update.service.d.ts +0 -13
  145. package/core/modules/flow-configuration/types/update.types.d.ts +0 -12
  146. package/core/services/context.service.d.ts +0 -23
  147. package/core/services/quote-draft.service.d.ts +0 -50
  148. package/core/types/runtime.types.d.ts +0 -30
  149. package/core/utils/line-item.utils.d.ts +0 -25
  150. package/core/utils/line-item.worker.d.ts +0 -9
  151. package/esm2020/cms/plugins/configuration.plugin.mjs +0 -109
  152. package/esm2020/cms/types/configuration.types.mjs +0 -2
  153. package/esm2020/core/modules/configuration/helpers.mjs +0 -73
  154. package/esm2020/core/modules/configuration/services/runtime-context.service.mjs +0 -45
  155. package/esm2020/core/modules/flow-configuration/services/flow-update.service.mjs +0 -138
  156. package/esm2020/core/modules/flow-configuration/types/update.types.mjs +0 -2
  157. package/esm2020/core/services/context.service.mjs +0 -91
  158. package/esm2020/core/services/quote-draft.service.mjs +0 -192
  159. package/esm2020/core/types/runtime.types.mjs +0 -16
  160. package/esm2020/core/utils/line-item.utils.mjs +0 -187
  161. package/esm2020/core/utils/line-item.worker.mjs +0 -19
  162. package/esm2020/src/guards/context.guard.mjs +0 -91
  163. package/esm2020/src/guards/index.mjs +0 -2
  164. package/esm2020/src/pages/remote/remote.component.mjs +0 -342
  165. package/esm2020/src/pages/remote/remote.module.mjs +0 -20
  166. package/esm2020/src/pages/remote/remote.types.mjs +0 -2
  167. package/esm2020/src/resolvers/quote.resolver.mjs +0 -82
  168. package/esm2020/src/types/context-route.types.mjs +0 -2
  169. package/esm2020/src/types/metrics.types.mjs +0 -2
  170. package/esm2020/src/utils/flow.utils.mjs +0 -25
  171. package/esm2020/src/utils/index.mjs +0 -2
  172. package/src/guards/context.guard.d.ts +0 -19
  173. package/src/guards/index.d.ts +0 -1
  174. package/src/pages/remote/remote.component.d.ts +0 -46
  175. package/src/pages/remote/remote.module.d.ts +0 -10
  176. package/src/pages/remote/remote.types.d.ts +0 -4
  177. package/src/resolvers/quote.resolver.d.ts +0 -19
  178. package/src/types/context-route.types.d.ts +0 -5
  179. package/src/types/metrics.types.d.ts +0 -5
  180. package/src/utils/flow.utils.d.ts +0 -8
  181. package/src/utils/index.d.ts +0 -1
@@ -1,219 +1,314 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Injectable, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
3
- import { UUID, ConfigurationContextMode, ConfigurationContext, UITemplateType, QuoteDraft, isDefined, ConfigurationProcessorTypes, EntityUtil, ChargeGroupUtils, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, ConfigurationMode, extractErrorDetails, ConfigurationTranslatorUtils, RuntimeModel, isNotLegacyUIDefinition, SalesforceIdUtils, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
4
- import { BehaviorSubject, switchMap, map as map$1, tap as tap$1, noop, catchError, throwError, forkJoin, of, zip, combineLatest, Subject, filter as filter$1, shareReplay as shareReplay$1, finalize, takeUntil, buffer, debounceTime, share, take as take$1, distinctUntilChanged } from 'rxjs';
5
- import { map, filter, tap, switchMap as switchMap$1, skip, take, shareReplay, catchError as catchError$1, finalize as finalize$1, first } from 'rxjs/operators';
6
- import * as i1 from '@veloceapps/api';
2
+ import { Injectable, InjectionToken, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
3
+ import { isDefined, UUID, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, UITemplateType, SalesforceIdUtils, ConfigurationProcessorTypes, EntityUtil, extractErrorDetails, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
4
+ import * as i3 from '@veloceapps/api';
7
5
  import { ApiModule } from '@veloceapps/api';
8
- import { merge, isEqual, cloneDeep, assign, flatten, entries, sortBy, map as map$2, omit, uniqBy, transform } from 'lodash';
9
6
  import * as i6 from '@veloceapps/components';
10
- import { ToastType, ConfirmationComponent, ConfirmationDialogModule } from '@veloceapps/components';
11
- import moment from 'moment';
12
- import { HttpErrorResponse } from '@angular/common/http';
13
- import * as i5 from 'primeng/api';
14
- import * as i6$1 from 'primeng/dynamicdialog';
7
+ import { ToastType, ConfirmationDialogModule } from '@veloceapps/components';
8
+ import { tap, BehaviorSubject, map, filter, switchMap, of, forkJoin, throwError, noop, Subject, catchError, combineLatest, finalize, buffer, debounceTime, share, take, distinctUntilChanged, shareReplay, takeUntil, first } from 'rxjs';
9
+ import * as i1 from '@veloceapps/api/v2';
10
+ import { flatten, omit, uniqBy, cloneDeep, assign, isEqual } from 'lodash';
11
+ import { filter as filter$1, map as map$1, tap as tap$1, catchError as catchError$1, finalize as finalize$1 } from 'rxjs/operators';
12
+ import * as i2 from 'primeng/api';
15
13
  import { NgControl } from '@angular/forms';
16
14
  import { DATE_PIPE_DEFAULT_OPTIONS, formatDate } from '@angular/common';
17
15
 
18
- const getDefaultLineItem = (context, uiDefinitionProperties, qty = 1) => {
19
- var _a, _b, _c;
20
- const id = UUID.UUID();
21
- const attributes = [];
22
- const lineItems = [];
23
- return Object.assign({ id, type: (_a = uiDefinitionProperties.rootType) !== null && _a !== void 0 ? _a : '', cfgStatus: 'Default', actionCode: 'ADD', qty,
24
- attributes,
25
- lineItems, productName: ((_b = context.properties) === null || _b === void 0 ? void 0 : _b['displayName']) || context.productName, productId: (_c = context.productId) !== null && _c !== void 0 ? _c : '' }, (uiDefinitionProperties.offeringId ? { offeringId: uiDefinitionProperties.offeringId } : {}));
16
+ class ConfigurationRuntimeService {
17
+ constructor(pcmApiService) {
18
+ this.pcmApiService = pcmApiService;
19
+ this.uiDefinitionContainer = null;
20
+ }
21
+ get uiDefinitionProps() {
22
+ var _a, _b;
23
+ return (_b = (_a = this.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
24
+ }
25
+ reset() {
26
+ this.uiDefinitionContainer = null;
27
+ this.initializationProps = undefined;
28
+ this.pcmModel = undefined;
29
+ }
30
+ init$(props) {
31
+ this.initializationProps = props;
32
+ return this.pcmApiService.fetchPCMByProductId(props.productId).pipe(tap(pcmModel => (this.pcmModel = pcmModel)));
33
+ }
34
+ }
35
+ ConfigurationRuntimeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, deps: [{ token: i1.PCMApiService }], target: i0.ɵɵFactoryTarget.Injectable });
36
+ ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
37
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
38
+ type: Injectable
39
+ }], ctorParameters: function () { return [{ type: i1.PCMApiService }]; } });
40
+
41
+ const findTransactionItem = (id, items) => {
42
+ return findTransactionItemWithComparator(items, (ti) => ti.id === id);
26
43
  };
27
- const getGuidedSellingConfigurationRequest = (data, context) => {
28
- const _context = Object.assign({}, context);
29
- delete _context.configurationToken;
30
- const properties = Object.assign({}, context.properties);
31
- delete properties['ConfigurationToken'];
32
- return {
33
- mode: 'SEARCH',
34
- step: 'START',
35
- attributeDomainMode: 'ALL',
36
- context: Object.assign(Object.assign({}, _context), { mode: ConfigurationContextMode.TEST, properties: Object.assign(Object.assign({}, properties), { ModelId: data.modelId, Name: 'Veloce Guided Selling', PricingEnabled: 'false', RuntimeMode: 'TEST' }) }),
37
- lineItem: {
38
- actionCode: 'ADD',
39
- cfgStatus: 'Default',
40
- id: UUID.UUID(),
41
- qty: 1,
42
- type: data.modelType,
43
- attributes: Object.entries(data.attributesMap).map(([name, value]) => ({
44
- name,
45
- value,
46
- cfgStatus: 'User',
47
- })),
48
- },
49
- };
44
+ const findTransactionItemWithComparator = (items, comparator) => {
45
+ let currentLevel = items;
46
+ while (currentLevel.length) {
47
+ const found = currentLevel.find(comparator);
48
+ if (found) {
49
+ return found;
50
+ }
51
+ currentLevel = flatten(currentLevel.map(parent => parent.children));
52
+ }
53
+ return;
54
+ };
55
+ const insertTransactionItem = (item, parentId, toInsert) => {
56
+ const insertData = item.id === parentId ? [toInsert] : [];
57
+ return Object.assign(Object.assign({}, item), { children: [
58
+ ...insertData,
59
+ ...item.children.map(ti => {
60
+ return insertTransactionItem(ti, parentId, toInsert);
61
+ }),
62
+ ] });
63
+ };
64
+ const removeTransactionItem = (item, idToRemove) => {
65
+ return Object.assign(Object.assign({}, item), { children: item.children
66
+ .map(ti => {
67
+ if (ti.id === idToRemove) {
68
+ return;
69
+ }
70
+ else if (ti.children.length) {
71
+ return removeTransactionItem(ti, idToRemove);
72
+ }
73
+ return ti;
74
+ })
75
+ .filter(isDefined) });
76
+ };
77
+ const replaceTransactionItem = (item, replaceTo) => {
78
+ if (item.id === replaceTo.id) {
79
+ return Object.assign({}, replaceTo);
80
+ }
81
+ return Object.assign(Object.assign({}, item), { children: item.children.map(ti => replaceTransactionItem(ti, replaceTo)) });
50
82
  };
51
- const generateConfigurationLineItem = (props, qty = 1) => {
52
- var _a, _b, _c;
53
- const id = UUID.UUID();
54
- const attributes = Object.entries((_a = props.attributesMap) !== null && _a !== void 0 ? _a : {}).map(([name, value]) => ({
55
- name,
56
- value,
57
- cfgStatus: 'User',
58
- }));
59
- const lineItems = [];
83
+ const generateTransactionItem = (productId) => {
60
84
  return {
61
- id,
62
- type: (_b = props.product.typeName) !== null && _b !== void 0 ? _b : '',
63
- cfgStatus: 'Default',
64
- actionCode: 'ADD',
65
- qty,
66
- attributes,
67
- lineItems,
68
- productName: props.product.name,
69
- productId: (_c = props.product.id) !== null && _c !== void 0 ? _c : '',
85
+ id: UUID.UUID(),
86
+ productId,
70
87
  };
71
88
  };
72
89
 
73
- const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
74
-
75
- const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
76
-
77
- var RuntimeMode;
78
- (function (RuntimeMode) {
79
- RuntimeMode[RuntimeMode["TEST"] = 0] = "TEST";
80
- RuntimeMode[RuntimeMode["PROD"] = 1] = "PROD";
81
- })(RuntimeMode || (RuntimeMode = {}));
82
- var RuntimeOperation;
83
- (function (RuntimeOperation) {
84
- RuntimeOperation["INIT"] = "INIT";
85
- RuntimeOperation["UPDATE"] = "UPDATE";
86
- })(RuntimeOperation || (RuntimeOperation = {}));
87
- var RuntimeStep;
88
- (function (RuntimeStep) {
89
- RuntimeStep["START"] = "START";
90
- RuntimeStep["UPDATE"] = "UPDATE";
91
- })(RuntimeStep || (RuntimeStep = {}));
92
-
93
- const UI_DEFINITION_VERSION = 3;
94
-
95
- class ContextService {
96
- constructor(contextApiService) {
97
- this.contextApiService = contextApiService;
98
- this.context = new BehaviorSubject(null);
90
+ class TransactionItemWorker {
91
+ constructor(src) {
92
+ this.ti = Object.assign({}, src);
99
93
  }
100
- get isInitialized() {
101
- return Boolean(this.context.value);
94
+ insert(parentId, toInsert) {
95
+ return new TransactionItemWorker(insertTransactionItem(this.ti, parentId, toInsert));
102
96
  }
103
- get isInitialized$() {
104
- return this.context.pipe(map(Boolean));
97
+ remove(id) {
98
+ return new TransactionItemWorker(removeTransactionItem(this.ti, id));
99
+ }
100
+ replace(toReplace) {
101
+ return new TransactionItemWorker(replaceTransactionItem(this.ti, toReplace));
105
102
  }
106
- get mode() {
107
- return this.resolve().properties['#mode'];
103
+ }
104
+
105
+ function extractMetadata(uiDefinition) {
106
+ return omit(uiDefinition, [
107
+ 'children',
108
+ 'pages',
109
+ 'components',
110
+ ]);
111
+ }
112
+
113
+ const FLOW_CUSTOMIZATION = new InjectionToken('FLOW_CUSTOMIZATION');
114
+
115
+ class RuntimeSettingsService {
116
+ constructor(configurationSettingsApiService) {
117
+ this.configurationSettingsApiService = configurationSettingsApiService;
118
+ this.configurationSettings$ = new BehaviorSubject({});
119
+ this.currencySettings$ = new BehaviorSubject({
120
+ iso: DEFAULT_CURRENCY_ISO_CODE,
121
+ symbol: DEFAULT_CURRENCY_SYMBOL,
122
+ });
123
+ this.shoppingCartSettings$ = new BehaviorSubject([]);
124
+ this.getCurrencySymbol = (locale, currency) => {
125
+ return (0)
126
+ .toLocaleString(locale, { style: 'currency', currency, minimumFractionDigits: 0, maximumFractionDigits: 0 })
127
+ .replace(/\d/g, '')
128
+ .trim();
129
+ };
108
130
  }
109
- get isEditMode$() {
110
- return this.resolve$().pipe(map(() => this.isEditMode));
131
+ create() {
132
+ return this.configurationSettingsApiService.fetchSettings().pipe(map(settings => this.parseConfigurationSettings(settings)), tap(configurationSettings => {
133
+ var _a;
134
+ this.configurationSettings$.next(configurationSettings);
135
+ this.addShoppingCartSettings((_a = configurationSettings['shopping-cart']) !== null && _a !== void 0 ? _a : []);
136
+ this.formattingSettings = this.getFormattingSettings();
137
+ }), map(() => undefined));
111
138
  }
112
- get isEditMode() {
113
- const context = this.resolve();
114
- if (context.properties['#mode'] === ConfigurationContextMode.ACCOUNT) {
115
- return true;
116
- }
117
- if (context.properties['#mode'] === ConfigurationContextMode.QUOTE) {
118
- return context.properties.Status === 'Draft';
139
+ initCurrency(iso) {
140
+ if (iso) {
141
+ const symbol = this.getCurrencySymbol('en-US', iso);
142
+ this.currencySettings$.next({ iso, symbol });
143
+ if (this.formattingSettings) {
144
+ this.formattingSettings.currencySymbol = symbol;
145
+ }
119
146
  }
120
- return false;
121
147
  }
122
- resolve() {
123
- if (!this.context.value) {
124
- throw new Error('Context is not initialized yet!');
148
+ getFormattingSettings() {
149
+ var _a, _b;
150
+ if (this.formattingSettings) {
151
+ return this.formattingSettings;
125
152
  }
126
- return Object.assign({}, this.context.value);
127
- }
128
- resolve$() {
129
- return this.context.pipe(filter((ctx) => Boolean(ctx)));
153
+ const shoppingCartSettings = (_a = this.getConfigurationSettings()['shopping-cart']) === null || _a === void 0 ? void 0 : _a.reduce((acc, setting) => {
154
+ return Object.assign(Object.assign({}, acc), { [setting.id]: setting.properties });
155
+ }, {});
156
+ const currencySettings = this.getCurrencySettings();
157
+ const dateFormat = (validateDateFormat((_b = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT) !== null && _b !== void 0 ? _b : '') && (shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DATE_FORMAT)) ||
158
+ DEFAULT_DATE_FORMAT;
159
+ const decimalSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.DECIMAL_SEPARATOR;
160
+ const thousandsSeparator = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.THOUSANDS_SEPARATOR;
161
+ // the number of decimal places can be 0
162
+ const priceScale = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.PRICE_SCALE;
163
+ const decimalsCount = priceScale !== null && priceScale !== '' && !isNaN(Number(priceScale)) && Number(priceScale) >= 0
164
+ ? Number(priceScale)
165
+ : DEFAULT_DECIMALS_COUNT;
166
+ const actionCodeSettings = shoppingCartSettings === null || shoppingCartSettings === void 0 ? void 0 : shoppingCartSettings.STATUS_LABEL;
167
+ return {
168
+ currencySymbol: currencySettings.symbol,
169
+ dateFormats: getSupportedDateFormats(dateFormat),
170
+ decimalsCount,
171
+ decimalSeparator: decimalSeparator !== undefined && ['.', ','].includes(decimalSeparator)
172
+ ? decimalSeparator
173
+ : DEFAULT_DECIMAL_SEPARATOR,
174
+ // thousands separator can be a blank value, so it can also be null
175
+ thousandsSeparator: thousandsSeparator !== undefined && ['.', ',', '', null].includes(thousandsSeparator)
176
+ ? thousandsSeparator || ''
177
+ : DEFAULT_THOUSANDS_SEPARATOR,
178
+ actionCodeLabels: (actionCodeSettings === null || actionCodeSettings === void 0 ? void 0 : actionCodeSettings.length)
179
+ ? actionCodeSettings.reduce((result, setting) => (Object.assign(Object.assign({}, result), { [setting.status_label]: setting.custom_label })), {})
180
+ : DEFAULT_ACTION_CODE_LABELS,
181
+ };
130
182
  }
131
- create(headerId, mode) {
132
- return this.contextApiService.getContext(headerId, mode).pipe(tap(context => this.context.next(merge(new ConfigurationContext(headerId, mode), context))), map(() => this.resolve()));
183
+ getConfigurationSettings() {
184
+ return this.configurationSettings$.value;
133
185
  }
134
- initTestMode() {
135
- return this.create('TestId', ConfigurationContextMode.TEST).pipe(map(context => {
136
- return this.update({
137
- properties: Object.assign(Object.assign({}, context.properties), { RuntimeMode: ConfigurationContextMode.TEST, StartDate: new Date().toISOString().substring(0, 10), standalone: 'true' }),
138
- });
139
- }));
186
+ getShoppingCartSettings() {
187
+ return this.shoppingCartSettings$.value;
140
188
  }
141
- update(partialContext) {
142
- const originalContext = this.resolve();
143
- const updatedContext = Object.assign(Object.assign(Object.assign({}, originalContext), partialContext), { properties: Object.assign(Object.assign({}, originalContext.properties), partialContext.properties) });
144
- this.context.next(updatedContext);
145
- return updatedContext;
189
+ getCurrencySettings() {
190
+ return this.currencySettings$.value;
146
191
  }
147
- set(context) {
148
- const originalContext = this.resolve();
149
- const updatedContext = Object.assign(Object.assign({}, originalContext), context);
150
- this.context.next(updatedContext);
151
- return updatedContext;
192
+ parseConfigurationSettings(settings) {
193
+ return settings.reduce((acc, setting) => {
194
+ switch (setting.key) {
195
+ case 'shopping-cart':
196
+ acc['shopping-cart'] = parseJsonSafely(setting.value, []);
197
+ break;
198
+ case 'navigation':
199
+ acc.navigation = parseJsonSafely(setting.value, {});
200
+ break;
201
+ case 'flows':
202
+ acc.flows = parseJsonSafely(setting.value, []);
203
+ break;
204
+ default:
205
+ acc[setting.key] = setting.value;
206
+ }
207
+ return acc;
208
+ }, {});
152
209
  }
153
- delete() {
154
- this.context.next(null);
210
+ addShoppingCartSettings(settings) {
211
+ // uniqBy removes items with the biggest index
212
+ const newSettings = uniqBy([...settings, ...this.shoppingCartSettings$.value], 'id');
213
+ this.shoppingCartSettings$.next(newSettings);
155
214
  }
156
215
  }
157
- ContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService, deps: [{ token: i1.ContextApiService }], target: i0.ɵɵFactoryTarget.Injectable });
158
- ContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService });
159
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ContextService, decorators: [{
216
+ RuntimeSettingsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, deps: [{ token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
217
+ RuntimeSettingsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService });
218
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeSettingsService, decorators: [{
160
219
  type: Injectable
161
- }], ctorParameters: function () { return [{ type: i1.ContextApiService }]; } });
220
+ }], ctorParameters: function () { return [{ type: i1.ConfigurationSettingsApiService }]; } });
162
221
 
163
222
  class FlowInfoService {
164
223
  get flow() {
224
+ if (!this.flowSubj$.value) {
225
+ throw new Error(`Flow not initialized yet`);
226
+ }
165
227
  return this.flowSubj$.value;
166
228
  }
167
- set flow(value) {
168
- this.flowSubj$.next(value);
229
+ get isFlowInitialized() {
230
+ return Boolean(this.flowSubj$.value);
169
231
  }
170
- get isLegacy() {
171
- var _a;
172
- return !!this.flow && ((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) == null;
232
+ get context() {
233
+ if (!this.contextSubj$.value) {
234
+ throw new Error('Context is not initialized yet!');
235
+ }
236
+ return Object.assign({}, this.contextSubj$.value);
237
+ }
238
+ get context$() {
239
+ return this.contextSubj$.asObservable().pipe(filter(isDefined));
240
+ }
241
+ get templates() {
242
+ return this.templatesSubj$.value;
243
+ }
244
+ get isFlowEngineInitialized$() {
245
+ return this.templates$.pipe(map(v => Boolean(v.FLOW_ENGINE)));
173
246
  }
174
247
  get isStateful() {
175
248
  var _a;
176
249
  return !!((_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful);
177
250
  }
178
- constructor(flowsApiService, templatesApiService, customizationService) {
179
- this.flowsApiService = flowsApiService;
180
- this.templatesApiService = templatesApiService;
251
+ constructor(runtimeSettingsService, templatesAdminApiService, customizationService) {
252
+ this.runtimeSettingsService = runtimeSettingsService;
253
+ this.templatesAdminApiService = templatesAdminApiService;
181
254
  this.customizationService = customizationService;
182
- this.templates = {};
183
255
  this.defaultTemplates = {
184
256
  flowEngine: 'Flow Engine',
185
257
  };
186
258
  this.flowSubj$ = new BehaviorSubject(null);
259
+ this.templatesSubj$ = new BehaviorSubject({});
260
+ this.contextSubj$ = new BehaviorSubject(null);
187
261
  this.flow$ = this.flowSubj$.asObservable();
262
+ this.templates$ = this.templatesSubj$.asObservable();
263
+ }
264
+ reset() {
265
+ this.flowSubj$.next(null);
266
+ this.templatesSubj$.next({});
267
+ this.contextSubj$.next(null);
188
268
  }
189
269
  init$(flowId, routeQueryParams) {
190
- return this.flowsApiService.getFlow(flowId).pipe(switchMap(flow => this.initFlowTemplates$(flow).pipe(map$1(() => flow))), tap$1(flow => {
191
- this.params = Object.assign(Object.assign({}, routeQueryParams), flow.properties.queryParams);
192
- this.flowSubj$.next(flow);
193
- }), map$1(noop), catchError(e => {
194
- this.flowSubj$.next(null);
195
- return throwError(() => e);
196
- }));
270
+ return this.initFlow$(flowId, routeQueryParams).pipe(switchMap(() => this.initFlowTemplates$()));
197
271
  }
198
- cleanup() {
199
- this.flowSubj$.next(null);
200
- this.params = undefined;
201
- this.templates = {};
272
+ updateContext(update) {
273
+ this.contextSubj$.next(Object.assign(Object.assign({}, this.context), update));
274
+ }
275
+ initFlow$(flowId, routeQueryParams) {
276
+ var _a;
277
+ const flow = (_a = this.runtimeSettingsService.getConfigurationSettings()['flows']) === null || _a === void 0 ? void 0 : _a.find(({ id }) => flowId === id);
278
+ if (!flow) {
279
+ this.flowSubj$.next(null);
280
+ throw new Error(`Flow with flowId=${flowId} is not defined`);
281
+ }
282
+ const headerId = routeQueryParams['headerId'];
283
+ if (typeof headerId !== 'string') {
284
+ throw new Error(`Please provide 'headerId'`);
285
+ }
286
+ const mode = this.getFlowContextMode(headerId);
287
+ // Restrict if mode is not defined
288
+ if (mode == null) {
289
+ throw new Error('Mode is undefined');
290
+ }
291
+ this.contextSubj$.next(Object.assign(Object.assign(Object.assign({}, flow.properties.queryParams), routeQueryParams), { mode }));
292
+ this.flowSubj$.next(flow);
293
+ return of(undefined);
202
294
  }
203
- initFlowTemplates$(flow) {
295
+ initFlowTemplates$() {
204
296
  var _a, _b, _c;
205
297
  return forkJoin([
206
- this.templatesApiService.fetchTemplates$(),
298
+ this.templatesAdminApiService.fetchTemplates$(),
207
299
  (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplates) === null || _b === void 0 ? void 0 : _b.call(_a)) !== null && _c !== void 0 ? _c : of([]),
208
- ]).pipe(map$1(([templates, localTemplates]) => {
209
- Object.entries(Object.assign(Object.assign({}, this.defaultTemplates), flow.properties.templates)).forEach(([key, name]) => {
300
+ ]).pipe(map(([templates, localTemplates]) => {
301
+ var _a, _b;
302
+ const newValue = {};
303
+ Object.entries(Object.assign(Object.assign({}, this.defaultTemplates), ((_b = (_a = this.flow) === null || _a === void 0 ? void 0 : _a.properties.templates) !== null && _b !== void 0 ? _b : {}))).forEach(([key, name]) => {
210
304
  var _a;
211
305
  const type = this.remapTemplateName(key);
212
306
  if (type) {
213
- this.templates[type] =
307
+ newValue[type] =
214
308
  (_a = localTemplates.find(template => template.name === name && template.type === type)) !== null && _a !== void 0 ? _a : templates.find(template => template.name === name && template.type === type);
215
309
  }
216
310
  });
311
+ this.templatesSubj$.next(newValue);
217
312
  }));
218
313
  }
219
314
  remapTemplateName(templateType) {
@@ -239,13 +334,20 @@ class FlowInfoService {
239
334
  }
240
335
  return undefined;
241
336
  }
337
+ getFlowContextMode(headerId) {
338
+ const objectName = SalesforceIdUtils.getSfObjectNameById(headerId);
339
+ if (!objectName) {
340
+ return;
341
+ }
342
+ return objectName.toUpperCase();
343
+ }
242
344
  }
243
- FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: i1.FlowsApiService }, { token: i1.UITemplatesApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
345
+ FlowInfoService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, deps: [{ token: RuntimeSettingsService }, { token: i1.UITemplatesAdminApiService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
244
346
  FlowInfoService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService });
245
347
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowInfoService, decorators: [{
246
348
  type: Injectable
247
349
  }], ctorParameters: function () {
248
- return [{ type: i1.FlowsApiService }, { type: i1.UITemplatesApiService }, { type: undefined, decorators: [{
350
+ return [{ type: RuntimeSettingsService }, { type: i1.UITemplatesAdminApiService }, { type: undefined, decorators: [{
249
351
  type: Optional
250
352
  }, {
251
353
  type: Inject,
@@ -253,186 +355,203 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
253
355
  }] }];
254
356
  } });
255
357
 
256
- class QuoteDraftService {
358
+ class TestModeConfigurationService {
359
+ constructor(flowInfoService, configurationService, configurationRuntimeService, salesTransactionService, runtimeSettingsService) {
360
+ this.flowInfoService = flowInfoService;
361
+ this.configurationService = configurationService;
362
+ this.configurationRuntimeService = configurationRuntimeService;
363
+ this.salesTransactionService = salesTransactionService;
364
+ this.runtimeSettingsService = runtimeSettingsService;
365
+ this.isInitialized = false;
366
+ }
367
+ initTestMode$(uiDefinitionContainer, options) {
368
+ var _a;
369
+ this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
370
+ if (this.checkInitialized(uiDefinitionContainer)) {
371
+ this.configurationRuntimeService.pcmModel = this.pcmModel;
372
+ return of(undefined);
373
+ }
374
+ this.configurationService.reset();
375
+ const { productId, quoteId, flowId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
376
+ if (!productId) {
377
+ return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
378
+ }
379
+ if (!quoteId) {
380
+ return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
381
+ }
382
+ if (!flowId) {
383
+ return throwError(() => `Unable to start the Configuration Preview: Flow is missing.`);
384
+ }
385
+ return this.runtimeSettingsService.create().pipe(switchMap(() => this.flowInfoService.init$(flowId, { productId, headerId: quoteId })), switchMap(() => this.configurationRuntimeService.init$({ productId })), tap(pcmModel => (this.pcmModel = pcmModel)), switchMap(() => {
386
+ if (options === null || options === void 0 ? void 0 : options.customizationMode) {
387
+ return of(undefined);
388
+ }
389
+ return this.initConfiguration$(quoteId);
390
+ }), tap(() => (this.isInitialized = true)), map(noop));
391
+ }
392
+ initConfiguration$(quoteId) {
393
+ this.salesTransactionService.setState(this.getTestTransactionContext(quoteId));
394
+ return this.configurationService.init$().pipe(switchMap(() => this.configurationService.state
395
+ ? this.configurationService.configureRequest$(this.configurationService.state)
396
+ : of(undefined)), map(noop));
397
+ }
398
+ getTestTransactionContext(quoteId) {
399
+ const testTransaction = {
400
+ id: quoteId,
401
+ businessObjectType: 'Quote',
402
+ salesTransactionItems: [],
403
+ };
404
+ return {
405
+ salesTransaction: testTransaction,
406
+ transactionId: quoteId,
407
+ businessObjectType: 'Quote',
408
+ childNodes: {},
409
+ id: UUID.UUID(),
410
+ tagAttributes: {},
411
+ };
412
+ }
413
+ checkInitialized(uiDefinitionContainer) {
414
+ var _a;
415
+ return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
416
+ }
417
+ }
418
+ TestModeConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, deps: [{ token: FlowInfoService }, { token: ConfigurationService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
419
+ TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
420
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
421
+ type: Injectable
422
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: RuntimeSettingsService }]; } });
423
+
424
+ class SalesTransactionService {
257
425
  get isInitialized$() {
258
426
  return this.isInitializedSubj$.asObservable();
259
427
  }
260
428
  get isInitialized() {
261
429
  return this.isInitializedSubj$.getValue();
262
430
  }
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
431
  set hasUnsavedChanges(value) {
272
432
  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 : [];
433
+ this.hasUnsavedChangesSubj$.next(value);
434
+ if (!this.hasUnsavedChanges) {
435
+ this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
276
436
  }
277
437
  }
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);
438
+ get hasUnsavedChanges() {
439
+ return this.hasUnsavedChangesSubj$.getValue();
284
440
  }
285
- get hasAssets$() {
286
- return this.assetsSubj$.pipe(map(() => this.hasAssets));
441
+ get state() {
442
+ return this.stateSubj$.getValue();
287
443
  }
288
- get hasAssets() {
444
+ get hasProducts() {
289
445
  var _a;
290
- return Boolean((_a = this.assetsSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
446
+ return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems.length);
291
447
  }
292
- get assetsState() {
293
- return this.assetsSubj$.value;
294
- }
295
- constructor(context, flowInfoService, accountApiService, quoteApiService) {
296
- this.context = context;
297
- this.flowInfoService = flowInfoService;
298
- this.accountApiService = accountApiService;
299
- this.quoteApiService = quoteApiService;
300
- this.quoteSubj$ = new BehaviorSubject(null);
301
- this.assetsSubj$ = new BehaviorSubject(null);
302
- this.resetSubj$ = new BehaviorSubject(true);
448
+ constructor(salesTransactionApiService) {
449
+ this.salesTransactionApiService = salesTransactionApiService;
450
+ this.stateSubj$ = new BehaviorSubject(null);
303
451
  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;
452
+ this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
453
+ this.initialState = [];
454
+ this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
455
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
317
456
  }
318
457
  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));
458
+ return this.salesTransactionApiService.getState(headerId, params).pipe(tap(res => this.stateSubj$.next(res)));
336
459
  }
337
460
  finalizeInit() {
338
- this.isInitialized = true;
461
+ this.isInitializedSubj$.next(true);
339
462
  this.hasUnsavedChanges = false;
340
463
  }
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 }));
464
+ reset() {
465
+ this.stateSubj$.next(null);
466
+ this.isInitializedSubj$.next(false);
467
+ this.hasUnsavedChangesSubj$.next(false);
347
468
  }
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));
469
+ getInitialState() {
470
+ return this.initialState;
357
471
  }
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 }));
472
+ setState(state) {
473
+ this.stateSubj$.next(state);
368
474
  }
369
- setAssetsState(assetsState) {
370
- this.assetsSubj$.next(assetsState);
475
+ }
476
+ SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: i1.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
477
+ SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
478
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
479
+ type: Injectable
480
+ }], ctorParameters: function () { return [{ type: i1.SalesTransactionApiService }]; } });
481
+
482
+ class FlowConfigurationService {
483
+ constructor(orchestrationsApiService, salesTransactionService, flowInfoService) {
484
+ this.orchestrationsApiService = orchestrationsApiService;
485
+ this.salesTransactionService = salesTransactionService;
486
+ this.flowInfoService = flowInfoService;
487
+ this.updatedSubj$ = new Subject();
488
+ this.updated$ = this.updatedSubj$.asObservable();
489
+ }
490
+ calculate$(state) {
491
+ return this.orchestrationsApiService
492
+ .apply$({ transactionContext: state, flowId: this.flowInfoService.flow.id })
493
+ .pipe(tap(result => this.salesTransactionService.setState(result)), map(noop));
371
494
  }
372
- get quoteDraft$() {
373
- return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
495
+ calculate(state) {
496
+ this.calculate$(state).subscribe();
374
497
  }
375
- get quoteDraft() {
376
- const quote = this.quoteSubj$.value;
377
- if (!quote) {
378
- return null;
498
+ revert$(transactionItemId) {
499
+ var _a;
500
+ const state = this.salesTransactionService.state;
501
+ const initialState = this.salesTransactionService.getInitialState();
502
+ const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
503
+ const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
504
+ const currentItem = currentState[currentItemIndex];
505
+ const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
506
+ if (!state || !currentItem || !initialItem) {
507
+ return of(null);
379
508
  }
380
- return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
509
+ const updatedState = cloneDeep(currentState);
510
+ updatedState.splice(currentItemIndex, 1, initialItem);
511
+ return of([]).pipe(map(() => (Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: updatedState }) }))), tap(newState => this.salesTransactionService.setState(newState)), switchMap(newState => this.calculate$(newState)), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
381
512
  }
382
- get currentState$() {
383
- return this.quoteDraft$.pipe(map(quote => quote.currentState));
513
+ revert(transactionItemId) {
514
+ this.revert$(transactionItemId).subscribe();
384
515
  }
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 : [];
516
+ delete$(ids) {
517
+ const state = this.salesTransactionService.state;
518
+ if (!state) {
519
+ return of(null);
520
+ }
521
+ return of([]).pipe(map(() => state.salesTransaction.salesTransactionItems.filter(({ id }) => !ids.includes(id))), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: updatedState }) }))), map(() => this.salesTransactionService.state), tap(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
388
522
  }
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;
392
- }
393
- get isStandalone$() {
394
- return this.flowInfoService.flow$.pipe(map(() => this.isStandalone));
395
- }
396
- getInitialCurrentState() {
397
- return this.initialCurrentState;
398
- }
399
- isEditMode$() {
400
- return this.context.resolve$().pipe(map(() => this.isEditMode()));
401
- }
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';
409
- }
410
- return false;
523
+ delete(ids) {
524
+ this.delete$(ids).subscribe();
411
525
  }
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
- }
526
+ handleErrorAndBounceBack() {
527
+ return (source$) => {
528
+ return source$.pipe(catchError(error => {
529
+ console.error(error);
530
+ // bounce back if configuration call has failed
531
+ const state = this.salesTransactionService.state;
532
+ if (state) {
533
+ this.salesTransactionService.setState(state);
534
+ this.updatedSubj$.next();
535
+ }
536
+ return throwError(() => error);
537
+ }));
538
+ };
419
539
  }
420
540
  }
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: [{
541
+ FlowConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, deps: [{ token: i1.OrchestrationsApiService }, { token: SalesTransactionService }, { token: FlowInfoService }], target: i0.ɵɵFactoryTarget.Injectable });
542
+ FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
543
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
424
544
  type: Injectable
425
- }], ctorParameters: function () { return [{ type: ContextService }, { type: FlowInfoService }, { type: i1.AccountApiService }, { type: i1.QuoteApiService }]; } });
545
+ }], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }, { type: FlowInfoService }]; } });
426
546
 
427
547
  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;
548
+ constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
432
549
  this.flowConfiguration = flowConfiguration;
433
- this.processorsApiService = processorsApiService;
550
+ this.flowInfoService = flowInfoService;
434
551
  this.flowStateApiService = flowStateApiService;
435
- this.quoteApiService = quoteApiService;
552
+ this.processorsApiService = processorsApiService;
553
+ this.salesTransactionApiService = salesTransactionApiService;
554
+ this.salesTransactionService = salesTransactionService;
436
555
  this.toastService = toastService;
437
556
  this.customizationService = customizationService;
438
557
  this.NOT_INITIALIZED = Symbol();
@@ -449,68 +568,22 @@ class FlowStateService {
449
568
  this.cleanup$ = new Subject();
450
569
  this.statefulExecutionRequest$ = this.initBufferedRequest$();
451
570
  /*
452
- In stateless mode watch QuoteDraft changes and call executeRequest so that
453
- all subscriptions get their updates according to updated QuoteDraft
571
+ In stateless mode watch State changes and call executeRequest so that
572
+ all subscriptions get their updates according to updated State
454
573
  */
455
574
  this.isInitialized$()
456
- .pipe(filter$1(Boolean), filter$1(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
575
+ .pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
457
576
  .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
577
  }
503
578
  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
- }));
579
+ if (this.flowInfoService.flow.properties.stateful) {
580
+ return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
581
+ }
582
+ else {
583
+ return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
584
+ }
512
585
  }
513
- cleanup() {
586
+ reset() {
514
587
  Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
515
588
  this.subscriptions = {};
516
589
  if (this.stateId$.value) {
@@ -522,9 +595,9 @@ class FlowStateService {
522
595
  this.cleanup$.next();
523
596
  }
524
597
  get hasUnsavedChanges() {
525
- return this.getFlowSafe().properties.stateful
598
+ return this.flowInfoService.flow.properties.stateful
526
599
  ? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
527
- : this.quoteDraftService.hasUnsavedChanges;
600
+ : this.salesTransactionService.hasUnsavedChanges;
528
601
  }
529
602
  get stateId() {
530
603
  return this.stateId$.value;
@@ -533,14 +606,14 @@ class FlowStateService {
533
606
  return this.executionInProgress$.asObservable();
534
607
  }
535
608
  isInitialized$() {
536
- return combineLatest([this.stateId$, this.quoteDraftService.isInitialized$]).pipe(map$1(values => values.some(Boolean)));
609
+ return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
537
610
  }
538
611
  isInitialized() {
539
- return Boolean(this.stateId$.value) || this.quoteDraftService.isInitialized;
612
+ return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
540
613
  }
541
614
  execute$(scope, exec) {
542
615
  const request = this.execToRequest(scope, exec);
543
- return this.executeRequest$(request).pipe(map$1(result => {
616
+ return this.executeRequest$(request).pipe(map(result => {
544
617
  // Keep only requested results
545
618
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
546
619
  var _a;
@@ -557,7 +630,7 @@ class FlowStateService {
557
630
  actions: [{ name: action, inputData }],
558
631
  };
559
632
  const request = this.execToRequest(scope, exec);
560
- return this.executeRequest$(request).pipe(map$1(noop));
633
+ return this.executeRequest$(request).pipe(map(noop));
561
634
  }
562
635
  select$(scope, selectorName, inputData) {
563
636
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -569,7 +642,7 @@ class FlowStateService {
569
642
  },
570
643
  },
571
644
  });
572
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
645
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
573
646
  }
574
647
  subscribe$(scope, selectorName, inputData, options) {
575
648
  const requestId = this.generateRequestId(scope, selectorName, inputData);
@@ -595,7 +668,7 @@ class FlowStateService {
595
668
  this.executeRequest$(request).subscribe();
596
669
  }
597
670
  }
598
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), finalize(() => {
671
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
599
672
  var _a;
600
673
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
601
674
  delete this.subscriptions[requestId];
@@ -603,9 +676,9 @@ class FlowStateService {
603
676
  }));
604
677
  }
605
678
  save$() {
606
- if (this.getFlowSafe().properties.stateful) {
679
+ if (this.flowInfoService.flow.properties.stateful) {
607
680
  if (this.stateId$.value) {
608
- return this.flowStateApiService.save(this.stateId$.value).pipe(tap$1(() => {
681
+ return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
609
682
  Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
610
683
  this.trackedStatefulChangesMap.set(key, false);
611
684
  });
@@ -613,30 +686,26 @@ class FlowStateService {
613
686
  }
614
687
  }
615
688
  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
- }));
689
+ const state = this.salesTransactionService.state;
690
+ if (state) {
691
+ return this.salesTransactionApiService.upsert(state);
621
692
  }
622
693
  }
623
- return of({ quoteId: '' });
694
+ return of({ id: '' });
624
695
  }
625
696
  submit$() {
626
- if (this.getFlowSafe().properties.stateful) {
697
+ if (this.flowInfoService.flow.properties.stateful) {
627
698
  if (this.stateId$.value) {
628
- return this.flowStateApiService.submit(this.stateId$.value);
699
+ return this.flowStateApiService.submit(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })));
629
700
  }
630
701
  }
631
702
  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
- }));
703
+ const state = this.salesTransactionService.state;
704
+ if (state) {
705
+ return this.salesTransactionApiService.submit(state);
637
706
  }
638
707
  }
639
- return of({ quoteId: '' });
708
+ return of({ id: '' });
640
709
  }
641
710
  getFlowStore() {
642
711
  return this.flowStore;
@@ -677,10 +746,10 @@ class FlowStateService {
677
746
  fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
678
747
  }
679
748
  }
680
- const execution$ = this.getFlowSafe().properties.stateful
749
+ const execution$ = this.flowInfoService.flow.properties.stateful
681
750
  ? this.executeStateful$(fullRequest)
682
751
  : this.executeStateless$(fullRequest);
683
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
752
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
684
753
  }
685
754
  handleSelectorsResponse(selectors) {
686
755
  Object.entries(selectors).forEach(([requestId, selectorResult]) => {
@@ -696,32 +765,21 @@ class FlowStateService {
696
765
  });
697
766
  }
698
767
  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
768
  const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
709
769
  const processors = processorsList.length ? processorsList : undefined;
710
770
  const selectors = Object.values(this.subscriptions)
711
771
  .map(({ request }) => request.selectors)
712
772
  .filter(isDefined)
713
773
  .reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
714
- const request = this.getDefaultExecutionRequestDTO();
715
774
  return this.flowStateApiService
716
775
  .init({
717
- quoteId: this.contextService.resolve().headerId,
718
- params: (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {},
776
+ quoteId: this.flowInfoService.context.headerId,
777
+ params: this.flowInfoService.context,
719
778
  actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
720
779
  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,
780
+ selectors: selectors,
723
781
  })
724
- .pipe(map$1(({ stateId, selectors }) => {
782
+ .pipe(map(({ stateId, selectors }) => {
725
783
  this.handleSelectorsResponse(selectors);
726
784
  this.stateId$.next(stateId);
727
785
  }));
@@ -741,80 +799,50 @@ class FlowStateService {
741
799
  };
742
800
  this.executionInProgress$.next(true);
743
801
  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 => {
802
+ }), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
745
803
  this.executionInProgress$.next(false);
746
804
  return throwError(() => e);
747
805
  }));
748
806
  }
749
807
  executeStateful$(request) {
750
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
808
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
751
809
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
752
810
  combineLatest([
753
811
  this.statefulExecutionRequest$,
754
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
755
- ])), map$1(([response]) => response), take$1(1));
812
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
813
+ ])), map(([response]) => response), take(1));
756
814
  }
757
815
  initStateless$() {
758
- var _a;
759
- const { headerId } = this.contextService.resolve();
760
- return this.quoteDraftService.init(headerId, (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {}).pipe(tap$1(() => {
761
- const assets = this.quoteDraftService.assetsState;
762
- if (assets) {
763
- this.flowStore = Object.assign(Object.assign({}, this.flowStore), { assets });
764
- }
765
- }), switchMap(() => {
766
- if (this.flowInfoService.isLegacy) {
767
- return of(null);
768
- }
769
- return this.executeRequest$(this.getDefaultExecutionRequestDTO());
770
- }), switchMap(() => this.calculate$()), tap$1(() => this.quoteDraftService.finalizeInit()), map$1(noop));
771
- }
772
- calculate$() {
773
- var _a;
774
- const flowState = this.quoteDraftService.quoteDraft;
775
- if (!flowState) {
776
- return of(undefined);
777
- }
778
- /*
779
- Don't execute procedures when:
780
- * Initializing a standalone product configuration UI, as procedure is execute in /price call
781
- * Initializing an empty account (account with no assets)
782
- */
783
- const isEmptyAccountMode = this.contextService.mode === ConfigurationContextMode.ACCOUNT &&
784
- !this.quoteDraftService.hasProducts &&
785
- !this.quoteDraftService.hasAssets &&
786
- !((_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.initialState.length);
787
- if (this.quoteDraftService.isStandalone || isEmptyAccountMode) {
788
- return of(undefined);
789
- }
790
- return this.flowConfiguration.calculate$(flowState);
816
+ return this.salesTransactionService.init(this.flowInfoService.context.headerId, this.flowInfoService.context).pipe(switchMap(state => this.flowConfiguration.calculate$(state)), tap(() => this.salesTransactionService.finalizeInit()), map(noop));
791
817
  }
792
818
  executeStateless$(request) {
793
819
  this.executionInProgress$.next(true);
794
- return of(undefined).pipe(tap$1(() => this.executeStatelessActions(request)), switchMap(() => {
820
+ return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
795
821
  var _a;
796
822
  /*
797
823
  Skip price calculation in case
798
824
  1. No actions in the request
799
825
  2. Initialization process execution (state not initialized yet)
800
826
  */
801
- if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
827
+ const { state } = this.salesTransactionService;
828
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
802
829
  return of(undefined);
803
830
  }
804
831
  else {
805
- return this.calculate$();
832
+ return this.flowConfiguration.calculate$(state);
806
833
  }
807
- }), map$1(() => this.executeStatelessSelectors(request)), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
834
+ }), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
808
835
  this.executionInProgress$.next(false);
809
836
  return throwError(() => e);
810
837
  }));
811
838
  }
812
839
  executeStatelessActions(request) {
813
840
  var _a;
814
- if (!this.quoteDraftService.quoteDraft || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
841
+ const state = this.salesTransactionService.state;
842
+ if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
815
843
  return;
816
844
  }
817
- let flowState = this.quoteDraftService.quoteDraft;
845
+ let flowState = state;
818
846
  request.actions.forEach(action => {
819
847
  var _a;
820
848
  try {
@@ -826,1022 +854,126 @@ class FlowStateService {
826
854
  throw e;
827
855
  }
828
856
  });
829
- this.quoteDraftService.updateQuoteDraft(flowState);
857
+ this.salesTransactionService.setState(flowState);
830
858
  }
831
859
  executeStatelessSelectors(request) {
832
860
  var _a;
833
- if (!this.quoteDraftService.quoteDraft) {
834
- throw 'QuoteDraft is not initialized';
861
+ if (!this.salesTransactionService.state) {
862
+ throw 'State is not initialized';
835
863
  }
836
- const flowState = this.quoteDraftService.quoteDraft;
864
+ const flowState = this.salesTransactionService.state;
837
865
  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;
1630
- }
1631
- const assetId = (_a = lineItem.assetId) !== null && _a !== void 0 ? _a : lineItem.openOrderLineItemId;
1632
- return (_b = this.quoteDraftService.assetsState) === null || _b === void 0 ? void 0 : _b.initialState.find(li => assetPredicateFn(li, assetId));
1633
- }
1634
- getUIDefinitionProperties() {
1635
- var _a, _b, _c;
1636
- return Object.assign(Object.assign({}, ((_b = (_a = this.getRuntimeContext().uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {})), ((_c = this.runtimeService.uiDefinitionProperties) !== null && _c !== void 0 ? _c : {}));
1637
- }
1638
- showInactiveProductsConfirmation() {
1639
- const confirmationConfig = {
1640
- title: ' ',
1641
- description: 'This quote contains inactive products. Do you want to remove them?',
1642
- primaryButtonLabel: 'Remove products',
1643
- secondaryButtonLabel: 'Back to Quote',
1644
- };
1645
- this.dialogService
1646
- .open(ConfirmationComponent, {
1647
- dismissableMask: false,
1648
- closeOnEscape: false,
1649
- closable: false,
1650
- showHeader: true,
1651
- header: `Inactive Products in Quote`,
1652
- width: '440px',
1653
- data: { confirmationConfig },
1654
- })
1655
- .onClose.subscribe(result => {
1656
- if (!result) {
1657
- const context = this.contextService.resolve();
1658
- window['VELO_BACK_FN'].apply(null, [context.headerId]);
1659
- }
1660
- });
1661
- }
1662
- }
1663
- ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: QuoteDraftService }, { token: ConfigurationRuntimeService }, { token: ContextService }, { token: i1.ConfigurationApiService }, { token: i5.MessageService }, { token: i6$1.DialogService }, { token: RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
1664
- ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1665
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
1666
- type: Injectable
1667
- }], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: ConfigurationRuntimeService }, { type: ContextService }, { type: i1.ConfigurationApiService }, { type: i5.MessageService }, { type: i6$1.DialogService }, { type: RuntimeSettingsService }]; } });
1668
-
1669
- class FlowConfigurationService {
1670
- constructor(proceduresApiService, contextService, quoteDraftService, updateService, configurationService, flowInfoService) {
1671
- this.proceduresApiService = proceduresApiService;
1672
- this.contextService = contextService;
1673
- this.quoteDraftService = quoteDraftService;
1674
- this.updateService = updateService;
1675
- this.configurationService = configurationService;
1676
- this.flowInfoService = flowInfoService;
1677
- this.updatedSubj$ = new Subject();
1678
- this.updated$ = this.updatedSubj$.asObservable();
1679
- }
1680
- calculate$(quoteDraft) {
1681
- return this.extendedApply$(quoteDraft).pipe(tap$1(result => {
1682
- // sort the result current state based on the quote draft initial state
1683
- const initialStateIds = quoteDraft.initialState.map(lineItem => lineItem.integrationId);
1684
- result.currentState = result.currentState
1685
- .slice()
1686
- .sort((a, b) => initialStateIds.indexOf(a.integrationId) - initialStateIds.indexOf(b.integrationId));
1687
- this.quoteDraftService.updateQuoteDraft(result);
1688
- }), map$1(noop));
1689
- }
1690
- calculate(quoteDraft) {
1691
- this.calculate$(quoteDraft).subscribe();
866
+ try {
867
+ result.selectors[key] = {
868
+ success: true,
869
+ result: this.executeSelectorScript(flowState, selector),
870
+ };
871
+ }
872
+ catch (e) {
873
+ console.error(e);
874
+ result.selectors[key] = {
875
+ success: false,
876
+ errorMessage: String(e),
877
+ };
878
+ }
879
+ return result;
880
+ }, { stateId: '', selectors: {} });
1692
881
  }
1693
- update$(updates) {
1694
- const quoteDraft = this.quoteDraftService.quoteDraft;
1695
- if (!quoteDraft) {
1696
- return of(null);
882
+ initProcessors$() {
883
+ var _a;
884
+ const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
885
+ if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
886
+ // Skip initialization as backend will take processors from SF
887
+ return of(undefined);
1697
888
  }
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);
889
+ const owners$ = Object.values(this.flowInfoService.templates)
890
+ .map(template => {
891
+ var _a, _b, _c;
892
+ if (!template) {
893
+ return;
894
+ }
895
+ 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);
896
+ return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
897
+ const processorsMap = processors.reduce((acc, p) => {
898
+ acc[p.apiName] = p;
899
+ return acc;
900
+ }, {});
901
+ this.processors[template.id] = processorsMap;
902
+ }));
903
+ })
904
+ .filter(isDefined);
905
+ if (!owners$.length) {
906
+ return of(undefined);
1716
907
  }
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());
908
+ return forkJoin(owners$).pipe(map(noop));
1722
909
  }
1723
- revert(lineItemId) {
1724
- this.revert$(lineItemId).subscribe();
1725
- }
1726
- delete$(ids) {
1727
- const quoteDraft = this.quoteDraftService.quoteDraft;
1728
- const currentState = this.quoteDraftService.currentState;
1729
- if (!quoteDraft) {
1730
- return of(null);
910
+ executeActionScript(request, executable) {
911
+ var _a;
912
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
913
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
914
+ const scope = this.getScopeByOwnerId(executable.ownerId);
915
+ const scopeText = scope ? ` in ${scope}` : '';
916
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1731
917
  }
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();
918
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1736
919
  }
1737
- addTerm$(term) {
1738
- const quoteDraft = this.quoteDraftService.quoteDraft;
1739
- if (!quoteDraft) {
1740
- return of(null);
920
+ executeSelectorScript(request, executable) {
921
+ var _a;
922
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
923
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
924
+ const scope = this.getScopeByOwnerId(executable.ownerId);
925
+ const scopeText = scope ? ` in ${scope}` : '';
926
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1741
927
  }
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());
928
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1744
929
  }
1745
- addToCart$(props) {
1746
- const quoteDraft = this.quoteDraftService.quoteDraft;
1747
- if (!quoteDraft) {
1748
- return of(null);
930
+ executeProcessorScript(request, configurationProcessor, inputData) {
931
+ var _a;
932
+ const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
933
+ let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
934
+ if (!functionToExecute) {
935
+ const script = `${configurationProcessor.script}\nreturn transform;`;
936
+ const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
937
+ functionToExecute = new Function(script + sourceMap)();
938
+ this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
1749
939
  }
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$();
940
+ return functionToExecute({
941
+ request,
942
+ inputData,
943
+ flowStore: this.flowStore,
944
+ });
1791
945
  }
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
- };
946
+ generateRequestId(scope, selectorName, inputData) {
947
+ const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
948
+ return `${scope}/${selectorName}/${inputDataHash}`;
1805
949
  }
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;
950
+ checkStatefulChanges(requestId, selectorResult) {
951
+ if (this.trackedStatefulChangesMap.has(requestId)) {
952
+ if (!this.initialStatefulData[requestId]) {
953
+ this.initialStatefulData[requestId] = selectorResult;
954
+ }
955
+ const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
956
+ this.trackedStatefulChangesMap.set(requestId, hasChanges);
1812
957
  }
1813
- return this.proceduresApiService.apply$(request);
1814
958
  }
1815
959
  }
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: [{
960
+ FlowStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, deps: [{ token: FlowConfigurationService }, { token: FlowInfoService }, { token: i3.FlowStateApiService }, { token: i1.ConfigurationProcessorsApiService }, { token: i1.SalesTransactionApiService }, { token: SalesTransactionService }, { token: i6.ToastService }, { token: FLOW_CUSTOMIZATION, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
961
+ FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
962
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
1819
963
  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
- }] });
964
+ }], ctorParameters: function () {
965
+ return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
966
+ type: Optional
967
+ }, {
968
+ type: Inject,
969
+ args: [FLOW_CUSTOMIZATION]
970
+ }] }];
971
+ } });
1834
972
 
1835
973
  class FlowStateConfigurationService {
1836
- constructor(flowInfoService, flowConfigurationService, flowStateApiService, flowStateService) {
974
+ constructor(flowInfoService, flowStateService) {
1837
975
  this.flowInfoService = flowInfoService;
1838
- this.flowConfigurationService = flowConfigurationService;
1839
- this.flowStateApiService = flowStateApiService;
1840
976
  this.flowStateService = flowStateService;
1841
- this.configurationStateId$ = new BehaviorSubject(null);
1842
- }
1843
- get configurationStateId() {
1844
- return this.configurationStateId$.value;
1845
977
  }
1846
978
  addToCart$(props) {
1847
979
  var _a;
@@ -1853,26 +985,22 @@ class FlowStateConfigurationService {
1853
985
  request$ = of();
1854
986
  }
1855
987
  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
- }));
988
+ // TODO: Implement
989
+ request$ = of();
1863
990
  }
1864
991
  }
1865
992
  else {
1866
- request$ = this.flowConfigurationService.addToCart$(props).pipe(map$1(noop));
993
+ // TODO: Implement
994
+ request$ = of();
1867
995
  }
1868
- return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map$1(noop));
996
+ return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
1869
997
  }
1870
998
  }
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 });
999
+ 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
1000
  FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
1873
1001
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
1874
1002
  type: Injectable
1875
- }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: FlowStateService }]; } });
1003
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }]; } });
1876
1004
 
1877
1005
  class IntegrationState {
1878
1006
  constructor() {
@@ -1892,12 +1020,12 @@ class IntegrationState {
1892
1020
  this.action$.next(action);
1893
1021
  }
1894
1022
  listen$(actionType) {
1895
- return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
1023
+ return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
1896
1024
  }
1897
1025
  listenAll$() {
1898
1026
  return this.action$.asObservable();
1899
1027
  }
1900
- clear() {
1028
+ reset() {
1901
1029
  this.stateSubj$.next({});
1902
1030
  }
1903
1031
  }
@@ -1908,8 +1036,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1908
1036
  }] });
1909
1037
 
1910
1038
  class ProductImagesService {
1911
- constructor(productApiService) {
1912
- this.productApiService = productApiService;
1039
+ constructor(productsAdminApiService) {
1040
+ this.productsAdminApiService = productsAdminApiService;
1913
1041
  this.imagesMap$ = new BehaviorSubject({});
1914
1042
  }
1915
1043
  getImageUrl$(productId) {
@@ -1917,161 +1045,178 @@ class ProductImagesService {
1917
1045
  this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
1918
1046
  this.fetchProductImage(productId);
1919
1047
  }
1920
- return this.imagesMap$.pipe(map$1(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1048
+ return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
1921
1049
  }
1922
1050
  fetchProductImage(productId) {
1923
- this.productApiService
1051
+ this.productsAdminApiService
1924
1052
  .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 }))))
1053
+ .pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
1926
1054
  .subscribe();
1927
1055
  }
1928
1056
  }
1929
- ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1057
+ ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductsAdminApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1930
1058
  ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
1931
1059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
1932
1060
  type: Injectable
1933
- }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
1061
+ }], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
1934
1062
 
1935
- class RuntimeContextService {
1936
- constructor(configurationApiService) {
1937
- this.configurationApiService = configurationApiService;
1938
- }
1939
- getRuntimeContext(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId) {
1940
- return this.configurationApiService
1941
- .getRuntimeDataByProductId(productId, offeringId, defaultUIDefinitionId, requiredUIDefinitionId)
1942
- .pipe(map(runtimeData => {
1943
- var _a;
1944
- const uiDefinitionContainer = this.getUIDefinitionContainer(runtimeData);
1945
- const runtimeModel = RuntimeModel.create(runtimeData.types, runtimeData.products);
1946
- const { productName, properties } = (_a = Array.from(runtimeModel.components.values()).find(c => c.productId === productId)) !== null && _a !== void 0 ? _a : {};
1947
- const uiDefinitionProperties = uiDefinitionContainer === null || uiDefinitionContainer === void 0 ? void 0 : uiDefinitionContainer.source.properties;
1948
- return {
1949
- modelId: runtimeData.modelId,
1950
- uiDefinitionContainer: uiDefinitionContainer,
1951
- runtimeModel: runtimeModel,
1952
- runtimeMode: RuntimeMode.PROD,
1953
- productId: productId,
1954
- productType: (properties === null || properties === void 0 ? void 0 : properties['displayName']) || productName,
1955
- offeringId: offeringId,
1956
- properties: {
1957
- PricingEnabled: (uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.pricingEnabled) ? 'true' : 'false',
1958
- PriceListId: uiDefinitionProperties === null || uiDefinitionProperties === void 0 ? void 0 : uiDefinitionProperties.priceList,
1959
- },
1960
- };
1961
- }));
1063
+ class CatalogProductsService {
1064
+ constructor() {
1065
+ this.stateSubj$ = new BehaviorSubject(null);
1066
+ this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
1962
1067
  }
1963
- getUIDefinitionContainer(runtimeData) {
1964
- var _a;
1965
- const containers = runtimeData.uiDefinitions.filter(container => isNotLegacyUIDefinition(container.source));
1966
- return (_a = containers.find(container => container.source.primary)) !== null && _a !== void 0 ? _a : containers[0];
1068
+ get state() {
1069
+ return this.stateSubj$.getValue();
1070
+ }
1071
+ reset() {
1072
+ this.stateSubj$.next(null);
1073
+ }
1074
+ setState(state) {
1075
+ this.stateSubj$.next(state);
1967
1076
  }
1968
1077
  }
1969
- RuntimeContextService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, deps: [{ token: i1.ConfigurationApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1970
- RuntimeContextService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService });
1971
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: RuntimeContextService, decorators: [{
1078
+ CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1079
+ CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
1080
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
1972
1081
  type: Injectable
1973
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }]; } });
1082
+ }] });
1974
1083
 
1975
- class ConfigurationRuntimeService {
1976
- constructor(apiService, contextService, runtimeContextService) {
1977
- this.apiService = apiService;
1978
- this.contextService = contextService;
1979
- this.runtimeContextService = runtimeContextService;
1980
- this._isInitialized = false;
1981
- this.uiDefinitionProperties = {};
1084
+ class ConfigurationService {
1085
+ get state$() {
1086
+ return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
1982
1087
  }
1983
- reset() {
1984
- this._isInitialized = false;
1985
- this._runtimeContext = undefined;
1986
- this.initializationProps = undefined;
1987
- this.uiDefinitionProperties = {};
1088
+ get state() {
1089
+ return this.configurationStateSubj$.getValue();
1090
+ }
1091
+ get previousState() {
1092
+ return this.previousConfigurationStateSubj$.getValue();
1093
+ }
1094
+ get root$() {
1095
+ return this.state$.pipe(map$1(state => state.salesTransaction.salesTransactionItems[0]), filter$1(isDefined));
1988
1096
  }
1989
- initTestMode(uiDefinitionContainer) {
1097
+ get root() {
1990
1098
  var _a, _b;
1991
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1992
- const uiDefinitionExternals = (_b = uiDefinitionContainer.source.externals) !== null && _b !== void 0 ? _b : {};
1993
- return combineLatest([
1994
- this.apiService.getRuntimeDataByModelId(uiDefinitionContainer.modelId),
1995
- this.contextService.initTestMode(),
1996
- ]).pipe(first(), map(([runtimeData, context]) => {
1997
- var _a;
1998
- this.contextService.update({
1999
- 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),
2000
- });
2001
- this._runtimeContext = {
2002
- modelId: uiDefinitionContainer.modelId,
2003
- runtimeModel: RuntimeModel.create(runtimeData.types, runtimeData.products),
2004
- runtimeMode: RuntimeMode.TEST,
2005
- uiDefinitionContainer,
2006
- };
2007
- return this._runtimeContext;
2008
- }), tap(() => (this._isInitialized = true)));
1099
+ return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
2009
1100
  }
2010
- init(props) {
2011
- this.initializationProps = props;
2012
- const context = this.contextService.resolve();
2013
- return this.runtimeContextService
2014
- .getRuntimeContext(props.productId, props.offeringId, props.defaultUIDefinitionId, props.requiredUIDefinitionId)
2015
- .pipe(tap(runtimeContext => {
2016
- var _a, _b, _c, _d;
2017
- this.uiDefinitionProperties = (_b = (_a = runtimeContext.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {};
2018
- const { PriceListId } = (_c = context.properties) !== null && _c !== void 0 ? _c : {};
2019
- const mergeContext = Object.assign(Object.assign({}, runtimeContext), { properties: Object.assign(Object.assign(Object.assign({}, runtimeContext.properties), context.properties), { PricingEnabled: PriceListId ? 'true' : 'false' }) });
2020
- this.id15to18('AccountId', mergeContext.properties);
2021
- this._runtimeContext = mergeContext;
2022
- if (context.properties && ((_d = this._runtimeContext.properties) === null || _d === void 0 ? void 0 : _d.StartDate)) {
2023
- this.contextService.update({
2024
- properties: Object.assign(Object.assign({}, this._runtimeContext.properties), context.properties),
2025
- });
2026
- }
2027
- return this._runtimeContext;
2028
- }), tap(() => (this._isInitialized = true)));
1101
+ constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService) {
1102
+ this.flowInfoService = flowInfoService;
1103
+ this.messageService = messageService;
1104
+ this.configurationRuntimeService = configurationRuntimeService;
1105
+ this.salesTransactionService = salesTransactionService;
1106
+ this.orchestrationsApiService = orchestrationsApiService;
1107
+ this.hasUnsavedChanges = false;
1108
+ this.configurationStateSubj$ = new BehaviorSubject(null);
1109
+ this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
1110
+ this.isLoadingSubj$ = new BehaviorSubject(false);
1111
+ this.isLoading$ = this.isLoadingSubj$.asObservable();
2029
1112
  }
2030
- overrideUIDefinition(uiDefinitionContainer) {
1113
+ reset() {
1114
+ this.hasUnsavedChanges = false;
1115
+ this.configurationStateSubj$.next(null);
1116
+ this.previousConfigurationStateSubj$.next(null);
1117
+ }
1118
+ init$() {
2031
1119
  var _a;
2032
- if (!this._runtimeContext) {
2033
- return;
1120
+ const { state } = this.salesTransactionService;
1121
+ const { productId, transactionItemId } = this.flowInfoService.context;
1122
+ if (!state || !productId) {
1123
+ return of(undefined);
1124
+ }
1125
+ const salesTransactionItems = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
1126
+ let isRootGenerated = false;
1127
+ let transactionItem = salesTransactionItems.find(item => item.id === transactionItemId);
1128
+ if (!transactionItem) {
1129
+ transactionItem = salesTransactionItems.find(item => item.productId === productId);
1130
+ }
1131
+ if (!transactionItem) {
1132
+ transactionItem = generateTransactionItem(productId);
1133
+ isRootGenerated = true;
2034
1134
  }
2035
- this._runtimeContext.uiDefinitionContainer = uiDefinitionContainer;
2036
- this.uiDefinitionProperties = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
1135
+ const configurationState = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: transactionItem ? [transactionItem] : [] }) });
1136
+ return (isRootGenerated ? this.configureRequest$(configurationState) : of(configurationState)).pipe(tap$1(configurationState => {
1137
+ this.configurationStateSubj$.next(configurationState);
1138
+ this.previousConfigurationStateSubj$.next(configurationState);
1139
+ }), map$1(noop));
2037
1140
  }
2038
- id15to18(propertyName, source) {
2039
- if (!source) {
2040
- return;
1141
+ patch$(transactionItem) {
1142
+ const { state, root } = this;
1143
+ if (!state) {
1144
+ return throwError(() => new Error(`Configuration State is not initialized`));
2041
1145
  }
2042
- const value = source[propertyName];
2043
- if (typeof value === 'string' && value.length === 15) {
2044
- source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
1146
+ if (!root) {
1147
+ return throwError(() => new Error(`Root SalesTransactionItem not found`));
2045
1148
  }
1149
+ const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
1150
+ const newTransactionContext = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [newRoot] }) });
1151
+ return this.configureRequest$(newTransactionContext).pipe(catchError$1(error => {
1152
+ console.error(error);
1153
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
1154
+ this.messageService.add({ severity: 'error', summary: error });
1155
+ }
1156
+ return throwError(() => error);
1157
+ }), tap$1(() => {
1158
+ if (!this.hasUnsavedChanges) {
1159
+ this.hasUnsavedChanges = true;
1160
+ }
1161
+ }), map$1(noop));
2046
1162
  }
2047
- get isInitialized() {
2048
- return this._isInitialized;
1163
+ patch(transactionItem) {
1164
+ this.patch$(transactionItem).subscribe();
2049
1165
  }
2050
- get runtimeModel() {
2051
- var _a;
2052
- return (_a = this.runtimeContext) === null || _a === void 0 ? void 0 : _a.runtimeModel;
1166
+ configureRequest$(transactionContext) {
1167
+ const request = {
1168
+ transactionContext,
1169
+ flowId: this.flowInfoService.flow.id,
1170
+ };
1171
+ this.isLoadingSubj$.next(true);
1172
+ return this.orchestrationsApiService.apply$(request).pipe(tap$1(result => {
1173
+ this.configurationStateSubj$.next(result);
1174
+ this.previousConfigurationStateSubj$.next(cloneDeep(result));
1175
+ }), catchError$1(error => throwError(() => {
1176
+ const resetState = this.previousConfigurationStateSubj$.getValue();
1177
+ if (resetState) {
1178
+ this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
1179
+ this.configurationStateSubj$.next(resetState);
1180
+ }
1181
+ if (error.error) {
1182
+ return extractErrorDetails(error.error).join('. ');
1183
+ }
1184
+ return error.message || JSON.stringify(error);
1185
+ })), finalize$1(() => this.isLoadingSubj$.next(false)));
1186
+ }
1187
+ configureExternal$(props) {
1188
+ // TODO: implement
1189
+ throw new Error('Not implemented');
2053
1190
  }
2054
- get runtimeContext() {
2055
- return this._runtimeContext;
1191
+ configureGuidedSelling$(data) {
1192
+ // TODO: implement
1193
+ throw new Error('Not implemented');
1194
+ }
1195
+ getPCMModel() {
1196
+ const pcmModel = this.configurationRuntimeService.pcmModel;
1197
+ if (!pcmModel) {
1198
+ throw new Error('PCM model not initialized');
1199
+ }
1200
+ return pcmModel;
2056
1201
  }
2057
1202
  }
2058
- 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 });
2059
- ConfigurationRuntimeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService });
2060
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationRuntimeService, decorators: [{
1203
+ ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: FlowInfoService }, { token: i2.MessageService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: i1.OrchestrationsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
1204
+ ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
1205
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
2061
1206
  type: Injectable
2062
- }], ctorParameters: function () { return [{ type: i1.ConfigurationApiService }, { type: ContextService }, { type: RuntimeContextService }]; } });
1207
+ }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }]; } });
2063
1208
 
2064
1209
  class ConfigurationStateService {
2065
- constructor(configurationRuntimeService, configurationService, quoteDraftService, toastService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, quoteApiService) {
1210
+ constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
2066
1211
  this.configurationRuntimeService = configurationRuntimeService;
2067
1212
  this.configurationService = configurationService;
2068
- this.quoteDraftService = quoteDraftService;
2069
- this.toastService = toastService;
2070
1213
  this.flowStateService = flowStateService;
2071
1214
  this.flowInfoService = flowInfoService;
2072
1215
  this.flowConfigurationService = flowConfigurationService;
2073
1216
  this.flowStateApiService = flowStateApiService;
2074
- this.quoteApiService = quoteApiService;
1217
+ this.salesTransactionService = salesTransactionService;
1218
+ this.salesTransactionApiService = salesTransactionApiService;
1219
+ this.toastService = toastService;
2075
1220
  this.isInitialized$ = new BehaviorSubject(false);
2076
1221
  this.canceledConfiguration$ = new Subject();
2077
1222
  this.NOT_INITIALIZED = Symbol();
@@ -2095,9 +1240,9 @@ class ConfigurationStateService {
2095
1240
  request$ = this.initStateful$();
2096
1241
  }
2097
1242
  else {
2098
- request$ = this.initStateless$();
1243
+ request$ = this.configurationService.init$();
2099
1244
  }
2100
- return request$.pipe(finalize(() => {
1245
+ return request$.pipe(take(1), tap(() => {
2101
1246
  this.isInitialized$.next(true);
2102
1247
  this.canceledConfiguration$ = new Subject();
2103
1248
  }));
@@ -2111,10 +1256,11 @@ class ConfigurationStateService {
2111
1256
  this.configurationStore = {};
2112
1257
  this.executedFunctions = {};
2113
1258
  this.configurationService.reset();
1259
+ this.configurationRuntimeService.reset();
2114
1260
  }
2115
1261
  execute$(exec) {
2116
1262
  const request = this.execToRequest(exec);
2117
- return this.executeRequest$(request).pipe(map$1(result => {
1263
+ return this.executeRequest$(request).pipe(map(result => {
2118
1264
  // Keep only requested results
2119
1265
  const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
2120
1266
  var _a;
@@ -2137,7 +1283,7 @@ class ConfigurationStateService {
2137
1283
  }
2138
1284
  // prevent parallel configuration requests in stateless mode
2139
1285
  if (!this.statelessExecutionRequest$) {
2140
- this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay$1(), take$1(1), finalize(() => (this.statelessExecutionRequest$ = null)));
1286
+ this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
2141
1287
  }
2142
1288
  return this.statelessExecutionRequest$;
2143
1289
  }
@@ -2151,7 +1297,7 @@ class ConfigurationStateService {
2151
1297
  },
2152
1298
  },
2153
1299
  });
2154
- return this.executeRequest$(request).pipe(map$1(response => response.selectors[requestId]));
1300
+ return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
2155
1301
  }
2156
1302
  subscribe$(selectorName, inputData = {}, options) {
2157
1303
  const requestId = UUID.UUID();
@@ -2174,58 +1320,42 @@ class ConfigurationStateService {
2174
1320
  this.executeRequest$(request).subscribe();
2175
1321
  }
2176
1322
  }
2177
- return subscription.data$.pipe(filter$1(data => data != this.NOT_INITIALIZED), map$1(data => data), distinctUntilChanged(), finalize(() => {
1323
+ return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
2178
1324
  var _a;
2179
1325
  if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
2180
1326
  delete this.subscriptions[requestId];
2181
1327
  }
2182
1328
  }), takeUntil(this.canceledConfiguration$));
2183
1329
  }
2184
- saveConfiguration(flow) {
2185
- var _a, _b, _c, _d;
1330
+ saveConfiguration() {
1331
+ var _a, _b;
2186
1332
  if (this.isStatefulConfiguration) {
2187
- return this.flowStateApiService
2188
- .saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '')
2189
- .pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map$1(() => r))));
1333
+ 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 })));
1334
+ }
1335
+ const state = this.salesTransactionService.state;
1336
+ if (!state) {
1337
+ return of({ id: '' });
1338
+ }
1339
+ const { standalone } = this.flowInfoService.flow.properties;
1340
+ if (standalone) {
1341
+ return this.salesTransactionApiService.upsert(state);
1342
+ }
1343
+ const transactionContext = this.salesTransactionService.state;
1344
+ const configurationRoot = this.configurationService.root;
1345
+ if (!transactionContext || !configurationRoot) {
1346
+ return of({ id: '' });
1347
+ }
1348
+ const stateItems = transactionContext.salesTransaction.salesTransactionItems;
1349
+ const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
1350
+ let salesTransactionItems;
1351
+ if (isNewTransactionItem) {
1352
+ salesTransactionItems = [...stateItems, configurationRoot];
2190
1353
  }
2191
1354
  else {
2192
- if (!flow) {
2193
- const quoteDraft = this.quoteDraftService.quoteDraft;
2194
- if (!quoteDraft) {
2195
- return of({ quoteId: '' });
2196
- }
2197
- const rootLineItem = this.configurationService.getSnapshot();
2198
- const asset = this.configurationService.getAsset();
2199
- const currentState = rootLineItem ? [rootLineItem] : [];
2200
- const initialState = asset ? [asset] : [];
2201
- return this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }));
2202
- }
2203
- else {
2204
- const quoteDraft = this.quoteDraftService.quoteDraft;
2205
- const lineItem = this.configurationService.getSnapshot();
2206
- if (!quoteDraft || !lineItem) {
2207
- return of({ quoteId: '' });
2208
- }
2209
- const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
2210
- let currentState;
2211
- if (isNewLineItem) {
2212
- currentState = [...quoteDraft.currentState, lineItem];
2213
- }
2214
- else {
2215
- currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
2216
- }
2217
- const asset = this.configurationService.getAsset();
2218
- const initialState = [...((_d = (_c = this.quoteDraftService.quoteDraft) === null || _c === void 0 ? void 0 : _c.initialState) !== null && _d !== void 0 ? _d : [])];
2219
- if (asset) {
2220
- if (!initialState.some(li => li.id === asset.id)) {
2221
- initialState.push(asset);
2222
- }
2223
- }
2224
- return this.flowConfigurationService
2225
- .calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))
2226
- .pipe(map$1(() => ({ quoteId: '' })));
2227
- }
1355
+ salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
2228
1356
  }
1357
+ const newState = Object.assign(Object.assign({}, transactionContext), { salesTransaction: Object.assign(Object.assign({}, transactionContext.salesTransaction), { salesTransactionItems }) });
1358
+ return this.flowConfigurationService.calculate$(newState).pipe(map(() => ({ id: '' })));
2229
1359
  }
2230
1360
  cancelConfiguration() {
2231
1361
  var _a, _b;
@@ -2246,37 +1376,33 @@ class ConfigurationStateService {
2246
1376
  return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
2247
1377
  }
2248
1378
  initStateful$() {
2249
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
2250
- 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 : '';
2251
- const lineItemId = (_e = (_d = this.configurationRuntimeService.runtimeContext) === null || _d === void 0 ? void 0 : _d.properties) === null || _e === void 0 ? void 0 : _e.lineItemId;
2252
- if (!this.flowStateService.stateId) {
1379
+ var _a, _b, _c, _d, _e, _f;
1380
+ this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
1381
+ const { productId, transactionItemId } = this.flowInfoService.context;
1382
+ if (!productId || !this.flowStateService.stateId) {
2253
1383
  return of(undefined);
2254
1384
  }
2255
- const container = (_f = this.configurationRuntimeService.runtimeContext) === null || _f === void 0 ? void 0 : _f.uiDefinitionContainer;
2256
- const lineItem = this.configurationService.generateLineItem();
1385
+ const container = this.configurationRuntimeService.uiDefinitionContainer;
2257
1386
  let request$;
2258
- if (!lineItemId) {
1387
+ if (!transactionItemId) {
2259
1388
  request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
2260
- lineItem,
2261
- 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 }))),
2262
- 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 }))),
1389
+ transactionItem: generateTransactionItem(productId),
1390
+ 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 }))),
1391
+ 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 }))),
2263
1392
  });
2264
1393
  }
2265
1394
  else {
2266
1395
  request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
2267
- lineItemId,
2268
- 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 }))),
2269
- 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 }))),
1396
+ transactionItemId,
1397
+ 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 }))),
1398
+ 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 }))),
2270
1399
  });
2271
1400
  }
2272
- return request$.pipe(map$1(r => {
1401
+ return request$.pipe(map(r => {
2273
1402
  this.stateId = r.stateId;
2274
1403
  return undefined;
2275
1404
  }));
2276
1405
  }
2277
- initStateless$() {
2278
- return this.configurationService.configure().pipe(map$1(() => undefined));
2279
- }
2280
1406
  execToRequest(exec) {
2281
1407
  var _a;
2282
1408
  return {
@@ -2322,39 +1448,37 @@ class ConfigurationStateService {
2322
1448
  else {
2323
1449
  execution$ = this.executeStateless$(fullRequest);
2324
1450
  }
2325
- return execution$.pipe(tap$1(result => this.handleSelectorsResponse(result.selectors)));
1451
+ return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
2326
1452
  }
2327
1453
  executeStateless$(request) {
2328
1454
  this.executionInProgress$.next(true);
2329
- return of(undefined).pipe(switchMap(() => {
1455
+ return this.configurationService.state$.pipe(first(), switchMap(state => {
2330
1456
  var _a;
2331
1457
  // Apply actions and execute configuration/price call
2332
1458
  // No need to run configuration if no actions in the request
2333
1459
  if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
2334
1460
  return of(undefined);
2335
1461
  }
2336
- let configurationRequest = this.configurationService.generateRequest(false);
2337
1462
  request.actions.forEach(action => {
2338
1463
  var _a;
2339
- configurationRequest = (_a = this.executeActionScript(configurationRequest, action)) !== null && _a !== void 0 ? _a : configurationRequest;
1464
+ state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
2340
1465
  });
2341
- configurationRequest = ConfigurationTranslatorUtils.lightenConfigurationRequest(configurationRequest);
2342
- return this.configurationService.configureRequest$(configurationRequest);
2343
- }), map$1(() => {
1466
+ return this.configurationService.configureRequest$(state);
1467
+ }), map(() => {
2344
1468
  // Run selectors and apply them to the state
2345
- const configurationState = this.configurationService.stateSnapshot;
1469
+ const configurationState = this.configurationService.state;
2346
1470
  if (!configurationState) {
2347
1471
  return { stateId: '', selectors: {} };
2348
1472
  }
2349
1473
  return this.runStatelessSelectors(request, configurationState);
2350
- }), tap$1(() => this.executionInProgress$.next(false)), catchError(error => {
2351
- const configurationState = this.configurationService.previousStateSnapshot;
1474
+ }), tap(() => this.executionInProgress$.next(false)), catchError(error => {
1475
+ const configurationState = this.configurationService.previousState;
2352
1476
  if (configurationState) {
2353
1477
  const selectorsResult = this.runStatelessSelectors(request, configurationState);
2354
1478
  this.handleSelectorsResponse(selectorsResult.selectors);
2355
1479
  }
2356
1480
  this.executionInProgress$.next(false);
2357
- if (!this.configurationRuntimeService.uiDefinitionProperties.suppressToastMessages) {
1481
+ if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
2358
1482
  this.toastService.add({ severity: ToastType.error, summary: String(error) });
2359
1483
  }
2360
1484
  return throwError(() => error);
@@ -2375,22 +1499,22 @@ class ConfigurationStateService {
2375
1499
  };
2376
1500
  this.executionInProgress$.next(true);
2377
1501
  return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
2378
- }), tap$1(({ stateId }) => (this.stateId = stateId)), share(), tap$1(() => this.executionInProgress$.next(false)), catchError(e => {
1502
+ }), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
2379
1503
  this.executionInProgress$.next(false);
2380
1504
  return throwError(() => e);
2381
1505
  }));
2382
1506
  }
2383
1507
  executeStateful$(request) {
2384
- return this.executionInProgress$.pipe(filter$1(inProgress => !inProgress), take$1(1), switchMap(() =>
1508
+ return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
2385
1509
  // make sure stream switches to statefulExecutionRequest$ before pushing an execution request
2386
1510
  combineLatest([
2387
1511
  this.statefulExecutionRequest$,
2388
- of(undefined).pipe(tap$1(() => this.statefulRequestStream$.next(request))),
2389
- ])), map$1(([response]) => response), take$1(1));
1512
+ of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
1513
+ ])), map(([response]) => response), take(1));
2390
1514
  }
2391
1515
  executeActionScript(request, processor) {
2392
- var _a, _b;
2393
- const { actions } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1516
+ var _a;
1517
+ const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2394
1518
  const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
2395
1519
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2396
1520
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2398,8 +1522,8 @@ class ConfigurationStateService {
2398
1522
  return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
2399
1523
  }
2400
1524
  executeSelectorScript(request, processor) {
2401
- var _a, _b;
2402
- const { selectors } = (_b = (_a = this.configurationRuntimeService.runtimeContext) === null || _a === void 0 ? void 0 : _a.uiDefinitionContainer) !== null && _b !== void 0 ? _b : {};
1525
+ var _a;
1526
+ const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
2403
1527
  const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
2404
1528
  if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
2405
1529
  throw `ConfigurationProcessor ${processor.apiName} not found`;
@@ -2441,25 +1565,52 @@ class ConfigurationStateService {
2441
1565
  }, { stateId: '', selectors: {} });
2442
1566
  }
2443
1567
  }
2444
- 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 });
1568
+ ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token: FlowStateService }, { token: FlowInfoService }, { token: FlowConfigurationService }, { token: i3.FlowStateApiService }, { token: SalesTransactionService }, { token: i1.SalesTransactionApiService }, { token: i6.ToastService }], target: i0.ɵɵFactoryTarget.Injectable });
2445
1569
  ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
2446
1570
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
2447
1571
  type: Injectable
2448
- }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: QuoteDraftService }, { type: i6.ToastService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }]; } });
1572
+ }], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type: FlowStateService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i3.FlowStateApiService }, { type: SalesTransactionService }, { type: i1.SalesTransactionApiService }, { type: i6.ToastService }]; } });
2449
1573
 
2450
1574
  class ConfigurationModule {
2451
1575
  }
2452
1576
  ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2453
1577
  ConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, imports: [ConfirmationDialogModule, ApiModule] });
2454
- ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService], imports: [ConfirmationDialogModule, ApiModule] });
1578
+ ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
1579
+ ConfigurationService,
1580
+ ConfigurationStateService,
1581
+ ConfigurationRuntimeService,
1582
+ TestModeConfigurationService,
1583
+ ], imports: [ConfirmationDialogModule, ApiModule] });
2455
1584
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
2456
1585
  type: NgModule,
2457
1586
  args: [{
2458
1587
  imports: [ConfirmationDialogModule, ApiModule],
2459
- providers: [ConfigurationRuntimeService, RuntimeContextService, ConfigurationService, ConfigurationStateService],
1588
+ providers: [
1589
+ ConfigurationService,
1590
+ ConfigurationStateService,
1591
+ ConfigurationRuntimeService,
1592
+ TestModeConfigurationService,
1593
+ ],
1594
+ }]
1595
+ }] });
1596
+
1597
+ class FlowConfigurationModule {
1598
+ }
1599
+ FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1600
+ FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
1601
+ FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
1602
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
1603
+ type: NgModule,
1604
+ args: [{
1605
+ imports: [ApiModule],
1606
+ providers: [FlowConfigurationService],
2460
1607
  }]
2461
1608
  }] });
2462
1609
 
1610
+ const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
1611
+
1612
+ const UI_DEFINITION_VERSION = 3;
1613
+
2463
1614
  const DEFAULT_FORMATTING_SETTINGS = {
2464
1615
  currencySymbol: DEFAULT_CURRENCY_SYMBOL,
2465
1616
  decimalsCount: DEFAULT_DECIMALS_COUNT,
@@ -2473,14 +1624,14 @@ class SdkCoreModule {
2473
1624
  SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
2474
1625
  SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
2475
1626
  SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
2476
- ContextService,
2477
1627
  FlowInfoService,
2478
- QuoteDraftService,
2479
1628
  ProductImagesService,
2480
1629
  IntegrationState,
2481
1630
  FlowStateService,
2482
1631
  FlowStateConfigurationService,
2483
1632
  RuntimeSettingsService,
1633
+ SalesTransactionService,
1634
+ CatalogProductsService,
2484
1635
  {
2485
1636
  provide: FORMATTING_SETTINGS_TOKEN,
2486
1637
  useExisting: RuntimeSettingsService,
@@ -2491,14 +1642,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2491
1642
  args: [{
2492
1643
  imports: [ConfigurationModule, FlowConfigurationModule],
2493
1644
  providers: [
2494
- ContextService,
2495
1645
  FlowInfoService,
2496
- QuoteDraftService,
2497
1646
  ProductImagesService,
2498
1647
  IntegrationState,
2499
1648
  FlowStateService,
2500
1649
  FlowStateConfigurationService,
2501
1650
  RuntimeSettingsService,
1651
+ SalesTransactionService,
1652
+ CatalogProductsService,
2502
1653
  {
2503
1654
  provide: FORMATTING_SETTINGS_TOKEN,
2504
1655
  useExisting: RuntimeSettingsService,
@@ -2556,6 +1707,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2556
1707
  }]
2557
1708
  }] });
2558
1709
 
1710
+ function filterSuccessfulExecute() {
1711
+ return (source) => source.pipe(filter((result) => result.success), map(r => r.result));
1712
+ }
1713
+
2559
1714
  class DatePipe {
2560
1715
  constructor() {
2561
1716
  var _a;
@@ -2683,5 +1838,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2683
1838
  * Generated bundle index. Do not edit.
2684
1839
  */
2685
1840
 
2686
- 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 };
1841
+ export { ActionCodePipe, CalendarDirective, CatalogProductsService, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, IntegrationState, NumberPipe, PricePipe, ProductImagesService, RuntimeSettingsService, SalesTransactionService, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, TestModeConfigurationService, TransactionItemWorker, UI_DEFINITION_VERSION, extractMetadata, filterSuccessfulExecute, findTransactionItem, findTransactionItemWithComparator, generateTransactionItem, insertTransactionItem, removeTransactionItem, replaceTransactionItem };
2687
1842
  //# sourceMappingURL=veloceapps-sdk-core.mjs.map