@veloceapps/sdk 8.0.0-185 → 8.0.0-187

Sign up to get free protection for your applications and to get access to all the features.
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