@veloceapps/sdk 8.0.0-185 → 8.0.0-187

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 (29) hide show
  1. package/cms/vendor-map.d.ts +3 -4
  2. package/core/modules/configuration/services/configuration-state.service.d.ts +2 -4
  3. package/core/modules/configuration/services/configuration.service.d.ts +1 -1
  4. package/core/services/flow-state.service.d.ts +1 -0
  5. package/core/services/quote-draft.service.d.ts +8 -31
  6. package/core/types/flow-state.types.d.ts +5 -0
  7. package/core/types/integration.types.d.ts +0 -1
  8. package/core/utils/line-item.utils.d.ts +1 -2
  9. package/esm2020/core/modules/configuration/services/configuration-state.service.mjs +16 -7
  10. package/esm2020/core/modules/configuration/services/configuration.service.mjs +10 -8
  11. package/esm2020/core/modules/flow-configuration/services/flow-configuration.service.mjs +3 -3
  12. package/esm2020/core/services/flow-state.service.mjs +31 -25
  13. package/esm2020/core/services/quote-draft.service.mjs +27 -100
  14. package/esm2020/core/types/flow-state.types.mjs +1 -1
  15. package/esm2020/core/types/integration.types.mjs +1 -1
  16. package/esm2020/core/utils/line-item.utils.mjs +4 -18
  17. package/esm2020/src/pages/product/product.component.mjs +15 -12
  18. package/esm2020/src/services/flow.service.mjs +38 -18
  19. package/fesm2015/veloceapps-sdk-core.mjs +455 -522
  20. package/fesm2015/veloceapps-sdk-core.mjs.map +1 -1
  21. package/fesm2015/veloceapps-sdk.mjs +47 -28
  22. package/fesm2015/veloceapps-sdk.mjs.map +1 -1
  23. package/fesm2020/veloceapps-sdk-core.mjs +418 -487
  24. package/fesm2020/veloceapps-sdk-core.mjs.map +1 -1
  25. package/fesm2020/veloceapps-sdk.mjs +50 -27
  26. package/fesm2020/veloceapps-sdk.mjs.map +1 -1
  27. package/package.json +1 -1
  28. package/src/pages/product/product.component.d.ts +1 -1
  29. package/src/services/flow.service.d.ts +1 -0
@@ -1,11 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { InjectionToken, Injectable, Optional, Inject, NgModule, inject, Directive, Input, LOCALE_ID, Pipe } from '@angular/core';
3
3
  import { UUID, ConfigurationContextMode, ConfigurationContext, UITemplateType, isDefined, ConfigurationProcessorTypes, EntityUtil, ChargeGroupUtils, DEFAULT_CURRENCY_ISO_CODE, DEFAULT_CURRENCY_SYMBOL, validateDateFormat, DEFAULT_DATE_FORMAT, DEFAULT_DECIMALS_COUNT, getSupportedDateFormats, DEFAULT_DECIMAL_SEPARATOR, DEFAULT_THOUSANDS_SEPARATOR, DEFAULT_ACTION_CODE_LABELS, parseJsonSafely, ConfigurationMode, ConfigurationTranslatorUtils, RuntimeModel, isNotLegacyUIDefinition, SalesforceIdUtils, DEFAULT_TIME_FORMAT, formatNumber } from '@veloceapps/core';
4
- import { BehaviorSubject, switchMap, map as map$1, tap as tap$1, noop, catchError, throwError, of, forkJoin, Subject, filter as filter$1, zip, combineLatest, shareReplay as shareReplay$1, finalize, takeUntil, buffer, debounceTime, share, take as take$1, distinctUntilChanged } from 'rxjs';
4
+ import { BehaviorSubject, switchMap, map as map$1, tap as tap$1, noop, catchError, throwError, of, forkJoin, zip, combineLatest, Subject, filter as filter$1, shareReplay as shareReplay$1, finalize, takeUntil, buffer, debounceTime, share, take as take$1, distinctUntilChanged } from 'rxjs';
5
5
  import { map, filter, tap, switchMap as switchMap$1, skip, take, shareReplay, catchError as catchError$1, finalize as finalize$1, first } from 'rxjs/operators';
6
6
  import * as i1 from '@veloceapps/api';
7
7
  import { ApiModule } from '@veloceapps/api';
8
- import { merge, isEmpty, flatten, entries, sortBy, map as map$2, omit, isEqual, cloneDeep, assign, uniqBy, transform } from 'lodash';
8
+ import { merge, isEmpty, isEqual, cloneDeep, assign, flatten, entries, sortBy, map as map$2, omit, uniqBy, transform } from 'lodash';
9
9
  import * as i6 from '@veloceapps/components';
10
10
  import { ToastType, ConfirmationComponent, ConfirmationDialogModule } from '@veloceapps/components';
11
11
  import moment from 'moment';
@@ -256,271 +256,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
256
256
  }] }];
257
257
  } });
258
258
 
