@veloceapps/sdk 5.0.13-0 → 5.0.13-10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/bundles/veloceapps-sdk-core.umd.js +193 -38
  2. package/bundles/veloceapps-sdk-core.umd.js.map +1 -1
  3. package/bundles/veloceapps-sdk-runtime.umd.js +3 -3
  4. package/bundles/veloceapps-sdk-runtime.umd.js.map +1 -1
  5. package/bundles/veloceapps-sdk.umd.js +23 -19
  6. package/bundles/veloceapps-sdk.umd.js.map +1 -1
  7. package/cms/vendor-map.d.ts +1 -0
  8. package/core/services/index.d.ts +1 -0
  9. package/core/services/metric-calculation/metric-calculation.service.d.ts +21 -0
  10. package/core/services/metric-calculation/metric-calculation.types.d.ts +1 -0
  11. package/core/services/metric-calculation/metric-calculation.utils.d.ts +5 -0
  12. package/core/services/quote-draft.service.d.ts +3 -1
  13. package/core/utils/line-item.utils.d.ts +1 -0
  14. package/esm2015/core/core.module.js +4 -4
  15. package/esm2015/core/modules/flow-configuration/services/flow-configuration.service.js +9 -2
  16. package/esm2015/core/services/index.js +2 -1
  17. package/esm2015/core/services/metric-calculation/metric-calculation.service.js +74 -0
  18. package/esm2015/core/services/metric-calculation/metric-calculation.types.js +2 -0
  19. package/esm2015/core/services/metric-calculation/metric-calculation.utils.js +42 -0
  20. package/esm2015/core/services/quote-draft.service.js +15 -5
  21. package/esm2015/core/utils/line-item.utils.js +13 -2
  22. package/esm2015/runtime/execution/components/context-provider/context-provider.component.js +1 -1
  23. package/esm2015/runtime/execution/runtime-execution.module.js +2 -2
  24. package/esm2015/runtime/runtime.module.js +2 -2
  25. package/esm2015/runtime/services/section.service.js +2 -2
  26. package/esm2015/src/components/header/metrics/metrics.component.js +12 -8
  27. package/esm2015/src/components/header/metrics/metrics.definitions.js +6 -6
  28. package/esm2015/src/resolvers/quote.resolver.js +9 -9
  29. package/fesm2015/veloceapps-sdk-core.js +169 -33
  30. package/fesm2015/veloceapps-sdk-core.js.map +1 -1
  31. package/fesm2015/veloceapps-sdk-runtime.js +1 -1
  32. package/fesm2015/veloceapps-sdk-runtime.js.map +1 -1
  33. package/fesm2015/veloceapps-sdk.js +22 -18
  34. package/fesm2015/veloceapps-sdk.js.map +1 -1
  35. package/package.json +2 -2
  36. package/runtime/execution/components/context-provider/context-provider.component.d.ts +2 -2
  37. package/runtime/execution/runtime-execution.module.d.ts +1 -1
  38. package/runtime/runtime.module.d.ts +1 -1
  39. package/src/components/header/metrics/metrics.component.d.ts +3 -2
@@ -33,16 +33,16 @@ export class QuoteResolver {
33
33
  }
34
34
  const { queryParams } = route;
35
35
  return this.quoteDraftService.init(headerId, queryParams).pipe(switchMap(() => this.calculate$()), tap(() => {
36
- if (this.quoteDraftService.isStandalone) {
37
- return;
38
- }
39
- if (this.accountHasNotAssets()) {
40
- this.changeNavigation('/empty', route);
41
- }
42
- else if (!this.quoteDraftService.isInitialized && this.quoteDraftService.hasAssets) {
43
- this.changeNavigation('/cart', route);
36
+ if (!this.quoteDraftService.isStandalone) {
37
+ if (this.accountHasNotAssets()) {
38
+ this.changeNavigation('/empty', route);
39
+ }
40
+ else if (!this.quoteDraftService.isInitialized && this.quoteDraftService.hasAssets) {
41
+ this.changeNavigation('/cart', route);
42
+ }
44
43
  }
45
44
  this.quoteDraftService.isInitialized = true;
45
+ this.quoteDraftService.hasUnsavedChanges = false;
46
46
  }), catchError(e => {
47
47
  const message = e instanceof HttpErrorResponse ? e.error.message : e;
48
48
  return this.handleError(route, message);
@@ -71,4 +71,4 @@ QuoteResolver.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", versio
71
71
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: QuoteResolver, decorators: [{
72
72
  type: Injectable
73
73
  }], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.QuoteDraftService }, { type: i3.FlowRouterService }, { type: i2.ContextService }, { type: i2.FlowConfigurationService }]; } });
