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