259
- const findLineItem = (id, lineItems) => {
260
- return findLineItemWithComparator(lineItems, (li) => li.id === id);
261
- };
262
- const findLineItemWithComparator = (lineItems, comparator) => {
263
- let currentLevel = lineItems;
264
- while (currentLevel.length) {
265
- const found = currentLevel.find(comparator);
266
- if (found) {
267
- return found;
268
- }
269
- currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
270
- }
271
- return;
272
- };
273
- const insertLineItem = (lineItem, parentId, toInsert) => {
274
- const insertData = lineItem.id === parentId ? [toInsert] : [];
275
- return Object.assign(Object.assign({}, lineItem), { lineItems: [
276
- ...insertData,
277
- ...lineItem.lineItems.map(li => {
278
- return insertLineItem(li, parentId, toInsert);
279
- }),
280
- ] });
281
- };
282
- const removeLineItem = (lineItem, idToRemove) => {
283
- return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems
284
- .map(li => {
285
- if (li.id === idToRemove) {
286
- return;
287
- }
288
- else if (li.lineItems.length) {
289
- return removeLineItem(li, idToRemove);
290
- }
291
- return li;
292
- })
293
- .filter(r => !!r) });
294
- };
295
- const replaceLineItem = (lineItem, replaceTo, skipCardinalityCalculation = false) => {
296
- if (lineItem.id === replaceTo.id) {
297
- if (!skipCardinalityCalculation) {
298
- return Object.assign({}, recalculateCardinalityVariables(lineItem, replaceTo));
299
- }
300
- else {
301
- return Object.assign({}, replaceTo);
302
- }
303
- }
304
- return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems.map(li => replaceLineItem(li, replaceTo, skipCardinalityCalculation)) });
305
- };
306
- const collectCardinalityComputations = (portDomains) => {
307
- const cardinalityComputations = new Map();
308
- entries(portDomains).forEach(([key, portDomain]) => {
309
- cardinalityComputations.set(key, portDomain.properties['cardinalityComputation'] === 'true');
310
- });
311
- return cardinalityComputations;
312
- };
313
- const calculateCardinalityVariables = (lineItems, cardinalityComputations) => {
314
- const cardVars = new Map();
315
- lineItems
316
- .filter(({ port, type }) => !!port && !!type)
317
- .forEach(li => {
318
- var _a;
319
- if (cardinalityComputations.get(`${li.port}`)) {
320
- const cardinalityVariableName = `#CV-${li.type}@${li.port}`;
321
- cardVars.set(cardinalityVariableName, ((_a = cardVars.get(cardinalityVariableName)) !== null && _a !== void 0 ? _a : 0) + li.qty);
322
- }
323
- });
324
- return cardVars;
325
- };
326
- const cardinalityRegexp = new RegExp('#CV-[a-zA-Z0-9_]+@(?<portName>[a-zA-Z0-9_]+)');
327
- const recalculateCardinalityVariables = (original, updated) => {
328
- var _a, _b;
329
- const cardinalityComputations = collectCardinalityComputations((_b = (_a = updated.portDomains) !== null && _a !== void 0 ? _a : original.portDomains) !== null && _b !== void 0 ? _b : {});
330
- const cardinalityVariables = calculateCardinalityVariables(updated.lineItems, cardinalityComputations);
331
- const originalCardinalityVariables = calculateCardinalityVariables(original.lineItems, cardinalityComputations);
332
- originalCardinalityVariables.forEach((value, key) => {
333
- var _a;
334
- const execArray = cardinalityRegexp.exec(key);
335
- const portName = (_a = execArray === null || execArray === void 0 ? void 0 : execArray.groups) === null || _a === void 0 ? void 0 : _a['portName'];
336
- if (!portName || cardinalityComputations.get(portName)) {
337
- if (cardinalityVariables.get(key) === value) {
338
- // no need to update cardinality if no changes
339
- cardinalityVariables.delete(key);
340
- }
341
- else if (!cardinalityVariables.has(key)) {
342
- // remove last item from port
343
- cardinalityVariables.set(key, 0);
344
- }
345
- }
346
- });
347
- return Object.assign(Object.assign({}, updated), { attributes: upsertAttributes(updated.attributes, [...cardinalityVariables].map(([name, value]) => ({ name, value, cfgStatus: 'Changed' }))) });
348
- };
349
- const mapAttributes = (attributes) => {
350
- return attributes.reduce((acc, { name, value }) => (Object.assign(Object.assign({}, acc), { [name]: value })), {});
351
- };
352
- const getAttributes = (attributes, names = []) => {
353
- const filtered = attributes.filter(({ name }) => names.includes(name));
354
- return sortBy(filtered, [({ name }) => names.indexOf(name)]);
355
- };
356
- const upsertAttributes = (originalAttributes, attributesToUpsert) => {
357
- return attributesToUpsert.reduce((acc, { name, value }) => {
358
- const [origAttr] = getAttributes(acc, [name]);
359
- return [
360
- ...acc.filter(attr => attr.name !== name),
361
- Object.assign(Object.assign({}, (origAttr !== null && origAttr !== void 0 ? origAttr : { name, type: '' })), { cfgStatus: origAttr ? 'Changed' : 'User', value }),
362
- ];
363
- }, originalAttributes);
364
- };
365
- const patchAttributes = (rootLineItem, id, attrs, skipCardinalityCalculation = false) => {
366
- const lineItem = findLineItem(id, [rootLineItem]);
367
- if (!lineItem) {
368
- return rootLineItem;
369
- }
370
- const attributes = upsertAttributes(lineItem.attributes, attrs);
371
- return replaceLineItem(rootLineItem, Object.assign(Object.assign({}, lineItem), { attributes }), skipCardinalityCalculation);
372
- };
373
- const getAttributeValue = (attributes, name) => { var _a; return (_a = attributes.find(attr => attr.name === name)) === null || _a === void 0 ? void 0 : _a.value; };
374
- const generateLineItem = (port, type, parentId, attributes = [], lineItems = []) => {
375
- return {
376
- id: UUID.UUID(),
377
- port,
378
- type,
379
- actionCode: 'ADD',
380
- cfgStatus: 'New',
381
- attributes: attributes.map(({ name, value }) => ({ cfgStatus: 'User', name, value })),
382
- lineItems,
383
- parentId,
384
- qty: 1,
385
- };
386
- };
387
- const getRecommendedPrices = (portDomain, type) => {
388
- var _a, _b;
389
- const domainType = portDomain.domainTypes.find(({ name }) => name === type);
390
- const [net, list] = (_b = (_a = domainType === null || domainType === void 0 ? void 0 : domainType.recommendedPrices) === null || _a === void 0 ? void 0 : _a.filter(({ chargeMethod }) => chargeMethod === 'ONE_TIME').reduce((acc, rp) => {
391
- const [netPrice, listPrice] = acc;
392
- return [netPrice + rp.netPrice, listPrice + rp.listPrice];
393
- }, [0, 0])) !== null && _b !== void 0 ? _b : [0, 0];
394
- return { net, list };
395
- };
396
- const generateModifiedAssetsMap = (lineItems) => {
397
- return lineItems.reduce((acc, li) => {
398
- var _a;
399
- const isModified = isLineItemModified(li);
400
- if (!isModified) {
401
- return acc;
402
- }
403
- const target = getOriginParent(lineItems, li);
404
- const id = (_a = target === null || target === void 0 ? void 0 : target.assetId) !== null && _a !== void 0 ? _a : target === null || target === void 0 ? void 0 : target.openOrderLineItemId;
405
- if (id) {
406
- acc[id] = true;
407
- }
408
- return acc;
409
- }, {});
410
- };
411
- const getOriginParent = (lineItems, currentLineItem) => {
412
- let target = currentLineItem;
413
- while (target && target.rampInstanceId) {
414
- target = lineItems.find(sub => sub.id === currentLineItem.rampInstanceId);
415
- }
416
- return target;
417
- };
418
- const isLineItemModified = (lineItem) => {
419
- if (lineItem.actionCode === 'EXIST' && lineItem.status === 'PENDING') {
420
- return false;
421
- }
422
- return lineItem.actionCode !== 'EXIST';
423
- };
424
- const multiplyLineItems = (lineItem, qty, split) => {
425
- if (split) {
426
- const unifyIds = (lineItem) => (Object.assign(Object.assign({}, lineItem), { id: UUID.UUID(), lineItems: lineItem.lineItems.map(unifyIds) }));
427
- return map$2(new Array(qty), () => unifyIds(lineItem));
428
- }
429
- else {
430
- return [
431
- Object.assign(Object.assign({}, lineItem), { qty: qty }),
432
- ];
433
- }
434
- };
435
- const isTechnicalAttribute = (name) => {
436
- return name.startsWith('#') || name.startsWith('$');
437
- };
438
- const filterOutTechnicalAttributes = (attributes) => {
439
- return attributes.filter(({ name }) => !isTechnicalAttribute(name));
440
- };
441
-
442
- var lineItem_utils = /*#__PURE__*/Object.freeze({
443
- __proto__: null,
444
- filterOutTechnicalAttributes: filterOutTechnicalAttributes,
445
- findLineItem: findLineItem,
446
- findLineItemWithComparator: findLineItemWithComparator,
447
- generateLineItem: generateLineItem,
448
- generateModifiedAssetsMap: generateModifiedAssetsMap,
449
- getAttributeValue: getAttributeValue,
450
- getAttributes: getAttributes,
451
- getOriginParent: getOriginParent,
452
- getRecommendedPrices: getRecommendedPrices,
453
- insertLineItem: insertLineItem,
454
- isLineItemModified: isLineItemModified,
455
- isTechnicalAttribute: isTechnicalAttribute,
456
- mapAttributes: mapAttributes,
457
- multiplyLineItems: multiplyLineItems,
458
- patchAttributes: patchAttributes,
459
- recalculateCardinalityVariables: recalculateCardinalityVariables,
460
- removeLineItem: removeLineItem,
461
- replaceLineItem: replaceLineItem,
462
- upsertAttributes: upsertAttributes
463
- });
464
-
465
- class LineItemWorker {
466
- constructor(src) {
467
- this.li = Object.assign({}, src);
468
- }
469
- insert(parentId, toInsert) {
470
- return new LineItemWorker(insertLineItem(this.li, parentId, toInsert));
471
- }
472
- remove(id) {
473
- return new LineItemWorker(removeLineItem(this.li, id));
474
- }
475
- replace(toReplace, skipCardinalityCalculation = false) {
476
- return new LineItemWorker(replaceLineItem(this.li, toReplace, skipCardinalityCalculation));
477
- }
478
- patchAttribute(attrs, id, skipCardinalityCalculation = false) {
479
- return new LineItemWorker(patchAttributes(this.li, id !== null && id !== void 0 ? id : this.li.id, attrs, skipCardinalityCalculation));
480
- }
481
- }
482
-
483
- function extractMetadata(uiDefinition) {
484
- return omit(uiDefinition, [
485
- 'children',
486
- 'pages',
487
- 'components',
488
- ]);
489
- }
490
-
491
- class IntegrationState {
492
- constructor() {
493
- this.stateSubj$ = new BehaviorSubject({});
494
- this.action$ = new Subject();
495
- }
496
- get state$() {
497
- return this.stateSubj$.asObservable();
498
- }
499
- get state() {
500
- return this.stateSubj$.getValue();
501
- }
502
- patchState(update) {
503
- this.stateSubj$.next(Object.assign(Object.assign({}, this.stateSubj$.getValue()), update));
504
- }
505
- dispatch(action) {
506
- this.action$.next(action);
507
- }
508
- listen$(actionType) {
509
- return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
510
- }
511
- listenAll$() {
512
- return this.action$.asObservable();
513
- }
514
- clear() {
515
- this.stateSubj$.next({});
516
- }
517
- }
518
- IntegrationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
519
- IntegrationState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState });
520
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, decorators: [{
521
- type: Injectable
522
- }] });
523
-
524
259
  class QuoteDraftService {
525
260
  get isInitialized$() {
526
261
  return this.isInitializedSubj$.asObservable();
@@ -547,30 +282,30 @@ class QuoteDraftService {
547
282
  return this.quoteSubj$.pipe(map(() => this.hasProducts));
548
283
  }
549
284
  get hasProducts() {
550
- const quoteDraft = this.quoteSubj$.value;
551
- return this.filterByActivePriceList((quoteDraft === null || quoteDraft === void 0 ? void 0 : quoteDraft.currentState) || []).some(li => !li.assetId && !li.openOrderLineItemId);
285
+ var _a;
286
+ return Boolean((_a = this.quoteSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
552
287
  }
553
288
  get hasAssets$() {
554
- return this.quoteSubj$.pipe(map(() => this.hasAssets));
289
+ return this.assetsSubj$.pipe(map(() => this.hasAssets));
555
290
  }
556
291
  get hasAssets() {
557
- const quoteDraft = this.quoteSubj$.value;
558
- return this.filterByActivePriceList((quoteDraft === null || quoteDraft === void 0 ? void 0 : quoteDraft.currentState) || []).some(li => li.assetId || li.openOrderLineItemId);
292
+ var _a;
293
+ return Boolean((_a = this.assetsSubj$.value) === null || _a === void 0 ? void 0 : _a.currentState.length);
559
294
  }
560
- constructor(context, quoteApiService, priceApiService, integrationState) {
295
+ get assetsState() {
296
+ return this.assetsSubj$.value;
297
+ }
298
+ constructor(context, accountApiService, quoteApiService) {
561
299
  this.context = context;
300
+ this.accountApiService = accountApiService;
562
301
  this.quoteApiService = quoteApiService;
563
- this.priceApiService = priceApiService;
564
- this.integrationState = integrationState;
565
302
  this.quoteSubj$ = new BehaviorSubject(null);
303
+ this.assetsSubj$ = new BehaviorSubject(null);
566
304
  this.resetSubj$ = new BehaviorSubject(true);
567
305
  this.isInitializedSubj$ = new BehaviorSubject(false);
568
306
  this.initialCurrentState = [];
569
307
  this._hasUnsavedChanges = false;
570
- this.allPriceLists = [];
571
- this.assetPriceLists = [];
572
308
  this.reset$ = this.resetSubj$.asObservable();
573
- 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));
574
309
  this.isInitializedSubj$
575
310
  .pipe(filter(isInitialized => isInitialized), switchMap$1(() => this.quoteSubj$.asObservable()), skip(1), tap(quote => this.markAsUpdated(quote)))
576
311
  .subscribe();
@@ -578,19 +313,24 @@ class QuoteDraftService {
578
313
  reset() {
579
314
  this.resetSubj$.next(true);
580
315
  this.quoteSubj$.next(null);
316
+ this.assetsSubj$.next(null);
581
317
  this.isInitialized = false;
582
318
  this.hasUnsavedChanges = false;
583
319
  }
584
- init(quoteId, params) {
585
- return zip(this.quoteApiService.getQuoteDraft(quoteId, params), this.priceApiService.getPriceLists()).pipe(tap(([quote, allPriceLists]) => {
586
- this.allPriceLists = allPriceLists;
320
+ init(headerId, params) {
321
+ const { mode } = this.context.resolve();
322
+ const assets$ = mode === ConfigurationContextMode.ACCOUNT
323
+ ? this.accountApiService.getAssetsState(headerId, params)
324
+ : of(undefined);
325
+ return zip(assets$, this.quoteApiService.getQuoteState(headerId, params)).pipe(tap(([assets, quote]) => {
326
+ if (assets) {
327
+ this.assetsSubj$.next(assets);
328
+ }
587
329
  this.quoteSubj$.next(quote);
588
330
  this.context.update(quote.context);
589
- this.populateActivePriceLists$();
590
331
  }), map(() => noop()), take(1));
591
332
  }
592
333
  finalizeInit() {
593
- this.initializeModifiedAssetsMap();
594
334
  this.isInitialized = true;
595
335
  this.hasUnsavedChanges = false;
596
336
  }
@@ -622,6 +362,9 @@ class QuoteDraftService {
622
362
  });
623
363
  this.quoteSubj$.next(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedCurrentState, totalPrices: priceSummary.totalPrices, approvalItems: priceSummary.approvalItems }));
624
364
  }
365
+ setAssetsState(assetsState) {
366
+ this.assetsSubj$.next(assetsState);
367
+ }
625
368
  get quoteDraft$() {
626
369
  return combineLatest([this.quoteSubj$, this.context.resolve$()]).pipe(map(() => this.quoteDraft), filter((quote) => Boolean(quote)), shareReplay());
627
370
  }
@@ -632,13 +375,6 @@ class QuoteDraftService {
632
375
  }
633
376
  return Object.assign(Object.assign({}, quote), { context: this.context.resolve() });
634
377
  }
635
- get quoteDraftForActivePriceList() {
636
- const quoteDraft = this.quoteDraft;
637
- if (!quoteDraft) {
638
- return null;
639
- }
640
- return Object.assign(Object.assign({}, quoteDraft), { initialState: this.filterByActivePriceList(quoteDraft.initialState), currentState: this.filterByActivePriceList(quoteDraft.currentState) });
641
- }
642
378
  get currentState$() {
643
379
  return this.quoteDraft$.pipe(map(quote => quote.currentState));
644
380
  }
@@ -646,39 +382,6 @@ class QuoteDraftService {
646
382
  var _a, _b;
647
383
  return (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.currentState) !== null && _b !== void 0 ? _b : [];
648
384
  }
649
- /**
650
- * Stream of activeCurrentState
651
- */
652
- get activeCurrentState$() {
653
- return this.quoteDraft$.pipe(map(() => this.activeCurrentState));
654
- }
655
- /**
656
- * activeCurrentState is currentState passed through additional filters
657
- */
658
- get activeCurrentState() {
659
- var _a, _b;
660
- let currentState = (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.currentState) !== null && _b !== void 0 ? _b : [];
661
- currentState = this.filterByActivePriceList(currentState);
662
- return currentState;
663
- }
664
- /**
665
- * Stream of activeInitialState
666
- */
667
- get activeInitialState$() {
668
- return this.quoteDraft$.pipe(map(() => this.activeInitialState));
669
- }
670
- /**
671
- * activeInitialState is initialState passed through additional filters
672
- */
673
- get activeInitialState() {
674
- var _a, _b;
675
- const ctx = this.context.resolve();
676
- let initialState = (_b = (_a = this.quoteDraft) === null || _a === void 0 ? void 0 : _a.initialState) !== null && _b !== void 0 ? _b : [];
677
- if (ctx.mode === ConfigurationContextMode.ACCOUNT) {
678
- initialState = this.filterByActivePriceList(initialState);
679
- }
680
- return initialState;
681
- }
682
385
  get isStandalone() {
683
386
  return this.context.resolve().properties.standalone === 'true';
684
387
  }
@@ -696,40 +399,10 @@ class QuoteDraftService {
696
399
  if (context.mode === ConfigurationContextMode.ACCOUNT) {
697
400
  return true;
698
401
  }
699
- if (context.mode === ConfigurationContextMode.QUOTE) {
700
- return context.properties.Status === 'Draft';
701
- }
702
- return false;
703
- }
704
- updateActivePriceList(priceListId) {
705
- this.context.update({ properties: { PriceListId: priceListId } });
706
- }
707
- populateActivePriceLists$() {
708
- const ctx = this.context.resolve();
709
- const quoteDraft = this.quoteDraft;
710
- if (!quoteDraft) {
711
- return;
712
- }
713
- // In ACCOUNT mode populate price lists from related assets
714
- if (ctx.mode === ConfigurationContextMode.ACCOUNT) {
715
- // Populate list of price lists
716
- this.assetPriceLists = quoteDraft.currentState
717
- .map(({ priceListId }) => priceListId)
718
- .reduce((trunk, priceListId) => {
719
- var _a, _b;
720
- if (!priceListId || trunk.some(item => item.id === priceListId)) {
721
- return trunk;
722
- }
723
- return [
724
- ...trunk,
725
- { id: priceListId, name: (_b = (_a = this.allPriceLists.find(item => item.id === priceListId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '' },
726
- ];
727
- }, []);
402
+ if (context.mode === ConfigurationContextMode.QUOTE) {
403
+ return context.properties.Status === 'Draft';
728
404
  }
729
- }
730
- filterByActivePriceList(lineItems) {
731
- const ctx = this.context.resolve();
732
- return lineItems.filter(li => !li.priceListId || li.priceListId === ctx.properties.PriceListId);
405
+ return false;
733
406
  }
734
407
  markAsUpdated(quote) {
735
408
  if ((quote === null || quote === void 0 ? void 0 : quote.context.properties.mode) === ConfigurationContextMode.ACCOUNT) {
@@ -739,17 +412,12 @@ class QuoteDraftService {
739
412
  this.hasUnsavedChanges = !isEqual(this.initialCurrentState, quote === null || quote === void 0 ? void 0 : quote.currentState);
740
413
  }
741
414
  }
742
- initializeModifiedAssetsMap() {
743
- this.integrationState.patchState({
744
- modifiedAssets: generateModifiedAssetsMap(this.currentState),
745
- });
746
- }
747
415
  }
748
- QuoteDraftService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, deps: [{ token: ContextService }, { token: i1.QuoteApiService }, { token: i1.PriceApiService }, { token: IntegrationState }], target: i0.ɵɵFactoryTarget.Injectable });
416
+ QuoteDraftService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, deps: [{ token: ContextService }, { token: i1.AccountApiService }, { token: i1.QuoteApiService }], target: i0.ɵɵFactoryTarget.Injectable });
749
417
  QuoteDraftService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService });
750
418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: QuoteDraftService, decorators: [{
751
419
  type: Injectable
752
- }], ctorParameters: function () { return [{ type: ContextService }, { type: i1.QuoteApiService }, { type: i1.PriceApiService }, { type: IntegrationState }]; } });
420
+ }], ctorParameters: function () { return [{ type: ContextService }, { type: i1.AccountApiService }, { type: i1.QuoteApiService }]; } });
753
421
 