74
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGUucmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9zcmMvcmVzb2x2ZXJzL3F1b3RlLnJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBSXhFLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ1UsTUFBYyxFQUNkLGlCQUFvQyxFQUNwQyxhQUFnQyxFQUNoQyxjQUE4QixFQUM5QixpQkFBMkM7UUFKM0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO0lBQ2xELENBQUM7SUFFSSxXQUFXLENBQUMsS0FBNkIsRUFBRSxPQUFlO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFD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QUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUNsQyxDQUFDO0lBQ0osQ0FBQzs7MkdBM0VVLGFBQWE7K0dBQWIsYUFBYTs0RkFBYixhQUFhO2tCQUR6QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBSZXNvbHZlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkNvbnRleHRNb2RlIH0gZnJvbSAnQHZlbG9jZWFwcHMvY29yZSc7XG5pbXBvcnQgeyBDb250ZXh0U2VydmljZSwgRmxvd0NvbmZpZ3VyYXRpb25TZXJ2aWNlLCBRdW90ZURyYWZ0U2VydmljZSB9IGZyb20gJ0B2ZWxvY2VhcHBzL3Nkay9jb3JlJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGZyb20sIE9ic2VydmFibGUsIG9mLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRmxvd1JvdXRlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9mbG93LXJvdXRlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFF1b3RlUmVzb2x2ZXIgaW1wbGVtZW50cyBSZXNvbHZlPHZvaWQgfCBib29sZWFuPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBxdW90ZURyYWZ0U2VydmljZTogUXVvdGVEcmFmdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXJTZXJ2aWNlOiBGbG93Um91dGVyU2VydmljZSxcbiAgICBwcml2YXRlIGNvbnRleHRTZXJ2aWNlOiBDb250ZXh0U2VydmljZSxcbiAgICBwcml2YXRlIGZsb3dDb25maWd1cmF0aW9uOiBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UsXG4gICkge31cblxuICBwcml2YXRlIGhhbmRsZUVycm9yKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90LCBtZXNzYWdlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBwYXJlbnRVcmwgPSB0aGlzLnJvdXRlclNlcnZpY2UuZ2V0Rmxvd1Jvb3RQYXRoKHJvdXRlKTtcbiAgICByZXR1cm4gZnJvbSh0aGlzLnJvdXRlci5uYXZpZ2F0ZShbcGFyZW50VXJsLCAnNDA0J10sIHsgc3RhdGU6IHsgbWVzc2FnZSB9IH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICBjb25zdCBxdW90ZURyYWZ0ID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0O1xuXG4gICAgaWYgKCF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmlzU3RhbmRhbG9uZSAmJiBxdW90ZURyYWZ0ICYmICF0aGlzLmFjY291bnRIYXNOb3RBc3NldHMoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZmxvd0NvbmZpZ3VyYXRpb24uY2FsY3VsYXRlJChxdW90ZURyYWZ0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gb2YodW5kZWZpbmVkKTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZVNuYXBzaG90KTogT2JzZXJ2YWJsZTx2b2lkIHwgYm9vbGVhbj4ge1xuICAgIGNvbnN0IHsgaGVhZGVySWQgfSA9IHRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZSgpO1xuICAgIGNvbnN0IHF1b3RlID0gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0O1xuXG4gICAgaWYgKHF1b3RlICYmIHF1b3RlLnF1b3RlSWQgPT09IGhlYWRlcklkKSB7XG4gICAgICByZXR1cm4gb2YodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBxdWVyeVBhcmFtcyB9ID0gcm91dGU7XG5cbiAgICByZXR1cm4gdGhpcy5xdW90ZURyYWZ0U2VydmljZS5pbml0KGhlYWRlcklkLCBxdWVyeVBhcmFtcykucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNhbGN1bGF0ZSQoKSksXG4gICAgICB0YXAoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5xdW90ZURyYWZ0U2VydmljZS5pc1N0YW5kYWxvbmUpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hY2NvdW50SGFzTm90QXNzZXRzKCkpIHtcbiAgICAgICAgICB0aGlzLmNoYW5nZU5hdmlnYXRpb24oJy9lbXB0eScsIHJvdXRlKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5xdW90ZURyYWZ0U2VydmljZS5pc0luaXRpYWxpemVkICYmIHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaGFzQXNzZXRzKSB7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VOYXZpZ2F0aW9uKCcvY2FydCcsIHJvdXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlLmVycm9yLm1lc3NhZ2UgOiBlO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihyb3V0ZSwgbWVzc2FnZSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VOYXZpZ2F0aW9uKHBhdGg6IHN0cmluZywgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRVcmwgPSB0aGlzLnJvdXRlclNlcnZpY2UuZ2V0Rmxvd1Jvb3RQYXRoKHJvdXRlKTtcblxuICAgIHRoaXMucm91dGVyXG4gICAgICAubmF2aWdhdGUoW3BhcmVudFVybCArIHBhdGhdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiByb3V0ZS5xdWVyeVBhcmFtcyxcbiAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlLmVycm9yLm1lc3NhZ2UgOiBlO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihyb3V0ZSwgbWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWNjb3VudEhhc05vdEFzc2V0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0Py5jb250ZXh0LnByb3BlcnRpZXMubW9kZSA9PT0gQ29uZmlndXJhdGlvbkNvbnRleHRNb2RlLkFDQ09VTlQgJiZcbiAgICAgICF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc0Fzc2V0c1xuICAgICk7XG4gIH1cbn1cbiJdfQ==
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVvdGUucmVzb2x2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Nkay9zcmMvcmVzb2x2ZXJzL3F1b3RlLnJlc29sdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFNUQsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7O0FBSXhFLE1BQU0sT0FBTyxhQUFhO0lBQ3hCLFlBQ1UsTUFBYyxFQUNkLGlCQUFvQyxFQUNwQyxhQUFnQyxFQUNoQyxjQUE4QixFQUM5QixpQkFBMkM7UUFKM0MsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0JBQWEsR0FBYixhQUFhLENBQW1CO1FBQ2hDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQTBCO0lBQ2xELENBQUM7SUFFSSxXQUFXLENBQUMsS0FBNkIsRUFBRSxPQUFlO1FBQ2hFLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVPLFVBQVU7UUFDaEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFD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QVUsQ0FBQyxJQUFJLE1BQUssd0JBQXdCLENBQUMsT0FBTztZQUMvRixDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQ2xDLENBQUM7SUFDSixDQUFDOzsyR0ExRVUsYUFBYTsrR0FBYixhQUFhOzRGQUFiLGFBQWE7a0JBRHpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIFJlc29sdmUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uQ29udGV4dE1vZGUgfSBmcm9tICdAdmVsb2NlYXBwcy9jb3JlJztcbmltcG9ydCB7IENvbnRleHRTZXJ2aWNlLCBGbG93Q29uZmlndXJhdGlvblNlcnZpY2UsIFF1b3RlRHJhZnRTZXJ2aWNlIH0gZnJvbSAnQHZlbG9jZWFwcHMvc2RrL2NvcmUnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBGbG93Um91dGVyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Zsb3ctcm91dGVyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUXVvdGVSZXNvbHZlciBpbXBsZW1lbnRzIFJlc29sdmU8dm9pZCB8IGJvb2xlYW4+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIHF1b3RlRHJhZnRTZXJ2aWNlOiBRdW90ZURyYWZ0U2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlclNlcnZpY2U6IEZsb3dSb3V0ZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGV4dFNlcnZpY2U6IENvbnRleHRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmxvd0NvbmZpZ3VyYXRpb246IEZsb3dDb25maWd1cmF0aW9uU2VydmljZSxcbiAgKSB7fVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3Iocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QsIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHBhcmVudFVybCA9IHRoaXMucm91dGVyU2VydmljZS5nZXRGbG93Um9vdFBhdGgocm91dGUpO1xuICAgIHJldHVybiBmcm9tKHRoaXMucm91dGVyLm5hdmlnYXRlKFtwYXJlbnRVcmwsICc0MDQnXSwgeyBzdGF0ZTogeyBtZXNzYWdlIH0gfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGUkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGNvbnN0IHF1b3RlRHJhZnQgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ7XG5cbiAgICBpZiAoIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNTdGFuZGFsb25lICYmIHF1b3RlRHJhZnQgJiYgIXRoaXMuYWNjb3VudEhhc05vdEFzc2V0cygpKSB7XG4gICAgICByZXR1cm4gdGhpcy5mbG93Q29uZmlndXJhdGlvbi5jYWxjdWxhdGUkKHF1b3RlRHJhZnQpO1xuICAgIH1cblxuICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUocm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiBPYnNlcnZhYmxlPHZvaWQgfCBib29sZWFuPiB7XG4gICAgY29uc3QgeyBoZWFkZXJJZCB9ID0gdGhpcy5jb250ZXh0U2VydmljZS5yZXNvbHZlKCk7XG4gICAgY29uc3QgcXVvdGUgPSB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLnF1b3RlRHJhZnQ7XG5cbiAgICBpZiAocXVvdGUgJiYgcXVvdGUucXVvdGVJZCA9PT0gaGVhZGVySWQpIHtcbiAgICAgIHJldHVybiBvZih0cnVlKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHF1ZXJ5UGFyYW1zIH0gPSByb3V0ZTtcblxuICAgIHJldHVybiB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmluaXQoaGVhZGVySWQsIHF1ZXJ5UGFyYW1zKS5waXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY2FsY3VsYXRlJCgpKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5xdW90ZURyYWZ0U2VydmljZS5pc1N0YW5kYWxvbmUpIHtcbiAgICAgICAgICBpZiAodGhpcy5hY2NvdW50SGFzTm90QXNzZXRzKCkpIHtcbiAgICAgICAgICAgIHRoaXMuY2hhbmdlTmF2aWdhdGlvbignL2VtcHR5Jywgcm91dGUpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMucXVvdGVEcmFmdFNlcnZpY2UuaXNJbml0aWFsaXplZCAmJiB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc0Fzc2V0cykge1xuICAgICAgICAgICAgdGhpcy5jaGFuZ2VOYXZpZ2F0aW9uKCcvY2FydCcsIHJvdXRlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc1Vuc2F2ZWRDaGFuZ2VzID0gZmFsc2U7XG4gICAgICB9KSxcbiAgICAgIGNhdGNoRXJyb3IoZSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlLmVycm9yLm1lc3NhZ2UgOiBlO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihyb3V0ZSwgbWVzc2FnZSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGFuZ2VOYXZpZ2F0aW9uKHBhdGg6IHN0cmluZywgcm91dGU6IEFjdGl2YXRlZFJvdXRlU25hcHNob3QpOiB2b2lkIHtcbiAgICBjb25zdCBwYXJlbnRVcmwgPSB0aGlzLnJvdXRlclNlcnZpY2UuZ2V0Rmxvd1Jvb3RQYXRoKHJvdXRlKTtcblxuICAgIHRoaXMucm91dGVyXG4gICAgICAubmF2aWdhdGUoW3BhcmVudFVybCArIHBhdGhdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiByb3V0ZS5xdWVyeVBhcmFtcyxcbiAgICAgICAgcmVwbGFjZVVybDogdHJ1ZSxcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UgPyBlLmVycm9yLm1lc3NhZ2UgOiBlO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5kbGVFcnJvcihyb3V0ZSwgbWVzc2FnZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYWNjb3VudEhhc05vdEFzc2V0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5xdW90ZURyYWZ0U2VydmljZS5xdW90ZURyYWZ0Py5jb250ZXh0LnByb3BlcnRpZXMubW9kZSA9PT0gQ29uZmlndXJhdGlvbkNvbnRleHRNb2RlLkFDQ09VTlQgJiZcbiAgICAgICF0aGlzLnF1b3RlRHJhZnRTZXJ2aWNlLmhhc0Fzc2V0c1xuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, NgModule } from '@angular/core';
3
3
  import { UUID, ConfigurationContext, ConfigurationContextMode, RuntimeModel, SalesforceIdUtils, ConfigurationMode, ChargeGroupUtils } from '@veloceapps/core';
