Merged PR 1786: #4760 Fehler bei Abholpreisberechnung in Filiale Darmstadt Ernst-Ludwig-Straße

#4760 Fehler bei Abholpreisberechnung in Filiale Darmstadt Ernst-Ludwig-Straße
This commit is contained in:
Lorenz Hilpert
2024-06-10 12:22:36 +00:00
committed by Nino Righi
parent b271ce9711
commit c68706b54f
2 changed files with 59 additions and 45 deletions

View File

@@ -36,7 +36,7 @@ export class DomainAvailabilityService {
private _logisticanService: LogisticianService, private _logisticanService: LogisticianService,
private _stockService: StockService, private _stockService: StockService,
private _supplierService: StoreCheckoutSupplierService, private _supplierService: StoreCheckoutSupplierService,
private _branchService: StoreCheckoutBranchService private _branchService: StoreCheckoutBranchService,
) {} ) {}
@memorize({ ttl: 10000 }) @memorize({ ttl: 10000 })
@@ -48,7 +48,7 @@ export class DomainAvailabilityService {
getSuppliers(): Observable<SupplierDTO[]> { getSuppliers(): Observable<SupplierDTO[]> {
return this._supplierService.StoreCheckoutSupplierGetSuppliers({}).pipe( return this._supplierService.StoreCheckoutSupplierGetSuppliers({}).pipe(
map((response) => response.result), map((response) => response.result),
shareReplay(1) shareReplay(1),
); );
} }
@@ -56,7 +56,7 @@ export class DomainAvailabilityService {
getTakeAwaySupplier(): Observable<SupplierDTO> { getTakeAwaySupplier(): Observable<SupplierDTO> {
return this._supplierService.StoreCheckoutSupplierGetSuppliers({}).pipe( return this._supplierService.StoreCheckoutSupplierGetSuppliers({}).pipe(
map(({ result }) => result?.find((supplier) => supplier?.supplierNumber === 'F')), map(({ result }) => result?.find((supplier) => supplier?.supplierNumber === 'F')),
shareReplay(1) shareReplay(1),
); );
} }
@@ -64,7 +64,7 @@ export class DomainAvailabilityService {
getBranches(): Observable<BranchDTO[]> { getBranches(): Observable<BranchDTO[]> {
return this._branchService.StoreCheckoutBranchGetBranches({}).pipe( return this._branchService.StoreCheckoutBranchGetBranches({}).pipe(
map((response) => response.result), map((response) => response.result),
shareReplay(1) shareReplay(1),
); );
} }
@@ -73,7 +73,7 @@ export class DomainAvailabilityService {
return this._stockService.StockGetStocksByBranch({ branchId }).pipe( return this._stockService.StockGetStocksByBranch({ branchId }).pipe(
map((response) => response.result), map((response) => response.result),
map((result) => result?.find((_) => true)), map((result) => result?.find((_) => true)),
shareReplay(1) shareReplay(1),
); );
} }
@@ -81,7 +81,7 @@ export class DomainAvailabilityService {
getDefaultStock(): Observable<StockDTO> { getDefaultStock(): Observable<StockDTO> {
return this._stockService.StockCurrentStock().pipe( return this._stockService.StockCurrentStock().pipe(
map((response) => response.result), map((response) => response.result),
shareReplay(1) shareReplay(1),
); );
} }
@@ -105,7 +105,7 @@ export class DomainAvailabilityService {
status: response.result.status, status: response.result.status,
version: response.result.version, version: response.result.version,
})), })),
shareReplay(1) shareReplay(1),
); );
} }
@@ -113,7 +113,7 @@ export class DomainAvailabilityService {
getLogisticians(): Observable<LogisticianDTO> { getLogisticians(): Observable<LogisticianDTO> {
return this._logisticanService.LogisticianGetLogisticians({}).pipe( return this._logisticanService.LogisticianGetLogisticians({}).pipe(
map((response) => response.result?.find((l) => l.logisticianNumber === '2470')), map((response) => response.result?.find((l) => l.logisticianNumber === '2470')),
shareReplay(1) shareReplay(1),
); );
} }
@@ -146,7 +146,7 @@ export class DomainAvailabilityService {
}); });
return availabilities; return availabilities;
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -167,13 +167,13 @@ export class DomainAvailabilityService {
this._stockService.StockInStock({ articleIds: [item.itemId], stockId: s.id }), this._stockService.StockInStock({ articleIds: [item.itemId], stockId: s.id }),
this.getTakeAwaySupplier(), this.getTakeAwaySupplier(),
this.getDefaultBranch(), this.getDefaultBranch(),
]) ]),
), ),
map(([response, supplier, defaultBranch]) => { map(([response, supplier, defaultBranch]) => {
const price = item?.price; const price = item?.price;
return this._mapToTakeAwayAvailability({ response, supplier, branchId: branch?.id ?? defaultBranch?.id, quantity, price }); return this._mapToTakeAwayAvailability({ response, supplier, branchId: branch?.id ?? defaultBranch?.id, quantity, price });
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -196,7 +196,7 @@ export class DomainAvailabilityService {
map(([response, supplier]) => { map(([response, supplier]) => {
return this._mapToTakeAwayAvailability({ response, supplier, branchId: branch.id, quantity, price }); return this._mapToTakeAwayAvailability({ response, supplier, branchId: branch.id, quantity, price });
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -218,7 +218,7 @@ export class DomainAvailabilityService {
map(([response, supplier, defaultBranch]) => { map(([response, supplier, defaultBranch]) => {
return this._mapToTakeAwayAvailability({ response, supplier, branchId: branchId ?? defaultBranch.id, quantity, price }); return this._mapToTakeAwayAvailability({ response, supplier, branchId: branchId ?? defaultBranch.id, quantity, price });
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -228,7 +228,7 @@ export class DomainAvailabilityService {
switchMap((s) => this._stockService.StockInStockByEAN({ eans: eansFiltered, stockId: s.id })), switchMap((s) => this._stockService.StockInStockByEAN({ eans: eansFiltered, stockId: s.id })),
withLatestFrom(this.getTakeAwaySupplier(), this.getDefaultBranch()), withLatestFrom(this.getTakeAwaySupplier(), this.getDefaultBranch()),
map((response) => response[0].result), map((response) => response[0].result),
shareReplay(1) shareReplay(1),
); );
} }
@@ -254,7 +254,7 @@ export class DomainAvailabilityService {
]) ])
.pipe( .pipe(
map((r) => this._mapToPickUpAvailability(r.result)?.find((_) => true)), map((r) => this._mapToPickUpAvailability(r.result)?.find((_) => true)),
shareReplay(1) shareReplay(1),
); );
} }
@@ -270,7 +270,7 @@ export class DomainAvailabilityService {
]).pipe( ]).pipe(
timeout(5000), timeout(5000),
map((r) => this._mapToShippingAvailability(r.result)?.find((_) => true)), map((r) => this._mapToShippingAvailability(r.result)?.find((_) => true)),
shareReplay(1) shareReplay(1),
); );
} }
@@ -305,7 +305,7 @@ export class DomainAvailabilityService {
priceMaintained: preferred?.priceMaintained, priceMaintained: preferred?.priceMaintained,
}; };
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -329,12 +329,12 @@ export class DomainAvailabilityService {
this.getPickUpAvailability({ item, quantity, branch: branch ?? defaultBranch }).pipe( this.getPickUpAvailability({ item, quantity, branch: branch ?? defaultBranch }).pipe(
mergeMap((availability) => mergeMap((availability) =>
logistician$.pipe( logistician$.pipe(
map((logistician) => ({ ...(availability?.length > 0 ? availability[0] : []), logistician: { id: logistician.id } })) map((logistician) => ({ ...(availability?.length > 0 ? availability[0] : []), logistician: { id: logistician.id } })),
) ),
), ),
shareReplay(1) shareReplay(1),
) ),
) ),
); );
} }
@@ -367,7 +367,7 @@ export class DomainAvailabilityService {
priceMaintained: preferred?.priceMaintained, priceMaintained: preferred?.priceMaintained,
}; };
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -378,7 +378,7 @@ export class DomainAvailabilityService {
switchMap((stockId) => switchMap((stockId) =>
stockId stockId
? this._stockService.StockInStock({ articleIds: items.map((i) => i.id), stockId }) ? this._stockService.StockInStock({ articleIds: items.map((i) => i.id), stockId })
: of({ result: [] } as ResponseArgsOfIEnumerableOfStockInfoDTO) : of({ result: [] } as ResponseArgsOfIEnumerableOfStockInfoDTO),
), ),
timeout(20000), timeout(20000),
withLatestFrom(this.getTakeAwaySupplier()), withLatestFrom(this.getTakeAwaySupplier()),
@@ -389,10 +389,10 @@ export class DomainAvailabilityService {
supplier, supplier,
quantity: 1, quantity: 1,
price: items?.find((i) => i.id === stockInfo.itemId)?.price, price: items?.find((i) => i.id === stockInfo.itemId)?.price,
}) }),
); );
}), }),
shareReplay(1) shareReplay(1),
); );
} }
@@ -400,7 +400,7 @@ export class DomainAvailabilityService {
getPickUpAvailabilities(payload: AvailabilityRequestDTO[], preferred?: boolean) { getPickUpAvailabilities(payload: AvailabilityRequestDTO[], preferred?: boolean) {
return this._availabilityService.AvailabilityStoreAvailability(payload).pipe( return this._availabilityService.AvailabilityStoreAvailability(payload).pipe(
timeout(20000), timeout(20000),
map((response) => (preferred ? this._mapToPickUpAvailability(response.result) : response.result)) map((response) => (preferred ? this._mapToPickUpAvailability(response.result) : response.result)),
); );
} }
@@ -408,7 +408,7 @@ export class DomainAvailabilityService {
getDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) { getDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) {
return this.memorizedAvailabilityShippingAvailability(payload).pipe( return this.memorizedAvailabilityShippingAvailability(payload).pipe(
timeout(20000), timeout(20000),
map((response) => this._mapToShippingAvailability(response.result)) map((response) => this._mapToShippingAvailability(response.result)),
); );
} }
@@ -416,7 +416,7 @@ export class DomainAvailabilityService {
getDigDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) { getDigDeliveryAvailabilities(payload: AvailabilityRequestDTO[]) {
return this.memorizedAvailabilityShippingAvailability(payload).pipe( return this.memorizedAvailabilityShippingAvailability(payload).pipe(
timeout(20000), timeout(20000),
map((response) => this._mapToShippingAvailability(response.result)) map((response) => this._mapToShippingAvailability(response.result)),
); );
} }
@@ -427,16 +427,16 @@ export class DomainAvailabilityService {
return this.getPickUpAvailabilities(payload, true).pipe( return this.getPickUpAvailabilities(payload, true).pipe(
timeout(20000), timeout(20000),
switchMap((availability) => switchMap((availability) =>
logistician$.pipe(map((logistician) => ({ availability: [...availability], logistician: { id: logistician.id } }))) logistician$.pipe(map((logistician) => ({ availability: [...availability], logistician: { id: logistician.id } }))),
), ),
shareReplay(1) shareReplay(1),
); );
} }
getPriceForAvailability( getPriceForAvailability(
purchasingOption: string, purchasingOption: string,
catalogAvailability: CatAvailabilityDTO | AvailabilityDTO, catalogAvailability: CatAvailabilityDTO | AvailabilityDTO,
availability: AvailabilityDTO availability: AvailabilityDTO,
): PriceDTO { ): PriceDTO {
switch (purchasingOption) { switch (purchasingOption) {
case 'take-away': case 'take-away':
@@ -567,12 +567,12 @@ export class DomainAvailabilityService {
if (!params.branchId) { if (!params.branchId) {
branchId$ = this.getDefaultBranch().pipe( branchId$ = this.getDefaultBranch().pipe(
first(), first(),
map((b) => b.id) map((b) => b.id),
); );
} }
const stock$ = branchId$.pipe( const stock$ = branchId$.pipe(
mergeMap((branchId) => this._stockService.StockGetStocksByBranch({ branchId }).pipe(map((response) => response.result?.[0]))) mergeMap((branchId) => this._stockService.StockGetStocksByBranch({ branchId }).pipe(map((response) => response.result?.[0]))),
); );
return stock$.pipe( return stock$.pipe(
@@ -589,17 +589,17 @@ export class DomainAvailabilityService {
acc[stockInfo.ean] = stockInfo; acc[stockInfo.ean] = stockInfo;
return acc; return acc;
}, {}); }, {});
}) }),
) ),
) ),
); );
} }
getInStock({ itemIds, branchId }: { itemIds: number[]; branchId: number }): Observable<StockInfoDTO[]> { getInStock({ itemIds, branchId }: { itemIds: number[]; branchId: number }): Observable<StockInfoDTO[]> {
return this.getStockByBranch(branchId).pipe( return this.getStockByBranch(branchId).pipe(
mergeMap((stock) => mergeMap((stock) =>
this._stockService.StockInStock({ articleIds: itemIds, stockId: stock.id }).pipe(map((response) => response.result)) this._stockService.StockInStock({ articleIds: itemIds, stockId: stock.id }).pipe(map((response) => response.result)),
) ),
); );
} }
} }