754
422
  class FlowStateService {
755
423
  constructor(contextService, quoteDraftService, flowInfoService, flowConfiguration, processorsApiService, flowStateApiService, quoteApiService, toastService, customizationService) {
@@ -781,8 +449,8 @@ class FlowStateService {
781
449
  this.isInitialized$()
782
450
  .pipe(filter$1(Boolean), filter$1(() => !this.getFlowSafe().properties.stateful), switchMap(() => this.flowConfiguration.updated$), switchMap(() => this.executeRequest$({}, true)))
783
451
  .subscribe();
784
- this.charges$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(flow => {
785
- if (!flow.properties.stateful) {
452
+ this.charges$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
453
+ if (this.flowInfoService.isLegacy) {
786
454
  return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.charges));
787
455
  }
788
456
  else {
@@ -790,10 +458,10 @@ class FlowStateService {
790
458
  cold: true,
791
459
  }).pipe(map$1(response => (response.success ? response.result : {})));
792
460
  }
793
- }), filter$1(isDefined), shareReplay$1());
461
+ }), shareReplay$1(1));
794
462
  this.charges$.subscribe();
795
- this.pricePlans$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(flow => {
796
- if (!flow.properties.stateful) {
463
+ this.pricePlans$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
464
+ if (this.flowInfoService.isLegacy) {
797
465
  return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.pricePlans));
798
466
  }
799
467
  else {
@@ -801,10 +469,10 @@ class FlowStateService {
801
469
  cold: true,
802
470
  }).pipe(map$1(response => (response.success ? response.result : {})));
803
471
  }