4
- import { BehaviorSubject, map as map$1, distinctUntilChanged, catchError, of, tap as tap$1, zip, noop, combineLatest, throwError, shareReplay as shareReplay$1, switchMap as switchMap$1 } from 'rxjs';
4
+ import { BehaviorSubject, zip, noop, combineLatest, Subject, take as take$1, map as map$1, distinctUntilChanged, catchError, of, tap as tap$1, throwError, shareReplay as shareReplay$1, switchMap as switchMap$1 } from 'rxjs';
5
5
  import { filter, tap, map, switchMap, skip, take, shareReplay, first, catchError as catchError$1, finalize } from 'rxjs/operators';
6
6
  import * as i1 from '@veloceapps/api';
7
7
  import { PriceApiService, ContextApiService, ProductModelApiService, ConfigurationApiService } from '@veloceapps/api';
8
- import { merge, flatten, sortBy, cloneDeep } from 'lodash';
8
+ import { merge, isEqual, uniq, flatten, sortBy, map as map$2, cloneDeep } from 'lodash';
9
9
  import { ToastType, ConfirmationComponent, ConfirmationDialogModule } from '@veloceapps/components';
10
10
  import * as i4 from 'primeng/api';
11
11
  import * as i5 from 'primeng/dynamicdialog';
@@ -79,31 +79,47 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
79
79
  args: [{ providedIn: 'root' }]
