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