804
- }), filter$1(isDefined), shareReplay$1());
472
+ }), shareReplay$1(1));
805
473
  this.pricePlans$.subscribe();
806
- this.activeMetrics$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(flow => {
807
- if (!flow.properties.stateful) {
474
+ this.activeMetrics$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
475
+ if (this.flowInfoService.isLegacy) {
808
476
  return this.quoteDraftService.quoteDraft$.pipe(map$1(quoteDraft => quoteDraft.activeMetrics));
809
477
  }
810
478
  else {
@@ -812,8 +480,19 @@ class FlowStateService {
812
480
  cold: true,
813
481
  }).pipe(map$1(response => (response.success ? response.result : [])));
814
482
  }
815
- }), filter$1(isDefined), shareReplay$1());
483
+ }), shareReplay$1(1));
816
484
  this.activeMetrics$.subscribe();
485
+ this.isPriceListLocked$ = this.flowInfoService.flow$.pipe(filter$1(isDefined), switchMap(() => {
486
+ if (this.flowInfoService.isLegacy) {
487
+ return of(false);
488
+ }
489
+ else {
490
+ return this.subscribe$(UITemplateType.FLOW_ENGINE, 'IS_PRICE_LIST_LOCKED', null, {
491
+ cold: true,
492
+ }).pipe(map$1(response => (response.success ? response.result : false)));
493
+ }
494
+ }), shareReplay$1(1));
495
+ this.isPriceListLocked$.subscribe();
817
496
  }