80
80
  }], ctorParameters: function () { return [{ type: i1.ContextApiService }]; } });
81
81
 
82
- class ProductImagesService {
83
- constructor(productApiService) {
84
- this.productApiService = productApiService;
85
- this.imagesMap$ = new BehaviorSubject({});
86
- }
87
- getImageUrl$(productId) {
88
- if (this.imagesMap$.value[productId] == null) {
89
- this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
90
- this.fetchProductImage(productId);
82
+ function calculateMetricByMethod(lineItems, metric, method) {
83
+ const items = getLineItemsByMethod(lineItems, method);
84
+ return items.reduce((acc, li) => {
85
+ let value = li.reduce((accProduct, item) => accProduct + ((item.totalMetrics && item.totalMetrics[metric]) || 0), 0);
86
+ if (method === 'avg' && li.length > 0) {
87
+ value /= li.length;
88
+ }
89
+ return acc + value;
90
+ }, 0);
91
+ }
92
+ function getLineItemsByMethod(lineItems, method) {
93
+ switch (method) {
94
+ case 'first': {
95
+ return lineItems.filter(li => !li.rampInstanceId).map(item => [item]);
96
+ }
97
+ case 'last': {
98
+ const rootTermItems = lineItems.filter(li => !li.rampInstanceId);
99
+ const products = rootTermItems.map(lineItem => [
100
+ lineItem,
101
+ ...lineItems.filter(li => li.rampInstanceId === lineItem.id),
102
+ ]);
103
+ return products
104
+ .map(items => [...items].sort((a, b) => getDateValue(a.endDate || '') - getDateValue(b.endDate || '')).pop())
105
+ .filter((li) => Boolean(li))
106
+ .map(item => [item]);
107
+ }
108
+ case 'avg': {
109
+ const rootTermItems = lineItems.filter(li => !li.rampInstanceId);
110
+ return rootTermItems.map(lineItem => [lineItem, ...lineItems.filter(li => li.rampInstanceId === lineItem.id)]);
111
+ }
112
+ case 'sum': {
113
+ return lineItems.map(item => [item]);
114
+ }
115
+ default: {
116
+ return lineItems.map(item => [item]);
91
117
  }
92
- return this.imagesMap$.pipe(map$1(imagesMap => imagesMap[productId]), distinctUntilChanged());
93
- }
94
- fetchProductImage(productId) {
95
- this.productApiService
96
- .fetchImage$(productId)
97
- .pipe(map$1(file => URL.createObjectURL(file)), catchError(() => of('')), tap$1(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
98
- .subscribe();
99
118
  }
100
119
  }
101
- ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductApiService }], target: i0.ɵɵFactoryTarget.Injectable });
102
- ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, providedIn: 'root' });
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, decorators: [{
104
- type: Injectable,
105
- args: [{ providedIn: 'root' }]
106
- }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
120
+ function getDateValue(date) {
121
+ return date ? new Date(date).getTime() : 0;
122
+ }
107
123
 
108
124
  class QuoteDraftService {
109
125
  constructor(context, quoteApiService, priceApiService) {
@@ -114,9 +130,9 @@ class QuoteDraftService {
114
130
  this.resetSubj$ = new BehaviorSubject(true);
115
131
  this.isInitializedSubj$ = new BehaviorSubject(false);
116
132
  this.initialCurrentState = [];
133
+ this._hasUnsavedChanges = false;
117
134
  this.allPriceLists = [];
118
135
  this.assetPriceLists = [];
119
- this.hasUnsavedChanges = false;
120
136
  this.reset$ = this.resetSubj$.asObservable();
121
137
  this.activePriceList$ = this.context.resolve$().pipe(map(ctx => this.allPriceLists.find(priceList => priceList.id === ctx.properties.PriceListId)), map(priceList => priceList !== null && priceList !== void 0 ? priceList : null));
122
138
  this.isInitializedSubj$
@@ -131,6 +147,16 @@ class QuoteDraftService {
131
147
  this.isInitializedSubj$.next(value);
132
148
  }
133
149
  }
150
+ get hasUnsavedChanges() {
151
+ return this._hasUnsavedChanges;
152
+ }
153
+ set hasUnsavedChanges(value) {
154
+ var _a, _b;
155
+ this._hasUnsavedChanges = value;
156
+ if (!this._hasUnsavedChanges) {
157
+ this.initialCurrentState = (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.currentState) !== null && _b !== void 0 ? _b : [];
158
+ }
159
+ }
134
160
  get hasAssets$() {
135
161
  return this.quoteSubj$.pipe(map(() => this.hasAssets));
136
162
  }
@@ -141,13 +167,12 @@ class QuoteDraftService {
141
167
  reset() {
142
168
  this.resetSubj$.next(true);
143
169
  this.quoteSubj$.next(null);
144
- this.initialCurrentState = [];
170
+ this.hasUnsavedChanges = false;
145
171
  }
146
172
  init(quoteId, params) {
147
173
  return zip(this.quoteApiService.getQuoteDraft(quoteId, params), this.priceApiService.getPriceLists()).pipe(tap(([quote, allPriceLists]) => {
148
174
  this.allPriceLists = allPriceLists;
149
175
  this.quoteSubj$.next(quote);
150
- this.initialCurrentState = quote.currentState;
151
176
  this.context.update(quote.context);
152
177
  this.populateActivePriceLists$();
153
178
  }), map(() => noop()), take(1));
@@ -294,7 +319,7 @@ class QuoteDraftService {
294
319
  this.hasUnsavedChanges = !!quote && !quote.currentState.every(li => li.actionCode === 'EXIST');
295
320
  }
296
321
  else {
297
- this.hasUnsavedChanges = true;
322
+ this.hasUnsavedChanges = !isEqual(this.initialCurrentState, quote === null || quote === void 0 ? void 0 : quote.currentState);
298
323
  }
299
324
  }
300
325
  }
@@ -305,6 +330,99 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
305
330
  args: [{ providedIn: 'root' }]
306
331
  }], ctorParameters: function () { return [{ type: ContextService }, { type: i1.QuoteApiService }, { type: i1.PriceApiService }]; } });
