diff --git a/.env-cmdrc b/.env-cmdrc
index 73bb133bc45..60fdf05f15f 100644
--- a/.env-cmdrc
+++ b/.env-cmdrc
@@ -55,6 +55,10 @@
"CX_REQUESTED_DELIVERY_DATE": "true",
"CX_PDF_INVOICES": "true"
},
+ "omf":{
+ "CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s9-public.model-t.myhybris.cloud",
+ "CX_OMF": "true"
+ },
"requested-delivery-date": {
"CX_BASE_URL": "https://api.cg79x9wuu9-eccommerc1-s8-public.model-t.myhybris.cloud",
"CX_REQUESTED_DELIVERY_DATE": "true"
diff --git a/core-libs/setup/tsconfig.spec.json b/core-libs/setup/tsconfig.spec.json
index 1e7adccf9a9..1952ea3bcfe 100644
--- a/core-libs/setup/tsconfig.spec.json
+++ b/core-libs/setup/tsconfig.spec.json
@@ -575,6 +575,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/extra-webpack.config.js b/extra-webpack.config.js
index c6f0f66837c..42ea421b644 100644
--- a/extra-webpack.config.js
+++ b/extra-webpack.config.js
@@ -72,6 +72,7 @@ module.exports = {
),
'@spartacus/s4om': path.join(__dirname, 'integration-libs/s4om'),
'@spartacus/s4-service': path.join(__dirname, 'integration-libs/s4-service'),
+ '@spartacus/omf': path.join(__dirname, 'integration-libs/omf'),
},
},
};
diff --git a/feature-libs/asm/tsconfig.schematics.json b/feature-libs/asm/tsconfig.schematics.json
index a9e1a8dbc30..63f3725717b 100644
--- a/feature-libs/asm/tsconfig.schematics.json
+++ b/feature-libs/asm/tsconfig.schematics.json
@@ -572,6 +572,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/cart/tsconfig.schematics.json b/feature-libs/cart/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/cart/tsconfig.schematics.json
+++ b/feature-libs/cart/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/checkout/tsconfig.schematics.json b/feature-libs/checkout/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/checkout/tsconfig.schematics.json
+++ b/feature-libs/checkout/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/customer-ticketing/tsconfig.schematics.json b/feature-libs/customer-ticketing/tsconfig.schematics.json
index 2e09eb491ef..cb9f54cdff4 100644
--- a/feature-libs/customer-ticketing/tsconfig.schematics.json
+++ b/feature-libs/customer-ticketing/tsconfig.schematics.json
@@ -595,6 +595,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/estimated-delivery-date/tsconfig.schematics.json b/feature-libs/estimated-delivery-date/tsconfig.schematics.json
index 2e09eb491ef..cb9f54cdff4 100644
--- a/feature-libs/estimated-delivery-date/tsconfig.schematics.json
+++ b/feature-libs/estimated-delivery-date/tsconfig.schematics.json
@@ -595,6 +595,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html
index aa0b7a541c7..616c86b3635 100644
--- a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html
+++ b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.html
@@ -33,6 +33,7 @@
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
>
{{ 'orderHistory.orderId' | cxTranslate }} {{ order?.code }}
diff --git a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts
index e408ffbd20f..bf3c4fbb36f 100644
--- a/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts
+++ b/feature-libs/order/components/order-history/my-account-v2/my-account-v2-order-history.component.spec.ts
@@ -15,10 +15,14 @@ import {
TranslationService,
} from '@spartacus/core';
import { MyAccountV2OrderHistoryService } from '@spartacus/order/core';
-import { EMPTY, Observable, of } from 'rxjs';
-import { ReplenishmentOrderHistoryFacade } from '../../../root/facade';
-import { OrderHistoryList, OrderHistoryView } from '../../../root/model';
+import { BehaviorSubject, EMPTY, Observable, of } from 'rxjs';
+import {
+ OrderHistoryFacade,
+ ReplenishmentOrderHistoryFacade,
+} from '../../../root/facade';
+import { Order, OrderHistoryList, OrderHistoryView } from '../../../root/model';
import { MyAccountV2OrderHistoryComponent } from './my-account-v2-order-history.component';
+import { Params } from '@angular/router';
const mockOrders: OrderHistoryList = {
orders: [
@@ -60,6 +64,24 @@ class MockUrlPipe implements PipeTransform {
transform() {}
}
+class MockOrderHistoryFacade implements Partial {
+ getOrderHistoryList(): Observable {
+ return new BehaviorSubject(mockOrders);
+ }
+ getOrderHistoryListLoaded(): Observable {
+ return of(true);
+ }
+ getQueryParams(_order: Order): Params | null {
+ return null;
+ }
+ loadOrderList(
+ _pageSize: number,
+ _currentPage?: number,
+ _sort?: string
+ ): void {}
+ clearOrderList() {}
+}
+
class MockMyAccountV2OrderHistoryService
implements Partial
{
@@ -119,6 +141,7 @@ describe('MyAccountV2OrderHistoryComponent', () => {
],
providers: [
{ provide: RoutingService, useClass: MockRoutingService },
+ { provide: OrderHistoryFacade, useClass: MockOrderHistoryFacade },
{
provide: MyAccountV2OrderHistoryService,
useClass: MockMyAccountV2OrderHistoryService,
@@ -164,10 +187,15 @@ describe('MyAccountV2OrderHistoryComponent', () => {
By.css('.cx-my-account-v2-order-history-code')
);
codes[1].triggerEventHandler('click');
- expect(routingService.go).toHaveBeenCalledWith({
- cxRoute: 'orderDetails',
- params: mockOrders.orders?.[1],
- });
+ expect(routingService.go).toHaveBeenCalledWith(
+ {
+ cxRoute: 'orderDetails',
+ params: mockOrders.orders?.[1],
+ },
+ {
+ queryParams: null,
+ }
+ );
});
it('should display pagination', () => {
diff --git a/feature-libs/order/components/order-history/order-history.component.html b/feature-libs/order/components/order-history/order-history.component.html
index 78adcb74bfa..b780c1a4e84 100644
--- a/feature-libs/order/components/order-history/order-history.component.html
+++ b/feature-libs/order/components/order-history/order-history.component.html
@@ -106,6 +106,7 @@
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>
{{ order?.code }}
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>
{{ order.purchaseOrderNumber }}
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>
{{ order.costCenter?.name }}
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>{{ order?.placed | cxDate: 'longDate' }}
@@ -174,6 +178,7 @@
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>
{{
@@ -193,6 +198,7 @@
params: order
} | cxUrl
"
+ [queryParams]="getQueryParams(order)"
class="cx-order-history-value"
>
{{ order?.total.formattedValue }} {
getOrderHistoryListLoaded(): Observable {
return of(true);
}
+ getQueryParams(_order: Order): Params | null {
+ return null;
+ }
loadOrderList(
_pageSize: number,
_currentPage?: number,
@@ -210,10 +215,15 @@ describe('OrderHistoryComponent', () => {
);
rows[1].triggerEventHandler('click', null);
- expect(routingService.go).toHaveBeenCalledWith({
- cxRoute: 'orderDetails',
- params: mockOrders.orders[1],
- });
+ expect(routingService.go).toHaveBeenCalledWith(
+ {
+ cxRoute: 'orderDetails',
+ params: mockOrders.orders[1],
+ },
+ {
+ queryParams: null,
+ }
+ );
});
it('should set correctly sort code', () => {
diff --git a/feature-libs/order/components/order-history/order-history.component.ts b/feature-libs/order/components/order-history/order-history.component.ts
index c6dd656e240..14a24e84548 100644
--- a/feature-libs/order/components/order-history/order-history.component.ts
+++ b/feature-libs/order/components/order-history/order-history.component.ts
@@ -5,6 +5,7 @@
*/
import { ChangeDetectionStrategy, Component, OnDestroy } from '@angular/core';
+import { Params } from '@angular/router';
import {
isNotUndefined,
RoutingService,
@@ -91,10 +92,19 @@ export class OrderHistoryComponent implements OnDestroy {
}
goToOrderDetail(order: Order): void {
- this.routing.go({
- cxRoute: 'orderDetails',
- params: order,
- });
+ this.routing.go(
+ {
+ cxRoute: 'orderDetails',
+ params: order,
+ },
+ {
+ queryParams: this.getQueryParams(order),
+ }
+ );
+ }
+
+ getQueryParams(order: Order): Params | null {
+ return this.orderHistoryFacade.getQueryParams(order);
}
getSortLabels(): Observable<{ byDate: string; byOrderNumber: string }> {
diff --git a/feature-libs/order/core/facade/order-history.service.spec.ts b/feature-libs/order/core/facade/order-history.service.spec.ts
index 743b7750681..526facd5d03 100644
--- a/feature-libs/order/core/facade/order-history.service.spec.ts
+++ b/feature-libs/order/core/facade/order-history.service.spec.ts
@@ -270,4 +270,14 @@ describe('OrderHistoryService', () => {
.subscribe((data) => expect(data).toEqual(true))
.unsubscribe();
});
+ describe('getQueryParams', () => {
+ it('should always return null even if guid is present', () => {
+ const param = userOrderService.getQueryParams({ guid: '123' });
+ expect(param).toEqual(null);
+ });
+ it('should always return if no guid exists', () => {
+ const param = userOrderService.getQueryParams({ code: '123' });
+ expect(param).toEqual(null);
+ });
+ });
});
diff --git a/feature-libs/order/core/facade/order-history.service.ts b/feature-libs/order/core/facade/order-history.service.ts
index 903376a585a..3f7328087c8 100644
--- a/feature-libs/order/core/facade/order-history.service.ts
+++ b/feature-libs/order/core/facade/order-history.service.ts
@@ -24,6 +24,7 @@ import { map, take, tap } from 'rxjs/operators';
import { OrderActions } from '../store/actions/index';
import { CANCEL_ORDER_PROCESS_ID, StateWithOrder } from '../store/order-state';
import { OrderSelectors } from '../store/selectors/index';
+import { Params } from '@angular/router';
@Injectable()
export class OrderHistoryService implements OrderHistoryFacade {
@@ -215,4 +216,8 @@ export class OrderHistoryService implements OrderHistoryFacade {
getOrderDetailsLoading(): Observable {
return this.store.pipe(select(OrderSelectors.getOrderDetailsLoading));
}
+
+ getQueryParams(_order: Order): Params | null {
+ return null;
+ }
}
diff --git a/feature-libs/order/root/facade/order-history.facade.ts b/feature-libs/order/root/facade/order-history.facade.ts
index 848d9d75e0f..29b5849fdd8 100644
--- a/feature-libs/order/root/facade/order-history.facade.ts
+++ b/feature-libs/order/root/facade/order-history.facade.ts
@@ -14,6 +14,7 @@ import {
Order,
OrderHistoryList,
} from '../model/order.model';
+import { Params } from '@angular/router';
export function orderHistoryFacadeFactory() {
return facadeFactory({
@@ -35,6 +36,7 @@ export function orderHistoryFacadeFactory() {
'getCancelOrderSuccess',
'resetCancelOrderProcessState',
'getOrderDetailsLoading',
+ 'getQueryParams',
],
async: true,
});
@@ -138,4 +140,9 @@ export abstract class OrderHistoryFacade {
* Returns an order details loading flag
*/
abstract getOrderDetailsLoading(): Observable;
+
+ /**
+ * Returns query parameters needed for order details route
+ */
+ abstract getQueryParams(order: Order): Params | null;
}
diff --git a/feature-libs/order/tsconfig.schematics.json b/feature-libs/order/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/order/tsconfig.schematics.json
+++ b/feature-libs/order/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/organization/tsconfig.schematics.json b/feature-libs/organization/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/organization/tsconfig.schematics.json
+++ b/feature-libs/organization/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/pdf-invoices/tsconfig.schematics.json b/feature-libs/pdf-invoices/tsconfig.schematics.json
index 2e09eb491ef..cb9f54cdff4 100644
--- a/feature-libs/pdf-invoices/tsconfig.schematics.json
+++ b/feature-libs/pdf-invoices/tsconfig.schematics.json
@@ -595,6 +595,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/pickup-in-store/tsconfig.schematics.json b/feature-libs/pickup-in-store/tsconfig.schematics.json
index cc1e55926eb..447815bfdba 100644
--- a/feature-libs/pickup-in-store/tsconfig.schematics.json
+++ b/feature-libs/pickup-in-store/tsconfig.schematics.json
@@ -598,6 +598,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/product-configurator/tsconfig.schematics.json b/feature-libs/product-configurator/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/product-configurator/tsconfig.schematics.json
+++ b/feature-libs/product-configurator/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/product/tsconfig.schematics.json b/feature-libs/product/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/product/tsconfig.schematics.json
+++ b/feature-libs/product/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/qualtrics/tsconfig.schematics.json b/feature-libs/qualtrics/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/qualtrics/tsconfig.schematics.json
+++ b/feature-libs/qualtrics/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/quote/tsconfig.schematics.json b/feature-libs/quote/tsconfig.schematics.json
index cc1e55926eb..447815bfdba 100644
--- a/feature-libs/quote/tsconfig.schematics.json
+++ b/feature-libs/quote/tsconfig.schematics.json
@@ -598,6 +598,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/requested-delivery-date/tsconfig.schematics.json b/feature-libs/requested-delivery-date/tsconfig.schematics.json
index 2e09eb491ef..cb9f54cdff4 100644
--- a/feature-libs/requested-delivery-date/tsconfig.schematics.json
+++ b/feature-libs/requested-delivery-date/tsconfig.schematics.json
@@ -595,6 +595,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/smartedit/tsconfig.schematics.json b/feature-libs/smartedit/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/smartedit/tsconfig.schematics.json
+++ b/feature-libs/smartedit/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/storefinder/tsconfig.schematics.json b/feature-libs/storefinder/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/storefinder/tsconfig.schematics.json
+++ b/feature-libs/storefinder/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/tracking/tsconfig.schematics.json b/feature-libs/tracking/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/tracking/tsconfig.schematics.json
+++ b/feature-libs/tracking/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/feature-libs/user/tsconfig.schematics.json b/feature-libs/user/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/feature-libs/user/tsconfig.schematics.json
+++ b/feature-libs/user/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/cdc/tsconfig.schematics.json b/integration-libs/cdc/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/cdc/tsconfig.schematics.json
+++ b/integration-libs/cdc/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/cdp/tsconfig.schematics.json b/integration-libs/cdp/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/cdp/tsconfig.schematics.json
+++ b/integration-libs/cdp/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/cds/tsconfig.schematics.json b/integration-libs/cds/tsconfig.schematics.json
index 185cef46904..7fd3f760267 100644
--- a/integration-libs/cds/tsconfig.schematics.json
+++ b/integration-libs/cds/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/cpq-quote/tsconfig.schematics.json b/integration-libs/cpq-quote/tsconfig.schematics.json
index 2e09eb491ef..cb9f54cdff4 100644
--- a/integration-libs/cpq-quote/tsconfig.schematics.json
+++ b/integration-libs/cpq-quote/tsconfig.schematics.json
@@ -595,6 +595,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/digital-payments/tsconfig.schematics.json b/integration-libs/digital-payments/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/digital-payments/tsconfig.schematics.json
+++ b/integration-libs/digital-payments/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/epd-visualization/tsconfig.schematics.json b/integration-libs/epd-visualization/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/epd-visualization/tsconfig.schematics.json
+++ b/integration-libs/epd-visualization/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/omf/README.md b/integration-libs/omf/README.md
new file mode 100644
index 00000000000..6ce492f2c92
--- /dev/null
+++ b/integration-libs/omf/README.md
@@ -0,0 +1,9 @@
+# Spartacus Order Management Foundation Integration
+
+The SAP Order Management foundation is a cloud-based solution that enables you to conveniently consolidate and manage all your orders and order-related data from a single location.
+
+Spartacus' Order Management Foundation Integration library leverages the advantages of SAP Order Management Foundation to bring a seamless order management experience to your e-commerce solution.
+
+It can be added to the existing Spartacus application by running `ng add @spartacus/omf`. For more information about Spartacus schematics, visit the [official Spartacus schematics documentation page](https://sap.github.io/spartacus-docs/schematics/).
+
+For more information, see [Spartacus](https://github.com/SAP/spartacus).
diff --git a/integration-libs/omf/jest.schematics.config.js b/integration-libs/omf/jest.schematics.config.js
new file mode 100644
index 00000000000..9ea8f415847
--- /dev/null
+++ b/integration-libs/omf/jest.schematics.config.js
@@ -0,0 +1,34 @@
+const { pathsToModuleNameMapper } = require('ts-jest');
+const { compilerOptions } = require('./tsconfig.schematics.json');
+const { defaultTransformerOptions } = require('jest-preset-angular/presets');
+
+/** @type {import('ts-jest/dist/types').JestConfigWithTsJest} */
+module.exports = {
+ preset: 'jest-preset-angular',
+ moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths || {}, {
+ prefix: '/',
+ }),
+ setupFilesAfterEnv: ['/setup-jest.ts'],
+ testMatch: ['**/+(*_)+(spec).+(ts)'],
+ transform: {
+ '^.+\\.(ts|js|mjs|html|svg)$': [
+ 'jest-preset-angular',
+ {
+ ...defaultTransformerOptions,
+ tsconfig: '/tsconfig.schematics.json',
+ },
+ ],
+ },
+
+ collectCoverage: false,
+ coverageReporters: ['json', 'lcov', 'text', 'clover'],
+ coverageDirectory: '/../../coverage/omf/schematics',
+ coverageThreshold: {
+ global: {
+ statements: 90,
+ branches: 90,
+ functions: 90,
+ lines: 90,
+ },
+ },
+};
diff --git a/integration-libs/omf/karma.conf.js b/integration-libs/omf/karma.conf.js
new file mode 100644
index 00000000000..38f7df18657
--- /dev/null
+++ b/integration-libs/omf/karma.conf.js
@@ -0,0 +1,49 @@
+// Karma configuration file, see link for more information
+// https://karma-runner.github.io/1.0/config/configuration-file.html
+
+module.exports = function (config) {
+ config.set({
+ basePath: '',
+ frameworks: ['jasmine', '@angular-devkit/build-angular'],
+ plugins: [
+ require('karma-jasmine'),
+ require('karma-coverage'),
+ require('karma-chrome-launcher'),
+ require('karma-jasmine-html-reporter'),
+ require('@angular-devkit/build-angular/plugins/karma'),
+ require('karma-junit-reporter'),
+ ],
+ client: {
+ clearContext: true, // close Jasmine Spec Runner output in browser to avoid 'Some of your tests did a full page reload!' error when '--no-watch' is active
+ },
+ reporters: ['progress', 'kjhtml', 'dots', 'junit'],
+ junitReporter: {
+ outputFile: 'unit-test-omf.xml',
+ outputDir: require('path').join(__dirname, '../../unit-tests-reports'),
+ useBrowserName: false,
+ },
+ coverageReporter: {
+ dir: require('path').join(__dirname, '../../coverage/omf'),
+ reporters: [{ type: 'lcov', subdir: '.' }, { type: 'text-summary' }],
+ check: {
+ global: {
+ statements: 90,
+ lines: 90,
+ branches: 75,
+ functions: 90,
+ },
+ },
+ },
+ captureTimeout: 210000,
+ browserDisconnectTolerance: 3,
+ browserDisconnectTimeout: 210000,
+ browserNoActivityTimeout: 210000,
+ port: 9876,
+ colors: true,
+ logLevel: config.LOG_INFO,
+ autoWatch: true,
+ browsers: ['Chrome'],
+ singleRun: false,
+ restartOnFileChange: true,
+ });
+};
diff --git a/integration-libs/omf/ng-package.json b/integration-libs/omf/ng-package.json
new file mode 100644
index 00000000000..9249a261cfe
--- /dev/null
+++ b/integration-libs/omf/ng-package.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "../../node_modules/ng-packagr/ng-package.schema.json",
+ "dest": "../../dist/omf",
+ "lib": {
+ "entryFile": "./public_api.ts"
+ },
+ "assets": ["**/*.scss", "schematics/**/*.json", "schematics/**/*.js"]
+}
diff --git a/integration-libs/omf/order/config/default-omf-config.ts b/integration-libs/omf/order/config/default-omf-config.ts
new file mode 100644
index 00000000000..2ad483c46ce
--- /dev/null
+++ b/integration-libs/omf/order/config/default-omf-config.ts
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { OmfConfig } from './omf-config';
+
+export const defaultOmfConfig: OmfConfig = {
+ omf: {
+ guidHttpHeaderName: 'guid',
+ },
+};
diff --git a/integration-libs/omf/order/config/omf-config.ts b/integration-libs/omf/order/config/omf-config.ts
new file mode 100644
index 00000000000..aaab2b94e85
--- /dev/null
+++ b/integration-libs/omf/order/config/omf-config.ts
@@ -0,0 +1,21 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { Injectable } from '@angular/core';
+import { Config } from '@spartacus/core';
+import { OmfConfiguration } from '@spartacus/omf';
+
+@Injectable({
+ providedIn: 'root',
+ useExisting: Config,
+})
+export abstract class OmfConfig {
+ omf?: OmfConfiguration;
+}
+
+declare module '@spartacus/core' {
+ interface Config extends OmfConfig {}
+}
diff --git a/integration-libs/omf/order/ng-package.json b/integration-libs/omf/order/ng-package.json
new file mode 100644
index 00000000000..e9016efd633
--- /dev/null
+++ b/integration-libs/omf/order/ng-package.json
@@ -0,0 +1,8 @@
+{
+ "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
+ "dest": "../../dist/omf",
+ "lib": {
+ "entryFile": "./public_api.ts"
+ },
+ "assets": ["**/*.scss", "schematics/**/*.json", "schematics/**/*.js"]
+}
diff --git a/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts b/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts
new file mode 100644
index 00000000000..a098bdb4f1c
--- /dev/null
+++ b/integration-libs/omf/order/occ-omf-order-history.adapter.spec.ts
@@ -0,0 +1,219 @@
+import {
+ HttpClientModule,
+ HttpHeaders,
+ HttpRequest,
+} from '@angular/common/http';
+import {
+ HttpClientTestingModule,
+ HttpTestingController,
+} from '@angular/common/http/testing';
+import { TestBed, waitForAsync } from '@angular/core/testing';
+import {
+ ConverterService,
+ InterceptorUtil,
+ LoggerService,
+ OCC_USER_ID_ANONYMOUS,
+ OccConfig,
+ OccEndpointsService,
+ USE_CLIENT_TOKEN,
+} from '@spartacus/core';
+import { Order, ORDER_NORMALIZER } from '@spartacus/order/root';
+import {
+ MockOccEndpointsService,
+ mockOccModuleConfig,
+} from 'projects/core/src/occ/adapters/user/unit-test.helper';
+import { OccOmfOrderHistoryAdapter } from './occ-omf-order-history.adapter';
+import { of } from 'rxjs';
+import { ActivatedRoute } from '@angular/router';
+import { Store, StoreModule } from '@ngrx/store';
+import { OmfConfig } from './config/omf-config';
+import { OrderSelectors } from '@spartacus/order/core';
+const userId = '123';
+
+const orderData: Order = {
+ site: 'electronics',
+ calculated: true,
+ code: '00001004',
+ guid: 'guid_01',
+};
+const mockActivatedRoute = {
+ snapshot: {
+ params: {},
+ },
+ get queryParams() {
+ return of({ guid: orderData.guid });
+ },
+};
+
+const mockOrderState = {
+ value: { orders: [orderData] },
+};
+
+const mockConfig: OmfConfig = {
+ omf: {
+ guidHttpHeaderName: 'my-guid-header',
+ },
+};
+
+describe('OccOmfOrderHistoryAdapter', () => {
+ let adapter: OccOmfOrderHistoryAdapter;
+ let httpMock: HttpTestingController;
+ let converter: ConverterService;
+ let occEnpointsService: OccEndpointsService;
+ let store: Store;
+
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [
+ HttpClientModule,
+ HttpClientTestingModule,
+ StoreModule.forRoot({}),
+ ],
+ providers: [
+ LoggerService,
+ OccOmfOrderHistoryAdapter,
+ { provide: OmfConfig, useValue: mockConfig },
+ { provide: OccConfig, useValue: mockOccModuleConfig },
+ { provide: ActivatedRoute, useValue: mockActivatedRoute },
+ {
+ provide: OccEndpointsService,
+ useClass: MockOccEndpointsService,
+ },
+ ],
+ });
+
+ adapter = TestBed.inject(OccOmfOrderHistoryAdapter);
+ httpMock = TestBed.inject(HttpTestingController);
+ converter = TestBed.inject(ConverterService);
+ occEnpointsService = TestBed.inject(OccEndpointsService);
+ store = TestBed.inject(Store);
+ spyOn(converter, 'pipeable').and.callThrough();
+ spyOn(converter, 'convert').and.callThrough();
+ spyOn(occEnpointsService, 'buildUrl').and.callThrough();
+ });
+
+ afterEach(() => {
+ httpMock.verify();
+ });
+
+ describe('loadOrder', () => {
+ it('should fetch a single order with guid passed in API request header for logged in user', waitForAsync(() => {
+ spyOn(adapter, 'getOrderGuid').and.returnValue(of(orderData.guid));
+ spyOn(adapter, 'getRequestHeader').and.returnValue(
+ new HttpHeaders().set('Custom-Guid-Header', orderData.guid ?? '')
+ );
+ spyOn(InterceptorUtil, 'createHeader').withArgs(
+ USE_CLIENT_TOKEN,
+ true,
+ jasmine.anything()
+ );
+ adapter.load(userId, orderData.code ?? '').subscribe();
+ const request = httpMock.expectOne((req: HttpRequest) => {
+ return req.method === 'GET';
+ }, `GET a single order`);
+ expect(request.request.headers.has('Custom-Guid-Header')).toBe(true);
+ expect(request.request.headers.get('Custom-Guid-Header')).toEqual(
+ orderData.guid
+ );
+ expect(occEnpointsService.buildUrl).toHaveBeenCalledWith('orderDetail', {
+ urlParams: { userId, orderId: orderData.code },
+ });
+ expect(InterceptorUtil.createHeader).not.toHaveBeenCalledWith(
+ USE_CLIENT_TOKEN,
+ true,
+ jasmine.anything()
+ );
+ expect(converter.pipeable).toHaveBeenCalledWith(ORDER_NORMALIZER);
+ request.flush(orderData);
+ httpMock.verify();
+ }));
+ it('should fetch a single order with guid passed in API request header for anonymous user', waitForAsync(() => {
+ spyOn(adapter, 'getOrderGuid').and.returnValue(of(orderData.guid));
+ spyOn(adapter, 'getRequestHeader').and.returnValue(
+ new HttpHeaders().set('Custom-Guid-Header', orderData.guid ?? '')
+ );
+ spyOn(InterceptorUtil, 'createHeader')
+ .withArgs(USE_CLIENT_TOKEN, true, jasmine.anything())
+ .and.callThrough();
+ adapter.load(OCC_USER_ID_ANONYMOUS, orderData.code ?? '').subscribe();
+ const request = httpMock.expectOne((req: HttpRequest) => {
+ return req.method === 'GET';
+ }, `GET a single order`);
+ expect(request.request.headers.has('Custom-Guid-Header')).toBe(true);
+ expect(request.request.headers.get('Custom-Guid-Header')).toEqual(
+ orderData.guid
+ );
+ expect(occEnpointsService.buildUrl).toHaveBeenCalledWith('orderDetail', {
+ urlParams: { userId: OCC_USER_ID_ANONYMOUS, orderId: orderData.code },
+ });
+ expect(InterceptorUtil.createHeader).toHaveBeenCalledWith(
+ USE_CLIENT_TOKEN,
+ true,
+ jasmine.anything()
+ );
+ expect(converter.pipeable).toHaveBeenCalledWith(ORDER_NORMALIZER);
+ request.flush(orderData);
+ httpMock.verify();
+ }));
+ });
+ describe('getRequestHeader', () => {
+ it('should construct a request header with guid', () => {
+ const header = adapter.getRequestHeader(orderData.guid);
+ expect(header.has('my-guid-header')).toBe(true);
+ expect(header.get('my-guid-header')).toEqual(orderData.guid);
+ });
+ });
+ describe('getOrderGuid', () => {
+ it('should return guid from route query params', (done) => {
+ adapter.getOrderGuid(orderData.code ?? '').subscribe((guid) => {
+ expect(guid).toEqual(orderData.guid);
+ done();
+ });
+ });
+ it('should return guid from store', (done) => {
+ spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue(
+ of({ guid: null })
+ );
+ spyOn(store, 'select').and.callFake((selector: any) => {
+ if (selector === OrderSelectors.getOrdersState) {
+ return of(mockOrderState);
+ }
+ return of(null);
+ });
+ adapter.getOrderGuid(orderData.code ?? '').subscribe((guid) => {
+ expect(guid).toEqual(orderData.guid);
+ done();
+ });
+ });
+ it('should return undefined from store if order is not present in store', (done) => {
+ spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue(
+ of({ guid: null })
+ );
+ spyOn(store, 'select').and.callFake((selector: any) => {
+ if (selector === OrderSelectors.getOrdersState) {
+ return of({ value: { orders: [orderData] } });
+ }
+ return of(null);
+ });
+ adapter.getOrderGuid('guid_02').subscribe((guid) => {
+ expect(guid).toEqual(undefined);
+ done();
+ });
+ });
+ it('should return undefined from store if store is empty', (done) => {
+ spyOnProperty(mockActivatedRoute, 'queryParams', 'get').and.returnValue(
+ of({ guid: null })
+ );
+ spyOn(store, 'select').and.callFake((selector: any) => {
+ if (selector === OrderSelectors.getOrdersState) {
+ return of({ value: {} });
+ }
+ return of(null);
+ });
+ adapter.getOrderGuid('guid_02').subscribe((guid) => {
+ expect(guid).toEqual(undefined);
+ done();
+ });
+ });
+ });
+});
diff --git a/integration-libs/omf/order/occ-omf-order-history.adapter.ts b/integration-libs/omf/order/occ-omf-order-history.adapter.ts
new file mode 100644
index 00000000000..20f582da81d
--- /dev/null
+++ b/integration-libs/omf/order/occ-omf-order-history.adapter.ts
@@ -0,0 +1,89 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { inject, Injectable, isDevMode } from '@angular/core';
+import {
+ OCC_USER_ID_ANONYMOUS,
+ InterceptorUtil,
+ USE_CLIENT_TOKEN,
+ Occ,
+} from '@spartacus/core';
+import { OccOrderHistoryAdapter } from '@spartacus/order/occ';
+import { Order, ORDER_NORMALIZER } from '@spartacus/order/root';
+import { HttpHeaders } from '@angular/common/http';
+import { map, Observable, of, switchMap } from 'rxjs';
+import { Store } from '@ngrx/store';
+import { StateWithOrder, OrderSelectors } from '@spartacus/order/core';
+import { OmfConfig } from './config/omf-config';
+import { ActivatedRoute } from '@angular/router';
+
+@Injectable({
+ providedIn: 'root',
+})
+export class OccOmfOrderHistoryAdapter extends OccOrderHistoryAdapter {
+ protected route = inject(ActivatedRoute);
+ protected store = inject(Store);
+ protected config = inject(OmfConfig);
+
+ protected getOrderDetailsValue(code: string): Observable {
+ return this.store.select(OrderSelectors.getOrdersState).pipe(
+ map((orderListState) => orderListState.value),
+ map((orderList) => {
+ return (orderList?.orders ?? []).find((order) => order.code === code);
+ })
+ );
+ }
+ getOrderGuid(orderCode: string): Observable {
+ return this.route.queryParams.pipe(
+ switchMap((queryParams) => {
+ if (queryParams.guid) {
+ // when navigating from Order History to Order Details page
+ return of(queryParams.guid);
+ } else {
+ // when loading Order History page in case of My-Account-V2
+ return this.getOrderDetailsValue(orderCode).pipe(
+ map((order) => (order ? order.guid : undefined))
+ );
+ }
+ })
+ );
+ }
+
+ getRequestHeader(guid: string | undefined): HttpHeaders {
+ let headers = new HttpHeaders();
+ if (!this.config.omf?.guidHttpHeaderName && isDevMode()) {
+ this.logger.warn(
+ `There is no guidHttpHeaderName configured in OMF configuration`
+ );
+ }
+ const guidHeader = this.config.omf?.guidHttpHeaderName?.toLowerCase?.();
+ if (guid && guidHeader) {
+ headers = headers.set(guidHeader, guid);
+ }
+ return headers;
+ }
+
+ public load(userId: string, orderCode: string): Observable {
+ return this.getOrderGuid(orderCode).pipe(
+ switchMap((guid) => {
+ const url = this.occEndpoints.buildUrl('orderDetail', {
+ urlParams: { userId, orderId: orderCode },
+ });
+ let headers = this.getRequestHeader(guid);
+ if (userId === OCC_USER_ID_ANONYMOUS) {
+ headers = InterceptorUtil.createHeader(
+ USE_CLIENT_TOKEN,
+ true,
+ headers
+ );
+ }
+ return this.http
+ .get(url, { headers })
+ .pipe(this.converter.pipeable(ORDER_NORMALIZER));
+ })
+ );
+ }
+}
diff --git a/integration-libs/omf/order/omf-order-history.service.spec.ts b/integration-libs/omf/order/omf-order-history.service.spec.ts
new file mode 100644
index 00000000000..2a7860b8a05
--- /dev/null
+++ b/integration-libs/omf/order/omf-order-history.service.spec.ts
@@ -0,0 +1,24 @@
+import { TestBed } from '@angular/core/testing';
+import { OmfOrderHistoryService } from './omf-order-history.service';
+import { StoreModule } from '@ngrx/store';
+
+describe('OmfOrderHistoryService', () => {
+ let service: OmfOrderHistoryService;
+ beforeEach(() => {
+ TestBed.configureTestingModule({
+ imports: [StoreModule.forRoot({})],
+ providers: [OmfOrderHistoryService],
+ });
+ service = TestBed.inject(OmfOrderHistoryService);
+ });
+ describe('getQueryParams', () => {
+ it('should return a routing query param with given guid', () => {
+ const param = service.getQueryParams({ guid: '123' });
+ expect(param).toEqual({ guid: '123' });
+ });
+ it('should return null if no guid exists', () => {
+ const param = service.getQueryParams({ code: '123' });
+ expect(param).toEqual(null);
+ });
+ });
+});
diff --git a/integration-libs/omf/order/omf-order-history.service.ts b/integration-libs/omf/order/omf-order-history.service.ts
new file mode 100644
index 00000000000..910078da593
--- /dev/null
+++ b/integration-libs/omf/order/omf-order-history.service.ts
@@ -0,0 +1,24 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { Injectable } from '@angular/core';
+import { Params } from '@angular/router';
+import { OrderHistoryService } from '@spartacus/order/core';
+import { Order, OrderHistoryFacade } from '@spartacus/order/root';
+
+@Injectable()
+export class OmfOrderHistoryService
+ extends OrderHistoryService
+ implements OrderHistoryFacade
+{
+ getQueryParams(order: Order): Params | null {
+ return order.guid
+ ? {
+ guid: order.guid,
+ }
+ : null;
+ }
+}
diff --git a/integration-libs/omf/order/omf-order.module.ts b/integration-libs/omf/order/omf-order.module.ts
new file mode 100644
index 00000000000..2639027ba79
--- /dev/null
+++ b/integration-libs/omf/order/omf-order.module.ts
@@ -0,0 +1,26 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { NgModule } from '@angular/core';
+import { OrderHistoryAdapter } from '@spartacus/order/core';
+import { OccOmfOrderHistoryAdapter } from './occ-omf-order-history.adapter';
+import { OrderHistoryFacade } from '@spartacus/order/root';
+import { OmfOrderHistoryService } from './omf-order-history.service';
+import { provideDefaultConfig } from '@spartacus/core';
+import { defaultOmfConfig } from './config/default-omf-config';
+
+@NgModule({
+ providers: [
+ OmfOrderHistoryService,
+ provideDefaultConfig(defaultOmfConfig),
+ { provide: OrderHistoryAdapter, useClass: OccOmfOrderHistoryAdapter },
+ {
+ provide: OrderHistoryFacade,
+ useClass: OmfOrderHistoryService,
+ },
+ ],
+})
+export class OmfOrderModule {}
diff --git a/integration-libs/omf/order/public_api.ts b/integration-libs/omf/order/public_api.ts
new file mode 100644
index 00000000000..651b6e75332
--- /dev/null
+++ b/integration-libs/omf/order/public_api.ts
@@ -0,0 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export * from './omf-order.module';
+export * from './occ-omf-order-history.adapter';
+export * from './omf-order-history.service';
diff --git a/integration-libs/omf/package.json b/integration-libs/omf/package.json
new file mode 100644
index 00000000000..72d600fdf54
--- /dev/null
+++ b/integration-libs/omf/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@spartacus/omf",
+ "version": "2211.27.0",
+ "description": "SAP Order Management Foundation Integration",
+ "keywords": [
+ "spartacus",
+ "framework",
+ "storefront",
+ "omf"
+ ],
+ "homepage": "https://github.com/SAP/spartacus",
+ "repository": "https://github.com/SAP/spartacus",
+ "license": "Apache-2.0",
+ "scripts": {
+ "build:schematics": "npm run clean:schematics && ../../node_modules/.bin/tsc -p ./tsconfig.schematics.json",
+ "clean:schematics": "../../node_modules/.bin/rimraf --glob \"schematics/**/*.js\" \"schematics/**/*.js.map\" \"schematics/**/*.d.ts\"",
+ "test:schematics": "npm --prefix ../../projects/schematics/ run clean && npm run clean:schematics && ../../node_modules/.bin/jest --config ./jest.schematics.config.js"
+ },
+ "dependencies": {
+ "tslib": "^2.6.2"
+ },
+ "peerDependencies": {
+ "@angular-devkit/schematics": "^17.0.5",
+ "@angular/common": "^17.0.5",
+ "@angular/core": "^17.0.5",
+ "@angular/router": "^17.0.5",
+ "@ngrx/store": "^17.0.1",
+ "@spartacus/core": "2211.27.0",
+ "@spartacus/order": "2211.27.0",
+ "@spartacus/schematics": "2211.27.0",
+ "rxjs": "^7.8.0"
+ },
+ "publishConfig": {
+ "access": "public"
+ },
+ "schematics": "./schematics/collection.json"
+}
diff --git a/integration-libs/omf/project.json b/integration-libs/omf/project.json
new file mode 100644
index 00000000000..edd7c938aba
--- /dev/null
+++ b/integration-libs/omf/project.json
@@ -0,0 +1,50 @@
+{
+ "name": "omf",
+ "$schema": "../../node_modules/nx/schemas/project-schema.json",
+ "projectType": "library",
+ "sourceRoot": "integration-libs/omf",
+ "prefix": "cx",
+ "targets": {
+ "build": {
+ "executor": "@angular-devkit/build-angular:ng-packagr",
+ "options": {
+ "project": "integration-libs/omf/ng-package.json"
+ },
+ "configurations": {
+ "production": {
+ "tsConfig": "integration-libs/omf/tsconfig.lib.prod.json"
+ },
+ "development": {
+ "tsConfig": "integration-libs/omf/tsconfig.lib.json"
+ }
+ },
+ "defaultConfiguration": "production"
+ },
+ "test": {
+ "executor": "@angular-devkit/build-angular:karma",
+ "options": {
+ "main": "integration-libs/omf/test.ts",
+ "tsConfig": "integration-libs/omf/tsconfig.spec.json",
+ "polyfills": ["zone.js", "zone.js/testing"],
+ "karmaConfig": "integration-libs/omf/karma.conf.js"
+ }
+ },
+ "test-jest": {
+ "executor": "nx:run-commands",
+ "options": {
+ "command": "npm run test:schematics",
+ "cwd": "integration-libs/omf"
+ }
+ },
+ "lint": {
+ "executor": "@angular-eslint/builder:lint",
+ "options": {
+ "lintFilePatterns": [
+ "integration-libs/omf/**/*.ts",
+ "integration-libs/omf/**/*.html"
+ ]
+ }
+ }
+ },
+ "tags": ["type:feature", "type:integration"]
+}
diff --git a/integration-libs/omf/public_api.ts b/integration-libs/omf/public_api.ts
new file mode 100644
index 00000000000..3fe3a63378c
--- /dev/null
+++ b/integration-libs/omf/public_api.ts
@@ -0,0 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export * from './root/public_api';
diff --git a/integration-libs/omf/root/feature-name.ts b/integration-libs/omf/root/feature-name.ts
new file mode 100644
index 00000000000..14c45e09839
--- /dev/null
+++ b/integration-libs/omf/root/feature-name.ts
@@ -0,0 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export const OMF_FEATURE = 'OMF';
diff --git a/integration-libs/omf/root/model/index.ts b/integration-libs/omf/root/model/index.ts
new file mode 100644
index 00000000000..bca3e90ea98
--- /dev/null
+++ b/integration-libs/omf/root/model/index.ts
@@ -0,0 +1,7 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export * from './omf-configuration';
diff --git a/integration-libs/omf/root/model/omf-configuration.ts b/integration-libs/omf/root/model/omf-configuration.ts
new file mode 100644
index 00000000000..52c3eb38c16
--- /dev/null
+++ b/integration-libs/omf/root/model/omf-configuration.ts
@@ -0,0 +1,9 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export abstract class OmfConfiguration {
+ guidHttpHeaderName: string;
+}
diff --git a/integration-libs/omf/root/ng-package.json b/integration-libs/omf/root/ng-package.json
new file mode 100644
index 00000000000..38e01ac17de
--- /dev/null
+++ b/integration-libs/omf/root/ng-package.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json",
+ "lib": {
+ "entryFile": "./public_api.ts"
+ }
+}
diff --git a/integration-libs/omf/root/omf-root.module.ts b/integration-libs/omf/root/omf-root.module.ts
new file mode 100644
index 00000000000..de8d9cc3bcc
--- /dev/null
+++ b/integration-libs/omf/root/omf-root.module.ts
@@ -0,0 +1,10 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { NgModule } from '@angular/core';
+
+@NgModule()
+export class OmfRootModule {}
diff --git a/integration-libs/omf/root/public_api.ts b/integration-libs/omf/root/public_api.ts
new file mode 100644
index 00000000000..195d0fdd35d
--- /dev/null
+++ b/integration-libs/omf/root/public_api.ts
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+export * from './omf-root.module';
+export * from './model/index';
diff --git a/integration-libs/omf/schematics/.gitignore b/integration-libs/omf/schematics/.gitignore
new file mode 100644
index 00000000000..c88f4d69e15
--- /dev/null
+++ b/integration-libs/omf/schematics/.gitignore
@@ -0,0 +1,18 @@
+# Outputs
+**/*.js
+**/*.js.map
+**/*.d.ts
+
+# IDEs
+.idea/
+jsconfig.json
+.vscode/
+
+# Misc
+node_modules/
+npm-debug.log*
+yarn-error.log*
+
+# Mac OSX Finder files.
+**/.DS_Store
+.DS_Store
diff --git a/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap b/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap
new file mode 100644
index 00000000000..f89c186c71f
--- /dev/null
+++ b/integration-libs/omf/schematics/add-omf/__snapshots__/index_spec.ts.snap
@@ -0,0 +1,31 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Spartacus OMF Schematics: ng-add OMF feature eager loading should import appropriate modules 1`] = `
+"import { NgModule } from '@angular/core';
+import { OmfRootModule } from "@spartacus/omf/root";
+
+@NgModule({
+ declarations: [],
+ imports: [
+ OmfRootModule
+ ]
+})
+export class OmfFeatureModule { }
+"
+`;
+
+exports[`Spartacus OMF Schematics: ng-add OMF feature general setup should add the feature using the lazy loading syntax 1`] = `
+"import { NgModule } from '@angular/core';
+import { OmfRootModule } from "@spartacus/omf/root";
+
+@NgModule({
+ declarations: [],
+ imports: [
+ OmfRootModule
+ ]
+})
+export class OmfFeatureModule { }
+"
+`;
+
+exports[`Spartacus OMF Schematics: ng-add OMF feature general setup should install the appropriate dependencies 1`] = `""`;
diff --git a/integration-libs/omf/schematics/add-omf/index.ts b/integration-libs/omf/schematics/add-omf/index.ts
new file mode 100644
index 00000000000..39829b110e8
--- /dev/null
+++ b/integration-libs/omf/schematics/add-omf/index.ts
@@ -0,0 +1,43 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import {
+ chain,
+ Rule,
+ SchematicContext,
+ Tree,
+} from '@angular-devkit/schematics';
+import {
+ addFeatures,
+ addPackageJsonDependenciesForLibrary,
+ analyzeApplication,
+ analyzeCrossFeatureDependencies,
+ finalizeInstallation,
+ readPackageJson,
+ validateSpartacusInstallation,
+ LibraryOptions as SpartacusOmfOptions,
+} from '@spartacus/schematics';
+import { peerDependencies } from '../../package.json';
+
+export function addOmfFeature(options: SpartacusOmfOptions): Rule {
+ return (tree: Tree, _context: SchematicContext): Rule => {
+ const packageJson = readPackageJson(tree);
+ validateSpartacusInstallation(packageJson);
+
+ const features = analyzeCrossFeatureDependencies(
+ options.features as string[]
+ );
+
+ return chain([
+ analyzeApplication(options, features),
+
+ addFeatures(options, features),
+ addPackageJsonDependenciesForLibrary(peerDependencies, options),
+
+ finalizeInstallation(options, features),
+ ]);
+ };
+}
diff --git a/integration-libs/omf/schematics/add-omf/index_spec.ts b/integration-libs/omf/schematics/add-omf/index_spec.ts
new file mode 100644
index 00000000000..102ca54d965
--- /dev/null
+++ b/integration-libs/omf/schematics/add-omf/index_spec.ts
@@ -0,0 +1,194 @@
+///
+
+import {
+ SchematicTestRunner,
+ UnitTestTree,
+} from '@angular-devkit/schematics/testing';
+import {
+ Schema as ApplicationOptions,
+ Style,
+} from '@schematics/angular/application/schema';
+import { Schema as WorkspaceOptions } from '@schematics/angular/workspace/schema';
+import {
+ OMF_FEATURE_NAME,
+ SPARTACUS_SCHEMATICS,
+ SPARTACUS_OMF,
+ LibraryOptions as OmfOptions,
+ SpartacusOptions,
+ omfFeatureModulePath,
+ ORDER_FEATURE_NAME,
+ orderWrapperModulePath,
+ SPARTACUS_ORDER,
+ orderFeatureModulePath,
+} from '@spartacus/schematics';
+import * as path from 'path';
+import { peerDependencies } from '../../package.json';
+
+const collectionPath = path.join(__dirname, '../collection.json');
+
+describe('Spartacus OMF Schematics: ng-add', () => {
+ const schematicRunner = new SchematicTestRunner(
+ SPARTACUS_OMF,
+ collectionPath
+ );
+
+ let appTree: UnitTestTree;
+
+ const workspaceOptions: WorkspaceOptions = {
+ name: 'workspace',
+ version: '0.5.0',
+ };
+
+ const appOptions: ApplicationOptions = {
+ name: 'schematics-test',
+ inlineStyle: false,
+ inlineTemplate: false,
+ routing: false,
+ style: Style.Scss,
+ skipTests: false,
+ projectRoot: '',
+ standalone: false,
+ };
+
+ const spartacusDefaultOptions: SpartacusOptions = {
+ project: 'schematics-test',
+ lazy: true,
+ features: [],
+ };
+
+ const libraryNoFeaturesOptions: OmfOptions = {
+ project: 'schematics-test',
+ lazy: false,
+ features: [],
+ };
+
+ const orderFeatureOptions: OmfOptions = {
+ ...libraryNoFeaturesOptions,
+ features: [ORDER_FEATURE_NAME],
+ };
+
+ const omfFeatureOptions: OmfOptions = {
+ ...libraryNoFeaturesOptions,
+ features: [OMF_FEATURE_NAME],
+ };
+
+ beforeEach(async () => {
+ schematicRunner.registerCollection(
+ SPARTACUS_SCHEMATICS,
+ path.join(
+ __dirname,
+ '../../../../projects/schematics/src/collection.json'
+ )
+ );
+ schematicRunner.registerCollection(
+ SPARTACUS_ORDER,
+ path.join(
+ __dirname,
+ '../../../../feature-libs/order/schematics/collection.json'
+ )
+ );
+ appTree = await schematicRunner.runExternalSchematic(
+ '@schematics/angular',
+ 'workspace',
+ workspaceOptions
+ );
+
+ appTree = await schematicRunner.runExternalSchematic(
+ '@schematics/angular',
+ 'application',
+ appOptions,
+ appTree
+ );
+
+ appTree = await schematicRunner.runExternalSchematic(
+ SPARTACUS_SCHEMATICS,
+ 'ng-add',
+ { ...spartacusDefaultOptions, name: 'schematics-test' },
+ appTree
+ );
+ });
+
+ describe('Without features', () => {
+ beforeEach(async () => {
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ libraryNoFeaturesOptions,
+ appTree
+ );
+ });
+
+ it('should not create any of the feature modules', () => {
+ expect(appTree.exists(omfFeatureModulePath)).toBeFalsy();
+ });
+ });
+
+ describe('OMF feature', () => {
+ describe('general setup', () => {
+ beforeEach(async () => {
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ orderFeatureOptions,
+ appTree
+ );
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ omfFeatureOptions,
+ appTree
+ );
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ omfFeatureOptions,
+ appTree
+ );
+ });
+
+ it('should install necessary Spartacus libraries', () => {
+ const packageJson = JSON.parse(appTree.readContent('package.json'));
+ let dependencies: Record = {};
+ dependencies = { ...packageJson.dependencies };
+ dependencies = { ...dependencies, ...packageJson.devDependencies };
+
+ for (const toAdd in peerDependencies) {
+ if (
+ !peerDependencies.hasOwnProperty(toAdd) ||
+ toAdd === SPARTACUS_SCHEMATICS
+ ) {
+ continue;
+ }
+ const expectedDependency = dependencies[toAdd];
+ expect(expectedDependency).toBeTruthy();
+ }
+ });
+
+ it('should add the feature using the lazy loading syntax', async () => {
+ const module = appTree.readContent(omfFeatureModulePath);
+ expect(module).toMatchSnapshot();
+ });
+ it('should install the appropriate dependencies', async () => {
+ const orderWrapperModule = appTree.readContent(orderWrapperModulePath);
+ expect(orderWrapperModule).toMatchSnapshot();
+ });
+ });
+
+ describe('eager loading', () => {
+ beforeEach(async () => {
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ { ...orderFeatureOptions, lazy: false },
+ appTree
+ );
+ appTree = await schematicRunner.runSchematic(
+ 'ng-add',
+ { ...omfFeatureOptions, lazy: false },
+ appTree
+ );
+ });
+
+ it('should import appropriate modules', async () => {
+ const module = appTree.readContent(omfFeatureModulePath);
+ expect(module).toMatchSnapshot();
+ expect(appTree.readContent(orderFeatureModulePath)).toBeTruthy();
+ });
+ });
+ });
+});
diff --git a/integration-libs/omf/schematics/add-omf/schema.json b/integration-libs/omf/schematics/add-omf/schema.json
new file mode 100644
index 00000000000..4662afa75b5
--- /dev/null
+++ b/integration-libs/omf/schematics/add-omf/schema.json
@@ -0,0 +1,26 @@
+{
+ "$schema": "http://json-schema.org/schema",
+ "$id": "OmfSchematics",
+ "title": "OMF Schematics",
+ "type": "object",
+ "properties": {
+ "project": {
+ "type": "string",
+ "description": "The name of the project.",
+ "$default": {
+ "$source": "projectName"
+ }
+ },
+ "debug": {
+ "description": "Display additional details during the running process.",
+ "type": "boolean",
+ "default": false
+ },
+ "features": {
+ "type": "array",
+ "uniqueItems": true,
+ "default": ["OMF"]
+ }
+ },
+ "required": []
+}
diff --git a/integration-libs/omf/schematics/collection.json b/integration-libs/omf/schematics/collection.json
new file mode 100644
index 00000000000..b989e4db3d9
--- /dev/null
+++ b/integration-libs/omf/schematics/collection.json
@@ -0,0 +1,18 @@
+{
+ "$schema": "../../../node_modules/@angular-devkit/schematics/collection-schema.json",
+ "schematics": {
+ "ng-add": {
+ "factory": "./add-omf/index#addOmfFeature",
+ "description": "Add and configure Spartacus' OMF feature",
+ "schema": "./add-omf/schema.json",
+ "private": true,
+ "hidden": true,
+ "aliases": ["install"]
+ },
+ "add": {
+ "factory": "./add-omf/index#addOmfFeature",
+ "description": "Add and configure Spartacus' OMF feature",
+ "schema": "./add-omf/schema.json"
+ }
+ }
+}
diff --git a/integration-libs/omf/setup-jest.ts b/integration-libs/omf/setup-jest.ts
new file mode 100644
index 00000000000..aeb0a861992
--- /dev/null
+++ b/integration-libs/omf/setup-jest.ts
@@ -0,0 +1,8 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import 'jest-preset-angular/setup-jest';
+import 'zone.js';
diff --git a/integration-libs/omf/test.ts b/integration-libs/omf/test.ts
new file mode 100644
index 00000000000..cb29fd468dd
--- /dev/null
+++ b/integration-libs/omf/test.ts
@@ -0,0 +1,22 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+// This file is required by karma.conf.js and loads recursively all the .spec and framework files
+
+import { getTestBed } from '@angular/core/testing';
+import {
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting,
+} from '@angular/platform-browser-dynamic/testing';
+
+// First, initialize the Angular testing environment.
+getTestBed().initTestEnvironment(
+ BrowserDynamicTestingModule,
+ platformBrowserDynamicTesting(),
+ {
+ teardown: { destroyAfterEach: false },
+ }
+);
diff --git a/integration-libs/omf/tsconfig.lib.json b/integration-libs/omf/tsconfig.lib.json
new file mode 100644
index 00000000000..f49a4958f7f
--- /dev/null
+++ b/integration-libs/omf/tsconfig.lib.json
@@ -0,0 +1,102 @@
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../out-tsc/lib",
+ "module": "es2022",
+ "moduleResolution": "node",
+ "declaration": true,
+ "sourceMap": true,
+ "inlineSources": true,
+ "experimentalDecorators": true,
+ "allowSyntheticDefaultImports": true,
+ "importHelpers": true,
+ "skipLibCheck": true,
+ "lib": ["dom", "esnext"],
+ "paths": {
+ "@spartacus/core": ["dist/core"],
+ "@spartacus/order/assets": ["dist/order/assets"],
+ "@spartacus/order/components": ["dist/order/components"],
+ "@spartacus/order/core": ["dist/order/core"],
+ "@spartacus/order": ["dist/order"],
+ "@spartacus/order/occ": ["dist/order/occ"],
+ "@spartacus/order/root": ["dist/order/root"],
+ "@spartacus/cart/base/assets": ["dist/cart/base/assets"],
+ "@spartacus/cart/base/components/add-to-cart": [
+ "dist/cart/base/components/add-to-cart"
+ ],
+ "@spartacus/cart/base/components/mini-cart": [
+ "dist/cart/base/components/mini-cart"
+ ],
+ "@spartacus/cart/base/components": ["dist/cart/base/components"],
+ "@spartacus/cart/base/core": ["dist/cart/base/core"],
+ "@spartacus/cart/base": ["dist/cart/base"],
+ "@spartacus/cart/base/occ": ["dist/cart/base/occ"],
+ "@spartacus/cart/base/root": ["dist/cart/base/root"],
+ "@spartacus/cart/import-export/assets": [
+ "dist/cart/import-export/assets"
+ ],
+ "@spartacus/cart/import-export/components": [
+ "dist/cart/import-export/components"
+ ],
+ "@spartacus/cart/import-export/core": ["dist/cart/import-export/core"],
+ "@spartacus/cart/import-export": ["dist/cart/import-export"],
+ "@spartacus/cart/import-export/root": ["dist/cart/import-export/root"],
+ "@spartacus/cart": ["dist/cart"],
+ "@spartacus/cart/quick-order/assets": ["dist/cart/quick-order/assets"],
+ "@spartacus/cart/quick-order/components": [
+ "dist/cart/quick-order/components"
+ ],
+ "@spartacus/cart/quick-order/core": ["dist/cart/quick-order/core"],
+ "@spartacus/cart/quick-order": ["dist/cart/quick-order"],
+ "@spartacus/cart/quick-order/root": ["dist/cart/quick-order/root"],
+ "@spartacus/cart/saved-cart/assets": ["dist/cart/saved-cart/assets"],
+ "@spartacus/cart/saved-cart/components": [
+ "dist/cart/saved-cart/components"
+ ],
+ "@spartacus/cart/saved-cart/core": ["dist/cart/saved-cart/core"],
+ "@spartacus/cart/saved-cart": ["dist/cart/saved-cart"],
+ "@spartacus/cart/saved-cart/occ": ["dist/cart/saved-cart/occ"],
+ "@spartacus/cart/saved-cart/root": ["dist/cart/saved-cart/root"],
+ "@spartacus/cart/wish-list/assets": ["dist/cart/wish-list/assets"],
+ "@spartacus/cart/wish-list/components/add-to-wishlist": [
+ "dist/cart/wish-list/components/add-to-wishlist"
+ ],
+ "@spartacus/cart/wish-list/components": [
+ "dist/cart/wish-list/components"
+ ],
+ "@spartacus/cart/wish-list/core": ["dist/cart/wish-list/core"],
+ "@spartacus/cart/wish-list": ["dist/cart/wish-list"],
+ "@spartacus/cart/wish-list/root": ["dist/cart/wish-list/root"],
+ "@spartacus/pdf-invoices/assets": ["dist/pdf-invoices/assets"],
+ "@spartacus/pdf-invoices/components": ["dist/pdf-invoices/components"],
+ "@spartacus/pdf-invoices/core": ["dist/pdf-invoices/core"],
+ "@spartacus/pdf-invoices": ["dist/pdf-invoices"],
+ "@spartacus/pdf-invoices/occ": ["dist/pdf-invoices/occ"],
+ "@spartacus/pdf-invoices/root": ["dist/pdf-invoices/root"],
+ "@spartacus/storefront": ["dist/storefrontlib"],
+ "@spartacus/user/account/assets": ["dist/user/account/assets"],
+ "@spartacus/user/account/components": ["dist/user/account/components"],
+ "@spartacus/user/account/core": ["dist/user/account/core"],
+ "@spartacus/user/account": ["dist/user/account"],
+ "@spartacus/user/account/occ": ["dist/user/account/occ"],
+ "@spartacus/user/account/root": ["dist/user/account/root"],
+ "@spartacus/user": ["dist/user"],
+ "@spartacus/user/profile/assets": ["dist/user/profile/assets"],
+ "@spartacus/user/profile/components": ["dist/user/profile/components"],
+ "@spartacus/user/profile/core": ["dist/user/profile/core"],
+ "@spartacus/user/profile": ["dist/user/profile"],
+ "@spartacus/user/profile/occ": ["dist/user/profile/occ"],
+ "@spartacus/user/profile/root": ["dist/user/profile/root"]
+ },
+ "resolveJsonModule": true,
+ "esModuleInterop": true
+ },
+ "angularCompilerOptions": {
+ "skipTemplateCodegen": true,
+ "strictMetadataEmit": true,
+ "fullTemplateTypeCheck": true,
+ "strictInjectionParameters": true,
+ "enableResourceInlining": true
+ },
+ "exclude": ["test.ts", "**/*.spec.ts"]
+}
diff --git a/integration-libs/omf/tsconfig.lib.prod.json b/integration-libs/omf/tsconfig.lib.prod.json
new file mode 100644
index 00000000000..2a2faa884cf
--- /dev/null
+++ b/integration-libs/omf/tsconfig.lib.prod.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.lib.json",
+ "compilerOptions": {
+ "declarationMap": false
+ },
+ "angularCompilerOptions": {
+ "compilationMode": "partial"
+ }
+}
diff --git a/integration-libs/omf/tsconfig.schematics.json b/integration-libs/omf/tsconfig.schematics.json
new file mode 100644
index 00000000000..ed17cd88119
--- /dev/null
+++ b/integration-libs/omf/tsconfig.schematics.json
@@ -0,0 +1,634 @@
+{
+ "compilerOptions": {
+ "baseUrl": "./",
+ "module": "CommonJs",
+ "types": ["jest"],
+ "paths": {
+ "@spartacus/schematics": ["../../projects/schematics/index"],
+ "@spartacus/setup": ["../../core-libs/setup/public_api"],
+ "@spartacus/setup/ssr": ["../../core-libs/setup/ssr/public_api"],
+ "@spartacus/asm/assets": ["../../feature-libs/asm/assets/public_api"],
+ "@spartacus/asm/components": [
+ "../../feature-libs/asm/components/public_api"
+ ],
+ "@spartacus/asm/core": ["../../feature-libs/asm/core/public_api"],
+ "@spartacus/asm/customer-360/assets": [
+ "../../feature-libs/asm/customer-360/assets/public_api"
+ ],
+ "@spartacus/asm/customer-360/components": [
+ "../../feature-libs/asm/customer-360/components/public_api"
+ ],
+ "@spartacus/asm/customer-360/core": [
+ "../../feature-libs/asm/customer-360/core/public_api"
+ ],
+ "@spartacus/asm/customer-360": [
+ "../../feature-libs/asm/customer-360/public_api"
+ ],
+ "@spartacus/asm/customer-360/occ": [
+ "../../feature-libs/asm/customer-360/occ/public_api"
+ ],
+ "@spartacus/asm/customer-360/root": [
+ "../../feature-libs/asm/customer-360/root/public_api"
+ ],
+ "@spartacus/asm": ["../../feature-libs/asm/public_api"],
+ "@spartacus/asm/occ": ["../../feature-libs/asm/occ/public_api"],
+ "@spartacus/asm/root": ["../../feature-libs/asm/root/public_api"],
+ "@spartacus/cart/base/assets": [
+ "../../feature-libs/cart/base/assets/public_api"
+ ],
+ "@spartacus/cart/base/components/add-to-cart": [
+ "../../feature-libs/cart/base/components/add-to-cart/public_api"
+ ],
+ "@spartacus/cart/base/components/mini-cart": [
+ "../../feature-libs/cart/base/components/mini-cart/public_api"
+ ],
+ "@spartacus/cart/base/components": [
+ "../../feature-libs/cart/base/components/public_api"
+ ],
+ "@spartacus/cart/base/core": [
+ "../../feature-libs/cart/base/core/public_api"
+ ],
+ "@spartacus/cart/base": ["../../feature-libs/cart/base/public_api"],
+ "@spartacus/cart/base/occ": [
+ "../../feature-libs/cart/base/occ/public_api"
+ ],
+ "@spartacus/cart/base/root": [
+ "../../feature-libs/cart/base/root/public_api"
+ ],
+ "@spartacus/cart/import-export/assets": [
+ "../../feature-libs/cart/import-export/assets/public_api"
+ ],
+ "@spartacus/cart/import-export/components": [
+ "../../feature-libs/cart/import-export/components/public_api"
+ ],
+ "@spartacus/cart/import-export/core": [
+ "../../feature-libs/cart/import-export/core/public_api"
+ ],
+ "@spartacus/cart/import-export": [
+ "../../feature-libs/cart/import-export/public_api"
+ ],
+ "@spartacus/cart/import-export/root": [
+ "../../feature-libs/cart/import-export/root/public_api"
+ ],
+ "@spartacus/cart": ["../../feature-libs/cart/public_api"],
+ "@spartacus/cart/quick-order/assets": [
+ "../../feature-libs/cart/quick-order/assets/public_api"
+ ],
+ "@spartacus/cart/quick-order/components": [
+ "../../feature-libs/cart/quick-order/components/public_api"
+ ],
+ "@spartacus/cart/quick-order/core": [
+ "../../feature-libs/cart/quick-order/core/public_api"
+ ],
+ "@spartacus/cart/quick-order": [
+ "../../feature-libs/cart/quick-order/public_api"
+ ],
+ "@spartacus/cart/quick-order/root": [
+ "../../feature-libs/cart/quick-order/root/public_api"
+ ],
+ "@spartacus/cart/saved-cart/assets": [
+ "../../feature-libs/cart/saved-cart/assets/public_api"
+ ],
+ "@spartacus/cart/saved-cart/components": [
+ "../../feature-libs/cart/saved-cart/components/public_api"
+ ],
+ "@spartacus/cart/saved-cart/core": [
+ "../../feature-libs/cart/saved-cart/core/public_api"
+ ],
+ "@spartacus/cart/saved-cart": [
+ "../../feature-libs/cart/saved-cart/public_api"
+ ],
+ "@spartacus/cart/saved-cart/occ": [
+ "../../feature-libs/cart/saved-cart/occ/public_api"
+ ],
+ "@spartacus/cart/saved-cart/root": [
+ "../../feature-libs/cart/saved-cart/root/public_api"
+ ],
+ "@spartacus/cart/wish-list/assets": [
+ "../../feature-libs/cart/wish-list/assets/public_api"
+ ],
+ "@spartacus/cart/wish-list/components/add-to-wishlist": [
+ "../../feature-libs/cart/wish-list/components/add-to-wishlist/public_api"
+ ],
+ "@spartacus/cart/wish-list/components": [
+ "../../feature-libs/cart/wish-list/components/public_api"
+ ],
+ "@spartacus/cart/wish-list/core": [
+ "../../feature-libs/cart/wish-list/core/public_api"
+ ],
+ "@spartacus/cart/wish-list": [
+ "../../feature-libs/cart/wish-list/public_api"
+ ],
+ "@spartacus/cart/wish-list/root": [
+ "../../feature-libs/cart/wish-list/root/public_api"
+ ],
+ "@spartacus/checkout/b2b/assets": [
+ "../../feature-libs/checkout/b2b/assets/public_api"
+ ],
+ "@spartacus/checkout/b2b/components": [
+ "../../feature-libs/checkout/b2b/components/public_api"
+ ],
+ "@spartacus/checkout/b2b/core": [
+ "../../feature-libs/checkout/b2b/core/public_api"
+ ],
+ "@spartacus/checkout/b2b": ["../../feature-libs/checkout/b2b/public_api"],
+ "@spartacus/checkout/b2b/occ": [
+ "../../feature-libs/checkout/b2b/occ/public_api"
+ ],
+ "@spartacus/checkout/b2b/root": [
+ "../../feature-libs/checkout/b2b/root/public_api"
+ ],
+ "@spartacus/checkout/base/assets": [
+ "../../feature-libs/checkout/base/assets/public_api"
+ ],
+ "@spartacus/checkout/base/components": [
+ "../../feature-libs/checkout/base/components/public_api"
+ ],
+ "@spartacus/checkout/base/core": [
+ "../../feature-libs/checkout/base/core/public_api"
+ ],
+ "@spartacus/checkout/base": [
+ "../../feature-libs/checkout/base/public_api"
+ ],
+ "@spartacus/checkout/base/occ": [
+ "../../feature-libs/checkout/base/occ/public_api"
+ ],
+ "@spartacus/checkout/base/root": [
+ "../../feature-libs/checkout/base/root/public_api"
+ ],
+ "@spartacus/checkout": ["../../feature-libs/checkout/public_api"],
+ "@spartacus/checkout/scheduled-replenishment/assets": [
+ "../../feature-libs/checkout/scheduled-replenishment/assets/public_api"
+ ],
+ "@spartacus/checkout/scheduled-replenishment/components": [
+ "../../feature-libs/checkout/scheduled-replenishment/components/public_api"
+ ],
+ "@spartacus/checkout/scheduled-replenishment": [
+ "../../feature-libs/checkout/scheduled-replenishment/public_api"
+ ],
+ "@spartacus/checkout/scheduled-replenishment/root": [
+ "../../feature-libs/checkout/scheduled-replenishment/root/public_api"
+ ],
+ "@spartacus/customer-ticketing/assets": [
+ "../../feature-libs/customer-ticketing/assets/public_api"
+ ],
+ "@spartacus/customer-ticketing/components": [
+ "../../feature-libs/customer-ticketing/components/public_api"
+ ],
+ "@spartacus/customer-ticketing/core": [
+ "../../feature-libs/customer-ticketing/core/public_api"
+ ],
+ "@spartacus/customer-ticketing": [
+ "../../feature-libs/customer-ticketing/public_api"
+ ],
+ "@spartacus/customer-ticketing/occ": [
+ "../../feature-libs/customer-ticketing/occ/public_api"
+ ],
+ "@spartacus/customer-ticketing/root": [
+ "../../feature-libs/customer-ticketing/root/public_api"
+ ],
+ "@spartacus/estimated-delivery-date/assets": [
+ "../../feature-libs/estimated-delivery-date/assets/public_api"
+ ],
+ "@spartacus/estimated-delivery-date": [
+ "../../feature-libs/estimated-delivery-date/public_api"
+ ],
+ "@spartacus/estimated-delivery-date/root": [
+ "../../feature-libs/estimated-delivery-date/root/public_api"
+ ],
+ "@spartacus/estimated-delivery-date/show-estimated-delivery-date": [
+ "../../feature-libs/estimated-delivery-date/show-estimated-delivery-date/public_api"
+ ],
+ "@spartacus/order/assets": ["../../feature-libs/order/assets/public_api"],
+ "@spartacus/order/components": [
+ "../../feature-libs/order/components/public_api"
+ ],
+ "@spartacus/order/core": ["../../feature-libs/order/core/public_api"],
+ "@spartacus/order": ["../../feature-libs/order/public_api"],
+ "@spartacus/order/occ": ["../../feature-libs/order/occ/public_api"],
+ "@spartacus/order/root": ["../../feature-libs/order/root/public_api"],
+ "@spartacus/organization/account-summary/assets": [
+ "../../feature-libs/organization/account-summary/assets/public_api"
+ ],
+ "@spartacus/organization/account-summary/components": [
+ "../../feature-libs/organization/account-summary/components/public_api"
+ ],
+ "@spartacus/organization/account-summary/core": [
+ "../../feature-libs/organization/account-summary/core/public_api"
+ ],
+ "@spartacus/organization/account-summary": [
+ "../../feature-libs/organization/account-summary/public_api"
+ ],
+ "@spartacus/organization/account-summary/occ": [
+ "../../feature-libs/organization/account-summary/occ/public_api"
+ ],
+ "@spartacus/organization/account-summary/root": [
+ "../../feature-libs/organization/account-summary/root/public_api"
+ ],
+ "@spartacus/organization/administration/assets": [
+ "../../feature-libs/organization/administration/assets/public_api"
+ ],
+ "@spartacus/organization/administration/components": [
+ "../../feature-libs/organization/administration/components/public_api"
+ ],
+ "@spartacus/organization/administration/core": [
+ "../../feature-libs/organization/administration/core/public_api"
+ ],
+ "@spartacus/organization/administration": [
+ "../../feature-libs/organization/administration/public_api"
+ ],
+ "@spartacus/organization/administration/occ": [
+ "../../feature-libs/organization/administration/occ/public_api"
+ ],
+ "@spartacus/organization/administration/root": [
+ "../../feature-libs/organization/administration/root/public_api"
+ ],
+ "@spartacus/organization": ["../../feature-libs/organization/public_api"],
+ "@spartacus/organization/order-approval/assets": [
+ "../../feature-libs/organization/order-approval/assets/public_api"
+ ],
+ "@spartacus/organization/order-approval": [
+ "../../feature-libs/organization/order-approval/public_api"
+ ],
+ "@spartacus/organization/order-approval/root": [
+ "../../feature-libs/organization/order-approval/root/public_api"
+ ],
+ "@spartacus/organization/unit-order/assets": [
+ "../../feature-libs/organization/unit-order/assets/public_api"
+ ],
+ "@spartacus/organization/unit-order/components": [
+ "../../feature-libs/organization/unit-order/components/public_api"
+ ],
+ "@spartacus/organization/unit-order/core": [
+ "../../feature-libs/organization/unit-order/core/public_api"
+ ],
+ "@spartacus/organization/unit-order": [
+ "../../feature-libs/organization/unit-order/public_api"
+ ],
+ "@spartacus/organization/unit-order/occ": [
+ "../../feature-libs/organization/unit-order/occ/public_api"
+ ],
+ "@spartacus/organization/unit-order/root": [
+ "../../feature-libs/organization/unit-order/root/public_api"
+ ],
+ "@spartacus/organization/user-registration/assets": [
+ "../../feature-libs/organization/user-registration/assets/public_api"
+ ],
+ "@spartacus/organization/user-registration/components": [
+ "../../feature-libs/organization/user-registration/components/public_api"
+ ],
+ "@spartacus/organization/user-registration/core": [
+ "../../feature-libs/organization/user-registration/core/public_api"
+ ],
+ "@spartacus/organization/user-registration": [
+ "../../feature-libs/organization/user-registration/public_api"
+ ],
+ "@spartacus/organization/user-registration/occ": [
+ "../../feature-libs/organization/user-registration/occ/public_api"
+ ],
+ "@spartacus/organization/user-registration/root": [
+ "../../feature-libs/organization/user-registration/root/public_api"
+ ],
+ "@spartacus/pdf-invoices/assets": [
+ "../../feature-libs/pdf-invoices/assets/public_api"
+ ],
+ "@spartacus/pdf-invoices/components": [
+ "../../feature-libs/pdf-invoices/components/public_api"
+ ],
+ "@spartacus/pdf-invoices/core": [
+ "../../feature-libs/pdf-invoices/core/public_api"
+ ],
+ "@spartacus/pdf-invoices": ["../../feature-libs/pdf-invoices/public_api"],
+ "@spartacus/pdf-invoices/occ": [
+ "../../feature-libs/pdf-invoices/occ/public_api"
+ ],
+ "@spartacus/pdf-invoices/root": [
+ "../../feature-libs/pdf-invoices/root/public_api"
+ ],
+ "@spartacus/pickup-in-store/assets": [
+ "../../feature-libs/pickup-in-store/assets/public_api"
+ ],
+ "@spartacus/pickup-in-store/components": [
+ "../../feature-libs/pickup-in-store/components/public_api"
+ ],
+ "@spartacus/pickup-in-store/core": [
+ "../../feature-libs/pickup-in-store/core/public_api"
+ ],
+ "@spartacus/pickup-in-store": [
+ "../../feature-libs/pickup-in-store/public_api"
+ ],
+ "@spartacus/pickup-in-store/occ": [
+ "../../feature-libs/pickup-in-store/occ/public_api"
+ ],
+ "@spartacus/pickup-in-store/root": [
+ "../../feature-libs/pickup-in-store/root/public_api"
+ ],
+ "@spartacus/product-configurator/common/assets": [
+ "../../feature-libs/product-configurator/common/assets/public_api"
+ ],
+ "@spartacus/product-configurator/common": [
+ "../../feature-libs/product-configurator/common/public_api"
+ ],
+ "@spartacus/product-configurator": [
+ "../../feature-libs/product-configurator/public_api"
+ ],
+ "@spartacus/product-configurator/rulebased/cpq": [
+ "../../feature-libs/product-configurator/rulebased/cpq/public_api"
+ ],
+ "@spartacus/product-configurator/rulebased": [
+ "../../feature-libs/product-configurator/rulebased/public_api"
+ ],
+ "@spartacus/product-configurator/rulebased/root": [
+ "../../feature-libs/product-configurator/rulebased/root/public_api"
+ ],
+ "@spartacus/product-configurator/textfield": [
+ "../../feature-libs/product-configurator/textfield/public_api"
+ ],
+ "@spartacus/product-configurator/textfield/root": [
+ "../../feature-libs/product-configurator/textfield/root/public_api"
+ ],
+ "@spartacus/product/bulk-pricing/assets": [
+ "../../feature-libs/product/bulk-pricing/assets/public_api"
+ ],
+ "@spartacus/product/bulk-pricing/components": [
+ "../../feature-libs/product/bulk-pricing/components/public_api"
+ ],
+ "@spartacus/product/bulk-pricing/core": [
+ "../../feature-libs/product/bulk-pricing/core/public_api"
+ ],
+ "@spartacus/product/bulk-pricing": [
+ "../../feature-libs/product/bulk-pricing/public_api"
+ ],
+ "@spartacus/product/bulk-pricing/occ": [
+ "../../feature-libs/product/bulk-pricing/occ/public_api"
+ ],
+ "@spartacus/product/bulk-pricing/root": [
+ "../../feature-libs/product/bulk-pricing/root/public_api"
+ ],
+ "@spartacus/product/future-stock/assets": [
+ "../../feature-libs/product/future-stock/assets/public_api"
+ ],
+ "@spartacus/product/future-stock/components": [
+ "../../feature-libs/product/future-stock/components/public_api"
+ ],
+ "@spartacus/product/future-stock/core": [
+ "../../feature-libs/product/future-stock/core/public_api"
+ ],
+ "@spartacus/product/future-stock": [
+ "../../feature-libs/product/future-stock/public_api"
+ ],
+ "@spartacus/product/future-stock/occ": [
+ "../../feature-libs/product/future-stock/occ/public_api"
+ ],
+ "@spartacus/product/future-stock/root": [
+ "../../feature-libs/product/future-stock/root/public_api"
+ ],
+ "@spartacus/product/image-zoom/assets": [
+ "../../feature-libs/product/image-zoom/assets/public_api"
+ ],
+ "@spartacus/product/image-zoom/components": [
+ "../../feature-libs/product/image-zoom/components/public_api"
+ ],
+ "@spartacus/product/image-zoom": [
+ "../../feature-libs/product/image-zoom/public_api"
+ ],
+ "@spartacus/product/image-zoom/root": [
+ "../../feature-libs/product/image-zoom/root/public_api"
+ ],
+ "@spartacus/product": ["../../feature-libs/product/public_api"],
+ "@spartacus/product/variants/assets": [
+ "../../feature-libs/product/variants/assets/public_api"
+ ],
+ "@spartacus/product/variants/components": [
+ "../../feature-libs/product/variants/components/public_api"
+ ],
+ "@spartacus/product/variants": [
+ "../../feature-libs/product/variants/public_api"
+ ],
+ "@spartacus/product/variants/occ": [
+ "../../feature-libs/product/variants/occ/public_api"
+ ],
+ "@spartacus/product/variants/root": [
+ "../../feature-libs/product/variants/root/public_api"
+ ],
+ "@spartacus/qualtrics/components": [
+ "../../feature-libs/qualtrics/components/public_api"
+ ],
+ "@spartacus/qualtrics": ["../../feature-libs/qualtrics/public_api"],
+ "@spartacus/qualtrics/root": [
+ "../../feature-libs/qualtrics/root/public_api"
+ ],
+ "@spartacus/quote/assets": ["../../feature-libs/quote/assets/public_api"],
+ "@spartacus/quote/components/cart-guard": [
+ "../../feature-libs/quote/components/cart-guard/public_api"
+ ],
+ "@spartacus/quote/components": [
+ "../../feature-libs/quote/components/public_api"
+ ],
+ "@spartacus/quote/components/request-button": [
+ "../../feature-libs/quote/components/request-button/public_api"
+ ],
+ "@spartacus/quote/core": ["../../feature-libs/quote/core/public_api"],
+ "@spartacus/quote": ["../../feature-libs/quote/public_api"],
+ "@spartacus/quote/occ": ["../../feature-libs/quote/occ/public_api"],
+ "@spartacus/quote/root": ["../../feature-libs/quote/root/public_api"],
+ "@spartacus/requested-delivery-date/assets": [
+ "../../feature-libs/requested-delivery-date/assets/public_api"
+ ],
+ "@spartacus/requested-delivery-date/core": [
+ "../../feature-libs/requested-delivery-date/core/public_api"
+ ],
+ "@spartacus/requested-delivery-date": [
+ "../../feature-libs/requested-delivery-date/public_api"
+ ],
+ "@spartacus/requested-delivery-date/occ": [
+ "../../feature-libs/requested-delivery-date/occ/public_api"
+ ],
+ "@spartacus/requested-delivery-date/root": [
+ "../../feature-libs/requested-delivery-date/root/public_api"
+ ],
+ "@spartacus/smartedit/core": [
+ "../../feature-libs/smartedit/core/public_api"
+ ],
+ "@spartacus/smartedit": ["../../feature-libs/smartedit/public_api"],
+ "@spartacus/smartedit/root": [
+ "../../feature-libs/smartedit/root/public_api"
+ ],
+ "@spartacus/storefinder/assets": [
+ "../../feature-libs/storefinder/assets/public_api"
+ ],
+ "@spartacus/storefinder/components": [
+ "../../feature-libs/storefinder/components/public_api"
+ ],
+ "@spartacus/storefinder/core": [
+ "../../feature-libs/storefinder/core/public_api"
+ ],
+ "@spartacus/storefinder": ["../../feature-libs/storefinder/public_api"],
+ "@spartacus/storefinder/occ": [
+ "../../feature-libs/storefinder/occ/public_api"
+ ],
+ "@spartacus/storefinder/root": [
+ "../../feature-libs/storefinder/root/public_api"
+ ],
+ "@spartacus/tracking": ["../../feature-libs/tracking/public_api"],
+ "@spartacus/tracking/personalization/core": [
+ "../../feature-libs/tracking/personalization/core/public_api"
+ ],
+ "@spartacus/tracking/personalization": [
+ "../../feature-libs/tracking/personalization/public_api"
+ ],
+ "@spartacus/tracking/personalization/root": [
+ "../../feature-libs/tracking/personalization/root/public_api"
+ ],
+ "@spartacus/tracking/tms/aep": [
+ "../../feature-libs/tracking/tms/aep/public_api"
+ ],
+ "@spartacus/tracking/tms/core": [
+ "../../feature-libs/tracking/tms/core/public_api"
+ ],
+ "@spartacus/tracking/tms/gtm": [
+ "../../feature-libs/tracking/tms/gtm/public_api"
+ ],
+ "@spartacus/tracking/tms": ["../../feature-libs/tracking/tms/public_api"],
+ "@spartacus/user/account/assets": [
+ "../../feature-libs/user/account/assets/public_api"
+ ],
+ "@spartacus/user/account/components": [
+ "../../feature-libs/user/account/components/public_api"
+ ],
+ "@spartacus/user/account/core": [
+ "../../feature-libs/user/account/core/public_api"
+ ],
+ "@spartacus/user/account": ["../../feature-libs/user/account/public_api"],
+ "@spartacus/user/account/occ": [
+ "../../feature-libs/user/account/occ/public_api"
+ ],
+ "@spartacus/user/account/root": [
+ "../../feature-libs/user/account/root/public_api"
+ ],
+ "@spartacus/user": ["../../feature-libs/user/public_api"],
+ "@spartacus/user/profile/assets": [
+ "../../feature-libs/user/profile/assets/public_api"
+ ],
+ "@spartacus/user/profile/components": [
+ "../../feature-libs/user/profile/components/public_api"
+ ],
+ "@spartacus/user/profile/core": [
+ "../../feature-libs/user/profile/core/public_api"
+ ],
+ "@spartacus/user/profile": ["../../feature-libs/user/profile/public_api"],
+ "@spartacus/user/profile/occ": [
+ "../../feature-libs/user/profile/occ/public_api"
+ ],
+ "@spartacus/user/profile/root": [
+ "../../feature-libs/user/profile/root/public_api"
+ ],
+ "@spartacus/cdc/assets": ["../../integration-libs/cdc/assets/public_api"],
+ "@spartacus/cdc/components": [
+ "../../integration-libs/cdc/components/public_api"
+ ],
+ "@spartacus/cdc/core": ["../../integration-libs/cdc/core/public_api"],
+ "@spartacus/cdc": ["../../integration-libs/cdc/public_api"],
+ "@spartacus/cdc/organization/administration": [
+ "../../integration-libs/cdc/organization/administration/public_api"
+ ],
+ "@spartacus/cdc/organization/user-registration": [
+ "../../integration-libs/cdc/organization/user-registration/public_api"
+ ],
+ "@spartacus/cdc/root": ["../../integration-libs/cdc/root/public_api"],
+ "@spartacus/cdc/user-account": [
+ "../../integration-libs/cdc/user-account/public_api"
+ ],
+ "@spartacus/cdc/user-profile": [
+ "../../integration-libs/cdc/user-profile/public_api"
+ ],
+ "@spartacus/cdp/customer-ticketing": [
+ "../../integration-libs/cdp/customer-ticketing/public_api"
+ ],
+ "@spartacus/cdp": ["../../integration-libs/cdp/public_api"],
+ "@spartacus/cds/assets": ["../../integration-libs/cds/assets/public_api"],
+ "@spartacus/cds": ["../../integration-libs/cds/public_api"],
+ "@spartacus/cpq-quote/assets": [
+ "../../integration-libs/cpq-quote/assets/public_api"
+ ],
+ "@spartacus/cpq-quote/cpq-quote-discount": [
+ "../../integration-libs/cpq-quote/cpq-quote-discount/public_api"
+ ],
+ "@spartacus/cpq-quote": ["../../integration-libs/cpq-quote/public_api"],
+ "@spartacus/cpq-quote/root": [
+ "../../integration-libs/cpq-quote/root/public_api"
+ ],
+ "@spartacus/digital-payments/assets": [
+ "../../integration-libs/digital-payments/assets/public_api"
+ ],
+ "@spartacus/digital-payments": [
+ "../../integration-libs/digital-payments/public_api"
+ ],
+ "@spartacus/epd-visualization/assets": [
+ "../../integration-libs/epd-visualization/assets/public_api"
+ ],
+ "@spartacus/epd-visualization/components": [
+ "../../integration-libs/epd-visualization/components/public_api"
+ ],
+ "@spartacus/epd-visualization/core": [
+ "../../integration-libs/epd-visualization/core/public_api"
+ ],
+ "@spartacus/epd-visualization/epd-visualization-api": [
+ "../../integration-libs/epd-visualization/epd-visualization-api/public_api"
+ ],
+ "@spartacus/epd-visualization": [
+ "../../integration-libs/epd-visualization/public_api"
+ ],
+ "@spartacus/epd-visualization/root": [
+ "../../integration-libs/epd-visualization/root/public_api"
+ ],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
+ "@spartacus/opps": ["../../integration-libs/opps/public_api"],
+ "@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
+ "@spartacus/s4-service/assets": [
+ "../../integration-libs/s4-service/assets/public_api"
+ ],
+ "@spartacus/s4-service/checkout": [
+ "../../integration-libs/s4-service/checkout/public_api"
+ ],
+ "@spartacus/s4-service": ["../../integration-libs/s4-service/public_api"],
+ "@spartacus/s4-service/order": [
+ "../../integration-libs/s4-service/order/public_api"
+ ],
+ "@spartacus/s4-service/root": [
+ "../../integration-libs/s4-service/root/public_api"
+ ],
+ "@spartacus/s4om/assets": [
+ "../../integration-libs/s4om/assets/public_api"
+ ],
+ "@spartacus/s4om": ["../../integration-libs/s4om/public_api"],
+ "@spartacus/s4om/root": ["../../integration-libs/s4om/root/public_api"],
+ "@spartacus/segment-refs": [
+ "../../integration-libs/segment-refs/public_api"
+ ],
+ "@spartacus/segment-refs/root": [
+ "../../integration-libs/segment-refs/root/public_api"
+ ],
+ "@spartacus/assets": ["../../projects/assets/src/public_api"],
+ "@spartacus/core": ["../../projects/core/public_api"],
+ "@spartacus/storefront": ["../../projects/storefrontlib/public_api"]
+ },
+ "noEmitOnError": true,
+ "noFallthroughCasesInSwitch": true,
+ "noImplicitAny": true,
+ "noImplicitThis": true,
+ "noUnusedParameters": true,
+ "noUnusedLocals": true,
+ "skipDefaultLibCheck": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "strictNullChecks": true,
+ "resolveJsonModule": true,
+ "esModuleInterop": true
+ },
+ "include": ["schematics/**/*.ts"],
+ "exclude": ["schematics/*/files/**/*", "schematics/**/*_spec.ts"]
+}
diff --git a/integration-libs/omf/tsconfig.spec.json b/integration-libs/omf/tsconfig.spec.json
new file mode 100644
index 00000000000..32e84d9e66c
--- /dev/null
+++ b/integration-libs/omf/tsconfig.spec.json
@@ -0,0 +1,12 @@
+/* To learn more about this file see: https://angular.io/config/tsconfig. */
+{
+ "extends": "../../tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../out-tsc/spec",
+ "strict": false,
+ "module": "es2022",
+ "types": ["jasmine", "node"]
+ },
+ "files": ["test.ts"],
+ "include": ["**/*.spec.ts", "**/*.d.ts"]
+}
diff --git a/integration-libs/opps/tsconfig.schematics.json b/integration-libs/opps/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/opps/tsconfig.schematics.json
+++ b/integration-libs/opps/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/s4-service/tsconfig.schematics.json b/integration-libs/s4-service/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/s4-service/tsconfig.schematics.json
+++ b/integration-libs/s4-service/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/s4om/tsconfig.schematics.json b/integration-libs/s4om/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/s4om/tsconfig.schematics.json
+++ b/integration-libs/s4om/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/integration-libs/segment-refs/tsconfig.schematics.json b/integration-libs/segment-refs/tsconfig.schematics.json
index b4c289b5c84..ed17cd88119 100644
--- a/integration-libs/segment-refs/tsconfig.schematics.json
+++ b/integration-libs/segment-refs/tsconfig.schematics.json
@@ -582,6 +582,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/package.json b/package.json
index 11c482ee6de..347565640c2 100644
--- a/package.json
+++ b/package.json
@@ -25,13 +25,14 @@
"build:epd-visualization": "npm --prefix integration-libs/epd-visualization run build:schematics && nx build epd-visualization --configuration production",
"build:estimated-delivery-date": "npm --prefix feature-libs/estimated-delivery-date run build:schematics && nx build estimated-delivery-date --configuration production",
"build:order": "npm --prefix feature-libs/order run build:schematics && nx build order --configuration production",
- "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:pdf-invoices && npm run build:order && npm run build:storefinder && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:product npm:build:product-configurator npm:build:requested-delivery-date && concurrently --kill-others-on-fail npm:build:estimated-delivery-date && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:cdp npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:cpq-quote npm:build:segment-refs npm:build:opps npm:build:pickup-in-store npm:build:quote && npm run build:setup && npm run build:s4-service",
+ "build:libs": "nx build core --configuration production && nx build storefrontlib --configuration production && concurrently --kill-others-on-fail npm:build:schematics npm:build:user && npm run build:cart && npm run build:pdf-invoices && npm run build:order && npm run build:storefinder && concurrently --kill-others-on-fail npm:build:checkout npm:build:asm npm:build:tracking npm:build:customer-ticketing && concurrently --kill-others-on-fail npm:build:organization npm:build:product npm:build:product-configurator npm:build:requested-delivery-date && concurrently --kill-others-on-fail npm:build:estimated-delivery-date && concurrently --kill-others-on-fail npm:build:smartedit npm:build:qualtrics npm:build:assets npm:build:cds npm:build:cdc npm:build:cdp npm:build:digital-payments npm:build:epd-visualization npm:build:s4om npm:build:omf npm:build:cpq-quote npm:build:segment-refs npm:build:opps npm:build:pickup-in-store npm:build:quote && npm run build:setup && npm run build:s4-service",
"build:organization": "npm --prefix feature-libs/organization run build:schematics && nx build organization --configuration production",
"build:pdf-invoices": "npm --prefix feature-libs/pdf-invoices run build:schematics && nx build pdf-invoices --configuration production",
"build:pickup-in-store": "npm --prefix feature-libs/pickup-in-store run build:schematics && nx build pickup-in-store --configuration production",
"build:product": "npm --prefix feature-libs/product run build:schematics && nx build product --configuration production",
"build:product-configurator": "npm --prefix feature-libs/product-configurator run build:schematics && nx build product-configurator --configuration production",
"build:s4om": "npm --prefix integration-libs/s4om run build:schematics && nx build s4om --configuration production",
+ "build:omf": "npm --prefix integration-libs/omf run build:schematics && nx build omf --configuration production",
"build:cpq-quote": "npm --prefix integration-libs/cpq-quote run build:schematics && npx nx build cpq-quote --configuration production",
"build:segment-refs": "npm --prefix integration-libs/segment-refs run build:schematics && nx build segment-refs --configuration production",
"build:opps": "npm --prefix integration-libs/opps run build:schematics && nx build opps --configuration production",
@@ -99,7 +100,7 @@
"start:pwa": "cd ./dist/storefrontapp/ && http-server --silent --proxy http://localhost:4200? -p 4200",
"test": "nx test",
"test:all-schematics": "set -e; npm --prefix ./projects/schematics test -- -u; for dir in feature-libs/* integration-libs/*; do (cd $dir && npm run test:schematics -- -u); done",
- "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test s4-service --code-coverage\" \"nx test cdp --code-coverage\" \"nx test opps --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test cpq-quote --code-coverage\" \"nx test requested-delivery-date --code-coverage\" \"nx test estimated-delivery-date --code-coverage\" \"nx test pdf-invoices --code-coverage\" \"nx test quote --code-coverage\"",
+ "test:libs": "concurrently \"nx test core --code-coverage\" \"nx test storefrontlib --code-coverage\" \"nx test cart --code-coverage\" \"nx test organization --code-coverage\" \"nx test storefinder --code-coverage\" \"nx test smartedit --code-coverage\" \"nx test asm --code-coverage\" \"nx test qualtrics --code-coverage\" \"nx test product --code-coverage\" \"nx test product-configurator --code-coverage\" \"nx test customer-ticketing --code-coverage\" \"nx test cdc --code-coverage\" \"nx test s4-service --code-coverage\" \"nx test cdp --code-coverage\" \"nx test opps --code-coverage\" \"nx test setup --code-coverage\" \"nx test checkout --code-coverage\" \"nx test order --code-coverage\" \"nx test digital-payments --code-coverage\" \"nx test epd-visualization --code-coverage\" \"nx test pickup-in-store --code-coverage\" \"nx test s4om --code-coverage\" \"nx test cpq-quote --code-coverage\" \"nx test omf --code-coverage\" \"nx test requested-delivery-date --code-coverage\" \"nx test estimated-delivery-date --code-coverage\" \"nx test pdf-invoices --code-coverage\" \"nx test quote --code-coverage\"",
"test:storefront:lib": "nx test storefrontlib --source-map --code-coverage",
"dev:ssr": "env-cmd --no-override -e dev,b2c,$SPA_ENV cross-env NODE_TLS_REJECT_UNAUTHORIZED=0 nx run storefrontapp:serve-ssr",
"serve:ssr": "node dist/storefrontapp-server/main.js",
diff --git a/projects/schematics/src/add-spartacus/schema.json b/projects/schematics/src/add-spartacus/schema.json
index a24f5f32cf7..9fdd8b7a9ce 100644
--- a/projects/schematics/src/add-spartacus/schema.json
+++ b/projects/schematics/src/add-spartacus/schema.json
@@ -54,6 +54,7 @@
"S4HANA-Order-Management",
"cpq-quote",
"s4-service",
+ "OMF",
"SmartEdit",
"Store-Finder",
"Personalization",
@@ -233,6 +234,10 @@
"value": "s4-service",
"label": "S/4HANA Service Integration (b2b feature)"
},
+ {
+ "value": "OMF",
+ "label": "SAP Order Management Foundation Integration"
+ },
{
"value": "SmartEdit",
"label": "SmartEdit"
diff --git a/projects/schematics/src/dependencies.json b/projects/schematics/src/dependencies.json
index 1afe034ca49..f9eecf22581 100644
--- a/projects/schematics/src/dependencies.json
+++ b/projects/schematics/src/dependencies.json
@@ -391,6 +391,17 @@
"bootstrap": "^4.6.2",
"rxjs": "^7.8.0"
},
+ "@spartacus/omf": {
+ "@angular-devkit/schematics": "^17.0.5",
+ "@angular/common": "^17.0.5",
+ "@angular/core": "^17.0.5",
+ "@angular/router": "^17.0.5",
+ "@ngrx/store": "^17.0.1",
+ "@spartacus/core": "2211.27.0",
+ "@spartacus/order": "2211.27.0",
+ "@spartacus/schematics": "2211.27.0",
+ "rxjs": "^7.8.0"
+ },
"@spartacus/opps": {
"@angular-devkit/schematics": "^17.0.5",
"@angular/common": "^17.0.5",
diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/index.ts b/projects/schematics/src/shared/lib-configs/integration-libs/index.ts
index d57a8c8d298..210ad10a547 100644
--- a/projects/schematics/src/shared/lib-configs/integration-libs/index.ts
+++ b/projects/schematics/src/shared/lib-configs/integration-libs/index.ts
@@ -14,3 +14,4 @@ export * from './segment-refs-schematics-config';
export * from './opps-schematics-config';
export * from './cpq-quote-schematics-config';
export * from './s4-service-schematics-config';
+export * from './omf-schematics-config';
diff --git a/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts b/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts
new file mode 100644
index 00000000000..b508bd75cdb
--- /dev/null
+++ b/projects/schematics/src/shared/lib-configs/integration-libs/omf-schematics-config.ts
@@ -0,0 +1,51 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import {
+ OMF_FEATURE_NAME,
+ ORDER_FEATURE_NAME,
+ SPARTACUS_OMF,
+ SPARTACUS_OMF_ORDER,
+ SPARTACUS_OMF_ROOT,
+} from '../../libs-constants';
+import { SchematicConfig } from '../../utils/lib-utils';
+import { ORDER_MODULE } from '../order-schematics-config';
+
+export const OMF_FOLDER_NAME = 'omf';
+export const OMF_MODULE_NAME = 'Omf';
+export const OMF_ROOT_MODULE = 'OmfRootModule';
+export const OMF_ORDER_MODULE = 'OmfOrderModule';
+
+export const OMF_SCHEMATICS_CONFIG: SchematicConfig = {
+ library: {
+ featureName: OMF_FEATURE_NAME,
+ mainScope: SPARTACUS_OMF,
+ },
+ folderName: OMF_FOLDER_NAME,
+ moduleName: OMF_MODULE_NAME,
+ featureModule: [
+ {
+ name: OMF_ROOT_MODULE,
+ importPath: SPARTACUS_OMF,
+ },
+ {
+ name: OMF_ORDER_MODULE,
+ importPath: SPARTACUS_OMF_ORDER,
+ },
+ ],
+ rootModule: {
+ importPath: SPARTACUS_OMF_ROOT,
+ name: OMF_ROOT_MODULE,
+ content: `${OMF_ROOT_MODULE}`,
+ },
+ dependencyFeatures: [ORDER_FEATURE_NAME],
+ importAfter: [
+ {
+ markerModuleName: ORDER_MODULE,
+ featureModuleName: OMF_ORDER_MODULE,
+ },
+ ],
+};
diff --git a/projects/schematics/src/shared/libs-constants.ts b/projects/schematics/src/shared/libs-constants.ts
index f9598305c0e..941aa32cfa4 100644
--- a/projects/schematics/src/shared/libs-constants.ts
+++ b/projects/schematics/src/shared/libs-constants.ts
@@ -223,6 +223,10 @@ export const SPARTACUS_S4OM = '@spartacus/s4om';
export const SPARTACUS_S4OM_ROOT = `@spartacus/s4om/root`;
export const SPARTACUS_S4OM_ASSETS = `@spartacus/s4om/assets`;
+export const SPARTACUS_OMF = '@spartacus/omf';
+export const SPARTACUS_OMF_ROOT = '@spartacus/omf/root';
+export const SPARTACUS_OMF_ORDER = '@spartacus/omf/order';
+
export const SPARTACUS_OPPS = '@spartacus/opps';
export const SPARTACUS_OPPS_ROOT = '@spartacus/opps/root';
@@ -325,6 +329,8 @@ export const S4_SERVICE_FEATURE_NAME = 's4-service';
export const OPPS_FEATURE_NAME = 'OPPS';
+export const OMF_FEATURE_NAME = 'OMF';
+
export const CUSTOMER_TICKETING_FEATURE_NAME = 'Customer-Ticketing';
/***** Feature name end *****/
diff --git a/projects/schematics/src/shared/schematics-config-mappings.ts b/projects/schematics/src/shared/schematics-config-mappings.ts
index 030634f9045..702a3aef46a 100644
--- a/projects/schematics/src/shared/schematics-config-mappings.ts
+++ b/projects/schematics/src/shared/schematics-config-mappings.ts
@@ -14,6 +14,7 @@ import {
QUOTE_SCHEMATICS_CONFIG,
OPPS_SCHEMATICS_CONFIG,
S4_SERVICE_SCHEMATICS_CONFIG,
+ OMF_SCHEMATICS_CONFIG,
} from './lib-configs';
import {
CART_BASE_SCHEMATICS_CONFIG,
@@ -151,6 +152,8 @@ export const SCHEMATICS_CONFIGS: SchematicConfig[] = [
OPPS_SCHEMATICS_CONFIG,
+ OMF_SCHEMATICS_CONFIG,
+
S4OM_SCHEMATICS_CONFIG,
S4_SERVICE_SCHEMATICS_CONFIG,
diff --git a/projects/schematics/src/shared/utils/graph-utils_spec.ts b/projects/schematics/src/shared/utils/graph-utils_spec.ts
index f69d38a4a53..ffe1b36e4e8 100644
--- a/projects/schematics/src/shared/utils/graph-utils_spec.ts
+++ b/projects/schematics/src/shared/utils/graph-utils_spec.ts
@@ -24,6 +24,7 @@ import {
SPARTACUS_REQUESTED_DELIVERY_DATE,
SPARTACUS_S4OM,
SPARTACUS_S4_SERVICE,
+ SPARTACUS_OMF,
SPARTACUS_SEGMENT_REFS,
SPARTACUS_SMARTEDIT,
SPARTACUS_STOREFINDER,
@@ -148,6 +149,7 @@ describe('Graph utils', () => {
SPARTACUS_S4OM,
SPARTACUS_S4_SERVICE,
SPARTACUS_OPPS,
+ SPARTACUS_OMF,
SPARTACUS_EPD_VISUALIZATION,
SPARTACUS_DIGITAL_PAYMENTS,
SPARTACUS_CPQ_QUOTE,
@@ -201,6 +203,7 @@ describe('Graph utils', () => {
"Segment-Refs",
"s4-service",
"S4HANA-Order-Management",
+ "OMF",
"OPPS",
"EPD-Visualization",
"Digital-Payments",
diff --git a/projects/schematics/src/shared/utils/test-utils.ts b/projects/schematics/src/shared/utils/test-utils.ts
index bcfe98caedd..525c8903440 100644
--- a/projects/schematics/src/shared/utils/test-utils.ts
+++ b/projects/schematics/src/shared/utils/test-utils.ts
@@ -92,6 +92,8 @@ export const trackingPersonalizationFeatureModulePath =
'src/app/spartacus/features/tracking/personalization-feature.module.ts';
export const trackingTagManagementFeatureModulePath =
'src/app/spartacus/features/tracking/tag-management-feature.module.ts';
+export const omfFeatureModulePath =
+ 'src/app/spartacus/features/omf/omf-feature.module.ts';
export const userFeatureModulePath =
'src/app/spartacus/features/user/user-feature.module.ts';
export const userAccountWrapperModulePath =
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts
new file mode 100644
index 00000000000..cab0e861034
--- /dev/null
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v1-e2e.cy.ts
@@ -0,0 +1,83 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import {
+ ELECTRONICS_BASESITE,
+ ELECTRONICS_CURRENCY,
+ loginUser,
+ signOutUser,
+} from '../../../helpers/checkout-flow';
+import { OmfConfig } from '@spartacus/core';
+import {
+ interceptOrdersEndpoint,
+ waitForResponse,
+} from '../../../helpers/order-history';
+const omfTester = {
+ email: 'keenreviewer14@hybris.com',
+ password: 'Welcome@1',
+};
+
+const headerName = 'guid';
+
+function systemConfig() {
+ Cypress.env('BASE_SITE', ELECTRONICS_BASESITE);
+ Cypress.env('BASE_CURRENCY', ELECTRONICS_CURRENCY);
+ cy.cxConfig({
+ omf: {
+ guidHttpHeaderName: headerName,
+ },
+ } as OmfConfig);
+}
+function intercepOrderDetailsHttpCalls(code: string, alias: string) {
+ cy.intercept(
+ 'GET',
+ `${Cypress.env('OCC_PREFIX')}/${Cypress.env(
+ 'BASE_SITE'
+ )}/users/current/orders/${code}?*`
+ ).as(alias);
+}
+function navigateToOrderHistoryV1() {
+ const ordersAlias = interceptOrdersEndpoint();
+ cy.visit(
+ `${Cypress.env('BASE_SITE')}/${Cypress.env('BASE_LANG')}/${Cypress.env('BASE_CURRENCY')}/login`
+ );
+ loginUser(omfTester);
+ cy.visit('/my-account/orders');
+ waitForResponse(ordersAlias);
+}
+function navigateToOrderDetailsV1() {
+ cy.get('.cx-order-history-value')
+ .invoke('attr', 'href')
+ .then((href) => {
+ const orderMatch = href.match(/order\/([\w-]+)/);
+ const guidMatch = href.match(/guid=([\w-]+)/);
+
+ const orderCode = orderMatch ? orderMatch[1] : null;
+ const orderGuid = guidMatch ? guidMatch[1] : null;
+ intercepOrderDetailsHttpCalls(orderCode, 'orderDetails');
+
+ cy.get('.cx-order-history-value').first().click();
+ cy.wait('@orderDetails').then((xhr) => {
+ expect(xhr.request.headers).to.have.property(headerName, orderGuid);
+ });
+ cy.get('cx-breadcrumb h1').should('contain', 'Order Details');
+ cy.url().should((url) => {
+ const params = new URLSearchParams(url.split('?')[1]);
+ expect(params.has('guid')).to.be.true;
+ });
+ });
+}
+
+describe('OMF - Navigate from Order History to Order Details Page', () => {
+ it('should load Order History and navigate to Order Details (MY_ACCOUT_V2 = false)', () => {
+ cy.restoreLocalStorage();
+ Cypress.env('CX_MY_ACCOUNT_V2', false);
+ systemConfig();
+ navigateToOrderHistoryV1();
+ navigateToOrderDetailsV1();
+ signOutUser();
+ });
+});
diff --git a/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts
new file mode 100644
index 00000000000..3f039fb82ed
--- /dev/null
+++ b/projects/storefrontapp-e2e-cypress/cypress/e2e/vendor/omf/omf-order-v2-e2e.cy.ts
@@ -0,0 +1,88 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import {
+ ELECTRONICS_BASESITE,
+ ELECTRONICS_CURRENCY,
+ loginUser,
+ signOutUser,
+} from '../../../helpers/checkout-flow';
+import {
+ interceptOrdersEndpoint,
+ waitForResponse,
+} from '../../../helpers/order-history';
+const omfTester = {
+ email: 'keenreviewer14@hybris.com',
+ password: 'Welcome@1',
+};
+import { OmfConfig } from '@spartacus/core';
+
+const headerName = 'guid';
+
+function systemConfig() {
+ Cypress.env('BASE_SITE', ELECTRONICS_BASESITE);
+ Cypress.env('BASE_CURRENCY', ELECTRONICS_CURRENCY);
+ cy.cxConfig({
+ omf: {
+ guidHttpHeaderName: headerName,
+ },
+ } as OmfConfig);
+}
+const orderCode = '2200006056';
+
+function intercepOrderDetailsHttpCalls(code: string, alias: string) {
+ cy.intercept(
+ 'GET',
+ `${Cypress.env('OCC_PREFIX')}/${Cypress.env(
+ 'BASE_SITE'
+ )}/users/current/orders/${code}?*`
+ ).as(alias);
+}
+function navigateToOrderDetailsV2() {
+ cy.contains('a', orderCode)
+ .invoke('attr', 'href')
+ .then((href) => {
+ const guidMatch = href.match(/guid=([\w-]+)/);
+
+ const orderGuid = guidMatch ? guidMatch[1] : null;
+ intercepOrderDetailsHttpCalls(orderCode, 'orderDetails');
+
+ cy.contains('a', '2200006056').click();
+ cy.wait('@orderDetails').then((xhr) => {
+ expect(xhr.request.headers).to.have.property(headerName, orderGuid);
+ });
+ cy.get('cx-breadcrumb h1').should('contain', 'Order Details');
+ cy.url().should((url) => {
+ const params = new URLSearchParams(url.split('?')[1]);
+ expect(params.has('guid')).to.be.true;
+ });
+ });
+}
+
+function navigateToOrderHistoryV2() {
+ const ordersAlias = interceptOrdersEndpoint();
+ intercepOrderDetailsHttpCalls(orderCode, 'orderHistoryV2');
+ cy.visit(
+ `${Cypress.env('BASE_SITE')}/${Cypress.env('BASE_LANG')}/${Cypress.env('BASE_CURRENCY')}/login`
+ );
+ loginUser(omfTester);
+ cy.visit('/my-account/orders');
+ waitForResponse(ordersAlias);
+ cy.wait('@orderHistoryV2').then((xhr) => {
+ expect(xhr.request.headers).to.have.property(headerName);
+ });
+}
+
+describe('OMF - Navigate from Order History to Order Details Page', () => {
+ it('should load Order History and navigate to Order Details (MY_ACCOUT_V2 = true)', () => {
+ cy.restoreLocalStorage();
+ Cypress.env('CX_MY_ACCOUNT_V2', true);
+ systemConfig();
+ navigateToOrderHistoryV2();
+ navigateToOrderDetailsV2();
+ signOutUser();
+ });
+});
diff --git a/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts b/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts
new file mode 100644
index 00000000000..b76edce7ee0
--- /dev/null
+++ b/projects/storefrontapp/src/app/spartacus/features/omf/omf-feature.module.ts
@@ -0,0 +1,13 @@
+/*
+ * SPDX-FileCopyrightText: 2024 SAP Spartacus team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+import { NgModule } from '@angular/core';
+import { OmfRootModule } from '@spartacus/omf/root';
+
+@NgModule({
+ imports: [OmfRootModule],
+})
+export class OmfFeatureModule {}
diff --git a/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts b/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts
index 7b0a5b9953f..fb70b608eb0 100644
--- a/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts
+++ b/projects/storefrontapp/src/app/spartacus/features/order/order-wrapper.module.ts
@@ -8,11 +8,15 @@ import { NgModule, Type } from '@angular/core';
import { OrderModule } from '@spartacus/order';
import { environment } from '../../../../environments/environment';
import { S4ServiceOrderModule } from '@spartacus/s4-service/order';
+import { OmfOrderModule } from '@spartacus/omf/order';
const extensions: Type[] = [];
if (environment.s4Service) {
extensions.push(S4ServiceOrderModule);
}
+if (environment.omf) {
+ extensions.push(OmfOrderModule);
+}
@NgModule({
imports: [OrderModule, ...extensions],
})
diff --git a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts
index d8bc10c7709..25c502e3799 100644
--- a/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts
+++ b/projects/storefrontapp/src/app/spartacus/spartacus-features.module.ts
@@ -103,6 +103,7 @@ import { SmartEditFeatureModule } from './features/smartedit/smartedit-feature.m
import { StorefinderFeatureModule } from './features/storefinder/storefinder-feature.module';
import { TrackingFeatureModule } from './features/tracking/tracking-feature.module';
import { UserFeatureModule } from './features/user/user-feature.module';
+import { OmfFeatureModule } from './features/omf/omf-feature.module';
const featureModules = [];
@@ -153,7 +154,9 @@ if (environment.requestedDeliveryDate) {
if (environment.estimatedDeliveryDate) {
featureModules.push(EstimatedDeliveryDateFeatureModule);
}
-
+if (environment.omf) {
+ featureModules.push(OmfFeatureModule);
+}
if (environment.cpq) {
featureModules.push(CpqQuoteFeatureModule);
}
diff --git a/projects/storefrontapp/src/environments/environment.prod.ts b/projects/storefrontapp/src/environments/environment.prod.ts
index ca3f757651c..55d6ec33c5a 100644
--- a/projects/storefrontapp/src/environments/environment.prod.ts
+++ b/projects/storefrontapp/src/environments/environment.prod.ts
@@ -18,6 +18,7 @@ export const environment: Environment = {
digitalPayments: buildProcess.env.CX_DIGITAL_PAYMENTS,
epdVisualization: buildProcess.env.CX_EPD_VISUALIZATION,
s4om: buildProcess.env.CX_S4OM,
+ omf: buildProcess.env.CX_OMF,
segmentRefs: buildProcess.env.CX_SEGMENT_REFS,
opps: buildProcess.env.CX_OPPS,
requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE,
diff --git a/projects/storefrontapp/src/environments/environment.ts b/projects/storefrontapp/src/environments/environment.ts
index dada8d77550..b09532c3ede 100644
--- a/projects/storefrontapp/src/environments/environment.ts
+++ b/projects/storefrontapp/src/environments/environment.ts
@@ -31,6 +31,7 @@ export const environment: Environment = {
digitalPayments: buildProcess.env.CX_DIGITAL_PAYMENTS ?? false,
epdVisualization: buildProcess.env.CX_EPD_VISUALIZATION ?? false,
s4om: buildProcess.env.CX_S4OM ?? false,
+ omf: buildProcess.env.CX_OMF ?? false,
segmentRefs: buildProcess.env.CX_SEGMENT_REFS ?? false,
opps: buildProcess.env.CX_OPPS ?? false,
requestedDeliveryDate: buildProcess.env.CX_REQUESTED_DELIVERY_DATE ?? false,
diff --git a/projects/storefrontapp/src/environments/models/build.process.env.d.ts b/projects/storefrontapp/src/environments/models/build.process.env.d.ts
index f86ee9c9e34..57cee274138 100644
--- a/projects/storefrontapp/src/environments/models/build.process.env.d.ts
+++ b/projects/storefrontapp/src/environments/models/build.process.env.d.ts
@@ -20,6 +20,7 @@ interface Env {
CX_DIGITAL_PAYMENTS: boolean;
CX_EPD_VISUALIZATION: boolean;
CX_S4OM: boolean;
+ CX_OMF: boolean;
CX_SEGMENT_REFS: boolean;
CX_OPPS: boolean;
CX_REQUESTED_DELIVERY_DATE: boolean;
diff --git a/projects/storefrontapp/src/environments/models/environment.model.ts b/projects/storefrontapp/src/environments/models/environment.model.ts
index 4ca405f9a7d..e565b8fd7ef 100644
--- a/projects/storefrontapp/src/environments/models/environment.model.ts
+++ b/projects/storefrontapp/src/environments/models/environment.model.ts
@@ -16,6 +16,7 @@ export interface Environment {
digitalPayments: boolean;
epdVisualization: boolean;
s4om: boolean;
+ omf: boolean;
segmentRefs: boolean;
opps: boolean;
requestedDeliveryDate: boolean;
diff --git a/projects/storefrontapp/tsconfig.app.prod.json b/projects/storefrontapp/tsconfig.app.prod.json
index 335e967af7b..aa0c5d8f67b 100644
--- a/projects/storefrontapp/tsconfig.app.prod.json
+++ b/projects/storefrontapp/tsconfig.app.prod.json
@@ -373,6 +373,9 @@
],
"@spartacus/epd-visualization": ["dist/epd-visualization"],
"@spartacus/epd-visualization/root": ["dist/epd-visualization/root"],
+ "@spartacus/omf": ["dist/omf"],
+ "@spartacus/omf/order": ["dist/omf/order"],
+ "@spartacus/omf/root": ["dist/omf/root"],
"@spartacus/opps": ["dist/opps"],
"@spartacus/opps/root": ["dist/opps/root"],
"@spartacus/s4-service/assets": ["dist/s4-service/assets"],
diff --git a/projects/storefrontapp/tsconfig.server.json b/projects/storefrontapp/tsconfig.server.json
index f8fed2cea6d..1a50dd4d3a0 100644
--- a/projects/storefrontapp/tsconfig.server.json
+++ b/projects/storefrontapp/tsconfig.server.json
@@ -585,6 +585,9 @@
"@spartacus/epd-visualization/root": [
"../../integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": ["../../integration-libs/omf/public_api"],
+ "@spartacus/omf/order": ["../../integration-libs/omf/order/public_api"],
+ "@spartacus/omf/root": ["../../integration-libs/omf/root/public_api"],
"@spartacus/opps": ["../../integration-libs/opps/public_api"],
"@spartacus/opps/root": ["../../integration-libs/opps/root/public_api"],
"@spartacus/s4-service/assets": [
diff --git a/projects/storefrontapp/tsconfig.server.prod.json b/projects/storefrontapp/tsconfig.server.prod.json
index 3c5a3db38a6..8757a7ff450 100644
--- a/projects/storefrontapp/tsconfig.server.prod.json
+++ b/projects/storefrontapp/tsconfig.server.prod.json
@@ -430,6 +430,9 @@
"@spartacus/epd-visualization/root": [
"../../dist/epd-visualization/root"
],
+ "@spartacus/omf": ["../../dist/omf"],
+ "@spartacus/omf/order": ["../../dist/omf/order"],
+ "@spartacus/omf/root": ["../../dist/omf/root"],
"@spartacus/opps": ["../../dist/opps"],
"@spartacus/opps/root": ["../../dist/opps/root"],
"@spartacus/s4-service/assets": ["../../dist/s4-service/assets"],
diff --git a/tsconfig.compodoc.json b/tsconfig.compodoc.json
index 7dba3b28271..d24ababccfd 100644
--- a/tsconfig.compodoc.json
+++ b/tsconfig.compodoc.json
@@ -668,6 +668,15 @@
"@spartacus/epd-visualization/root": [
"integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": [
+ "integration-libs/omf/public_api"
+ ],
+ "@spartacus/omf/order": [
+ "integration-libs/omf/order/public_api"
+ ],
+ "@spartacus/omf/root": [
+ "integration-libs/omf/root/public_api"
+ ],
"@spartacus/opps": [
"integration-libs/opps/public_api"
],
@@ -734,4 +743,4 @@
"./projects/storefrontstyles/**/*.*",
"./projects/vendor/**/*.*"
]
-}
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
index 1a6bd4fd094..30d9276801f 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -672,6 +672,15 @@
"@spartacus/epd-visualization/root": [
"integration-libs/epd-visualization/root/public_api"
],
+ "@spartacus/omf": [
+ "integration-libs/omf/public_api"
+ ],
+ "@spartacus/omf/order": [
+ "integration-libs/omf/order/public_api"
+ ],
+ "@spartacus/omf/root": [
+ "integration-libs/omf/root/public_api"
+ ],
"@spartacus/opps": [
"integration-libs/opps/public_api"
],
@@ -745,4 +754,4 @@
"strictTemplates": true,
"strictInputAccessModifiers": true
}
-}
+}
\ No newline at end of file