818
497
  init$() {
819
498
  return this.initProcessors$().pipe(switchMap(() => {
@@ -921,7 +600,7 @@ class FlowStateService {
921
600
  }
922
601
  }
923
602
  else {
924
- const quoteDraft = this.quoteDraftService.quoteDraftForActivePriceList;
603
+ const quoteDraft = this.quoteDraftService.quoteDraft;
925
604
  if (quoteDraft) {
926
605
  return this.quoteApiService.upsertQuote(quoteDraft).pipe(tap$1(({ configurationId }) => {
927
606
  this.contextService.update({ properties: { ConfigurationId: configurationId } });
@@ -937,7 +616,7 @@ class FlowStateService {
937
616
  }
938
617
  }
939
618
  else {
940
- const quoteDraft = this.quoteDraftService.quoteDraftForActivePriceList;
619
+ const quoteDraft = this.quoteDraftService.quoteDraft;
941
620
  if (quoteDraft) {
942
621
  return this.quoteApiService.submitQuote(quoteDraft).pipe(tap$1(({ configurationId }) => {
943
622
  this.contextService.update({ properties: { ConfigurationId: configurationId } });
@@ -1064,7 +743,12 @@ class FlowStateService {
1064
743
  initStateless$() {
1065
744
  var _a;
1066
745
  const { headerId } = this.contextService.resolve();
1067
- return this.quoteDraftService.init(headerId, (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {}).pipe(switchMap(() => this.executeRequest$(this.getDefaultExecutionRequestDTO())), switchMap(() => this.calculate$()), tap$1(() => this.quoteDraftService.finalizeInit()), map$1(noop));
746
+ return this.quoteDraftService.init(headerId, (_a = this.flowInfoService.params) !== null && _a !== void 0 ? _a : {}).pipe(tap$1(() => {
747
+ const assets = this.quoteDraftService.assetsState;
748
+ if (assets) {
749
+ this.flowStore = Object.assign(Object.assign({}, this.flowStore), { assets });
750
+ }
751
+ }), switchMap(() => this.executeRequest$(this.getDefaultExecutionRequestDTO())), switchMap(() => this.calculate$()), tap$1(() => this.quoteDraftService.finalizeInit()), map$1(noop));
1068
752
  }
1069
753
  calculate$() {
1070
754
  var _a;
@@ -1121,144 +805,350 @@ class FlowStateService {
1121
805
  });
1122
806
  this.quoteDraftService.updateQuoteDraft(flowState);
1123
807
  }
1124
- executeStatelessSelectors(request) {
1125
- var _a;
1126
- if (!this.quoteDraftService.quoteDraft) {
1127
- throw 'QuoteDraft is not initialized';
1128
- }
1129
- const flowState = this.quoteDraftService.quoteDraft;
1130
- return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
1131
- try {
1132
- result.selectors[key] = {
1133
- success: true,
1134
- result: this.executeSelectorScript(flowState, selector),
1135
- };
1136
- }
1137
- catch (e) {
1138
- console.error(e);
1139
- result.selectors[key] = {
1140
- success: false,
1141
- errorMessage: String(e),
1142
- };
1143
- }
1144
- return result;
1145
- }, { stateId: '', selectors: {} });
808
+ executeStatelessSelectors(request) {
809
+ var _a;
810
+ if (!this.quoteDraftService.quoteDraft) {
811
+ throw 'QuoteDraft is not initialized';
812
+ }
813
+ const flowState = this.quoteDraftService.quoteDraft;
814
+ return EntityUtil.entries((_a = request.selectors) !== null && _a !== void 0 ? _a : {}).reduce((result, [key, selector]) => {
815
+ try {
816
+ result.selectors[key] = {
817
+ success: true,
818
+ result: this.executeSelectorScript(flowState, selector),
819
+ };
820
+ }
821
+ catch (e) {
822
+ console.error(e);
823
+ result.selectors[key] = {
824
+ success: false,
825
+ errorMessage: String(e),
826
+ };
827
+ }
828
+ return result;
829
+ }, { stateId: '', selectors: {} });
830
+ }
831
+ getFlowSafe() {
832
+ if (!this.flowInfoService.flow) {
833
+ throw 'Flow is not defined';
834
+ }
835
+ return this.flowInfoService.flow;
836
+ }
837
+ initProcessors$() {
838
+ var _a;
839
+ const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
840
+ const flow = this.getFlowSafe();
841
+ if (flow.properties.stateful && !hasOverrides) {
842
+ // Skip initialization as backend will take processors from SF
843
+ return of(undefined);
844
+ }
845
+ const owners$ = Object.values(this.flowInfoService.templates)
846
+ .map(template => {
847
+ var _a, _b, _c;
848
+ if (!template) {
849
+ return;
850
+ }
851
+ const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
852
+ return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap$1(processors => {
853
+ const processorsMap = processors.reduce((acc, p) => {
854
+ acc[p.apiName] = p;
855
+ return acc;
856
+ }, {});
857
+ this.processors[template.id] = processorsMap;
858
+ }));
859
+ })
860
+ .filter(isDefined);
861
+ if (!owners$.length) {
862
+ return of(undefined);
863
+ }
864
+ return forkJoin(owners$).pipe(map$1(noop));
865
+ }
866
+ executeActionScript(request, executable) {
867
+ var _a;
868
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
869
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
870
+ const scope = this.getScopeByOwnerId(executable.ownerId);
871
+ const scopeText = scope ? ` in ${scope}` : '';
872
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
873
+ }
874
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
875
+ }
876
+ executeSelectorScript(request, executable) {
877
+ var _a;
878
+ const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
879
+ if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
880
+ const scope = this.getScopeByOwnerId(executable.ownerId);
881
+ const scopeText = scope ? ` in ${scope}` : '';
882
+ throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
883
+ }
884
+ return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
885
+ }
886
+ executeProcessorScript(request, configurationProcessor, inputData) {
887
+ var _a;
888
+ const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
889
+ let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
890
+ if (!functionToExecute) {
891
+ const script = `${configurationProcessor.script}\nreturn transform;`;
892
+ const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
893
+ functionToExecute = new Function(script + sourceMap)();
894
+ this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
895
+ }
896
+ return functionToExecute({
897
+ request,
898
+ inputData,
899
+ flowStore: this.flowStore,
900
+ });
901
+ }
902
+ generateRequestId(scope, selectorName, inputData) {
903
+ const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
904
+ return `${scope}/${selectorName}/${inputDataHash}`;
905
+ }
906
+ getDefaultExecutionRequestDTO() {
907
+ var _a;
908
+ const request = {
909
+ actions: [],
910
+ selectors: {},
911
+ };
912
+ if (this.getFlowSafe().properties.standalone) {
913
+ return request;
914
+ }
915
+ const flowEngineTemplateId = this.getOwnerIdByScope(UITemplateType.FLOW_ENGINE);
916
+ (_a = request.actions) === null || _a === void 0 ? void 0 : _a.push({
917
+ apiName: 'UPDATE_CONTEXT_PROPERTIES',
918
+ ownerId: flowEngineTemplateId,
919
+ inputData: this.contextService.resolve().properties,
920
+ });
921
+ return request;
922
+ }
923
+ }
924
+ 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 });
925
+ FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
926
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
927
+ type: Injectable
928
+ }], ctorParameters: function () {
929
+ return [{ type: ContextService }, { type: QuoteDraftService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }, { type: i6.ToastService }, { type: undefined, decorators: [{
930
+ type: Optional
931
+ }, {
932
+ type: Inject,
933
+ args: [FLOW_CUSTOMIZATION]
934
+ }] }];
935
+ } });
936
+
937
+ const findLineItem = (id, lineItems) => {
938
+ return findLineItemWithComparator(lineItems, (li) => li.id === id);
939
+ };
940
+ const findLineItemWithComparator = (lineItems, comparator) => {
941
+ let currentLevel = lineItems;
942
+ while (currentLevel.length) {
943
+ const found = currentLevel.find(comparator);
944
+ if (found) {
945
+ return found;
946
+ }
947
+ currentLevel = flatten(currentLevel.map(parent => parent.lineItems));
948
+ }
949
+ return;
950
+ };
951
+ const insertLineItem = (lineItem, parentId, toInsert) => {
952
+ const insertData = lineItem.id === parentId ? [toInsert] : [];
953
+ return Object.assign(Object.assign({}, lineItem), { lineItems: [
954
+ ...insertData,
955
+ ...lineItem.lineItems.map(li => {
956
+ return insertLineItem(li, parentId, toInsert);
957
+ }),
958
+ ] });
959
+ };
960
+ const removeLineItem = (lineItem, idToRemove) => {
961
+ return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems
962
+ .map(li => {
963
+ if (li.id === idToRemove) {
964
+ return;
965
+ }
966
+ else if (li.lineItems.length) {
967
+ return removeLineItem(li, idToRemove);
968
+ }
969
+ return li;
970
+ })
971
+ .filter(r => !!r) });
972
+ };
973
+ const replaceLineItem = (lineItem, replaceTo, skipCardinalityCalculation = false) => {
974
+ if (lineItem.id === replaceTo.id) {
975
+ if (!skipCardinalityCalculation) {
976
+ return Object.assign({}, recalculateCardinalityVariables(lineItem, replaceTo));
977
+ }
978
+ else {
979
+ return Object.assign({}, replaceTo);
980
+ }
981
+ }
982
+ return Object.assign(Object.assign({}, lineItem), { lineItems: lineItem.lineItems.map(li => replaceLineItem(li, replaceTo, skipCardinalityCalculation)) });
983
+ };
984
+ const collectCardinalityComputations = (portDomains) => {
985
+ const cardinalityComputations = new Map();
986
+ entries(portDomains).forEach(([key, portDomain]) => {
987
+ cardinalityComputations.set(key, portDomain.properties['cardinalityComputation'] === 'true');
988
+ });
989
+ return cardinalityComputations;
990
+ };
991
+ const calculateCardinalityVariables = (lineItems, cardinalityComputations) => {
992
+ const cardVars = new Map();
993
+ lineItems
994
+ .filter(({ port, type }) => !!port && !!type)
995
+ .forEach(li => {
996
+ var _a;
997
+ if (cardinalityComputations.get(`${li.port}`)) {
998
+ const cardinalityVariableName = `#CV-${li.type}@${li.port}`;
999
+ cardVars.set(cardinalityVariableName, ((_a = cardVars.get(cardinalityVariableName)) !== null && _a !== void 0 ? _a : 0) + li.qty);
1000
+ }
1001
+ });
1002
+ return cardVars;
1003
+ };
1004
+ const cardinalityRegexp = new RegExp('#CV-[a-zA-Z0-9_]+@(?<portName>[a-zA-Z0-9_]+)');
1005
+ const recalculateCardinalityVariables = (original, updated) => {
1006
+ var _a, _b;
1007
+ const cardinalityComputations = collectCardinalityComputations((_b = (_a = updated.portDomains) !== null && _a !== void 0 ? _a : original.portDomains) !== null && _b !== void 0 ? _b : {});
1008
+ const cardinalityVariables = calculateCardinalityVariables(updated.lineItems, cardinalityComputations);
1009
+ const originalCardinalityVariables = calculateCardinalityVariables(original.lineItems, cardinalityComputations);
1010
+ originalCardinalityVariables.forEach((value, key) => {
1011
+ var _a;
1012
+ const execArray = cardinalityRegexp.exec(key);
1013
+ const portName = (_a = execArray === null || execArray === void 0 ? void 0 : execArray.groups) === null || _a === void 0 ? void 0 : _a['portName'];
1014
+ if (!portName || cardinalityComputations.get(portName)) {
1015
+ if (cardinalityVariables.get(key) === value) {
1016
+ // no need to update cardinality if no changes
1017
+ cardinalityVariables.delete(key);
1018
+ }
1019
+ else if (!cardinalityVariables.has(key)) {
1020
+ // remove last item from port
1021
+ cardinalityVariables.set(key, 0);
1022
+ }
1023
+ }
1024
+ });
1025
+ return Object.assign(Object.assign({}, updated), { attributes: upsertAttributes(updated.attributes, [...cardinalityVariables].map(([name, value]) => ({ name, value, cfgStatus: 'Changed' }))) });
1026
+ };
1027
+ const mapAttributes = (attributes) => {
1028
+ return attributes.reduce((acc, { name, value }) => (Object.assign(Object.assign({}, acc), { [name]: value })), {});
1029
+ };
1030
+ const getAttributes = (attributes, names = []) => {
1031
+ const filtered = attributes.filter(({ name }) => names.includes(name));
1032
+ return sortBy(filtered, [({ name }) => names.indexOf(name)]);
1033
+ };
1034
+ const upsertAttributes = (originalAttributes, attributesToUpsert) => {
1035
+ return attributesToUpsert.reduce((acc, { name, value }) => {
1036
+ const [origAttr] = getAttributes(acc, [name]);
1037
+ return [
1038
+ ...acc.filter(attr => attr.name !== name),
1039
+ Object.assign(Object.assign({}, (origAttr !== null && origAttr !== void 0 ? origAttr : { name, type: '' })), { cfgStatus: origAttr ? 'Changed' : 'User', value }),
1040
+ ];
1041
+ }, originalAttributes);
1042
+ };
1043
+ const patchAttributes = (rootLineItem, id, attrs, skipCardinalityCalculation = false) => {
1044
+ const lineItem = findLineItem(id, [rootLineItem]);
1045
+ if (!lineItem) {
1046
+ return rootLineItem;
1047
+ }
1048
+ const attributes = upsertAttributes(lineItem.attributes, attrs);
1049
+ return replaceLineItem(rootLineItem, Object.assign(Object.assign({}, lineItem), { attributes }), skipCardinalityCalculation);
1050
+ };
1051
+ const getAttributeValue = (attributes, name) => { var _a; return (_a = attributes.find(attr => attr.name === name)) === null || _a === void 0 ? void 0 : _a.value; };
1052
+ const generateLineItem = (port, type, parentId, attributes = [], lineItems = []) => {
1053
+ return {
1054
+ id: UUID.UUID(),
1055
+ port,
1056
+ type,
1057
+ actionCode: 'ADD',
1058
+ cfgStatus: 'New',
1059
+ attributes: attributes.map(({ name, value }) => ({ cfgStatus: 'User', name, value })),
1060
+ lineItems,
1061
+ parentId,
1062
+ qty: 1,
1063
+ };
1064
+ };
1065
+ const getRecommendedPrices = (portDomain, type) => {
1066
+ var _a, _b;
1067
+ const domainType = portDomain.domainTypes.find(({ name }) => name === type);
1068
+ const [net, list] = (_b = (_a = domainType === null || domainType === void 0 ? void 0 : domainType.recommendedPrices) === null || _a === void 0 ? void 0 : _a.filter(({ chargeMethod }) => chargeMethod === 'ONE_TIME').reduce((acc, rp) => {
1069
+ const [netPrice, listPrice] = acc;
1070
+ return [netPrice + rp.netPrice, listPrice + rp.listPrice];
1071
+ }, [0, 0])) !== null && _b !== void 0 ? _b : [0, 0];
1072
+ return { net, list };
1073
+ };
1074
+ const getOriginParent = (lineItems, currentLineItem) => {
1075
+ let target = currentLineItem;
1076
+ while (target && target.rampInstanceId) {
1077
+ target = lineItems.find(sub => sub.id === currentLineItem.rampInstanceId);
1078
+ }
1079
+ return target;
1080
+ };
1081
+ const assetPredicateFn = (lineItem, assetId) => {
1082
+ if (!assetId) {
1083
+ return false;
1146
1084
  }
1147
- getFlowSafe() {
1148
- if (!this.flowInfoService.flow) {
1149
- throw 'Flow is not defined';
1150
- }
1151
- return this.flowInfoService.flow;
1085
+ return lineItem.assetId === assetId || lineItem.openOrderLineItemId === assetId;
1086
+ };
1087
+ const multiplyLineItems = (lineItem, qty, split) => {
1088
+ if (split) {
1089
+ const unifyIds = (lineItem) => (Object.assign(Object.assign({}, lineItem), { id: UUID.UUID(), lineItems: lineItem.lineItems.map(unifyIds) }));
1090
+ return map$2(new Array(qty), () => unifyIds(lineItem));
1152
1091
  }
1153
- initProcessors$() {
1154
- var _a;
1155
- const hasOverrides = Boolean((_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors);
1156
- const flow = this.getFlowSafe();
1157
- if (flow.properties.stateful && !hasOverrides) {
1158
- // Skip initialization as backend will take processors from SF
1159
- return of(undefined);
1160
- }
1161
- const owners$ = Object.values(this.flowInfoService.templates)
1162
- .map(template => {
1163
- var _a, _b, _c;
1164
- if (!template) {
1165
- return;
1166
- }
1167
- const localProcessors$ = (_c = (_b = (_a = this.customizationService) === null || _a === void 0 ? void 0 : _a.getTemplateConfigurationProcessors) === null || _b === void 0 ? void 0 : _b.call(_a, template.name)) !== null && _c !== void 0 ? _c : of(null);
1168
- return localProcessors$.pipe(switchMap(processors => processors ? of(processors) : this.processorsApiService.fetchConfigurationProcessors$(template.id)), tap$1(processors => {
1169
- const processorsMap = processors.reduce((acc, p) => {
1170
- acc[p.apiName] = p;
1171
- return acc;
1172
- }, {});
1173
- this.processors[template.id] = processorsMap;
1174
- }));
1175
- })
1176
- .filter(isDefined);
1177
- if (!owners$.length) {
1178
- return of(undefined);
1179
- }
1180
- return forkJoin(owners$).pipe(map$1(noop));
1092
+ else {
1093
+ return [
1094
+ Object.assign(Object.assign({}, lineItem), { qty: qty }),
1095
+ ];
1181
1096
  }
1182
- executeActionScript(request, executable) {
1183
- var _a;
1184
- const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
1185
- if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
1186
- const scope = this.getScopeByOwnerId(executable.ownerId);
1187
- const scopeText = scope ? ` in ${scope}` : '';
1188
- throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1189
- }
1190
- return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1097
+ };
1098
+ const isTechnicalAttribute = (name) => {
1099
+ return name.startsWith('#') || name.startsWith('$');
1100
+ };
1101
+ const filterOutTechnicalAttributes = (attributes) => {
1102
+ return attributes.filter(({ name }) => !isTechnicalAttribute(name));
1103
+ };
1104
+
1105
+ var lineItem_utils = /*#__PURE__*/Object.freeze({
1106
+ __proto__: null,
1107
+ assetPredicateFn: assetPredicateFn,
1108
+ filterOutTechnicalAttributes: filterOutTechnicalAttributes,
1109
+ findLineItem: findLineItem,
1110
+ findLineItemWithComparator: findLineItemWithComparator,
1111
+ generateLineItem: generateLineItem,
1112
+ getAttributeValue: getAttributeValue,
1113
+ getAttributes: getAttributes,
1114
+ getOriginParent: getOriginParent,
1115
+ getRecommendedPrices: getRecommendedPrices,
1116
+ insertLineItem: insertLineItem,
1117
+ isTechnicalAttribute: isTechnicalAttribute,
1118
+ mapAttributes: mapAttributes,
1119
+ multiplyLineItems: multiplyLineItems,
1120
+ patchAttributes: patchAttributes,
1121
+ recalculateCardinalityVariables: recalculateCardinalityVariables,
1122
+ removeLineItem: removeLineItem,
1123
+ replaceLineItem: replaceLineItem,
1124
+ upsertAttributes: upsertAttributes
1125
+ });
1126
+
1127
+ class LineItemWorker {
1128
+ constructor(src) {
1129
+ this.li = Object.assign({}, src);
1191
1130
  }
1192
- executeSelectorScript(request, executable) {
1193
- var _a;
1194
- const configurationProcessor = (_a = this.processors[executable.ownerId]) === null || _a === void 0 ? void 0 : _a[executable.apiName];
1195
- if (!(configurationProcessor === null || configurationProcessor === void 0 ? void 0 : configurationProcessor.script)) {
1196
- const scope = this.getScopeByOwnerId(executable.ownerId);
1197
- const scopeText = scope ? ` in ${scope}` : '';
1198
- throw `ConfigurationProcessor ${executable.apiName}${scopeText} not found`;
1199
- }
1200
- return this.executeProcessorScript(request, configurationProcessor, executable.inputData);
1131
+ insert(parentId, toInsert) {
1132
+ return new LineItemWorker(insertLineItem(this.li, parentId, toInsert));
1201
1133
  }
1202
- executeProcessorScript(request, configurationProcessor, inputData) {
1203
- var _a;
1204
- const scope = this.getScopeByOwnerId((_a = configurationProcessor.ownerId) !== null && _a !== void 0 ? _a : '');
1205
- let functionToExecute = this.executedFunctions[scope + configurationProcessor.apiName];
1206
- if (!functionToExecute) {
1207
- const script = `${configurationProcessor.script}\nreturn transform;`;
1208
- const sourceMap = `\n//# sourceURL=${scope ? scope + '/' : ''}${configurationProcessor.apiName}.js`;
1209
- functionToExecute = new Function(script + sourceMap)();
1210
- this.executedFunctions[scope + configurationProcessor.apiName] = functionToExecute;
1211
- }
1212
- return functionToExecute({
1213
- request,
1214
- inputData,
1215
- flowStore: this.flowStore,
1216
- });
1134
+ remove(id) {
1135
+ return new LineItemWorker(removeLineItem(this.li, id));
1217
1136
  }
1218
- generateRequestId(scope, selectorName, inputData) {
1219
- const inputDataHash = UUID.hex(JSON.stringify(inputData) || '').slice(0, 8);
1220
- return `${scope}/${selectorName}/${inputDataHash}`;
1137
+ replace(toReplace, skipCardinalityCalculation = false) {
1138
+ return new LineItemWorker(replaceLineItem(this.li, toReplace, skipCardinalityCalculation));
1221
1139
  }
1222
- getDefaultExecutionRequestDTO() {
1223
- var _a, _b, _c;
1224
- const request = {
1225
- actions: [],
1226
- selectors: {},
1227
- };
1228
- if (this.getFlowSafe().properties.standalone) {
1229
- return request;
1230
- }
1231
- const ownerId = this.getOwnerIdByScope(UITemplateType.FLOW_ENGINE);
1232
- (_a = request.actions) === null || _a === void 0 ? void 0 : _a.push({
1233
- apiName: 'UPDATE_PRICE_LIST',
1234
- ownerId,
1235
- inputData: {},
1236
- });
1237
- (_b = request.actions) === null || _b === void 0 ? void 0 : _b.push({
1238
- apiName: 'UPDATE_ASSET_IDS',
1239
- ownerId,
1240
- inputData: {},
1241
- });
1242
- (_c = request.actions) === null || _c === void 0 ? void 0 : _c.push({
1243
- apiName: 'UPDATE_CONTEXT_PROPERTIES',
1244
- ownerId,
1245
- inputData: this.contextService.resolve().properties,
1246
- });
1247
- return request;
1140
+ patchAttribute(attrs, id, skipCardinalityCalculation = false) {
1141
+ return new LineItemWorker(patchAttributes(this.li, id !== null && id !== void 0 ? id : this.li.id, attrs, skipCardinalityCalculation));
1248
1142
  }
1249
1143
  }
1250
- 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 });
1251
- FlowStateService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService });
1252
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: FlowStateService, decorators: [{
1253
- type: Injectable
1254
- }], ctorParameters: function () {
1255
- return [{ type: ContextService }, { type: QuoteDraftService }, { type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.ConfigurationProcessorsApiService }, { type: i1.FlowStateApiService }, { type: i1.QuoteApiService }, { type: i6.ToastService }, { type: undefined, decorators: [{
1256
- type: Optional
1257
- }, {
1258
- type: Inject,
1259
- args: [FLOW_CUSTOMIZATION]
1260
- }] }];
1261
- } });
1144
+
1145
+ function extractMetadata(uiDefinition) {
1146
+ return omit(uiDefinition, [
1147
+ 'children',
1148
+ 'pages',
1149
+ 'components',
1150
+ ]);
1151
+ }
1262
1152
 
1263
1153
  class FlowUpdateService {
1264
1154
  update(rootLineItems, updates, charges) {
@@ -1681,6 +1571,15 @@ class ConfigurationService {
1681
1571
  }
1682
1572
  return lineItem;
1683
1573
  }
1574
+ getAsset() {
1575
+ var _a, _b;
1576
+ const lineItem = this.configurableRamp;
1577
+ if (!lineItem) {
1578
+ return;
1579
+ }
1580
+ const assetId = (_a = lineItem.assetId) !== null && _a !== void 0 ? _a : lineItem.openOrderLineItemId;
1581
+ return (_b = this.quoteDraftService.assetsState) === null || _b === void 0 ? void 0 : _b.initialState.find(li => assetPredicateFn(li, assetId));
1582
+ }
1684
1583
  getUIDefinitionProperties() {
1685
1584
  var _a, _b, _c;
1686
1585
  return Object.assign(Object.assign({}, ((_b = (_a = this.getRuntimeContext().uiDefinitionContainer) === null || _a === void 0 ? void 0 : _a.source.properties) !== null && _b !== void 0 ? _b : {})), ((_c = this.runtimeService.uiDefinitionProperties) !== null && _c !== void 0 ? _c : {}));
@@ -1709,14 +1608,6 @@ class ConfigurationService {
1709
1608
  }
1710
1609
  });
1711
1610
  }
