Kulturpass Mengenänderung Verfügbarkeit Check

This commit is contained in:
Lorenz Hilpert
2023-06-23 15:30:41 +02:00
parent 3e429cb261
commit 4417fd9f0d
12 changed files with 162 additions and 42 deletions

View File

@@ -33,7 +33,7 @@ import {
DisplayOrderItemDTO,
OrderCheckoutService,
ReorderValues,
ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString,
ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString,
} from '@swagger/oms';
import { isNullOrUndefined, memorize } from '@utils/common';
import { combineLatest, Observable, of, concat, isObservable, throwError } from 'rxjs';
@@ -723,7 +723,7 @@ export class DomainCheckoutService {
}: {
processId: number;
orderItemSubsetId: number;
}): Observable<ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString> {
}): Observable<ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString> {
const setBuyer$ = this.getBuyer({ processId }).pipe(
first(),
mergeMap((buyer) => this._setBuyer({ processId, buyer }))
@@ -734,8 +734,17 @@ export class DomainCheckoutService {
mergeMap((payer) => this._setPayer({ processId, payer }))
);
return setBuyer$.pipe(
const checkAvailabilities$ = this.checkAvailabilities({ processId });
const updateAvailabilities$ = this.updateAvailabilities({ processId });
// const setPaymentType$ = this.setPayment({ processId, paymentType: 1 });
return checkAvailabilities$.pipe(
mergeMap((_) => updateAvailabilities$),
mergeMap((_) => setBuyer$),
mergeMap((_) => setPayer$),
// mergeMap((_) => setPaymentType$),
mergeMap((checkout) =>
this.orderCheckoutService.OrderCheckoutCreateKulturPassOrder({
payload: {

View File

@@ -14,6 +14,14 @@
<div class="text-right">
<div class="font-bold text-xl mt-4">{{ item?.unitPrice?.value?.value | currency: 'EUR' }}</div>
<div class="font-bold">
<ui-quantity-dropdown [quantity]="item?.quantity" (quantityChange)="onQuantityChange($event)"></ui-quantity-dropdown>
<ui-quantity-dropdown
[quantity]="itemQuantity$ | async"
[minQuantity]="availableQuantity$ | async"
(quantityChange)="onQuantityChange($event)"
></ui-quantity-dropdown>
</div>
<div *ngIf="maxQuantityHint" class="text-warning font-bold text-sm">
Es sind maximal <br />
{{ availableQuantity$ | async }} Exemplare verfügbar
</div>
</div>

View File

@@ -1,8 +1,10 @@
import { CommonModule } from '@angular/common';
import { Component, ChangeDetectionStrategy, Output, Input, EventEmitter } from '@angular/core';
import { ProductImageModule } from '@cdn/product-image';
import { provideComponentStore } from '@ngrx/component-store';
import { ShoppingCartItemDTO } from '@swagger/checkout';
import { UiQuantityDropdownModule } from '@ui/quantity-dropdown';
import { KulturpassOrderItemStore } from './kulturpass-order-item.store';
@Component({
selector: 'shared-kulturpass-order-item',
@@ -12,19 +14,49 @@ import { UiQuantityDropdownModule } from '@ui/quantity-dropdown';
host: { class: 'shared-kulturpass-order-item' },
standalone: true,
imports: [ProductImageModule, CommonModule, UiQuantityDropdownModule],
providers: [provideComponentStore(KulturpassOrderItemStore)],
})
export class KulturpassOrderItemComponent {
@Input() item: ShoppingCartItemDTO;
@Input()
set item(item: ShoppingCartItemDTO) {
this._store.updateItem(item);
this._store.fetchAvailability(item);
}
get item() {
return this._store.item;
}
@Output() quantityChange = new EventEmitter<ShoppingCartItemDTO>();
itemQuantity$ = this._store.itemQuantity$;
get iconSrc() {
return `/assets/images/Icon_${this.item?.product?.format}.svg`;
}
constructor() {}
availableQuantity$ = this._store.availableQuantity$;
maxQuantityHint = false;
constructor(private _store: KulturpassOrderItemStore) {}
onQuantityChange(quantity: number) {
this.quantityChange.emit({ ...this.item, quantity });
const initialQuantity = this.item.quantity;
this._store.updateItem({ ...this.item, quantity });
if (this._store.availableQuantity < quantity) {
quantity = this._store.availableQuantity;
this.maxQuantityHint = true;
} else {
this.maxQuantityHint = false;
}
if (initialQuantity !== quantity) {
this.quantityChange.emit({ ...this.item, quantity });
}
setTimeout(() => {
this._store.updateItem({ ...this.item, quantity });
}, 1);
}
}

View File

@@ -0,0 +1,67 @@
import { ComponentStore, tapResponse } from '@ngrx/component-store';
import { ShoppingCartItemDTO, AvailabilityDTO } from '@swagger/checkout';
import { DomainAvailabilityService } from '@domain/availability';
import { Observable } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { Injectable } from '@angular/core';
export interface KulturpassOrderItemState {
item: ShoppingCartItemDTO;
availability?: AvailabilityDTO;
}
@Injectable()
export class KulturpassOrderItemStore extends ComponentStore<KulturpassOrderItemState> {
get item() {
return this.get((s) => s.item);
}
get availability() {
return this.get((s) => s.availability);
}
get availableQuantity() {
return this.get((s) => s.availability?.inStock ?? s.item?.quantity ?? 0);
}
constructor(private _availabilityService: DomainAvailabilityService) {
super({ item: null });
}
readonly item$ = this.select((state) => state.item);
readonly updateItem = this.updater((state, item: ShoppingCartItemDTO) => ({ ...state, item }));
readonly itemQuantity$ = this.select((state) => state.item?.quantity ?? 0);
readonly availability$ = this.select((state) => state.availability);
readonly updateAvailability = this.updater((state, availability: AvailabilityDTO) => ({ ...state, availability }));
readonly availableQuantity$ = this.select((state) => state.availability?.inStock ?? state.item?.quantity ?? 0);
fetchAvailability = this.effect((item$: Observable<ShoppingCartItemDTO>) =>
item$.pipe(
switchMap((item) =>
this._availabilityService
.getTakeAwayAvailability({
item: {
ean: item.product.ean,
itemId: Number(item.product.catalogProductNumber),
price: item.unitPrice,
},
quantity: item.quantity,
})
.pipe(tapResponse(this.handleAvailabilityResponse, this.handleAvailabilityError))
)
)
);
handleAvailabilityResponse = (res: AvailabilityDTO) => {
this.updateAvailability(res);
};
handleAvailabilityError = (err) => {
console.log(err);
};
}

View File

@@ -126,7 +126,7 @@ export class KulturpassOrderSearchboxStore extends ComponentStore<KulturpassOrde
points: 0,
},
itemType: item.type,
product: item.product,
product: { catalogProductNumber: String(item.id), ...item.product },
};
this.addToShoppingCart$.next(addToShoppingCartDTO);

View File

@@ -58,24 +58,11 @@ export { ResponseArgsOfIEnumerableOfLogisticianDTO } from './models/response-arg
export { LogisticianDTO } from './models/logistician-dto';
export { EntityDTOBaseOfLogisticianDTOAndILogistician } from './models/entity-dtobase-of-logistician-dtoand-ilogistician';
export { ResponseArgsOfLogisticianDTO } from './models/response-args-of-logistician-dto';
export { ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './models/response-args-of-value-tuple-of-order-list-item-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export { ValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './models/value-tuple-of-order-list-item-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export { OrderListItemDTO } from './models/order-list-item-dto';
export { ValidationStatus } from './models/validation-status';
export { OrderProcessingStatus } from './models/order-processing-status';
export { AddresseeDTO } from './models/addressee-dto';
export { OrganisationDTO } from './models/organisation-dto';
export { OrganisationNamesDTO } from './models/organisation-names-dto';
export { PersonNamesDTO } from './models/person-names-dto';
export { CommunicationDetailsDTO } from './models/communication-details-dto';
export { AddressType } from './models/address-type';
export { PaymentDTO } from './models/payment-dto';
export { EntityDTOBaseOfPaymentDTOAndIReadOnlyPayment } from './models/entity-dtobase-of-payment-dtoand-iread-only-payment';
export { LinkedRecordDTO } from './models/linked-record-dto';
export { KulturPassOrderValues } from './models/kultur-pass-order-values';
export { ResponseArgsOfIEnumerableOfDisplayOrderDTO } from './models/response-args-of-ienumerable-of-display-order-dto';
export { ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './models/response-args-of-value-tuple-of-ienumerable-of-display-order-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export { ValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './models/value-tuple-of-ienumerable-of-display-order-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export { DisplayOrderDTO } from './models/display-order-dto';
export { DisplayBranchDTO } from './models/display-branch-dto';
export { CommunicationDetailsDTO } from './models/communication-details-dto';
export { EntityDTOBaseOfDisplayBranchDTOAndIBranch } from './models/entity-dtobase-of-display-branch-dtoand-ibranch';
export { DisplayOrderItemDTO } from './models/display-order-item-dto';
export { DisplayOrderItemSubsetDTO } from './models/display-order-item-subset-dto';
@@ -84,6 +71,8 @@ export { QuantityUnitType } from './models/quantity-unit-type';
export { PromotionDTO } from './models/promotion-dto';
export { EntityDTOBaseOfDisplayOrderItemDTOAndIOrderItem } from './models/entity-dtobase-of-display-order-item-dtoand-iorder-item';
export { DisplayAddresseeDTO } from './models/display-addressee-dto';
export { OrganisationDTO } from './models/organisation-dto';
export { OrganisationNamesDTO } from './models/organisation-names-dto';
export { BuyerType } from './models/buyer-type';
export { DisplayLogisticianDTO } from './models/display-logistician-dto';
export { EntityDTOBaseOfDisplayLogisticianDTOAndILogistician } from './models/entity-dtobase-of-display-logistician-dtoand-ilogistician';
@@ -93,7 +82,10 @@ export { TermsOfDeliveryDTO } from './models/terms-of-delivery-dto';
export { TypeOfDelivery } from './models/type-of-delivery';
export { ShippingType } from './models/shipping-type';
export { NotificationChannel } from './models/notification-channel';
export { LinkedRecordDTO } from './models/linked-record-dto';
export { EntityDTOBaseOfDisplayOrderDTOAndIOrder } from './models/entity-dtobase-of-display-order-dtoand-iorder';
export { KulturPassOrderValues } from './models/kultur-pass-order-values';
export { ResponseArgsOfIEnumerableOfDisplayOrderDTO } from './models/response-args-of-ienumerable-of-display-order-dto';
export { ResponseArgsOfValueTupleOfOrderItemSubsetDTOAndOrderItemSubsetDTO } from './models/response-args-of-value-tuple-of-order-item-subset-dtoand-order-item-subset-dto';
export { ValueTupleOfOrderItemSubsetDTOAndOrderItemSubsetDTO } from './models/value-tuple-of-order-item-subset-dtoand-order-item-subset-dto';
export { OrderItemSubsetDTO } from './models/order-item-subset-dto';
@@ -101,12 +93,14 @@ export { EntityDTOContainerOfOrderItemDTO } from './models/entity-dtocontainer-o
export { OrderItemDTO } from './models/order-item-dto';
export { EntityDTOContainerOfOrderDTO } from './models/entity-dtocontainer-of-order-dto';
export { OrderDTO } from './models/order-dto';
export { OrderProcessingStatus } from './models/order-processing-status';
export { BuyerDTO } from './models/buyer-dto';
export { BuyerStatus } from './models/buyer-status';
export { AddresseeWithReferenceDTO } from './models/addressee-with-reference-dto';
export { EntityReferenceDTO } from './models/entity-reference-dto';
export { EntityDTOContainerOfShippingAddressDTO } from './models/entity-dtocontainer-of-shipping-address-dto';
export { ShippingAddressDTO } from './models/shipping-address-dto';
export { AddressType } from './models/address-type';
export { EntityDTOBaseOfShippingAddressDTOAndIShippingAddress } from './models/entity-dtobase-of-shipping-address-dtoand-ishipping-address';
export { EntityDTOContainerOfLogisticianDTO } from './models/entity-dtocontainer-of-logistician-dto';
export { EntityDTOContainerOfPayerDTO } from './models/entity-dtocontainer-of-payer-dto';
@@ -115,6 +109,9 @@ export { PayerType } from './models/payer-type';
export { PayerStatus } from './models/payer-status';
export { EntityDTOBaseOfPayerDTOAndIPayer } from './models/entity-dtobase-of-payer-dtoand-ipayer';
export { EntityDTOContainerOfPaymentDTO } from './models/entity-dtocontainer-of-payment-dto';
export { PaymentDTO } from './models/payment-dto';
export { EntityDTOBaseOfPaymentDTOAndIReadOnlyPayment } from './models/entity-dtobase-of-payment-dtoand-iread-only-payment';
export { ValidationStatus } from './models/validation-status';
export { PackagingInstructions } from './models/packaging-instructions';
export { EntityDTOBaseOfOrderDTOAndIOrder } from './models/entity-dtobase-of-order-dtoand-iorder';
export { OrderItemType } from './models/order-item-type';
@@ -140,6 +137,8 @@ export { PackageDTO } from './models/package-dto';
export { EntityDTOContainerOfUserDTO } from './models/entity-dtocontainer-of-user-dto';
export { UserDTO } from './models/user-dto';
export { EntityDTOBaseOfUserDTOAndIUser } from './models/entity-dtobase-of-user-dtoand-iuser';
export { AddresseeDTO } from './models/addressee-dto';
export { PersonNamesDTO } from './models/person-names-dto';
export { EntityDTOBaseOfPackageDTOAndIPackage } from './models/entity-dtobase-of-package-dtoand-ipackage';
export { EntityDTOBaseOfOrderItemSubsetDTOAndIOrderItemStatus } from './models/entity-dtobase-of-order-item-subset-dtoand-iorder-item-status';
export { ReorderValues } from './models/reorder-values';
@@ -197,6 +196,7 @@ export { ResponseArgsOfIEnumerableOfOrderDTO } from './models/response-args-of-i
export { ResponseArgsOfOrderDTO } from './models/response-args-of-order-dto';
export { ListResponseArgsOfOrderListItemDTO } from './models/list-response-args-of-order-list-item-dto';
export { ResponseArgsOfIEnumerableOfOrderListItemDTO } from './models/response-args-of-ienumerable-of-order-list-item-dto';
export { OrderListItemDTO } from './models/order-list-item-dto';
export { ResponseArgsOfBoolean } from './models/response-args-of-boolean';
export { ResponseArgsOfOrderItemDTO } from './models/response-args-of-order-item-dto';
export { ResponseArgsOfIEnumerableOfOrderItemDTO } from './models/response-args-of-ienumerable-of-order-item-dto';

View File

@@ -1,9 +1,11 @@
/* tslint:disable */
import { EntityDTOBaseOfDisplayOrderDTOAndIOrder } from './entity-dtobase-of-display-order-dtoand-iorder';
import { KeyValueDTOOfStringAndString } from './key-value-dtoof-string-and-string';
import { DisplayAddresseeDTO } from './display-addressee-dto';
import { BuyerType } from './buyer-type';
import { EnvironmentChannel } from './environment-channel';
import { DisplayOrderItemDTO } from './display-order-item-dto';
import { LinkedRecordDTO } from './linked-record-dto';
import { DisplayLogisticianDTO } from './display-logistician-dto';
import { NotificationChannel } from './notification-channel';
import { DisplayBranchDTO } from './display-branch-dto';
@@ -11,6 +13,7 @@ import { OrderType } from './order-type';
import { DisplayOrderPaymentDTO } from './display-order-payment-dto';
import { TermsOfDeliveryDTO } from './terms-of-delivery-dto';
export interface DisplayOrderDTO extends EntityDTOBaseOfDisplayOrderDTOAndIOrder{
actions?: Array<KeyValueDTOOfStringAndString>;
buyer?: DisplayAddresseeDTO;
buyerComment?: string;
buyerIsGuestAccount?: boolean;
@@ -21,6 +24,7 @@ export interface DisplayOrderDTO extends EntityDTOBaseOfDisplayOrderDTOAndIOrder
features?: {[key: string]: string};
items?: Array<DisplayOrderItemDTO>;
itemsCount?: number;
linkedRecords?: Array<LinkedRecordDTO>;
logistician?: DisplayLogisticianDTO;
notificationChannels?: NotificationChannel;
orderBranch?: DisplayBranchDTO;

View File

@@ -0,0 +1,6 @@
/* tslint:disable */
import { ResponseArgs } from './response-args';
import { ValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './value-tuple-of-ienumerable-of-display-order-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export interface ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString extends ResponseArgs{
result: ValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString;
}

View File

@@ -1,6 +0,0 @@
/* tslint:disable */
import { ResponseArgs } from './response-args';
import { ValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from './value-tuple-of-order-list-item-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
export interface ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString extends ResponseArgs{
result: ValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString;
}

View File

@@ -0,0 +1,7 @@
/* tslint:disable */
import { DisplayOrderDTO } from './display-order-dto';
import { KeyValueDTOOfStringAndString } from './key-value-dtoof-string-and-string';
export interface ValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString {
item1: Array<DisplayOrderDTO>;
item2: Array<KeyValueDTOOfStringAndString>;
}

View File

@@ -1,7 +0,0 @@
/* tslint:disable */
import { OrderListItemDTO } from './order-list-item-dto';
import { KeyValueDTOOfStringAndString } from './key-value-dtoof-string-and-string';
export interface ValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString {
item1: OrderListItemDTO;
item2: Array<KeyValueDTOOfStringAndString>;
}

View File

@@ -7,7 +7,7 @@ import { StrictHttpResponse as __StrictHttpResponse } from '../strict-http-respo
import { Observable as __Observable } from 'rxjs';
import { map as __map, filter as __filter } from 'rxjs/operators';
import { ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from '../models/response-args-of-value-tuple-of-order-list-item-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
import { ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString } from '../models/response-args-of-value-tuple-of-ienumerable-of-display-order-dtoand-ienumerable-of-key-value-dtoof-string-and-string';
import { KulturPassOrderValues } from '../models/kultur-pass-order-values';
import { ResponseArgsOfIEnumerableOfDisplayOrderDTO } from '../models/response-args-of-ienumerable-of-display-order-dto';
import { ResponseArgsOfValueTupleOfOrderItemSubsetDTOAndOrderItemSubsetDTO } from '../models/response-args-of-value-tuple-of-order-item-subset-dtoand-order-item-subset-dto';
@@ -43,7 +43,7 @@ class OrderCheckoutService extends __BaseService {
*
* @return or
*/
OrderCheckoutCreateKulturPassOrderResponse(params: OrderCheckoutService.OrderCheckoutCreateKulturPassOrderParams): __Observable<__StrictHttpResponse<ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString>> {
OrderCheckoutCreateKulturPassOrderResponse(params: OrderCheckoutService.OrderCheckoutCreateKulturPassOrderParams): __Observable<__StrictHttpResponse<ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString>> {
let __params = this.newParams();
let __headers = new HttpHeaders();
let __body: any = null;
@@ -62,7 +62,7 @@ class OrderCheckoutService extends __BaseService {
return this.http.request<any>(req).pipe(
__filter(_r => _r instanceof HttpResponse),
__map((_r) => {
return _r as __StrictHttpResponse<ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString>;
return _r as __StrictHttpResponse<ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString>;
})
);
}
@@ -76,9 +76,9 @@ class OrderCheckoutService extends __BaseService {
*
* @return or
*/
OrderCheckoutCreateKulturPassOrder(params: OrderCheckoutService.OrderCheckoutCreateKulturPassOrderParams): __Observable<ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString> {
OrderCheckoutCreateKulturPassOrder(params: OrderCheckoutService.OrderCheckoutCreateKulturPassOrderParams): __Observable<ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString> {
return this.OrderCheckoutCreateKulturPassOrderResponse(params).pipe(
__map(_r => _r.body as ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfOrderListItemDTOAndIEnumerableOfKeyValueDTOOfStringAndString)
__map(_r => _r.body as ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString | ResponseArgsOfValueTupleOfIEnumerableOfDisplayOrderDTOAndIEnumerableOfKeyValueDTOOfStringAndString)
);
}