From 7c160ce7e1241d0ee19b3fc2b3367f3f69b89607 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Silke=20Gr=C3=BCber?= Date: Fri, 8 Sep 2023 09:27:13 +0200 Subject: [PATCH] feat: save orderReferenceId as native basket attribute (#1499) --- docs/guides/migrations.md | 2 ++ .../requisition/requisition.mapper.spec.ts | 5 ++++- src/app/core/facades/checkout.facade.ts | 5 +++++ src/app/core/models/basket/basket.interface.ts | 3 ++- src/app/core/models/basket/basket.mapper.spec.ts | 6 ++++++ src/app/core/models/basket/basket.mapper.ts | 1 + src/app/core/models/basket/basket.model.ts | 1 + src/app/core/models/order/order.mapper.spec.ts | 5 +++++ src/app/core/models/order/order.mapper.ts | 2 ++ src/app/core/services/basket/basket.service.ts | 7 ++++--- .../core/store/customer/basket/basket.actions.ts | 2 +- .../store/customer/basket/basket.effects.spec.ts | 6 +++--- src/app/core/utils/dev/basket-mock-data.ts | 2 +- .../basket-buyer/basket-buyer.component.html | 4 ++-- .../basket-buyer/basket-buyer.component.ts | 2 -- .../basket-order-reference.component.spec.ts | 6 +++--- .../basket-order-reference.component.ts | 16 +++++----------- 17 files changed, 47 insertions(+), 28 deletions(-) diff --git a/docs/guides/migrations.md b/docs/guides/migrations.md index ef5bb17637..137120d1c5 100644 --- a/docs/guides/migrations.md +++ b/docs/guides/migrations.md @@ -9,6 +9,8 @@ kb_sync_latest_only ## 4.1 to 4.2 +The basket attribute 'orderReferenceId' is now saved as native attribute 'externalOrderReference' at the basket, but it still exists at the basket and can be displayed further on, if needed. + A better handling for cookie `SameSite` and `secure` settings was implemented with new defaults to `SameSite=Strict` and `secure`. This can still be overridden when calling `cookies.services` `put` method with explicitly set values. Now the `secure` setting is always set to `true` if in `https` mode, you can prevent this by explicitly setting it to `false`. diff --git a/projects/requisition-management/src/app/models/requisition/requisition.mapper.spec.ts b/projects/requisition-management/src/app/models/requisition/requisition.mapper.spec.ts index a29deaa319..a30c4893bc 100644 --- a/projects/requisition-management/src/app/models/requisition/requisition.mapper.spec.ts +++ b/projects/requisition-management/src/app/models/requisition/requisition.mapper.spec.ts @@ -28,7 +28,9 @@ describe('Requisition Mapper', () => { user: 'bboldner@test.intershop.de', costCenter: 'CostCenter123', creationDate: 12345678, + externalOrderReference: 'EXT12345', lineItemCount: 2, + messageToMerchant: 'test message', approval: { costCenterApproval: { approvers: [{ email: 'jlink@test.intershop.de' }], @@ -98,12 +100,13 @@ describe('Requisition Mapper', () => { "customerNo": "OilCorp", "dynamicMessages": undefined, "email": "bboldner@test.intershop.de", + "externalOrderReference": "EXT12345", "id": "testUUDI", "infos": undefined, "invoiceToAddress": undefined, "lineItemCount": 2, "lineItems": [], - "messageToMerchant": undefined, + "messageToMerchant": "test message", "orderNo": "10001", "payment": undefined, "promotionCodes": undefined, diff --git a/src/app/core/facades/checkout.facade.ts b/src/app/core/facades/checkout.facade.ts index 1edeca7000..3e0a8f52e4 100644 --- a/src/app/core/facades/checkout.facade.ts +++ b/src/app/core/facades/checkout.facade.ts @@ -46,6 +46,7 @@ import { setBasketPayment, startCheckout, submitOrder, + updateBasket, updateBasketAddress, updateBasketCostCenter, updateBasketItem, @@ -132,6 +133,10 @@ export class CheckoutFacade { this.store.dispatch(updateBasketCostCenter({ costCenter })); } + updateBasketExternalOrderReference(externalOrderReference: string) { + this.store.dispatch(updateBasket({ update: { externalOrderReference } })); + } + setBasketCustomAttribute(attribute: Attribute): void { this.store.dispatch(setBasketAttribute({ attribute })); } diff --git a/src/app/core/models/basket/basket.interface.ts b/src/app/core/models/basket/basket.interface.ts index b104631172..a04e98f92f 100644 --- a/src/app/core/models/basket/basket.interface.ts +++ b/src/app/core/models/basket/basket.interface.ts @@ -13,8 +13,8 @@ import { ShippingMethodData } from 'ish-core/models/shipping-method/shipping-met export interface BasketBaseData { id: string; - purchaseCurrency?: string; calculated: boolean; + purchaseCurrency?: string; invoiceToAddress?: string; commonShipToAddress?: string; commonShippingMethod?: string; @@ -27,6 +27,7 @@ export interface BasketBaseData { valueBasedDiscounts?: string[]; }; buckets?: string[]; + externalOrderReference?: string; lineItems?: string[]; messageToMerchant?: string; payments?: string[]; diff --git a/src/app/core/models/basket/basket.mapper.spec.ts b/src/app/core/models/basket/basket.mapper.spec.ts index fc198da617..188e2c49f1 100644 --- a/src/app/core/models/basket/basket.mapper.spec.ts +++ b/src/app/core/models/basket/basket.mapper.spec.ts @@ -81,6 +81,8 @@ describe('Basket Mapper', () => { }, ], }, + messageToMerchant: 'test message', + externalOrderReference: 'EXT12345', }; const basketIncludedData = { @@ -179,6 +181,10 @@ describe('Basket Mapper', () => { expect(basket.totals.bucketSurchargeTotalsByType[0].amount.gross).toBe( basketData.data.surcharges.bucketSurcharges[0].amount.gross.value ); + + expect(basket.messageToMerchant).toBe(basketData.data.messageToMerchant); + expect(basket.externalOrderReference).toBe(basketData.data.externalOrderReference); + expect(basket.totals.isEstimated).toBeTrue(); }); diff --git a/src/app/core/models/basket/basket.mapper.ts b/src/app/core/models/basket/basket.mapper.ts index a58111f322..c697ce4c88 100644 --- a/src/app/core/models/basket/basket.mapper.ts +++ b/src/app/core/models/basket/basket.mapper.ts @@ -68,6 +68,7 @@ export class BasketMapper { attributes: data.attributes, taxationId: data.attributes?.find(attr => attr.name === 'taxationID')?.value as string, user: data.buyer, + externalOrderReference: data.externalOrderReference, messageToMerchant: data.messageToMerchant, }; } diff --git a/src/app/core/models/basket/basket.model.ts b/src/app/core/models/basket/basket.model.ts index b2b814be62..ee064eba53 100644 --- a/src/app/core/models/basket/basket.model.ts +++ b/src/app/core/models/basket/basket.model.ts @@ -34,6 +34,7 @@ export interface AbstractBasket { firstName: string; lastName: string; }; + externalOrderReference?: string; messageToMerchant?: string; } diff --git a/src/app/core/models/order/order.mapper.spec.ts b/src/app/core/models/order/order.mapper.spec.ts index 824a56a9a6..86bad0cb09 100644 --- a/src/app/core/models/order/order.mapper.spec.ts +++ b/src/app/core/models/order/order.mapper.spec.ts @@ -64,6 +64,8 @@ describe('Order Mapper', () => { }, ], }, + messageToMerchant: 'test message', + externalOrderReference: 'EXT12345', attributes: [ { name: 'BusinessObjectAttributes#OrderApproval_ApprovalDate', value: '2020-10-12T13:40:00+02:00', type: 'Date' }, { name: 'BusinessObjectAttributes#OrderApproval_ApproverFirstName', value: 'Patricia', type: 'String' }, @@ -160,6 +162,9 @@ describe('Order Mapper', () => { expect(order.approval.approverFirstName).toBe('Patricia'); expect(order.requisitionNo).toBe(orderBaseData.requisitionDocumentNo); + + expect(order.messageToMerchant).toBe(orderBaseData.messageToMerchant); + expect(order.externalOrderReference).toBe(orderBaseData.externalOrderReference); }); }); }); diff --git a/src/app/core/models/order/order.mapper.ts b/src/app/core/models/order/order.mapper.ts index a988444858..9922018f5b 100644 --- a/src/app/core/models/order/order.mapper.ts +++ b/src/app/core/models/order/order.mapper.ts @@ -85,6 +85,8 @@ export class OrderMapper { attributes: data.attributes, taxationId: data.taxIdentificationNumber, user: data.buyer, + messageToMerchant: data.messageToMerchant, + externalOrderReference: data.externalOrderReference, }; } } diff --git a/src/app/core/services/basket/basket.service.ts b/src/app/core/services/basket/basket.service.ts index a7ff3a5189..74c29b913d 100644 --- a/src/app/core/services/basket/basket.service.ts +++ b/src/app/core/services/basket/basket.service.ts @@ -31,11 +31,12 @@ import { getBasketIdOrCurrent, getCurrentBasket } from 'ish-core/store/customer/ import { encodeResourceID } from 'ish-core/utils/url-resource-ids'; export type BasketUpdateType = - | { invoiceToAddress: string } - | { commonShipToAddress: string } | { commonShippingMethod: string } - | { costCenter: string } + | { commonShipToAddress: string } | { calculated: boolean } + | { costCenter: string } + | { externalOrderReference: string } + | { invoiceToAddress: string } | { messageToMerchant: string }; export type BasketItemUpdateType = diff --git a/src/app/core/store/customer/basket/basket.actions.ts b/src/app/core/store/customer/basket/basket.actions.ts index d6a44c1e76..516830bc6a 100644 --- a/src/app/core/store/customer/basket/basket.actions.ts +++ b/src/app/core/store/customer/basket/basket.actions.ts @@ -71,7 +71,7 @@ export const addMessageToMerchant = createAction( '[Basket] Message to Merchant', payload<{ messageToMerchant: string }>() ); -export const updateBasket = createAction('[Basket Internal] Update Basket', payload<{ update: BasketUpdateType }>()); +export const updateBasket = createAction('[Basket API] Update Basket', payload<{ update: BasketUpdateType }>()); export const updateBasketFail = createAction('[Basket API] Update Basket Fail', httpError()); diff --git a/src/app/core/store/customer/basket/basket.effects.spec.ts b/src/app/core/store/customer/basket/basket.effects.spec.ts index 2f5e2fa74b..11979e53e7 100644 --- a/src/app/core/store/customer/basket/basket.effects.spec.ts +++ b/src/app/core/store/customer/basket/basket.effects.spec.ts @@ -224,9 +224,9 @@ describe('Basket Effects', () => { effects.recalculateBasketAfterCurrencyChange$.subscribe(action => { expect(action).toMatchInlineSnapshot(` - [Basket Internal] Update Basket: - update: {"calculated":true} - `); + [Basket API] Update Basket: + update: {"calculated":true} + `); done(); }); }); diff --git a/src/app/core/utils/dev/basket-mock-data.ts b/src/app/core/utils/dev/basket-mock-data.ts index e277f4743c..4debf51453 100644 --- a/src/app/core/utils/dev/basket-mock-data.ts +++ b/src/app/core/utils/dev/basket-mock-data.ts @@ -18,7 +18,7 @@ export class BasketMockData { commonShippingMethod: BasketMockData.getShippingMethod(), payment: BasketMockData.getPayment(), totals: BasketMockData.getTotals(), - attributes: [{ name: 'orderReferenceID', value: '111-222-333' }], + externalOrderReference: '111-222-333', } as BasketView; } diff --git a/src/app/shared/components/basket/basket-buyer/basket-buyer.component.html b/src/app/shared/components/basket/basket-buyer/basket-buyer.component.html index ccb3ffc2ce..6c9b243cc1 100644 --- a/src/app/shared/components/basket/basket-buyer/basket-buyer.component.html +++ b/src/app/shared/components/basket/basket-buyer/basket-buyer.component.html @@ -13,7 +13,7 @@

{{ object.costCenter }} {{ costCenterName }}

-
+
{{ 'checkout.widget.buyer.orderReferenceId' | translate }} -

{{ orderReferenceID }}

+

{{ object.externalOrderReference }}

diff --git a/src/app/shared/components/basket/basket-buyer/basket-buyer.component.ts b/src/app/shared/components/basket/basket-buyer/basket-buyer.component.ts index f2697f5ebf..2d8f8a8f9d 100644 --- a/src/app/shared/components/basket/basket-buyer/basket-buyer.component.ts +++ b/src/app/shared/components/basket/basket-buyer/basket-buyer.component.ts @@ -23,7 +23,6 @@ export class BasketBuyerComponent implements OnInit, OnDestroy { customer$: Observable; taxationID: string; - orderReferenceID: string; costCenterName: string; userName: string; companyName1: string; @@ -35,7 +34,6 @@ export class BasketBuyerComponent implements OnInit, OnDestroy { ngOnInit() { this.taxationID = this.object.taxationId; - this.orderReferenceID = this.getAttributeValue('orderReferenceID'); this.costCenterName = this.getAttributeValue('BusinessObjectAttributes#Order_CostCenter_Name'); this.userName = this.object.user diff --git a/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.spec.ts b/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.spec.ts index 8d8fb3fd5d..d79b32bac5 100644 --- a/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.spec.ts +++ b/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.spec.ts @@ -49,7 +49,7 @@ describe('Basket Order Reference Component', () => { it('should read the order reference id from the basket', () => { component.basket = { - attributes: [{ name: 'orderReferenceID', value: '4711' }], + externalOrderReference: '4711', } as Basket; fixture.detectChanges(); @@ -66,7 +66,7 @@ describe('Basket Order Reference Component', () => { }); component.submitForm(); - verify(checkoutFacade.setBasketCustomAttribute(anything())).once(); + verify(checkoutFacade.updateBasketExternalOrderReference(anything())).once(); }); it('should not emit form when an invalid form is submitted', () => { @@ -77,6 +77,6 @@ describe('Basket Order Reference Component', () => { }); component.submitForm(); - verify(checkoutFacade.setBasketCustomAttribute(anything())).never(); + verify(checkoutFacade.updateBasketExternalOrderReference(anything())).never(); }); }); diff --git a/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.ts b/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.ts index bedc285a29..8e34dce1e1 100644 --- a/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.ts +++ b/src/app/shared/components/basket/basket-order-reference/basket-order-reference.component.ts @@ -61,17 +61,14 @@ export class BasketOrderReferenceComponent implements OnInit, OnChanges { ngOnChanges(changes: SimpleChanges) { if (this.basket) { this.successMessage(changes.basket); - this.model = { ...this.model, orderReferenceId: this.getOrderReferenceId(this.basket) }; + this.model = { ...this.model, orderReferenceId: this.basket.externalOrderReference }; } } - private getOrderReferenceId(basket: Basket): string { - return basket?.attributes?.find(attr => attr.name === 'orderReferenceID')?.value as string; - } - private successMessage(basketChange: SimpleChange) { if ( - this.getOrderReferenceId(basketChange?.previousValue) !== this.getOrderReferenceId(basketChange?.currentValue) && + (basketChange?.previousValue as Basket)?.externalOrderReference !== + (basketChange?.currentValue as Basket)?.externalOrderReference && !basketChange?.firstChange ) { this.showSuccessMessage = true; @@ -83,16 +80,13 @@ export class BasketOrderReferenceComponent implements OnInit, OnChanges { } get disabled() { - return this.form.invalid || (!this.getOrderReferenceId(this.basket) && !this.form.get('orderReferenceId').value); + return this.form.invalid || (!this.basket?.externalOrderReference && !this.form.get('orderReferenceId').value); } submitForm() { if (this.disabled) { return; } - this.checkoutFacade.setBasketCustomAttribute({ - name: 'orderReferenceID', - value: this.form.get('orderReferenceId').value, - }); + this.checkoutFacade.updateBasketExternalOrderReference(this.form.get('orderReferenceId').value); } }