1712
- getAsset() {
1713
- var _a;
1714
- const lineItem = this.configurableRamp;
1715
- if (!lineItem) {
1716
- return;
1717
- }
1718
- return (_a = this.quoteDraftService.quoteDraft) === null || _a === void 0 ? void 0 : _a.initialState.find(a => a.id === lineItem.openOrderLineItemId || a.id === lineItem.assetId);
1719
- }
1720
1611
  }
1721
1612
  ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService, deps: [{ token: QuoteDraftService }, { token: ConfigurationRuntimeService }, { token: ContextService }, { token: i1.ConfigurationApiService }, { token: i5.MessageService }, { token: i6$1.DialogService }, { token: RuntimeSettingsService }], target: i0.ɵɵFactoryTarget.Injectable });
1722
1613
  ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ConfigurationService });
@@ -1764,7 +1655,7 @@ class FlowConfigurationService {
1764
1655
  revert$(lineItemId) {
1765
1656
  const quoteDraft = this.quoteDraftService.quoteDraft;
1766
1657
  const initialCurrentState = this.quoteDraftService.getInitialCurrentState();
1767
- const currentState = this.quoteDraftService.activeCurrentState;
1658
+ const currentState = this.quoteDraftService.currentState;
1768
1659
  const currentLineItemIndex = currentState.findIndex(({ id }) => id === lineItemId);
1769
1660
  const currentLineItem = currentState[currentLineItemIndex];
1770
1661
  const initialLineItem = initialCurrentState.find(({ integrationId }) => integrationId === (currentLineItem === null || currentLineItem === void 0 ? void 0 : currentLineItem.integrationId));
@@ -1813,7 +1704,7 @@ class FlowConfigurationService {
1813
1704
  }), switchMap(updatedState => this.calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))), map$1(() => this.quoteDraftService.quoteDraft), tap$1(() => this.updatedSubj$.next()), this.handleErrorAndBounceBack());
