|
@@ -1,6 +1,7 @@
|
|
|
import { OrderType } from '@vendure/common/lib/generated-types';
|
|
import { OrderType } from '@vendure/common/lib/generated-types';
|
|
|
import { ID } from '@vendure/common/lib/shared-types';
|
|
import { ID } from '@vendure/common/lib/shared-types';
|
|
|
import {
|
|
import {
|
|
|
|
|
+ ChannelService,
|
|
|
CustomOrderProcess,
|
|
CustomOrderProcess,
|
|
|
idsAreEqual,
|
|
idsAreEqual,
|
|
|
Order,
|
|
Order,
|
|
@@ -10,16 +11,22 @@ import {
|
|
|
orderItemsAreShipped,
|
|
orderItemsAreShipped,
|
|
|
OrderService,
|
|
OrderService,
|
|
|
RequestContext,
|
|
RequestContext,
|
|
|
|
|
+ RequestContextService,
|
|
|
TransactionalConnection,
|
|
TransactionalConnection,
|
|
|
|
|
+ User,
|
|
|
} from '@vendure/core';
|
|
} from '@vendure/core';
|
|
|
|
|
|
|
|
let connection: TransactionalConnection;
|
|
let connection: TransactionalConnection;
|
|
|
let orderService: OrderService;
|
|
let orderService: OrderService;
|
|
|
|
|
+let channelService: ChannelService;
|
|
|
|
|
+let requestContextService: RequestContextService;
|
|
|
|
|
|
|
|
export const multivendorOrderProcess: CustomOrderProcess<any> = {
|
|
export const multivendorOrderProcess: CustomOrderProcess<any> = {
|
|
|
init(injector) {
|
|
init(injector) {
|
|
|
connection = injector.get(TransactionalConnection);
|
|
connection = injector.get(TransactionalConnection);
|
|
|
orderService = injector.get(OrderService);
|
|
orderService = injector.get(OrderService);
|
|
|
|
|
+ channelService = injector.get(ChannelService);
|
|
|
|
|
+ requestContextService = injector.get(RequestContextService);
|
|
|
},
|
|
},
|
|
|
|
|
|
|
|
async onTransitionStart(fromState, toState, data) {
|
|
async onTransitionStart(fromState, toState, data) {
|
|
@@ -67,20 +74,41 @@ export const multivendorOrderProcess: CustomOrderProcess<any> = {
|
|
|
if (order.type === OrderType.Seller) {
|
|
if (order.type === OrderType.Seller) {
|
|
|
const aggregateOrder = await orderService.getAggregateOrder(ctx, order);
|
|
const aggregateOrder = await orderService.getAggregateOrder(ctx, order);
|
|
|
if (aggregateOrder) {
|
|
if (aggregateOrder) {
|
|
|
|
|
+ // Create a new RequestContext on the default Channel, since the current
|
|
|
|
|
+ // RequestContext may be scoped to the Seller channel, and will not be able to
|
|
|
|
|
+ // update the AggregateOrder.
|
|
|
|
|
+ const defaultChannel = await channelService.getDefaultChannel();
|
|
|
|
|
+ const defaultChannelCtx = await requestContextService.create({
|
|
|
|
|
+ apiType: 'admin',
|
|
|
|
|
+ channelOrToken: defaultChannel,
|
|
|
|
|
+ req: ctx.req,
|
|
|
|
|
+ languageCode: ctx.languageCode,
|
|
|
|
|
+ user: ctx.activeUserId ? new User({ id: ctx.activeUserId }) : undefined,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
// This part is responsible for automatically updating the state of the aggregate Order
|
|
// This part is responsible for automatically updating the state of the aggregate Order
|
|
|
// based on the fulfillment state of all the associated seller Orders.
|
|
// based on the fulfillment state of all the associated seller Orders.
|
|
|
const otherSellerOrders = (await orderService.getSellerOrders(ctx, aggregateOrder)).filter(
|
|
const otherSellerOrders = (await orderService.getSellerOrders(ctx, aggregateOrder)).filter(
|
|
|
so => !idsAreEqual(so.id, order.id),
|
|
so => !idsAreEqual(so.id, order.id),
|
|
|
);
|
|
);
|
|
|
|
|
+
|
|
|
const sellerOrderStates = [...otherSellerOrders.map(so => so.state), toState];
|
|
const sellerOrderStates = [...otherSellerOrders.map(so => so.state), toState];
|
|
|
if (sellerOrderStates.every(state => state === 'Shipped')) {
|
|
if (sellerOrderStates.every(state => state === 'Shipped')) {
|
|
|
- await orderService.transitionToState(data.ctx, aggregateOrder.id, 'Shipped');
|
|
|
|
|
|
|
+ await orderService.transitionToState(defaultChannelCtx, aggregateOrder.id, 'Shipped');
|
|
|
} else if (sellerOrderStates.every(state => state === 'Delivered')) {
|
|
} else if (sellerOrderStates.every(state => state === 'Delivered')) {
|
|
|
- await orderService.transitionToState(data.ctx, aggregateOrder.id, 'Delivered');
|
|
|
|
|
|
|
+ await orderService.transitionToState(defaultChannelCtx, aggregateOrder.id, 'Delivered');
|
|
|
} else if (sellerOrderStates.some(state => state === 'Delivered')) {
|
|
} else if (sellerOrderStates.some(state => state === 'Delivered')) {
|
|
|
- await orderService.transitionToState(data.ctx, aggregateOrder.id, 'PartiallyDelivered');
|
|
|
|
|
|
|
+ await orderService.transitionToState(
|
|
|
|
|
+ defaultChannelCtx,
|
|
|
|
|
+ aggregateOrder.id,
|
|
|
|
|
+ 'PartiallyDelivered',
|
|
|
|
|
+ );
|
|
|
} else if (sellerOrderStates.some(state => state === 'Shipped')) {
|
|
} else if (sellerOrderStates.some(state => state === 'Shipped')) {
|
|
|
- await orderService.transitionToState(data.ctx, aggregateOrder.id, 'PartiallyShipped');
|
|
|
|
|
|
|
+ await orderService.transitionToState(
|
|
|
|
|
+ defaultChannelCtx,
|
|
|
|
|
+ aggregateOrder.id,
|
|
|
|
|
+ 'PartiallyShipped',
|
|
|
|
|
+ );
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|