307
332
 
333
+ class MetricsCalculationService {
334
+ constructor(quoteDraftService, settingsService) {
335
+ this.quoteDraftService = quoteDraftService;
336
+ this.settingsService = settingsService;
337
+ this.metricsUpdated$ = new Subject();
338
+ this.quoteMetricsSettings = {};
339
+ this.metricsCalculationMethodMap = {};
340
+ this.metricsData = {};
341
+ combineLatest([
342
+ this.quoteDraftService.currentState$,
343
+ this.settingsService.fetchSetting('QUOTE_LEVEL_METRIC_CALCULATION_METHOD').pipe(take$1(1)),
344
+ ]).subscribe(([lineItems, setting]) => {
345
+ let settingsData = {};
346
+ try {
347
+ settingsData = JSON.parse((setting === null || setting === void 0 ? void 0 : setting.value) || '{}');
348
+ }
349
+ catch (error) {
350
+ settingsData = {};
351
+ }
352
+ this.quoteMetricsSettings = settingsData;
353
+ this.updateMetrics(lineItems);
354
+ });
355
+ }
356
+ get onMetricsUpdate$() {
357
+ return this.metricsUpdated$.asObservable();
358
+ }
359
+ getMetricValue(metric) {
360
+ return this.metricsData[metric] || 0;
361
+ }
362
+ updateMetrics(lineItems) {
363
+ const metricKeys = this.collectMetricKeys(lineItems).filter(key => !key.includes('Effective_'));
364
+ this.metricsCalculationMethodMap = this.buildMetricsCalculationMethods(metricKeys, this.metricsCalculationMethodMap);
365
+ this.metricsData = metricKeys.reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: this.calculateMetric(lineItems, key) })), {});
366
+ this.metricsUpdated$.next();
367
+ }
368
+ calculateMetric(lineItems, metric) {
369
+ return calculateMetricByMethod(lineItems, metric, this.metricsCalculationMethodMap[metric] || 'sum');
370
+ }
371
+ buildMetricsCalculationMethods(metricKeys, initial) {
372
+ return metricKeys.reduce((acc, name) => {
373
+ if (acc[name]) {
374
+ return acc;
375
+ }
376
+ acc = Object.assign(Object.assign({}, acc), { [name]: 'sum' });
377
+ const settingKey = name.replace(/VDM_|Total_/g, '');
378
+ if (this.quoteMetricsSettings[settingKey]) {
379
+ acc = Object.assign(Object.assign({}, acc), { [name]: this.quoteMetricsSettings[settingKey] });
380
+ }
381
+ return acc;
382
+ }, initial);
383
+ }
384
+ collectMetricKeys(lineItems) {
385
+ const keys = [];
386
+ lineItems.forEach(lineItem => {
387
+ keys.push(...Object.keys(lineItem.totalMetrics || {}));
388
+ keys.push(...this.collectMetricKeys(lineItem.lineItems));
389
+ });
390
+ return uniq(keys);
391
+ }
392
+ }
393
+ MetricsCalculationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: MetricsCalculationService, deps: [{ token: QuoteDraftService }, { token: i1.ConfigurationSettingsApiService }], target: i0.ɵɵFactoryTarget.Injectable });
394
+ MetricsCalculationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: MetricsCalculationService, providedIn: 'root' });
395
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: MetricsCalculationService, decorators: [{
396
+ type: Injectable,
397
+ args: [{ providedIn: 'root' }]
398
+ }], ctorParameters: function () { return [{ type: QuoteDraftService }, { type: i1.ConfigurationSettingsApiService }]; } });
399
+
400
+ class ProductImagesService {
401
+ constructor(productApiService) {
402
+ this.productApiService = productApiService;
403
+ this.imagesMap$ = new BehaviorSubject({});
404
+ }
405
+ getImageUrl$(productId) {
406
+ if (this.imagesMap$.value[productId] == null) {
407
+ this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: '' }));
408
+ this.fetchProductImage(productId);
409
+ }
410
+ return this.imagesMap$.pipe(map$1(imagesMap => imagesMap[productId]), distinctUntilChanged());
411
+ }
412
+ fetchProductImage(productId) {
413
+ this.productApiService
414
+ .fetchImage$(productId)
415
+ .pipe(map$1(file => URL.createObjectURL(file)), catchError(() => of('')), tap$1(url => this.imagesMap$.next(Object.assign(Object.assign({}, this.imagesMap$.value), { [productId]: url }))))
416
+ .subscribe();
417
+ }
418
+ }
419
+ ProductImagesService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, deps: [{ token: i1.ProductApiService }], target: i0.ɵɵFactoryTarget.Injectable });
420
+ ProductImagesService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, providedIn: 'root' });
421
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: ProductImagesService, decorators: [{
422
+ type: Injectable,
423
+ args: [{ providedIn: 'root' }]
424
+ }], ctorParameters: function () { return [{ type: i1.ProductApiService }]; } });
425
+
308
426
  class RuntimeContextService {
309
427
  constructor(configurationApiService) {
310
428
  this.configurationApiService = configurationApiService;
@@ -530,6 +648,17 @@ const getRecommendedPrices = (portDomain, type) => {
530
648
  }, [0, 0])) !== null && _b !== void 0 ? _b : [0, 0];