1814
1705
  }
1815
1706
  get() {
1816
- return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.activeCurrentState), shareReplay$1());
1707
+ return this.quoteDraftService.quoteDraft$.pipe(map$1(() => this.quoteDraftService.currentState), shareReplay$1());
1817
1708
  }
1818
1709
  getSnapshot() {
1819
1710
  var _a, _b;
@@ -1922,6 +1813,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
1922
1813
  type: Injectable
1923
1814
  }], ctorParameters: function () { return [{ type: FlowInfoService }, { type: FlowConfigurationService }, { type: i1.FlowStateApiService }, { type: FlowStateService }]; } });
1924
1815
 
1816
+ class IntegrationState {
1817
+ constructor() {
1818
+ this.stateSubj$ = new BehaviorSubject({});
1819
+ this.action$ = new Subject();
1820
+ }
1821
+ get state$() {
1822
+ return this.stateSubj$.asObservable();
1823
+ }
1824
+ get state() {
1825
+ return this.stateSubj$.getValue();
1826
+ }
1827
+ patchState(update) {
1828
+ this.stateSubj$.next(Object.assign(Object.assign({}, this.stateSubj$.getValue()), update));
1829
+ }
1830
+ dispatch(action) {
1831
+ this.action$.next(action);
1832
+ }
1833
+ listen$(actionType) {
1834
+ return this.action$.pipe(filter$1(action => action.type === actionType), map$1(action => action.payload));
1835
+ }
1836
+ listenAll$() {
1837
+ return this.action$.asObservable();
1838
+ }
1839
+ clear() {
1840
+ this.stateSubj$.next({});
1841
+ }
1842
+ }
1843
+ IntegrationState.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
1844
+ IntegrationState.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState });
1845
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: IntegrationState, decorators: [{
1846
+ type: Injectable
1847
+ }] });
1848
+
1925
1849
  class ProductImagesService {
1926
1850
  constructor(productApiService) {
1927
1851
  this.productApiService = productApiService;
@@ -2189,7 +2113,7 @@ class ConfigurationStateService {
2189
2113
  }), takeUntil(this.canceledConfiguration$));
