#4329 HSC - OLA im Warenkorb

This commit is contained in:
Lorenz Hilpert
2023-09-29 11:07:54 +02:00
parent cfba5f34d4
commit 45cb411e17
3 changed files with 46 additions and 54 deletions

View File

@@ -27,7 +27,6 @@ import {
StoreCheckoutPayerService,
StoreCheckoutBranchService,
ItemsResult,
ShoppingCartItemDTO,
} from '@swagger/checkout';
import {
DisplayOrderDTO,
@@ -37,20 +36,19 @@ import {
ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString,
} from '@swagger/oms';
import { isNullOrUndefined, memorize } from '@utils/common';
import { combineLatest, Observable, of, concat, isObservable, throwError, interval, zip, EMPTY, Subscription } from 'rxjs';
import { combineLatest, Observable, of, concat, isObservable, throwError, Subscription, interval as rxjsInterval, Subject } from 'rxjs';
import {
bufferCount,
catchError,
debounceTime,
distinctUntilChanged,
filter,
first,
map,
mergeMap,
share,
shareReplay,
switchMap,
take,
takeUntil,
tap,
withLatestFrom,
} from 'rxjs/operators';
@@ -63,8 +61,6 @@ import { ApplicationService } from '@core/application';
import { CustomerDTO } from '@swagger/crm';
import { Config } from '@core/config';
import parseDuration from 'parse-duration';
import { CheckoutEntity } from './store/defs/checkout.entity';
import { isEqual } from 'lodash';
@Injectable()
export class DomainCheckoutService {
@@ -701,57 +697,42 @@ export class DomainCheckoutService {
* @returns true if the availability of all items is valid
*/
validateOlaStatus({ processId, interval }: { processId: number; interval?: number }): Observable<boolean> {
return new Observable<boolean>((observer) => {
const enity$ = this.store.select(DomainCheckoutSelectors.selectCheckoutEntityByProcessId, { processId });
return rxjsInterval(interval ?? this.olaExpiration / 10).pipe(
switchMap(() =>
this.store.select(DomainCheckoutSelectors.selectCheckoutEntityByProcessId, { processId }).pipe(
take(1),
map((entity) => {
const now = Date.now();
if (!entity || !entity.shoppingCart || !entity.shoppingCart.items) {
return;
}
const olaExpiration = this.olaExpiration;
const itemAvailabilityTimestamp = entity.itemAvailabilityTimestamp ?? {};
let timeout: any;
const shoppingCart = entity.shoppingCart;
let subscription: Subscription;
const timestamps = shoppingCart.items
?.map((i) => i.data)
?.filter((item) => !!item?.features?.orderType)
?.map((item) => itemAvailabilityTimestamp[`${item.id}_${item.features.orderType}`]);
function check() {
const now = Date.now();
subscription?.unsubscribe();
subscription = enity$.pipe(take(1)).subscribe((entity) => {
if (!entity || !entity.shoppingCart || !entity.shoppingCart.items) {
return;
}
const itemAvailabilityTimestamp = entity.itemAvailabilityTimestamp ?? {};
const shoppingCart = entity.shoppingCart;
const timestamps = shoppingCart.items
?.map((i) => i.data)
?.filter((item) => !!item?.features?.orderType)
?.map((item) => itemAvailabilityTimestamp[`${item.id}_${item.features.orderType}`]);
if (timestamps?.length > 0) {
const oldestTimestamp = Math.min(...timestamps);
observer.next(now - oldestTimestamp < olaExpiration);
}
timeout = setTimeout(() => {
check.call(this);
}, interval ?? olaExpiration / 10);
});
}
check.call(this);
return () => {
subscription?.unsubscribe();
clearTimeout(timeout);
};
}).pipe(distinctUntilChanged());
if (timestamps?.length > 0) {
const oldestTimestamp = Math.min(...timestamps);
const expirationTimestamp = oldestTimestamp + this.olaExpiration;
return expirationTimestamp > now;
}
return false;
})
)
),
distinctUntilChanged()
);
}
validateAvailabilities({ processId }: { processId: number }): Observable<boolean> {
return this.getShoppingCart({ processId }).pipe(
map((shoppingCart) => {
const items = shoppingCart?.items?.map((item) => item.data) || [];
return items.every((i) => this.availabilityService.isAvailable({ availability: i.availability }));
})
);
@@ -762,7 +743,12 @@ export class DomainCheckoutService {
const availabilities$ = this.validateAvailabilities({ processId });
return combineLatest([olaStatus$, availabilities$]).pipe(map(([olaStatus, availabilities]) => olaStatus && availabilities));
return combineLatest([olaStatus$, availabilities$]).pipe(
tap(([olaStatus, availabilities]) => {
console.log({ olaStatus, availabilities });
}),
map(([olaStatus, availabilities]) => olaStatus && availabilities)
);
}
completeCheckout({ processId }: { processId: number }): Observable<DisplayOrderDTO[]> {

View File

@@ -48,7 +48,7 @@
"rootUrl": "https://isa-test.paragon-data.net/wws/v1"
},
"@domain/checkout": {
"olaExpiration": "30s"
"olaExpiration": "5m"
},
"hubs": {
"notifications": {

View File

@@ -17,7 +17,7 @@ import { DomainCheckoutService } from '@domain/checkout';
import { AvailabilityDTO, DestinationDTO, ShoppingCartItemDTO } from '@swagger/checkout';
import { UiMessageModalComponent, UiModalService } from '@ui/modal';
import { PrintModalData, PrintModalComponent } from '@modal/printer';
import { delay, first, map, switchMap, takeUntil } from 'rxjs/operators';
import { delay, first, map, switchMap, takeUntil, tap } from 'rxjs/operators';
import { Subject, NEVER, combineLatest, BehaviorSubject, Subscription } from 'rxjs';
import { DomainCatalogService } from '@domain/catalog';
import { BreadcrumbService } from '@core/breadcrumb';
@@ -39,6 +39,8 @@ import { CustomerSearchNavigation } from '@shared/services';
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class CheckoutReviewComponent implements OnInit, OnDestroy, AfterViewInit {
private _onDestroy$ = new Subject<void>();
private _customerSearchNavigation = inject(CustomerSearchNavigation);
checkingOla$ = new BehaviorSubject<boolean>(false);
@@ -170,8 +172,12 @@ export class CheckoutReviewComponent implements OnInit, OnDestroy, AfterViewInit
showOrderButtonSpinner: boolean;
checkoutIsInValid$ = this.applicationService.activatedProcessId$.pipe(
takeUntil(this._onDestroy$),
switchMap((processId) => this.domainCheckoutService.checkoutIsValid({ processId })),
map((valid) => !valid)
map((valid) => !valid),
tap((invalid) => {
console.log('invalid', invalid);
})
);
get productSearchBasePath() {
@@ -182,8 +188,6 @@ export class CheckoutReviewComponent implements OnInit, OnDestroy, AfterViewInit
return this._environmentService.matchDesktopLarge$;
}
private _onDestroy$ = new Subject<void>();
@ViewChildren(ShoppingCartItemComponent)
private _shoppingCartItems: QueryList<ShoppingCartItemComponent>;
@@ -230,13 +234,15 @@ export class CheckoutReviewComponent implements OnInit, OnDestroy, AfterViewInit
this.resetControl();
this._onDestroy$.next();
this._onDestroy$.complete();
this.checkingOla$.complete();
this.quantityError$.complete();
this.olaCheckSubscription?.unsubscribe();
}
registerOlaCechk() {
this.olaCheckSubscription?.unsubscribe();
this.olaCheckSubscription = this.applicationService.activatedProcessId$
.pipe(
takeUntil(this._onDestroy$),
delay(250),
switchMap((processId) =>
this.domainCheckoutService.validateOlaStatus({