531
649
  return { net, list };
532
650
  };
651
+ const multiplyLineItems = (lineItem, qty, split) => {
652
+ if (split) {
653
+ const unifyIds = (lineItem) => (Object.assign(Object.assign({}, lineItem), { id: UUID.UUID(), lineItems: lineItem.lineItems.map(unifyIds) }));
654
+ return map$2(new Array(qty), () => unifyIds(lineItem));
655
+ }
656
+ else {
657
+ return [
658
+ Object.assign(Object.assign({}, lineItem), { qty: qty }),
659
+ ];
660
+ }
661
+ };
533
662
 
534
663
  var lineItem_utils = /*#__PURE__*/Object.freeze({
535
664
  __proto__: null,
@@ -544,7 +673,8 @@ var lineItem_utils = /*#__PURE__*/Object.freeze({
544
673
  patchAttributes: patchAttributes,
545
674
  getAttributeValue: getAttributeValue,
546
675
  generateLineItem: generateLineItem,
547
- getRecommendedPrices: getRecommendedPrices
676
+ getRecommendedPrices: getRecommendedPrices,
677
+ multiplyLineItems: multiplyLineItems
548
678
  });
549
679
 
550
680
  class LineItemWorker {
@@ -925,7 +1055,13 @@ class FlowConfigurationService {
925
1055
  if (!quoteDraft) {
926
1056
  return of(null);
927
1057
  }
928
- return this.configurationService.configureExternal$(productId, qty).pipe(map$1(lineItem => [...quoteDraft.currentState, lineItem]), switchMap$1(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), this.handleErrorAndBounceBack());
1058
+ return this.configurationService.configureExternal$(productId, qty).pipe(map$1(lineItem => {
1059
+ var _a, _b;
1060
+ const model = this.configurationService.getRuntimeModel();
1061
+ const split = (_b = (_a = model === null || model === void 0 ? void 0 : model.types.find(type => type.name === lineItem.type)) === null || _a === void 0 ? void 0 : _a.split) !== null && _b !== void 0 ? _b : false;
1062
+ const lineItems = multiplyLineItems(lineItem, qty !== null && qty !== void 0 ? qty : 1, split);
1063
+ return [...quoteDraft.currentState, ...lineItems];
1064
+ }), switchMap$1(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), this.handleErrorAndBounceBack());
929
1065
  }
930
1066
  get() {
931
1067
  return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.activeCurrentState), shareReplay$1());
@@ -1018,12 +1154,12 @@ class SdkCoreModule {
1018
1154
  }
1019
1155
  SdkCoreModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SdkCoreModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
1020
1156
  SdkCoreModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SdkCoreModule, imports: [ConfigurationModule, FlowConfigurationModule] });