View File

@@ -87,7 +87,7 @@ export function getCanAddResults(state: PurchaseOptionsState): CanAdd[] {
export function getCanAddForItemWithPurchaseOption( export function getCanAddForItemWithPurchaseOption(
itemId: number, itemId: number,
purchaseOption: PurchaseOption purchaseOption: PurchaseOption,
): (state: PurchaseOptionsState) => CanAdd { ): (state: PurchaseOptionsState) => CanAdd {
return (state: PurchaseOptionsState) => { return (state: PurchaseOptionsState) => {
const canAddResults = getCanAddResults(state); const canAddResults = getCanAddResults(state);
@@ -157,7 +157,7 @@ export function getItemsThatHaveAnAvailabilityAndCanAddForPurchaseOption(purchas
const canAddResults = getCanAddResults(state); const canAddResults = getCanAddResults(state);
return items.filter((item) => return items.filter((item) =>
canAddResults.some((canAdd) => canAdd.itemId === item.id && canAdd.purchaseOption === purchaseOption && canAdd.canAdd) canAddResults.some((canAdd) => canAdd.itemId === item.id && canAdd.purchaseOption === purchaseOption && canAdd.canAdd),
); );
}; };
} }
@@ -189,7 +189,7 @@ export function getItemsForList(state: PurchaseOptionsState): Item[] {
export function getAvailabilitiesForItem( export function getAvailabilitiesForItem(
itemId: number, itemId: number,
allDeliveryAvailabilities?: boolean allDeliveryAvailabilities?: boolean,
): (state: PurchaseOptionsState) => Availability[] { ): (state: PurchaseOptionsState) => Availability[] {
return (state) => { return (state) => {
let availabilities = getAvailabilities(state); let availabilities = getAvailabilities(state);
@@ -198,7 +198,7 @@ export function getAvailabilitiesForItem(
// if 'delivery', 'dig-delivery' and 'b2b-delivery' are present remove 'dig-delivery' and 'b2b-delivery' // if 'delivery', 'dig-delivery' and 'b2b-delivery' are present remove 'dig-delivery' and 'b2b-delivery'
if (!allDeliveryAvailabilities && availabilities.some((availability) => availability.purchaseOption === 'delivery')) { if (!allDeliveryAvailabilities && availabilities.some((availability) => availability.purchaseOption === 'delivery')) {
availabilities = availabilities.filter( availabilities = availabilities.filter(
(availability) => availability.purchaseOption !== 'dig-delivery' && availability.purchaseOption !== 'b2b-delivery' (availability) => availability.purchaseOption !== 'dig-delivery' && availability.purchaseOption !== 'b2b-delivery',
); );
} }
const optionsOrder = PURCHASE_OPTIONS; const optionsOrder = PURCHASE_OPTIONS;
@@ -247,7 +247,7 @@ export function getIsGiftCard(itemId: number): (state: PurchaseOptionsState) =>
export function getAvailabilityPriceForPurchaseOption( export function getAvailabilityPriceForPurchaseOption(
itemId: number, itemId: number,
purchaseOption: PurchaseOption purchaseOption: PurchaseOption,
): (state: PurchaseOptionsState) => (PriceDTO & { fromCatalogue?: boolean }) | undefined { ): (state: PurchaseOptionsState) => (PriceDTO & { fromCatalogue?: boolean }) | undefined {
return (state) => { return (state) => {
const item = getItems(state).find((item) => item.id === itemId); const item = getItems(state).find((item) => item.id === itemId);
@@ -316,6 +316,20 @@ export function getAvailabilityPriceForPurchaseOption(
return pickupAvailability?.data?.price; return pickupAvailability?.data?.price;
} }
} }
// #4760 Fehler bei Abholpreisberechnung in Filiale Darmstadt Ernst-Ludwig-Straße (negativ Preis im Warenkorb)
// Überprüfen ob der Preis ungültig ist und der Versandpreis vorhanden ist
// Wenn ja, dann den Versandpreis nehmen
if (!(availability?.data?.price?.value?.value > 0)) {
if (deliveryAvailability?.data?.price?.value?.value > 0) {
const deliveryPrice = deliveryAvailability?.data?.price;
availability.data.price = deliveryPrice;
} else {
// Wenn der Versandpreis auch ungültig ist, dann den Katalogpreis nehmen
const catalogAvailability = availabilities.find((availability) => availability.purchaseOption === 'catalog');
return catalogAvailability?.data?.price ?? DEFAULT_PRICE_DTO;
}
}
} }
if (availability && availability.data.price?.value?.value && availability.data.price) { if (availability && availability.data.price?.value?.value && availability.data.price) {
@@ -376,7 +390,7 @@ export function getCanAddResultForItemAndCurrentPurchaseOption(itemId: number):
export function getAvailabilityWithPurchaseOption( export function getAvailabilityWithPurchaseOption(
itemId: number, itemId: number,
purchaseOption: PurchaseOption purchaseOption: PurchaseOption,
): (state: PurchaseOptionsState) => Availability { ): (state: PurchaseOptionsState) => Availability {
return (state) => { return (state) => {
let availabilities = getAvailabilitiesForItem(itemId, true)(state); let availabilities = getAvailabilitiesForItem(itemId, true)(state);