2190
2114
  }
2191
2115
  saveConfiguration(quoteId, flow) {
2192
- var _a, _b;
2116
+ var _a, _b, _c, _d;
2193
2117
  if (this.isStatefulConfiguration) {
2194
2118
  return this.flowStateApiService
2195
2119
  .saveConfiguration((_a = this.flowStateService.stateId) !== null && _a !== void 0 ? _a : '', (_b = this.stateId) !== null && _b !== void 0 ? _b : '')
@@ -2201,10 +2125,12 @@ class ConfigurationStateService {
2201
2125
  return of({ quoteId: '' });
2202
2126
  }
2203
2127
  const rootLineItem = this.configurationService.getSnapshot();
2128
+ const asset = this.configurationService.getAsset();
2204
2129
  const currentState = rootLineItem ? [rootLineItem] : [];
2130
+ const initialState = asset ? [asset] : [];
2205
2131
  return this.quoteApiService
2206
- .getQuoteDraft(quoteId)
2207
- .pipe(switchMap(quoteDraft => this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState }))));
2132
+ .getQuoteState(quoteId)
2133
+ .pipe(switchMap(quoteDraft => this.quoteApiService.upsertQuote(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))));
2208
2134
  }
2209
2135
  else {
2210
2136
  const quoteDraft = this.quoteDraftService.quoteDraft;
@@ -2213,15 +2139,22 @@ class ConfigurationStateService {
2213
2139
  return of({ quoteId: '' });
2214
2140
  }
2215
2141
  const isNewLineItem = quoteDraft.currentState.every(li => li.id !== lineItem.id);
2216
- let updatedState;
2142
+ let currentState;
2217
2143
  if (isNewLineItem) {
2218
- updatedState = [...quoteDraft.currentState, lineItem];
2144
+ currentState = [...quoteDraft.currentState, lineItem];
2219
2145
  }
2220
2146
  else {
2221
- updatedState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
2147
+ currentState = quoteDraft.currentState.map(li => (li.id === lineItem.id ? lineItem : li));
2148
+ }
2149
+ const asset = this.configurationService.getAsset();
2150
+ const initialState = [...((_d = (_c = this.quoteDraftService.quoteDraft) === null || _c === void 0 ? void 0 : _c.initialState) !== null && _d !== void 0 ? _d : [])];
2151
+ if (asset) {
2152
+ if (!initialState.some(li => li.id === asset.id)) {
2153
+ initialState.push(asset);
2154
+ }
2222
2155
  }
2223
2156
  return this.flowConfigurationService
2224
- .calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState: updatedState }))
2157
+ .calculate$(Object.assign(Object.assign({}, quoteDraft), { currentState, initialState }))
2225
2158
  .pipe(map$1(() => ({ quoteId: '' })));
2226
2159
  }
2227
2160
  }
@@ -2607,5 +2540,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImpor
2607
2540
  * Generated bundle index. Do not edit.
2608
2541
  */
2609
2542
 
2610
- export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationModule, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, FlowUpdateService, IntegrationState, LineItemWorker, NumberPipe, PricePipe, ProductImagesService, QuoteDraftService, RuntimeMode, RuntimeOperation, RuntimeSettingsService, RuntimeStep, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, UI_DEFINITION_VERSION, extractMetadata, filterOutTechnicalAttributes, findLineItem, findLineItemWithComparator, generateConfigurationLineItem, generateLineItem, generateModifiedAssetsMap, getAttributeValue, getAttributes, getDefaultLineItem, getGuidedSellingConfigurationRequest, getOriginParent, getRecommendedPrices, insertLineItem, isLineItemModified, isTechnicalAttribute, lineItem_utils as lineItemUtils, mapAttributes, multiplyLineItems, patchAttributes, recalculateCardinalityVariables, removeLineItem, replaceLineItem, upsertAttributes };
2543
+ export { ActionCodePipe, CalendarDirective, ConfigurationRuntimeService, ConfigurationService, ConfigurationStateService, ContextService, DEFAULT_FORMATTING_SETTINGS, DatePipe, FLOW_CUSTOMIZATION, FORMATTING_SETTINGS_TOKEN, FlowConfigurationModule, FlowConfigurationService, FlowInfoService, FlowStateConfigurationService, FlowStateService, FlowUpdateService, IntegrationState, LineItemWorker, NumberPipe, PricePipe, ProductImagesService, QuoteDraftService, RuntimeMode, RuntimeOperation, RuntimeSettingsService, RuntimeStep, SdkCoreModule, SdkDirectivesModule, SdkPipesModule, UI_DEFINITION_VERSION, assetPredicateFn, extractMetadata, filterOutTechnicalAttributes, findLineItem, findLineItemWithComparator, generateConfigurationLineItem, generateLineItem, getAttributeValue, getAttributes, getDefaultLineItem, getGuidedSellingConfigurationRequest, getOriginParent, getRecommendedPrices, insertLineItem, isTechnicalAttribute, lineItem_utils as lineItemUtils, mapAttributes, multiplyLineItems, patchAttributes, recalculateCardinalityVariables, removeLineItem, replaceLineItem, upsertAttributes };
2611
2544
  //# sourceMappingURL=veloceapps-sdk-core.mjs.map