1021
- SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SdkCoreModule, providers: [ContextService, QuoteDraftService, ProductImagesService], imports: [[ConfigurationModule, FlowConfigurationModule]] });
1157
+ SdkCoreModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SdkCoreModule, providers: [ContextService, QuoteDraftService, ProductImagesService, MetricsCalculationService], imports: [[ConfigurationModule, FlowConfigurationModule]] });
1022
1158
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImport: i0, type: SdkCoreModule, decorators: [{
1023
1159
  type: NgModule,
1024
1160
  args: [{
1025
1161
  imports: [ConfigurationModule, FlowConfigurationModule],
1026
- providers: [ContextService, QuoteDraftService, ProductImagesService],
1162
+ providers: [ContextService, QuoteDraftService, ProductImagesService, MetricsCalculationService],
1027
1163
  }]
1028
1164
  }] });
1029
1165
 
@@ -1031,5 +1167,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.15", ngImpo
1031
1167
  * Generated bundle index. Do not edit.
1032
1168
  */
1033
1169
 
1034
- export { ConfigurationRuntimeService, ConfigurationService, ContextService, FlowConfigurationModule, FlowConfigurationService, FlowUpdateService, LineItemWorker, ProductImagesService, QuoteDraftService, RuntimeMode, RuntimeOperation, RuntimeStep, SdkCoreModule, findLineItem, findLineItemWithComparator, generateLineItem, getAttributeValue, getAttributes, getDefaultLineItem, getRecommendedPrices, insertLineItem, lineItem_utils as lineItemUtils, mapAttributes, patchAttributes, removeLineItem, replaceLineItem, upsertAttributes };
1170
+ export { ConfigurationRuntimeService, ConfigurationService, ContextService, FlowConfigurationModule, FlowConfigurationService, FlowUpdateService, LineItemWorker, MetricsCalculationService, ProductImagesService, QuoteDraftService, RuntimeMode, RuntimeOperation, RuntimeStep, SdkCoreModule, findLineItem, findLineItemWithComparator, generateLineItem, getAttributeValue, getAttributes, getDefaultLineItem, getRecommendedPrices, insertLineItem, lineItem_utils as lineItemUtils, mapAttributes, multiplyLineItems, patchAttributes, removeLineItem, replaceLineItem, upsertAttributes };
1035
1171
  //# sourceMappingURL=veloceapps-sdk-core.js.map