@veloceapps/sdk 11.0.0-10 → 11.0.0-100
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 +23 -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 +74 -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 +12 -89
- 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 +42 -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 +900 -1670
- package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2015/veloceapps-sdk.mjs +192 -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 +976 -1755
- package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
- package/fesm2020/veloceapps-sdk.mjs +192 -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 +5 -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,265 @@ 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) {
|
360
|
+
this.flowInfoService = flowInfoService;
|
361
|
+
this.configurationService = configurationService;
|
362
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
363
|
+
this.salesTransactionService = salesTransactionService;
|
364
|
+
this.runtimeSettingsService = runtimeSettingsService;
|
365
|
+
this.isInitialized = false;
|
366
|
+
}
|
367
|
+
initTestMode$(uiDefinitionContainer, options) {
|
368
|
+
var _a;
|
369
|
+
this.configurationRuntimeService.uiDefinitionContainer = uiDefinitionContainer;
|
370
|
+
if (this.checkInitialized(uiDefinitionContainer)) {
|
371
|
+
this.configurationRuntimeService.pcmModel = this.pcmModel;
|
372
|
+
return of(undefined);
|
373
|
+
}
|
374
|
+
this.configurationService.reset();
|
375
|
+
const { productId, quoteId, flowId } = (_a = uiDefinitionContainer.source.properties) !== null && _a !== void 0 ? _a : {};
|
376
|
+
if (!productId) {
|
377
|
+
return throwError(() => 'Unable to start the Configuration Preview: Product is missing.');
|
378
|
+
}
|
379
|
+
if (!quoteId) {
|
380
|
+
return throwError(() => `Unable to start the Configuration Preview: Quote is missing.`);
|
381
|
+
}
|
382
|
+
if (!flowId) {
|
383
|
+
return throwError(() => `Unable to start the Configuration Preview: Flow is missing.`);
|
384
|
+
}
|
385
|
+
return this.runtimeSettingsService.create().pipe(switchMap(() => this.flowInfoService.init$(flowId, { productId, headerId: quoteId })), switchMap(() => this.configurationRuntimeService.init$({ productId })), tap(pcmModel => (this.pcmModel = pcmModel)), switchMap(() => {
|
386
|
+
if (options === null || options === void 0 ? void 0 : options.customizationMode) {
|
387
|
+
return of(undefined);
|
388
|
+
}
|
389
|
+
return this.initConfiguration$(quoteId);
|
390
|
+
}), tap(() => (this.isInitialized = true)), map(noop));
|
391
|
+
}
|
392
|
+
initConfiguration$(quoteId) {
|
393
|
+
this.salesTransactionService.setState(this.getTestTransactionContext(quoteId));
|
394
|
+
return this.configurationService.init$().pipe(switchMap(() => this.configurationService.state
|
395
|
+
? this.configurationService.configure$(this.configurationService.state)
|
396
|
+
: of(undefined)), map(noop));
|
397
|
+
}
|
398
|
+
getTestTransactionContext(quoteId) {
|
399
|
+
const testTransaction = {
|
400
|
+
id: quoteId,
|
401
|
+
businessObjectType: 'Quote',
|
402
|
+
salesTransactionItems: [],
|
403
|
+
};
|
404
|
+
return {
|
405
|
+
salesTransaction: testTransaction,
|
406
|
+
transactionId: quoteId,
|
407
|
+
businessObjectType: 'Quote',
|
408
|
+
nodes: {},
|
409
|
+
id: UUID.UUID(),
|
410
|
+
attributes: {},
|
411
|
+
};
|
412
|
+
}
|
413
|
+
checkInitialized(uiDefinitionContainer) {
|
414
|
+
var _a;
|
415
|
+
return this.isInitialized && !!((_a = uiDefinitionContainer.source.properties) === null || _a === void 0 ? void 0 : _a.persistTestState);
|
416
|
+
}
|
417
|
+
}
|
418
|
+
TestModeConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, deps: [{ token: FlowInfoService }, { token: ConfigurationService }, { token: ConfigurationRuntimeService }, { token: SalesTransactionService }, { token: RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
|
419
|
+
TestModeConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService });
|
420
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: TestModeConfigurationService, decorators: [{
|
421
|
+
type: Injectable
|
422
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: ConfigurationService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: RuntimeSettingsService }]; } });
|
423
|
+
|
424
|
+
class GuidedSellingService {
|
425
|
+
constructor(orchestrationsApiService) {
|
426
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
427
|
+
this.guidedSellingResult$ = new BehaviorSubject({});
|
428
|
+
}
|
429
|
+
get guidedSellingResult() {
|
430
|
+
return this.guidedSellingResult$.value;
|
431
|
+
}
|
432
|
+
configureGuidedSelling$(data) {
|
433
|
+
return this.orchestrationsApiService
|
434
|
+
.apply$({
|
435
|
+
transactionContext: this.getTransactionContext(data.attributesMap),
|
436
|
+
orchestrationName: data.orchestrationName,
|
437
|
+
})
|
438
|
+
.pipe(map(transactionContext => {
|
439
|
+
var _a, _b;
|
440
|
+
const guidedSellingNode = (_a = transactionContext.nodes['GuidedSelling']) === null || _a === void 0 ? void 0 : _a[0];
|
441
|
+
const guidedSellingResult = ((_b = guidedSellingNode === null || guidedSellingNode === void 0 ? void 0 : guidedSellingNode.attributes) === null || _b === void 0 ? void 0 : _b['result']) || {};
|
442
|
+
this.guidedSellingResult$.next(guidedSellingResult);
|
443
|
+
return guidedSellingResult;
|
444
|
+
}));
|
445
|
+
}
|
446
|
+
clearGuidedSelling$() {
|
447
|
+
this.guidedSellingResult$.next({});
|
448
|
+
}
|
449
|
+
getTransactionContext(guidedSellingAttributes) {
|
450
|
+
const testTransaction = {
|
451
|
+
id: UUID.UUID(),
|
452
|
+
businessObjectType: 'Quote',
|
453
|
+
salesTransactionItems: [],
|
454
|
+
attributes: {},
|
455
|
+
};
|
456
|
+
return {
|
457
|
+
salesTransaction: testTransaction,
|
458
|
+
transactionId: UUID.UUID(),
|
459
|
+
businessObjectType: 'Quote',
|
460
|
+
nodes: {
|
461
|
+
GuidedSelling: [
|
462
|
+
{
|
463
|
+
id: UUID.UUID(),
|
464
|
+
attributes: {},
|
465
|
+
nodes: {},
|
466
|
+
properties: { guidedSellingAttributes },
|
467
|
+
},
|
468
|
+
],
|
469
|
+
},
|
470
|
+
id: UUID.UUID(),
|
471
|
+
attributes: {},
|
472
|
+
};
|
473
|
+
}
|
474
|
+
}
|
475
|
+
GuidedSellingService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService, deps: [{ token: i1.OrchestrationsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
476
|
+
GuidedSellingService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService });
|
477
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: GuidedSellingService, decorators: [{
|
478
|
+
type: Injectable
|
479
|
+
}], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }]; } });
|
480
|
+
|
481
|
+
class SalesTransactionService {
|
257
482
|
get isInitialized$() {
|
258
483
|
return this.isInitializedSubj$.asObservable();
|
259
484
|
}
|
260
485
|
get isInitialized() {
|
261
486
|
return this.isInitializedSubj$.getValue();
|
262
487
|
}
|
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
488
|
set hasUnsavedChanges(value) {
|
272
489
|
var _a, _b;
|
273
|
-
this.
|
274
|
-
if (!this.
|
275
|
-
this.
|
490
|
+
this.hasUnsavedChangesSubj$.next(value);
|
491
|
+
if (!this.hasUnsavedChanges) {
|
492
|
+
this.initialState = (_b = (_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems) !== null && _b !== void 0 ? _b : [];
|
276
493
|
}
|
277
494
|
}
|
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);
|
495
|
+
get hasUnsavedChanges() {
|
496
|
+
return this.hasUnsavedChangesSubj$.getValue();
|
284
497
|
}
|
285
|
-
get
|
286
|
-
return this.
|
498
|
+
get state() {
|
499
|
+
return this.stateSubj$.getValue();
|
287
500
|
}
|
288
|
-
get
|
501
|
+
get hasProducts() {
|
289
502
|
var _a;
|
290
|
-
return Boolean((_a = this.
|
291
|
-
}
|
292
|
-
get assetsState() {
|
293
|
-
return this.assetsSubj$.value;
|
503
|
+
return Boolean((_a = this.state) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems.length);
|
294
504
|
}
|
295
|
-
constructor(
|
296
|
-
this.
|
297
|
-
this.
|
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);
|
505
|
+
constructor(salesTransactionApiService) {
|
506
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
507
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
303
508
|
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;
|
509
|
+
this.hasUnsavedChangesSubj$ = new BehaviorSubject(false);
|
510
|
+
this.initialState = [];
|
511
|
+
this.hasUnsavedChanges$ = this.hasUnsavedChangesSubj$.asObservable();
|
512
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
317
513
|
}
|
318
514
|
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);
|
515
|
+
return this.salesTransactionApiService.query(headerId, params).pipe(tap(res => {
|
516
|
+
if (!res.salesTransaction) {
|
517
|
+
throw new Error('SalesTransaction is not defined. Please check Query Orchestration.');
|
334
518
|
}
|
335
|
-
|
519
|
+
this.stateSubj$.next(res);
|
520
|
+
}));
|
336
521
|
}
|
337
522
|
finalizeInit() {
|
338
|
-
this.
|
523
|
+
this.isInitializedSubj$.next(true);
|
339
524
|
this.hasUnsavedChanges = false;
|
340
525
|
}
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
}
|
346
|
-
this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: lineItems }));
|
526
|
+
reset() {
|
527
|
+
this.stateSubj$.next(null);
|
528
|
+
this.isInitializedSubj$.next(false);
|
529
|
+
this.hasUnsavedChangesSubj$.next(false);
|
347
530
|
}
|
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));
|
531
|
+
getInitialState() {
|
532
|
+
return this.initialState;
|
357
533
|
}
|
358
|
-
|
359
|
-
|
360
|
-
if (!quoteDraft) {
|
361
|
-
return;
|
362
|
-
}
|
363
|
-
const updatedCurrentState = this.currentState.map(lineItem => {
|
364
|
-
const updated = priceSummary.lineItems.find(li => li.id === lineItem.id);
|
365
|
-
return updated !== null && updated !== void 0 ? updated : lineItem;
|
366
|
-
});
|
367
|
-
this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedCurrentState, totalPrices: priceSummary.totalPrices, approvalItems: priceSummary.approvalItems }));
|
368
|
-
}
|
369
|
-
setAssetsState(assetsState) {
|
370
|
-
this.assetsSubj$.next(assetsState);
|
371
|
-
}
|
372
|
-
get quoteDraft$() {
|
373
|
-
return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
|
374
|
-
}
|
375
|
-
get quoteDraft() {
|
376
|
-
const quote = this.quoteSubj$.value;
|
377
|
-
if (!quote) {
|
378
|
-
return null;
|
379
|
-
}
|
380
|
-
return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
|
381
|
-
}
|
382
|
-
get currentState$() {
|
383
|
-
return this.quoteDraft$.pipe(map(quote => quote.currentState));
|
534
|
+
setState(state) {
|
535
|
+
this.stateSubj$.next(state);
|
384
536
|
}
|
385
|
-
|
386
|
-
|
387
|
-
|
537
|
+
}
|
538
|
+
SalesTransactionService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, deps: [{ token: i1.SalesTransactionApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
539
|
+
SalesTransactionService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService });
|
540
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SalesTransactionService, decorators: [{
|
541
|
+
type: Injectable
|
542
|
+
}], ctorParameters: function () { return [{ type: i1.SalesTransactionApiService }]; } });
|
543
|
+
|
544
|
+
class FlowConfigurationService {
|
545
|
+
constructor(orchestrationsApiService, salesTransactionService, flowInfoService) {
|
546
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
547
|
+
this.salesTransactionService = salesTransactionService;
|
548
|
+
this.flowInfoService = flowInfoService;
|
549
|
+
this.updatedSubj$ = new Subject();
|
550
|
+
this.updated$ = this.updatedSubj$.asObservable();
|
388
551
|
}
|
389
|
-
|
390
|
-
|
391
|
-
|
552
|
+
calculate$(state) {
|
553
|
+
return this.orchestrationsApiService
|
554
|
+
.apply$({ transactionContext: state, flowId: this.flowInfoService.flow.id })
|
555
|
+
.pipe(tap(result => this.salesTransactionService.setState(result)), map(noop));
|
392
556
|
}
|
393
|
-
|
394
|
-
|
557
|
+
calculate(state) {
|
558
|
+
this.calculate$(state).subscribe();
|
395
559
|
}
|
396
|
-
|
397
|
-
|
560
|
+
revert$(transactionItemId) {
|
561
|
+
var _a;
|
562
|
+
const state = this.salesTransactionService.state;
|
563
|
+
const initialState = this.salesTransactionService.getInitialState();
|
564
|
+
const currentState = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
|
565
|
+
const currentItemIndex = currentState.findIndex(({ id }) => id === transactionItemId);
|
566
|
+
const currentItem = currentState[currentItemIndex];
|
567
|
+
const initialItem = initialState.find(({ integrationId }) => integrationId === (currentItem === null || currentItem === void 0 ? void 0 : currentItem.integrationId));
|
568
|
+
if (!state || !currentItem || !initialItem) {
|
569
|
+
return of(null);
|
570
|
+
}
|
571
|
+
const updatedState = cloneDeep(currentState);
|
572
|
+
updatedState.splice(currentItemIndex, 1, initialItem);
|
573
|
+
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
574
|
}
|
399
|
-
|
400
|
-
|
575
|
+
revert(transactionItemId) {
|
576
|
+
this.revert$(transactionItemId).subscribe();
|
401
577
|
}
|
402
|
-
|
403
|
-
const
|
404
|
-
if (
|
405
|
-
return
|
406
|
-
}
|
407
|
-
if (context.mode === ConfigurationContextMode.QUOTE) {
|
408
|
-
return context.properties.Status === 'Draft';
|
578
|
+
delete$(ids) {
|
579
|
+
const state = this.salesTransactionService.state;
|
580
|
+
if (!state) {
|
581
|
+
return of(null);
|
409
582
|
}
|
410
|
-
return
|
583
|
+
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
584
|
}
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
585
|
+
delete(ids) {
|
586
|
+
this.delete$(ids).subscribe();
|
587
|
+
}
|
588
|
+
handleErrorAndBounceBack() {
|
589
|
+
return (source$) => {
|
590
|
+
return source$.pipe(catchError(error => {
|
591
|
+
console.error(error);
|
592
|
+
// bounce back if configuration call has failed
|
593
|
+
const state = this.salesTransactionService.state;
|
594
|
+
if (state) {
|
595
|
+
this.salesTransactionService.setState(state);
|
596
|
+
this.updatedSubj$.next();
|
597
|
+
}
|
598
|
+
return throwError(() => error);
|
599
|
+
}));
|
600
|
+
};
|
419
601
|
}
|
420
602
|
}
|
421
|
-
|
422
|
-
|
423
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
603
|
+
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 });
|
604
|
+
FlowConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService });
|
605
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationService, decorators: [{
|
424
606
|
type: Injectable
|
425
|
-
}], ctorParameters: function () { return [{ type:
|
607
|
+
}], ctorParameters: function () { return [{ type: i1.OrchestrationsApiService }, { type: SalesTransactionService }, { type: FlowInfoService }]; } });
|
426
608
|
|
427
609
|
class FlowStateService {
|
428
|
-
constructor(
|
429
|
-
this.contextService = contextService;
|
430
|
-
this.quoteDraftService = quoteDraftService;
|
431
|
-
this.flowInfoService = flowInfoService;
|
610
|
+
constructor(flowConfiguration, flowInfoService, flowStateApiService, processorsApiService, salesTransactionApiService, salesTransactionService, toastService, customizationService) {
|
432
611
|
this.flowConfiguration = flowConfiguration;
|
433
|
-
this.
|
612
|
+
this.flowInfoService = flowInfoService;
|
434
613
|
this.flowStateApiService = flowStateApiService;
|
435
|
-
this.
|
614
|
+
this.processorsApiService = processorsApiService;
|
615
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
616
|
+
this.salesTransactionService = salesTransactionService;
|
436
617
|
this.toastService = toastService;
|
437
618
|
this.customizationService = customizationService;
|
438
619
|
this.NOT_INITIALIZED = Symbol();
|
@@ -449,68 +630,22 @@ class FlowStateService {
|
|
449
630
|
this.cleanup$ = new Subject();
|
450
631
|
this.statefulExecutionRequest$ = this.initBufferedRequest$();
|
451
632
|
/*
|
452
|
-
In stateless mode watch
|
453
|
-
all subscriptions get their updates according to updated
|
633
|
+
In stateless mode watch State changes and call executeRequest so that
|
634
|
+
all subscriptions get their updates according to updated State
|
454
635
|
*/
|
455
636
|
this.isInitialized$()
|
456
|
-
.pipe(filter
|
637
|
+
.pipe(filter(Boolean), filter(() => !this.flowInfoService.flow.properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
|
457
638
|
.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
639
|
}
|
503
640
|
init$() {
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
|
510
|
-
}
|
511
|
-
}));
|
641
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
642
|
+
return this.initProcessors$().pipe(switchMap(() => this.initStateful$()));
|
643
|
+
}
|
644
|
+
else {
|
645
|
+
return forkJoin([this.initStateless$(), this.initProcessors$()]).pipe(map(noop));
|
646
|
+
}
|
512
647
|
}
|
513
|
-
|
648
|
+
reset() {
|
514
649
|
Object.values(this.subscriptions).forEach(({ data$ }) => data$.complete());
|
515
650
|
this.subscriptions = {};
|
516
651
|
if (this.stateId$.value) {
|
@@ -522,9 +657,9 @@ class FlowStateService {
|
|
522
657
|
this.cleanup$.next();
|
523
658
|
}
|
524
659
|
get hasUnsavedChanges() {
|
525
|
-
return this.
|
660
|
+
return this.flowInfoService.flow.properties.stateful
|
526
661
|
? Array.from(this.trackedStatefulChangesMap.values()).some(Boolean)
|
527
|
-
: this.
|
662
|
+
: this.salesTransactionService.hasUnsavedChanges;
|
528
663
|
}
|
529
664
|
get stateId() {
|
530
665
|
return this.stateId$.value;
|
@@ -533,14 +668,14 @@ class FlowStateService {
|
|
533
668
|
return this.executionInProgress$.asObservable();
|
534
669
|
}
|
535
670
|
isInitialized$() {
|
536
|
-
return combineLatest([this.stateId$, this.
|
671
|
+
return combineLatest([this.stateId$, this.salesTransactionService.isInitialized$]).pipe(map(values => values.some(Boolean)));
|
537
672
|
}
|
538
673
|
isInitialized() {
|
539
|
-
return Boolean(this.stateId$.value) || this.
|
674
|
+
return Boolean(this.stateId$.value) || this.salesTransactionService.isInitialized;
|
540
675
|
}
|
541
676
|
execute$(scope, exec) {
|
542
677
|
const request = this.execToRequest(scope, exec);
|
543
|
-
return this.executeRequest$(request).pipe(map
|
678
|
+
return this.executeRequest$(request).pipe(map(result => {
|
544
679
|
// Keep only requested results
|
545
680
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
546
681
|
var _a;
|
@@ -557,7 +692,7 @@ class FlowStateService {
|
|
557
692
|
actions: [{ name: action, inputData }],
|
558
693
|
};
|
559
694
|
const request = this.execToRequest(scope, exec);
|
560
|
-
return this.executeRequest$(request).pipe(map
|
695
|
+
return this.executeRequest$(request).pipe(map(noop));
|
561
696
|
}
|
562
697
|
select$(scope, selectorName, inputData) {
|
563
698
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -569,7 +704,7 @@ class FlowStateService {
|
|
569
704
|
},
|
570
705
|
},
|
571
706
|
});
|
572
|
-
return this.executeRequest$(request).pipe(map
|
707
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
573
708
|
}
|
574
709
|
subscribe$(scope, selectorName, inputData, options) {
|
575
710
|
const requestId = this.generateRequestId(scope, selectorName, inputData);
|
@@ -595,7 +730,7 @@ class FlowStateService {
|
|
595
730
|
this.executeRequest$(request).subscribe();
|
596
731
|
}
|
597
732
|
}
|
598
|
-
return subscription.data$.pipe(filter
|
733
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), finalize(() => {
|
599
734
|
var _a;
|
600
735
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
601
736
|
delete this.subscriptions[requestId];
|
@@ -603,9 +738,9 @@ class FlowStateService {
|
|
603
738
|
}));
|
604
739
|
}
|
605
740
|
save$() {
|
606
|
-
if (this.
|
741
|
+
if (this.flowInfoService.flow.properties.stateful) {
|
607
742
|
if (this.stateId$.value) {
|
608
|
-
return this.flowStateApiService.save(this.stateId$.value).pipe(tap
|
743
|
+
return this.flowStateApiService.save(this.stateId$.value).pipe(map(({ quoteId }) => ({ id: quoteId })), tap(() => {
|
609
744
|
Array.from(this.trackedStatefulChangesMap.keys()).forEach(key => {
|
610
745
|
this.trackedStatefulChangesMap.set(key, false);
|
611
746
|
});
|
@@ -613,30 +748,16 @@ class FlowStateService {
|
|
613
748
|
}
|
614
749
|
}
|
615
750
|
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
|
-
}));
|
751
|
+
const state = this.salesTransactionService.state;
|
752
|
+
if (state) {
|
753
|
+
const request = {
|
754
|
+
transactionContext: state,
|
755
|
+
flowId: this.flowInfoService.flow.id,
|
756
|
+
};
|
757
|
+
return this.salesTransactionApiService.save(request).pipe(map(id => ({ id })));
|
637
758
|
}
|
638
759
|
}
|
639
|
-
return of({
|
760
|
+
return of({ id: '' });
|
640
761
|
}
|
641
762
|
getFlowStore() {
|
642
763
|
return this.flowStore;
|
@@ -677,10 +798,10 @@ class FlowStateService {
|
|
677
798
|
fullRequest.selectors = assign(fullRequest.selectors, subscription.request.selectors);
|
678
799
|
}
|
679
800
|
}
|
680
|
-
const execution$ = this.
|
801
|
+
const execution$ = this.flowInfoService.flow.properties.stateful
|
681
802
|
? this.executeStateful$(fullRequest)
|
682
803
|
: this.executeStateless$(fullRequest);
|
683
|
-
return execution$.pipe(tap
|
804
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
684
805
|
}
|
685
806
|
handleSelectorsResponse(selectors) {
|
686
807
|
Object.entries(selectors).forEach(([requestId, selectorResult]) => {
|
@@ -696,32 +817,21 @@ class FlowStateService {
|
|
696
817
|
});
|
697
818
|
}
|
698
819
|
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
820
|
const processorsList = flatten(Object.values(this.processors).map(ownerMap => Object.values(ownerMap !== null && ownerMap !== void 0 ? ownerMap : {})));
|
709
821
|
const processors = processorsList.length ? processorsList : undefined;
|
710
822
|
const selectors = Object.values(this.subscriptions)
|
711
823
|
.map(({ request }) => request.selectors)
|
712
824
|
.filter(isDefined)
|
713
825
|
.reduce((trunk, selectors) => (Object.assign(Object.assign({}, trunk), selectors)), {});
|
714
|
-
const request = this.getDefaultExecutionRequestDTO();
|
715
826
|
return this.flowStateApiService
|
716
827
|
.init({
|
717
|
-
quoteId: this.
|
718
|
-
params:
|
828
|
+
quoteId: this.flowInfoService.context.headerId,
|
829
|
+
params: this.flowInfoService.context,
|
719
830
|
actionsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.ACTION),
|
720
831
|
selectorsOverride: processors === null || processors === void 0 ? void 0 : processors.filter(processor => processor.type === ConfigurationProcessorTypes.SELECTOR),
|
721
|
-
selectors:
|
722
|
-
actions: request.actions,
|
832
|
+
selectors: selectors,
|
723
833
|
})
|
724
|
-
.pipe(map
|
834
|
+
.pipe(map(({ stateId, selectors }) => {
|
725
835
|
this.handleSelectorsResponse(selectors);
|
726
836
|
this.stateId$.next(stateId);
|
727
837
|
}));
|
@@ -741,80 +851,50 @@ class FlowStateService {
|
|
741
851
|
};
|
742
852
|
this.executionInProgress$.next(true);
|
743
853
|
return this.flowStateApiService.execute(this.stateId$.value, request);
|
744
|
-
}), tap
|
854
|
+
}), tap(({ stateId }) => this.stateId$.next(stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
745
855
|
this.executionInProgress$.next(false);
|
746
856
|
return throwError(() => e);
|
747
857
|
}));
|
748
858
|
}
|
749
859
|
executeStateful$(request) {
|
750
|
-
return this.executionInProgress$.pipe(filter
|
860
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
751
861
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
752
862
|
combineLatest([
|
753
863
|
this.statefulExecutionRequest$,
|
754
|
-
of(undefined).pipe(tap
|
755
|
-
])), map
|
864
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
865
|
+
])), map(([response]) => response), take(1));
|
756
866
|
}
|
757
867
|
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);
|
868
|
+
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
869
|
}
|
792
870
|
executeStateless$(request) {
|
793
871
|
this.executionInProgress$.next(true);
|
794
|
-
return of(undefined).pipe(tap
|
872
|
+
return of(undefined).pipe(tap(() => this.executeStatelessActions(request)), switchMap(() => {
|
795
873
|
var _a;
|
796
874
|
/*
|
797
875
|
Skip price calculation in case
|
798
876
|
1. No actions in the request
|
799
877
|
2. Initialization process execution (state not initialized yet)
|
800
878
|
*/
|
801
|
-
|
879
|
+
const { state } = this.salesTransactionService;
|
880
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length) || !this.isInitialized()) {
|
802
881
|
return of(undefined);
|
803
882
|
}
|
804
883
|
else {
|
805
|
-
return this.calculate$();
|
884
|
+
return this.flowConfiguration.calculate$(state);
|
806
885
|
}
|
807
|
-
}), map
|
886
|
+
}), map(() => this.executeStatelessSelectors(request)), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
808
887
|
this.executionInProgress$.next(false);
|
809
888
|
return throwError(() => e);
|
810
889
|
}));
|
811
890
|
}
|
812
891
|
executeStatelessActions(request) {
|
813
892
|
var _a;
|
814
|
-
|
893
|
+
const state = this.salesTransactionService.state;
|
894
|
+
if (!state || !((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
815
895
|
return;
|
816
896
|
}
|
817
|
-
let flowState =
|
897
|
+
let flowState = state;
|
818
898
|
request.actions.forEach(action => {
|
819
899
|
var _a;
|
820
900
|
try {
|
@@ -826,14 +906,14 @@ class FlowStateService {
|
|
826
906
|
throw e;
|
827
907
|
}
|
828
908
|
});
|
829
|
-
this.
|
909
|
+
this.salesTransactionService.setState(flowState);
|
830
910
|
}
|
831
911
|
executeStatelessSelectors(request) {
|
832
912
|
var _a;
|
833
|
-
if (!this.
|
834
|
-
throw '
|
913
|
+
if (!this.salesTransactionService.state) {
|
914
|
+
throw 'State is not initialized';
|
835
915
|
}
|
836
|
-
const flowState = this.
|
916
|
+
const flowState = this.salesTransactionService.state;
|
837
917
|
return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
|
838
918
|
try {
|
839
919
|
result.selectors[key] = {
|
@@ -844,1019 +924,111 @@ class FlowStateService {
|
|
844
924
|
catch (e) {
|
845
925
|
console.error(e);
|
846
926
|
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();
|
927
|
+
success: false,
|
928
|
+
errorMessage: String(e),
|
929
|
+
};
|
930
|
+
}
|
931
|
+
return result;
|
932
|
+
}, { stateId: '', selectors: {} });
|
1707
933
|
}
|
1708
|
-
|
1709
|
-
|
1710
|
-
|
1711
|
-
|
934
|
+
initProcessors$() {
|
935
|
+
var _a;
|
936
|
+
const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
|
937
|
+
if (this.flowInfoService.flow.properties.stateful && !hasOverrides) {
|
938
|
+
// Skip initialization as backend will take processors from SF
|
939
|
+
return of(undefined);
|
1712
940
|
}
|
1713
|
-
|
1714
|
-
|
1715
|
-
|
1716
|
-
|
1717
|
-
|
1718
|
-
|
1719
|
-
|
1720
|
-
|
1721
|
-
|
1722
|
-
|
1723
|
-
|
1724
|
-
|
1725
|
-
|
1726
|
-
|
1727
|
-
|
1728
|
-
|
1729
|
-
if (!
|
1730
|
-
return of(
|
941
|
+
const owners$ = Object.values(this.flowInfoService.templates)
|
942
|
+
.map(template => {
|
943
|
+
var _a, _b, _c;
|
944
|
+
if (!template) {
|
945
|
+
return;
|
946
|
+
}
|
947
|
+
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);
|
948
|
+
return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap(processors => {
|
949
|
+
const processorsMap = processors.reduce((acc, p) => {
|
950
|
+
acc[p.apiName] = p;
|
951
|
+
return acc;
|
952
|
+
}, {});
|
953
|
+
this.processors[template.id] = processorsMap;
|
954
|
+
}));
|
955
|
+
})
|
956
|
+
.filter(isDefined);
|
957
|
+
if (!owners$.length) {
|
958
|
+
return of(undefined);
|
1731
959
|
}
|
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();
|
960
|
+
return forkJoin(owners$).pipe(map(noop));
|
1740
961
|
}
|
1741
|
-
|
1742
|
-
|
1743
|
-
const
|
1744
|
-
if (!
|
1745
|
-
|
962
|
+
executeActionScript(request, executable) {
|
963
|
+
var _a;
|
964
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
965
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
966
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
967
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
968
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1746
969
|
}
|
1747
|
-
return
|
1748
|
-
}
|
1749
|
-
delete(ids) {
|
1750
|
-
this.delete$(ids).subscribe();
|
970
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1751
971
|
}
|
1752
|
-
|
1753
|
-
|
1754
|
-
|
1755
|
-
|
972
|
+
executeSelectorScript(request, executable) {
|
973
|
+
var _a;
|
974
|
+
const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
|
975
|
+
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
976
|
+
const scope = this.getScopeByOwnerId(executable.ownerId);
|
977
|
+
const scopeText = scope ? ` in ${scope}` : '';
|
978
|
+
throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
|
1756
979
|
}
|
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());
|
980
|
+
return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
|
1759
981
|
}
|
1760
|
-
|
1761
|
-
|
1762
|
-
|
1763
|
-
|
982
|
+
executeProcessorScript(request, configurationProcessor, inputData) {
|
983
|
+
var _a;
|
984
|
+
const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
|
985
|
+
let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
|
986
|
+
if (!functionToExecute) {
|
987
|
+
const script = `${configurationProcessor.script}\nreturn transform;`;
|
988
|
+
const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
|
989
|
+
functionToExecute = new Function(script + sourceMap)();
|
990
|
+
this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
|
1764
991
|
}
|
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$();
|
992
|
+
return functionToExecute({
|
993
|
+
request,
|
994
|
+
inputData,
|
995
|
+
flowStore: this.flowStore,
|
996
|
+
});
|
1806
997
|
}
|
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
|
-
};
|
998
|
+
generateRequestId(scope, selectorName, inputData) {
|
999
|
+
const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
|
1000
|
+
return `${scope}/${selectorName}/${inputDataHash}`;
|
1820
1001
|
}
|
1821
|
-
|
1822
|
-
|
1823
|
-
|
1824
|
-
|
1825
|
-
|
1826
|
-
|
1002
|
+
checkStatefulChanges(requestId, selectorResult) {
|
1003
|
+
if (this.trackedStatefulChangesMap.has(requestId)) {
|
1004
|
+
if (!this.initialStatefulData[requestId]) {
|
1005
|
+
this.initialStatefulData[requestId] = selectorResult;
|
1006
|
+
}
|
1007
|
+
const hasChanges = !isEqual(this.initialStatefulData[requestId], selectorResult);
|
1008
|
+
this.trackedStatefulChangesMap.set(requestId, hasChanges);
|
1827
1009
|
}
|
1828
|
-
return this.proceduresApiService.apply$(request);
|
1829
1010
|
}
|
1830
1011
|
}
|
1831
|
-
|
1832
|
-
|
1833
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1012
|
+
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 });
|
1013
|
+
FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
|
1014
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
|
1834
1015
|
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
|
-
}] });
|
1016
|
+
}], ctorParameters: function () {
|
1017
|
+
return [{ type: FlowConfigurationService }, { type: FlowInfoService }, { type: i3.FlowStateApiService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.SalesTransactionApiService }, { type: SalesTransactionService }, { type: i6.ToastService }, { type: undefined, decorators: [{
|
1018
|
+
type: Optional
|
1019
|
+
}, {
|
1020
|
+
type: Inject,
|
1021
|
+
args: [FLOW_CUSTOMIZATION]
|
1022
|
+
}] }];
|
1023
|
+
} });
|
1849
1024
|
|
1850
1025
|
class FlowStateConfigurationService {
|
1851
|
-
constructor(flowInfoService,
|
1026
|
+
constructor(flowInfoService, flowStateService, configurationService, salesTransactionService, flowConfigurationService) {
|
1852
1027
|
this.flowInfoService = flowInfoService;
|
1853
|
-
this.flowConfigurationService = flowConfigurationService;
|
1854
|
-
this.flowStateApiService = flowStateApiService;
|
1855
1028
|
this.flowStateService = flowStateService;
|
1856
|
-
this.
|
1857
|
-
|
1858
|
-
|
1859
|
-
return this.configurationStateId$.value;
|
1029
|
+
this.configurationService = configurationService;
|
1030
|
+
this.salesTransactionService = salesTransactionService;
|
1031
|
+
this.flowConfigurationService = flowConfigurationService;
|
1860
1032
|
}
|
1861
1033
|
addToCart$(props) {
|
1862
1034
|
var _a;
|
@@ -1868,26 +1040,42 @@ class FlowStateConfigurationService {
|
|
1868
1040
|
request$ = of();
|
1869
1041
|
}
|
1870
1042
|
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
|
-
}));
|
1043
|
+
// TODO: Implement
|
1044
|
+
request$ = of();
|
1878
1045
|
}
|
1879
1046
|
}
|
1880
1047
|
else {
|
1881
|
-
request$ = this.
|
1048
|
+
request$ = this.configureExternal$(props);
|
1882
1049
|
}
|
1883
|
-
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map
|
1050
|
+
return request$.pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(noop));
|
1051
|
+
}
|
1052
|
+
configureExternal$(props) {
|
1053
|
+
var _a, _b;
|
1054
|
+
const { state } = this.salesTransactionService;
|
1055
|
+
if (!state) {
|
1056
|
+
return of();
|
1057
|
+
}
|
1058
|
+
const stateToConfigure = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [
|
1059
|
+
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]) => ({
|
1060
|
+
attributeName,
|
1061
|
+
value,
|
1062
|
+
})) }),
|
1063
|
+
] }) });
|
1064
|
+
return this.configurationService.justConfigureRequest$(stateToConfigure).pipe(switchMap(configurationResult => {
|
1065
|
+
const state = this.salesTransactionService.state;
|
1066
|
+
const addedProduct = configurationResult.salesTransaction.salesTransactionItems[0];
|
1067
|
+
if (!state || !addedProduct) {
|
1068
|
+
return of();
|
1069
|
+
}
|
1070
|
+
return this.flowConfigurationService.calculate$(Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [...state.salesTransaction.salesTransactionItems, addedProduct] }) }));
|
1071
|
+
}));
|
1884
1072
|
}
|
1885
1073
|
}
|
1886
|
-
FlowStateConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, deps: [{ token: FlowInfoService }, { token:
|
1074
|
+
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
1075
|
FlowStateConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService });
|
1888
1076
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateConfigurationService, decorators: [{
|
1889
1077
|
type: Injectable
|
1890
|
-
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type:
|
1078
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowStateService }, { type: ConfigurationService }, { type: SalesTransactionService }, { type: FlowConfigurationService }]; } });
|
1891
1079
|
|
1892
1080
|
class IntegrationState {
|
1893
1081
|
constructor() {
|
@@ -1907,12 +1095,12 @@ class IntegrationState {
|
|
1907
1095
|
this.action$.next(action);
|
1908
1096
|
}
|
1909
1097
|
listen$(actionType) {
|
1910
|
-
return this.action$.pipe(filter
|
1098
|
+
return this.action$.pipe(filter(action => action.type === actionType), map(action => action.payload));
|
1911
1099
|
}
|
1912
1100
|
listenAll$() {
|
1913
1101
|
return this.action$.asObservable();
|
1914
1102
|
}
|
1915
|
-
|
1103
|
+
reset() {
|
1916
1104
|
this.stateSubj$.next({});
|
1917
1105
|
}
|
1918
1106
|
}
|
@@ -1923,8 +1111,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
1923
1111
|
}] });
|
1924
1112
|
|
1925
1113
|
class ProductImagesService {
|
1926
|
-
constructor(
|
1927
|
-
this.
|
1114
|
+
constructor(productsAdminApiService) {
|
1115
|
+
this.productsAdminApiService = productsAdminApiService;
|
1928
1116
|
this.imagesMap$ = new BehaviorSubject({});
|
1929
1117
|
}
|
1930
1118
|
getImageUrl$(productId) {
|
@@ -1932,161 +1120,187 @@ class ProductImagesService {
|
|
1932
1120
|
this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
|
1933
1121
|
this.fetchProductImage(productId);
|
1934
1122
|
}
|
1935
|
-
return this.imagesMap$.pipe(map
|
1123
|
+
return this.imagesMap$.pipe(map(imagesMap => { var _a; return (_a = imagesMap[productId]) !== null && _a !== void 0 ? _a : null; }), distinctUntilChanged());
|
1936
1124
|
}
|
1937
1125
|
fetchProductImage(productId) {
|
1938
|
-
this.
|
1126
|
+
this.productsAdminApiService
|
1939
1127
|
.fetchImage$(productId)
|
1940
|
-
.pipe(map
|
1128
|
+
.pipe(map(file => URL.createObjectURL(file)), catchError(() => of('')), tap(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
|
1941
1129
|
.subscribe();
|
1942
1130
|
}
|
1943
1131
|
}
|
1944
|
-
ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.
|
1132
|
+
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
1133
|
ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService });
|
1946
1134
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ProductImagesService, decorators: [{
|
1947
1135
|
type: Injectable
|
1948
|
-
}], ctorParameters: function () { return [{ type: i1.
|
1136
|
+
}], ctorParameters: function () { return [{ type: i1.ProductsAdminApiService }]; } });
|
1949
1137
|
|
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
|
-
}));
|
1138
|
+
class CatalogProductsService {
|
1139
|
+
constructor() {
|
1140
|
+
this.stateSubj$ = new BehaviorSubject(null);
|
1141
|
+
this.state$ = this.stateSubj$.asObservable().pipe(filter(isDefined));
|
1977
1142
|
}
|
1978
|
-
|
1979
|
-
|
1980
|
-
|
1981
|
-
|
1143
|
+
get state() {
|
1144
|
+
return this.stateSubj$.getValue();
|
1145
|
+
}
|
1146
|
+
reset() {
|
1147
|
+
this.stateSubj$.next(null);
|
1148
|
+
}
|
1149
|
+
setState(state) {
|
1150
|
+
this.stateSubj$.next(state);
|
1982
1151
|
}
|
1983
1152
|
}
|
1984
|
-
|
1985
|
-
|
1986
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1153
|
+
CatalogProductsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
1154
|
+
CatalogProductsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService });
|
1155
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: CatalogProductsService, decorators: [{
|
1987
1156
|
type: Injectable
|
1988
|
-
}]
|
1157
|
+
}] });
|
1989
1158
|
|
1990
|
-
class
|
1991
|
-
constructor(
|
1992
|
-
this.
|
1993
|
-
this.
|
1994
|
-
this.
|
1995
|
-
this.
|
1996
|
-
this.
|
1159
|
+
class ConfigurationService {
|
1160
|
+
constructor(flowInfoService, messageService, configurationRuntimeService, salesTransactionService, orchestrationsApiService, guidedSellingService) {
|
1161
|
+
this.flowInfoService = flowInfoService;
|
1162
|
+
this.messageService = messageService;
|
1163
|
+
this.configurationRuntimeService = configurationRuntimeService;
|
1164
|
+
this.salesTransactionService = salesTransactionService;
|
1165
|
+
this.orchestrationsApiService = orchestrationsApiService;
|
1166
|
+
this.guidedSellingService = guidedSellingService;
|
1167
|
+
this.hasUnsavedChanges = false;
|
1168
|
+
this.configurationStateSubj$ = new BehaviorSubject(null);
|
1169
|
+
this.previousConfigurationStateSubj$ = new BehaviorSubject(null);
|
1170
|
+
this.isLoadingSubj$ = new BehaviorSubject(false);
|
1171
|
+
this.isLoading$ = this.isLoadingSubj$.asObservable();
|
1997
1172
|
}
|
1998
|
-
|
1999
|
-
this.
|
2000
|
-
|
2001
|
-
|
2002
|
-
this.
|
1173
|
+
get state$() {
|
1174
|
+
return this.configurationStateSubj$.asObservable().pipe(filter$1(isDefined));
|
1175
|
+
}
|
1176
|
+
get state() {
|
1177
|
+
return this.configurationStateSubj$.getValue();
|
1178
|
+
}
|
1179
|
+
get previousState() {
|
1180
|
+
return this.previousConfigurationStateSubj$.getValue();
|
1181
|
+
}
|
1182
|
+
get root$() {
|
1183
|
+
return this.state$.pipe(map$1(state => state.salesTransaction.salesTransactionItems[0]), filter$1(isDefined));
|
2003
1184
|
}
|
2004
|
-
|
1185
|
+
get root() {
|
2005
1186
|
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)));
|
1187
|
+
return (_b = (_a = this.configurationStateSubj$.getValue()) === null || _a === void 0 ? void 0 : _a.salesTransaction.salesTransactionItems[0]) !== null && _b !== void 0 ? _b : null;
|
2024
1188
|
}
|
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)));
|
1189
|
+
reset() {
|
1190
|
+
this.hasUnsavedChanges = false;
|
1191
|
+
this.configurationStateSubj$.next(null);
|
1192
|
+
this.previousConfigurationStateSubj$.next(null);
|
2044
1193
|
}
|
2045
|
-
|
1194
|
+
init$() {
|
2046
1195
|
var _a;
|
2047
|
-
|
2048
|
-
|
1196
|
+
const { state } = this.salesTransactionService;
|
1197
|
+
const { standalone } = this.flowInfoService.flow.properties;
|
1198
|
+
const { productId, transactionItemId, newProductQty } = this.flowInfoService.context;
|
1199
|
+
if (!state || !productId) {
|
1200
|
+
return of(undefined);
|
1201
|
+
}
|
1202
|
+
const salesTransactionItems = (_a = state === null || state === void 0 ? void 0 : state.salesTransaction.salesTransactionItems) !== null && _a !== void 0 ? _a : [];
|
1203
|
+
let isRootGenerated = false;
|
1204
|
+
let transactionItem = salesTransactionItems.find(item => item.id === transactionItemId);
|
1205
|
+
if (!transactionItem && standalone) {
|
1206
|
+
transactionItem = salesTransactionItems.find(item => item.productId === productId);
|
1207
|
+
}
|
1208
|
+
if (!transactionItem) {
|
1209
|
+
transactionItem = generateTransactionItem(productId);
|
1210
|
+
if (typeof newProductQty === 'number' && newProductQty > 0) {
|
1211
|
+
transactionItem.qty = newProductQty;
|
1212
|
+
}
|
1213
|
+
isRootGenerated = true;
|
1214
|
+
}
|
1215
|
+
const guidedSellingResult = this.guidedSellingService.guidedSellingResult;
|
1216
|
+
if (transactionItem && Object.keys(guidedSellingResult).length && isRootGenerated) {
|
1217
|
+
transactionItem.stiAttributes = Object.entries(guidedSellingResult).map(([attributeName, value]) => ({
|
1218
|
+
attributeName,
|
1219
|
+
value,
|
1220
|
+
}));
|
2049
1221
|
}
|
2050
|
-
|
2051
|
-
|
1222
|
+
const configurationState = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: transactionItem ? [transactionItem] : [] }) });
|
1223
|
+
return (isRootGenerated ? this.configure$(configurationState) : of(configurationState)).pipe(tap$1(configurationState => {
|
1224
|
+
this.configurationStateSubj$.next(configurationState);
|
1225
|
+
this.previousConfigurationStateSubj$.next(configurationState);
|
1226
|
+
}), map$1(noop));
|
2052
1227
|
}
|
2053
|
-
|
2054
|
-
|
2055
|
-
|
1228
|
+
patch$(transactionItem) {
|
1229
|
+
const { state, root } = this;
|
1230
|
+
if (!state) {
|
1231
|
+
return throwError(() => new Error(`Configuration State is not initialized`));
|
2056
1232
|
}
|
2057
|
-
|
2058
|
-
|
2059
|
-
source[propertyName] = SalesforceIdUtils.generateId18FromId15(value);
|
1233
|
+
if (!root) {
|
1234
|
+
return throwError(() => new Error(`Root SalesTransactionItem not found`));
|
2060
1235
|
}
|
1236
|
+
const newRoot = new TransactionItemWorker(root).replace(transactionItem).ti;
|
1237
|
+
const newTransactionContext = Object.assign(Object.assign({}, state), { salesTransaction: Object.assign(Object.assign({}, state.salesTransaction), { salesTransactionItems: [newRoot] }) });
|
1238
|
+
return this.configure$(newTransactionContext).pipe(catchError$1(error => {
|
1239
|
+
console.error(error);
|
1240
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
1241
|
+
this.messageService.add({ severity: 'error', summary: error });
|
1242
|
+
}
|
1243
|
+
return throwError(() => error);
|
1244
|
+
}), tap$1(() => {
|
1245
|
+
if (!this.hasUnsavedChanges) {
|
1246
|
+
this.hasUnsavedChanges = true;
|
1247
|
+
}
|
1248
|
+
}), map$1(noop));
|
2061
1249
|
}
|
2062
|
-
|
2063
|
-
|
1250
|
+
patch(transactionItem) {
|
1251
|
+
this.patch$(transactionItem).subscribe();
|
2064
1252
|
}
|
2065
|
-
|
2066
|
-
|
2067
|
-
return
|
1253
|
+
configure$(transactionContext) {
|
1254
|
+
this.isLoadingSubj$.next(true);
|
1255
|
+
return this.justConfigureRequest$(transactionContext).pipe(tap$1(result => {
|
1256
|
+
this.configurationStateSubj$.next(result);
|
1257
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(result));
|
1258
|
+
}), catchError$1(e => {
|
1259
|
+
const resetState = this.previousConfigurationStateSubj$.getValue();
|
1260
|
+
if (resetState) {
|
1261
|
+
this.previousConfigurationStateSubj$.next(cloneDeep(resetState));
|
1262
|
+
this.configurationStateSubj$.next(resetState);
|
1263
|
+
}
|
1264
|
+
return throwError(() => e);
|
1265
|
+
}), finalize$1(() => this.isLoadingSubj$.next(false)));
|
1266
|
+
}
|
1267
|
+
justConfigureRequest$(transactionContext) {
|
1268
|
+
const request = {
|
1269
|
+
transactionContext,
|
1270
|
+
flowId: this.flowInfoService.flow.id,
|
1271
|
+
};
|
1272
|
+
return this.orchestrationsApiService.apply$(request).pipe(catchError$1(error => throwError(() => {
|
1273
|
+
if (error.error) {
|
1274
|
+
return extractErrorDetails(error.error).join('. ');
|
1275
|
+
}
|
1276
|
+
return error.message || JSON.stringify(error);
|
1277
|
+
})));
|
2068
1278
|
}
|
2069
|
-
|
2070
|
-
|
1279
|
+
getPCMModel() {
|
1280
|
+
const pcmModel = this.configurationRuntimeService.pcmModel;
|
1281
|
+
if (!pcmModel) {
|
1282
|
+
throw new Error('PCM model not initialized');
|
1283
|
+
}
|
1284
|
+
return pcmModel;
|
2071
1285
|
}
|
2072
1286
|
}
|
2073
|
-
|
2074
|
-
|
2075
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type:
|
1287
|
+
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 });
|
1288
|
+
ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
|
1289
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, decorators: [{
|
2076
1290
|
type: Injectable
|
2077
|
-
}], ctorParameters: function () { return [{ type:
|
1291
|
+
}], ctorParameters: function () { return [{ type: FlowInfoService }, { type: i2.MessageService }, { type: ConfigurationRuntimeService }, { type: SalesTransactionService }, { type: i1.OrchestrationsApiService }, { type: GuidedSellingService }]; } });
|
2078
1292
|
|
2079
1293
|
class ConfigurationStateService {
|
2080
|
-
constructor(configurationRuntimeService, configurationService,
|
1294
|
+
constructor(configurationRuntimeService, configurationService, flowStateService, flowInfoService, flowConfigurationService, flowStateApiService, salesTransactionService, salesTransactionApiService, toastService) {
|
2081
1295
|
this.configurationRuntimeService = configurationRuntimeService;
|
2082
1296
|
this.configurationService = configurationService;
|
2083
|
-
this.quoteDraftService = quoteDraftService;
|
2084
|
-
this.toastService = toastService;
|
2085
1297
|
this.flowStateService = flowStateService;
|
2086
1298
|
this.flowInfoService = flowInfoService;
|
2087
1299
|
this.flowConfigurationService = flowConfigurationService;
|
2088
1300
|
this.flowStateApiService = flowStateApiService;
|
2089
|
-
this.
|
1301
|
+
this.salesTransactionService = salesTransactionService;
|
1302
|
+
this.salesTransactionApiService = salesTransactionApiService;
|
1303
|
+
this.toastService = toastService;
|
2090
1304
|
this.isInitialized$ = new BehaviorSubject(false);
|
2091
1305
|
this.canceledConfiguration$ = new Subject();
|
2092
1306
|
this.NOT_INITIALIZED = Symbol();
|
@@ -2110,9 +1324,9 @@ class ConfigurationStateService {
|
|
2110
1324
|
request$ = this.initStateful$();
|
2111
1325
|
}
|
2112
1326
|
else {
|
2113
|
-
request$ = this.
|
1327
|
+
request$ = this.configurationService.init$();
|
2114
1328
|
}
|
2115
|
-
return request$.pipe(
|
1329
|
+
return request$.pipe(take(1), tap(() => {
|
2116
1330
|
this.isInitialized$.next(true);
|
2117
1331
|
this.canceledConfiguration$ = new Subject();
|
2118
1332
|
}));
|
@@ -2126,10 +1340,11 @@ class ConfigurationStateService {
|
|
2126
1340
|
this.configurationStore = {};
|
2127
1341
|
this.executedFunctions = {};
|
2128
1342
|
this.configurationService.reset();
|
1343
|
+
this.configurationRuntimeService.reset();
|
2129
1344
|
}
|
2130
1345
|
execute$(exec) {
|
2131
1346
|
const request = this.execToRequest(exec);
|
2132
|
-
return this.executeRequest$(request).pipe(map
|
1347
|
+
return this.executeRequest$(request).pipe(map(result => {
|
2133
1348
|
// Keep only requested results
|
2134
1349
|
const actualSelectors = Object.entries(result.selectors).reduce((trunk, [requestId, result]) => {
|
2135
1350
|
var _a;
|
@@ -2152,7 +1367,7 @@ class ConfigurationStateService {
|
|
2152
1367
|
}
|
2153
1368
|
// prevent parallel configuration requests in stateless mode
|
2154
1369
|
if (!this.statelessExecutionRequest$) {
|
2155
|
-
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay
|
1370
|
+
this.statelessExecutionRequest$ = executionRequest$.pipe(shareReplay(), take(1), finalize(() => (this.statelessExecutionRequest$ = null)));
|
2156
1371
|
}
|
2157
1372
|
return this.statelessExecutionRequest$;
|
2158
1373
|
}
|
@@ -2166,7 +1381,7 @@ class ConfigurationStateService {
|
|
2166
1381
|
},
|
2167
1382
|
},
|
2168
1383
|
});
|
2169
|
-
return this.executeRequest$(request).pipe(map
|
1384
|
+
return this.executeRequest$(request).pipe(map(response => response.selectors[requestId]));
|
2170
1385
|
}
|
2171
1386
|
subscribe$(selectorName, inputData = {}, options) {
|
2172
1387
|
const requestId = UUID.UUID();
|
@@ -2189,58 +1404,46 @@ class ConfigurationStateService {
|
|
2189
1404
|
this.executeRequest$(request).subscribe();
|
2190
1405
|
}
|
2191
1406
|
}
|
2192
|
-
return subscription.data$.pipe(filter
|
1407
|
+
return subscription.data$.pipe(filter(data => data != this.NOT_INITIALIZED), map(data => data), distinctUntilChanged(), finalize(() => {
|
2193
1408
|
var _a;
|
2194
1409
|
if (!((_a = this.subscriptions[requestId]) === null || _a === void 0 ? void 0 : _a.data$.observed)) {
|
2195
1410
|
delete this.subscriptions[requestId];
|
2196
1411
|
}
|
2197
1412
|
}), takeUntil(this.canceledConfiguration$));
|
2198
1413
|
}
|
2199
|
-
saveConfiguration(
|
2200
|
-
var _a, _b
|
1414
|
+
saveConfiguration() {
|
1415
|
+
var _a, _b;
|
2201
1416
|
if (this.isStatefulConfiguration) {
|
2202
|
-
return this.flowStateApiService
|
2203
|
-
|
2204
|
-
|
1417
|
+
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 })));
|
1418
|
+
}
|
1419
|
+
const state = this.salesTransactionService.state;
|
1420
|
+
if (!state) {
|
1421
|
+
return of({ id: '' });
|
1422
|
+
}
|
1423
|
+
const { standalone } = this.flowInfoService.flow.properties;
|
1424
|
+
if (standalone) {
|
1425
|
+
const request = {
|
1426
|
+
transactionContext: state,
|
1427
|
+
flowId: this.flowInfoService.flow.id,
|
1428
|
+
};
|
1429
|
+
return this.salesTransactionApiService.save(request).pipe(switchMap(r => this.flowStateService.executeRequest$({}, true).pipe(map(() => r))), map(id => ({ id })));
|
1430
|
+
}
|
1431
|
+
const transactionContext = this.salesTransactionService.state;
|
1432
|
+
const configurationRoot = this.configurationService.root;
|
1433
|
+
if (!transactionContext || !configurationRoot) {
|
1434
|
+
return of({ id: '' });
|
1435
|
+
}
|
1436
|
+
const stateItems = transactionContext.salesTransaction.salesTransactionItems;
|
1437
|
+
const isNewTransactionItem = stateItems.every(ti => ti.id !== configurationRoot.id);
|
1438
|
+
let salesTransactionItems;
|
1439
|
+
if (isNewTransactionItem) {
|
1440
|
+
salesTransactionItems = [...stateItems, configurationRoot];
|
2205
1441
|
}
|
2206
1442
|
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
|
-
}
|
1443
|
+
salesTransactionItems = stateItems.map(ti => (ti.id === configurationRoot.id ? configurationRoot : ti));
|
2243
1444
|
}
|
1445
|
+
const newState = Object.assign(Object.assign({}, transactionContext), { salesTransaction: Object.assign(Object.assign({}, transactionContext.salesTransaction), { salesTransactionItems }) });
|
1446
|
+
return this.flowConfigurationService.calculate$(newState).pipe(switchMap(() => this.flowStateService.executeRequest$({}, true)), map(() => ({ id: '' })));
|
2244
1447
|
}
|
2245
1448
|
cancelConfiguration() {
|
2246
1449
|
var _a, _b;
|
@@ -2261,37 +1464,33 @@ class ConfigurationStateService {
|
|
2261
1464
|
return (_b = (_a = this.flowInfoService.flow) === null || _a === void 0 ? void 0 : _a.properties.stateful) !== null && _b !== void 0 ? _b : false;
|
2262
1465
|
}
|
2263
1466
|
initStateful$() {
|
2264
|
-
var _a, _b, _c, _d, _e, _f
|
2265
|
-
this.ownerId = (
|
2266
|
-
const
|
2267
|
-
if (!this.flowStateService.stateId) {
|
1467
|
+
var _a, _b, _c, _d, _e, _f;
|
1468
|
+
this.ownerId = (_b = (_a = this.configurationRuntimeService.uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.id) !== null && _b !== void 0 ? _b : '';
|
1469
|
+
const { productId, transactionItemId } = this.flowInfoService.context;
|
1470
|
+
if (!productId || !this.flowStateService.stateId) {
|
2268
1471
|
return of(undefined);
|
2269
1472
|
}
|
2270
|
-
const container =
|
2271
|
-
const lineItem = this.configurationService.generateLineItem();
|
1473
|
+
const container = this.configurationRuntimeService.uiDefinitionContainer;
|
2272
1474
|
let request$;
|
2273
|
-
if (!
|
1475
|
+
if (!transactionItemId) {
|
2274
1476
|
request$ = this.flowStateApiService.newConfiguration(this.flowStateService.stateId, {
|
2275
|
-
|
2276
|
-
actionsOverride: (
|
2277
|
-
selectorsOverride: (
|
1477
|
+
transactionItem: generateTransactionItem(productId),
|
1478
|
+
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 }))),
|
1479
|
+
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
1480
|
});
|
2279
1481
|
}
|
2280
1482
|
else {
|
2281
1483
|
request$ = this.flowStateApiService.startConfiguration(this.flowStateService.stateId, {
|
2282
|
-
|
2283
|
-
actionsOverride: (
|
2284
|
-
selectorsOverride: (
|
1484
|
+
transactionItemId,
|
1485
|
+
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 }))),
|
1486
|
+
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
1487
|
});
|
2286
1488
|
}
|
2287
|
-
return request$.pipe(map
|
1489
|
+
return request$.pipe(map(r => {
|
2288
1490
|
this.stateId = r.stateId;
|
2289
1491
|
return undefined;
|
2290
1492
|
}));
|
2291
1493
|
}
|
2292
|
-
initStateless$() {
|
2293
|
-
return this.configurationService.configure().pipe(map$1(() => undefined));
|
2294
|
-
}
|
2295
1494
|
execToRequest(exec) {
|
2296
1495
|
var _a;
|
2297
1496
|
return {
|
@@ -2337,39 +1536,37 @@ class ConfigurationStateService {
|
|
2337
1536
|
else {
|
2338
1537
|
execution$ = this.executeStateless$(fullRequest);
|
2339
1538
|
}
|
2340
|
-
return execution$.pipe(tap
|
1539
|
+
return execution$.pipe(tap(result => this.handleSelectorsResponse(result.selectors)));
|
2341
1540
|
}
|
2342
1541
|
executeStateless$(request) {
|
2343
1542
|
this.executionInProgress$.next(true);
|
2344
|
-
return
|
1543
|
+
return this.configurationService.state$.pipe(first(), switchMap(state => {
|
2345
1544
|
var _a;
|
2346
1545
|
// Apply actions and execute configuration/price call
|
2347
1546
|
// No need to run configuration if no actions in the request
|
2348
1547
|
if (!((_a = request.actions) === null || _a === void 0 ? void 0 : _a.length)) {
|
2349
1548
|
return of(undefined);
|
2350
1549
|
}
|
2351
|
-
let configurationRequest = this.configurationService.generateRequest(false);
|
2352
1550
|
request.actions.forEach(action => {
|
2353
1551
|
var _a;
|
2354
|
-
|
1552
|
+
state = (_a = this.executeActionScript(state, action)) !== null && _a !== void 0 ? _a : state;
|
2355
1553
|
});
|
2356
|
-
|
2357
|
-
|
2358
|
-
}), map$1(() => {
|
1554
|
+
return this.configurationService.configure$(state);
|
1555
|
+
}), map(() => {
|
2359
1556
|
// Run selectors and apply them to the state
|
2360
|
-
const configurationState = this.configurationService.
|
1557
|
+
const configurationState = this.configurationService.state;
|
2361
1558
|
if (!configurationState) {
|
2362
1559
|
return { stateId: '', selectors: {} };
|
2363
1560
|
}
|
2364
1561
|
return this.runStatelessSelectors(request, configurationState);
|
2365
|
-
}), tap
|
2366
|
-
const configurationState = this.configurationService.
|
1562
|
+
}), tap(() => this.executionInProgress$.next(false)), catchError(error => {
|
1563
|
+
const configurationState = this.configurationService.previousState;
|
2367
1564
|
if (configurationState) {
|
2368
1565
|
const selectorsResult = this.runStatelessSelectors(request, configurationState);
|
2369
1566
|
this.handleSelectorsResponse(selectorsResult.selectors);
|
2370
1567
|
}
|
2371
1568
|
this.executionInProgress$.next(false);
|
2372
|
-
if (!this.configurationRuntimeService.
|
1569
|
+
if (!this.configurationRuntimeService.uiDefinitionProps.suppressToastMessages) {
|
2373
1570
|
this.toastService.add({ severity: ToastType.error, summary: String(error) });
|
2374
1571
|
}
|
2375
1572
|
return throwError(() => error);
|
@@ -2390,22 +1587,22 @@ class ConfigurationStateService {
|
|
2390
1587
|
};
|
2391
1588
|
this.executionInProgress$.next(true);
|
2392
1589
|
return this.flowStateApiService.executeConfiguration(this.flowStateService.stateId, this.stateId, request);
|
2393
|
-
}), tap
|
1590
|
+
}), tap(({ stateId }) => (this.stateId = stateId)), share(), tap(() => this.executionInProgress$.next(false)), catchError(e => {
|
2394
1591
|
this.executionInProgress$.next(false);
|
2395
1592
|
return throwError(() => e);
|
2396
1593
|
}));
|
2397
1594
|
}
|
2398
1595
|
executeStateful$(request) {
|
2399
|
-
return this.executionInProgress$.pipe(filter
|
1596
|
+
return this.executionInProgress$.pipe(filter(inProgress => !inProgress), take(1), switchMap(() =>
|
2400
1597
|
// make sure stream switches to statefulExecutionRequest$ before pushing an execution request
|
2401
1598
|
combineLatest([
|
2402
1599
|
this.statefulExecutionRequest$,
|
2403
|
-
of(undefined).pipe(tap
|
2404
|
-
])), map
|
1600
|
+
of(undefined).pipe(tap(() => this.statefulRequestStream$.next(request))),
|
1601
|
+
])), map(([response]) => response), take(1));
|
2405
1602
|
}
|
2406
1603
|
executeActionScript(request, processor) {
|
2407
|
-
var _a
|
2408
|
-
const { actions } = (
|
1604
|
+
var _a;
|
1605
|
+
const { actions } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2409
1606
|
const configurationProcessor = actions === null || actions === void 0 ? void 0 : actions.find(action => action.apiName === processor.apiName);
|
2410
1607
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2411
1608
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2413,8 +1610,8 @@ class ConfigurationStateService {
|
|
2413
1610
|
return this.executeProcessorScript(request, configurationProcessor, processor.inputData);
|
2414
1611
|
}
|
2415
1612
|
executeSelectorScript(request, processor) {
|
2416
|
-
var _a
|
2417
|
-
const { selectors } = (
|
1613
|
+
var _a;
|
1614
|
+
const { selectors } = (_a = this.configurationRuntimeService.uiDefinitionContainer) !== null && _a !== void 0 ? _a : {};
|
2418
1615
|
const configurationProcessor = selectors === null || selectors === void 0 ? void 0 : selectors.find(selector => selector.apiName === processor.apiName);
|
2419
1616
|
if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
|
2420
1617
|
throw `ConfigurationProcessor ${processor.apiName} not found`;
|
@@ -2456,25 +1653,54 @@ class ConfigurationStateService {
|
|
2456
1653
|
}, { stateId: '', selectors: {} });
|
2457
1654
|
}
|
2458
1655
|
}
|
2459
|
-
ConfigurationStateService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, deps: [{ token: ConfigurationRuntimeService }, { token: ConfigurationService }, { token:
|
1656
|
+
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
1657
|
ConfigurationStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService });
|
2461
1658
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationStateService, decorators: [{
|
2462
1659
|
type: Injectable
|
2463
|
-
}], ctorParameters: function () { return [{ type: ConfigurationRuntimeService }, { type: ConfigurationService }, { type:
|
1660
|
+
}], 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
1661
|
|
2465
1662
|
class ConfigurationModule {
|
2466
1663
|
}
|
2467
1664
|
ConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2468
1665
|
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: [
|
1666
|
+
ConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, providers: [
|
1667
|
+
ConfigurationService,
|
1668
|
+
ConfigurationStateService,
|
1669
|
+
ConfigurationRuntimeService,
|
1670
|
+
TestModeConfigurationService,
|
1671
|
+
GuidedSellingService,
|
1672
|
+
], imports: [ConfirmationDialogModule, ApiModule] });
|
2470
1673
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationModule, decorators: [{
|
2471
1674
|
type: NgModule,
|
2472
1675
|
args: [{
|
2473
1676
|
imports: [ConfirmationDialogModule, ApiModule],
|
2474
|
-
providers: [
|
1677
|
+
providers: [
|
1678
|
+
ConfigurationService,
|
1679
|
+
ConfigurationStateService,
|
1680
|
+
ConfigurationRuntimeService,
|
1681
|
+
TestModeConfigurationService,
|
1682
|
+
GuidedSellingService,
|
1683
|
+
],
|
1684
|
+
}]
|
1685
|
+
}] });
|
1686
|
+
|
1687
|
+
class FlowConfigurationModule {
|
1688
|
+
}
|
1689
|
+
FlowConfigurationModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
1690
|
+
FlowConfigurationModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, imports: [ApiModule] });
|
1691
|
+
FlowConfigurationModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, providers: [FlowConfigurationService], imports: [ApiModule] });
|
1692
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowConfigurationModule, decorators: [{
|
1693
|
+
type: NgModule,
|
1694
|
+
args: [{
|
1695
|
+
imports: [ApiModule],
|
1696
|
+
providers: [FlowConfigurationService],
|
2475
1697
|
}]
|
2476
1698
|
}] });
|
2477
1699
|
|
1700
|
+
const FORMATTING_SETTINGS_TOKEN = new InjectionToken('Summary of formatting settings for variant types of data, e.g. numbers, text, dates, etc');
|
1701
|
+
|
1702
|
+
const UI_DEFINITION_VERSION = 3;
|
1703
|
+
|
2478
1704
|
const DEFAULT_FORMATTING_SETTINGS = {
|
2479
1705
|
currencySymbol: DEFAULT_CURRENCY_SYMBOL,
|
2480
1706
|
decimalsCount: DEFAULT_DECIMALS_COUNT,
|
@@ -2488,14 +1714,14 @@ class SdkCoreModule {
|
|
2488
1714
|
SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
|
2489
1715
|
SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
|
2490
1716
|
SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SdkCoreModule, providers: [
|
2491
|
-
ContextService,
|
2492
1717
|
FlowInfoService,
|
2493
|
-
QuoteDraftService,
|
2494
1718
|
ProductImagesService,
|
2495
1719
|
IntegrationState,
|
2496
1720
|
FlowStateService,
|
2497
1721
|
FlowStateConfigurationService,
|
2498
1722
|
RuntimeSettingsService,
|
1723
|
+
SalesTransactionService,
|
1724
|
+
CatalogProductsService,
|
2499
1725
|
{
|
2500
1726
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2501
1727
|
useExisting: RuntimeSettingsService,
|
@@ -2506,14 +1732,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2506
1732
|
args: [{
|
2507
1733
|
imports: [ConfigurationModule, FlowConfigurationModule],
|
2508
1734
|
providers: [
|
2509
|
-
ContextService,
|
2510
1735
|
FlowInfoService,
|
2511
|
-
QuoteDraftService,
|
2512
1736
|
ProductImagesService,
|
2513
1737
|
IntegrationState,
|
2514
1738
|
FlowStateService,
|
2515
1739
|
FlowStateConfigurationService,
|
2516
1740
|
RuntimeSettingsService,
|
1741
|
+
SalesTransactionService,
|
1742
|
+
CatalogProductsService,
|
2517
1743
|
{
|
2518
1744
|
provide: FORMATTING_SETTINGS_TOKEN,
|
2519
1745
|
useExisting: RuntimeSettingsService,
|
@@ -2571,6 +1797,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2571
1797
|
}]
|
2572
1798
|
}] });
|
2573
1799
|
|
1800
|
+
function filterSuccessfulExecute() {
|
1801
|
+
return (source) => source.pipe(filter((result) => result.success), map(r => r.result));
|
1802
|
+
}
|
1803
|
+
|
2574
1804
|
class DatePipe {
|
2575
1805
|
constructor() {
|
2576
1806
|
var _a;
|
@@ -2698,5 +1928,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
|
|
2698
1928
|
* Generated bundle index. Do not edit.
|
2699
1929
|
*/
|
2700
1930
|
|
2701
|
-
export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService,
|
1931
|
+
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
1932
|
//# sourceMappingURL=veloceapps-sdk-core.mjs.map
|