Переглянути джерело

test(core): Add e2e tests for draft Order operations

Relates to #1453
Michael Bromley 3 роки тому
батько
коміт
417439e7a2

+ 3 - 29
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -24,13 +24,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -69,13 +67,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2346,7 +2342,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3466,7 +3461,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3489,11 +3484,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  __typename?: 'OrderCustomFields';
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3512,7 +3502,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3619,18 +3608,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  __typename?: 'OrderLineCustomFields';
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5512,13 +5490,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 27
packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts

@@ -23,13 +23,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -67,13 +65,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2262,7 +2258,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3318,7 +3313,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3340,10 +3335,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3362,7 +3353,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3466,17 +3456,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5277,13 +5257,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 26
packages/common/src/generated-shop-types.ts

@@ -1643,7 +1643,6 @@ export type Mutation = {
 export type MutationAddItemToOrderArgs = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1655,7 +1654,6 @@ export type MutationRemoveOrderLineArgs = {
 export type MutationAdjustOrderLineArgs = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1899,7 +1897,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -1922,11 +1920,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  __typename?: 'OrderCustomFields';
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   id?: Maybe<IdOperators>;
   createdAt?: Maybe<DateOperators>;
@@ -1943,7 +1936,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -2050,18 +2042,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  __typename?: 'OrderLineCustomFields';
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderList = PaginatedList & {
@@ -3131,12 +3112,8 @@ export type UpdateCustomerInput = {
 
 export type UpdateCustomerPasswordResult = Success | InvalidCredentialsError | PasswordValidationError | NativeAuthStrategyError;
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 29
packages/common/src/generated-types.ts

@@ -23,13 +23,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -68,13 +66,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2338,7 +2334,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3402,7 +3397,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3425,11 +3420,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  __typename?: 'OrderCustomFields';
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3448,7 +3438,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3555,18 +3544,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  __typename?: 'OrderLineCustomFields';
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5435,13 +5413,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 449 - 0
packages/core/e2e/draft-order.e2e-spec.ts

@@ -0,0 +1,449 @@
+/* tslint:disable:no-non-null-assertion */
+import { mergeConfig, orderPercentageDiscount } from '@vendure/core';
+import { createErrorResultGuard, createTestEnvironment, ErrorResultGuard } from '@vendure/testing';
+import gql from 'graphql-tag';
+import path from 'path';
+
+import { initialData } from '../../../e2e-common/e2e-initial-data';
+import { testConfig, TEST_SETUP_TIMEOUT_MS } from '../../../e2e-common/test-config';
+
+import { singleStageRefundablePaymentMethod } from './fixtures/test-payment-methods';
+import { ORDER_WITH_LINES_FRAGMENT } from './graphql/fragments';
+import * as Codegen from './graphql/generated-e2e-admin-types';
+import { CanceledOrderFragment, OrderWithLinesFragment } from './graphql/generated-e2e-admin-types';
+import {
+    GetActiveCustomerOrdersQuery,
+    TestOrderFragmentFragment,
+    UpdatedOrderFragment,
+} from './graphql/generated-e2e-shop-types';
+import { CREATE_PROMOTION, GET_CUSTOMER_LIST } from './graphql/shared-definitions';
+import { GET_ACTIVE_CUSTOMER_ORDERS } from './graphql/shop-definitions';
+
+describe('Draft Orders resolver', () => {
+    const { server, adminClient, shopClient } = createTestEnvironment(
+        mergeConfig(testConfig(), {
+            paymentOptions: {
+                paymentMethodHandlers: [singleStageRefundablePaymentMethod],
+            },
+        }),
+    );
+    let customers: Codegen.GetCustomerListQuery['customers']['items'];
+    let draftOrder: OrderWithLinesFragment;
+    const freeOrderCouponCode = 'FREE';
+
+    const orderGuard: ErrorResultGuard<
+        TestOrderFragmentFragment | CanceledOrderFragment | UpdatedOrderFragment
+    > = createErrorResultGuard(input => !!input.lines);
+
+    beforeAll(async () => {
+        await server.init({
+            initialData: {
+                ...initialData,
+                paymentMethods: [
+                    {
+                        name: singleStageRefundablePaymentMethod.code,
+                        handler: { code: singleStageRefundablePaymentMethod.code, arguments: [] },
+                    },
+                ],
+            },
+            productsCsvPath: path.join(__dirname, 'fixtures/e2e-products-full.csv'),
+            customerCount: 3,
+        });
+        await adminClient.asSuperAdmin();
+
+        // Create a couple of orders to be queried
+        const result = await adminClient.query<
+            Codegen.GetCustomerListQuery,
+            Codegen.GetCustomerListQueryVariables
+        >(GET_CUSTOMER_LIST, {
+            options: {
+                take: 3,
+            },
+        });
+        customers = result.customers.items;
+
+        // Create a coupon code promotion
+        const { createPromotion } = await adminClient.query<
+            Codegen.CreatePromotionMutation,
+            Codegen.CreatePromotionMutationVariables
+        >(CREATE_PROMOTION, {
+            input: {
+                name: 'Free Order',
+                enabled: true,
+                conditions: [],
+                couponCode: freeOrderCouponCode,
+                actions: [
+                    {
+                        code: orderPercentageDiscount.code,
+                        arguments: [{ name: 'discount', value: '100' }],
+                    },
+                ],
+            },
+        });
+    }, TEST_SETUP_TIMEOUT_MS);
+
+    afterAll(async () => {
+        await server.destroy();
+    });
+
+    it('create draft order', async () => {
+        const { createDraftOrder } = await adminClient.query<Codegen.CreateDraftOrderMutation>(
+            CREATE_DRAFT_ORDER,
+        );
+
+        expect(createDraftOrder.state).toBe('Draft');
+        expect(createDraftOrder.active).toBe(false);
+        draftOrder = createDraftOrder;
+    });
+
+    it('addItemToDraftOrder', async () => {
+        const { addItemToDraftOrder } = await adminClient.query<
+            Codegen.AddItemToDraftOrderMutation,
+            Codegen.AddItemToDraftOrderMutationVariables
+        >(ADD_ITEM_TO_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            input: {
+                productVariantId: 'T_5',
+                quantity: 2,
+            },
+        });
+
+        orderGuard.assertSuccess(addItemToDraftOrder);
+        expect(addItemToDraftOrder.lines.length).toBe(1);
+        draftOrder = addItemToDraftOrder;
+    });
+
+    it('adjustDraftOrderLine', async () => {
+        const { adjustDraftOrderLine } = await adminClient.query<
+            Codegen.AdjustDraftOrderLineMutation,
+            Codegen.AdjustDraftOrderLineMutationVariables
+        >(ADJUST_DRAFT_ORDER_LINE, {
+            orderId: draftOrder.id,
+            input: {
+                orderLineId: draftOrder.lines[0]!.id,
+                quantity: 5,
+            },
+        });
+
+        orderGuard.assertSuccess(adjustDraftOrderLine);
+        expect(adjustDraftOrderLine.lines[0].quantity).toBe(5);
+    });
+
+    it('removeDraftOrderLine', async () => {
+        const { removeDraftOrderLine } = await adminClient.query<
+            Codegen.RemoveDraftOrderLineMutation,
+            Codegen.RemoveDraftOrderLineMutationVariables
+        >(REMOVE_DRAFT_ORDER_LINE, {
+            orderId: draftOrder.id,
+            orderLineId: draftOrder.lines[0]!.id,
+        });
+
+        orderGuard.assertSuccess(removeDraftOrderLine);
+        expect(removeDraftOrderLine.lines.length).toBe(0);
+    });
+
+    it('setCustomerForDraftOrder', async () => {
+        const { setCustomerForDraftOrder } = await adminClient.query<
+            Codegen.SetCustomerForDraftOrderMutation,
+            Codegen.SetCustomerForDraftOrderMutationVariables
+        >(SET_CUSTOMER_FOR_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            customerId: customers[0].id,
+        });
+
+        orderGuard.assertSuccess(setCustomerForDraftOrder);
+        expect(setCustomerForDraftOrder.customer?.id).toBe(customers[0].id);
+    });
+
+    it('custom does not see draft orders in history', async () => {
+        await shopClient.asUserWithCredentials(customers[0].emailAddress, 'test');
+
+        const { activeCustomer } = await shopClient.query<GetActiveCustomerOrdersQuery>(
+            GET_ACTIVE_CUSTOMER_ORDERS,
+        );
+
+        expect(activeCustomer?.orders.totalItems).toBe(0);
+        expect(activeCustomer?.orders.items.length).toBe(0);
+    });
+
+    it('setDraftOrderShippingAddress', async () => {
+        const { setDraftOrderShippingAddress } = await adminClient.query<
+            Codegen.SetDraftOrderShippingAddressMutation,
+            Codegen.SetDraftOrderShippingAddressMutationVariables
+        >(SET_SHIPPING_ADDRESS_FOR_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            input: {
+                streetLine1: 'Shipping Street',
+                city: 'Wigan',
+                province: 'Greater Manchester',
+                postalCode: 'WN1 2DD',
+                countryCode: 'GB',
+            },
+        });
+
+        expect(setDraftOrderShippingAddress.shippingAddress).toEqual({
+            company: null,
+            fullName: null,
+            phoneNumber: null,
+            streetLine2: null,
+            province: 'Greater Manchester',
+            city: 'Wigan',
+            country: 'United Kingdom',
+            postalCode: 'WN1 2DD',
+            streetLine1: 'Shipping Street',
+        });
+    });
+
+    it('setDraftOrderBillingAddress', async () => {
+        const { setDraftOrderBillingAddress } = await adminClient.query<
+            Codegen.SetDraftOrderBillingAddressMutation,
+            Codegen.SetDraftOrderBillingAddressMutationVariables
+        >(SET_BILLING_ADDRESS_FOR_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            input: {
+                streetLine1: 'Billing Street',
+                city: 'Skelmerdale',
+                province: 'Lancashire',
+                postalCode: 'WN8 3QW',
+                countryCode: 'GB',
+            },
+        });
+
+        expect(setDraftOrderBillingAddress.billingAddress).toEqual({
+            company: null,
+            fullName: null,
+            phoneNumber: null,
+            streetLine2: null,
+            province: 'Lancashire',
+            city: 'Skelmerdale',
+            country: 'United Kingdom',
+            postalCode: 'WN8 3QW',
+            streetLine1: 'Billing Street',
+        });
+    });
+
+    it('applyCouponCodeToDraftOrder', async () => {
+        const { addItemToDraftOrder } = await adminClient.query<
+            Codegen.AddItemToDraftOrderMutation,
+            Codegen.AddItemToDraftOrderMutationVariables
+        >(ADD_ITEM_TO_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            input: {
+                productVariantId: 'T_1',
+                quantity: 1,
+            },
+        });
+
+        orderGuard.assertSuccess(addItemToDraftOrder);
+        expect(addItemToDraftOrder.totalWithTax).toBe(155880);
+
+        const { applyCouponCodeToDraftOrder } = await adminClient.query<
+            Codegen.ApplyCouponCodeToDraftOrderMutation,
+            Codegen.ApplyCouponCodeToDraftOrderMutationVariables
+        >(APPLY_COUPON_CODE_TO_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            couponCode: freeOrderCouponCode,
+        });
+
+        orderGuard.assertSuccess(applyCouponCodeToDraftOrder);
+
+        expect(applyCouponCodeToDraftOrder.couponCodes).toEqual([freeOrderCouponCode]);
+        expect(applyCouponCodeToDraftOrder.totalWithTax).toBe(0);
+    });
+
+    it('removeCouponCodeFromDraftOrder', async () => {
+        const { removeCouponCodeFromDraftOrder } = await adminClient.query<
+            Codegen.RemoveCouponCodeFromDraftOrderMutation,
+            Codegen.RemoveCouponCodeFromDraftOrderMutationVariables
+        >(REMOVE_COUPON_CODE_FROM_DRAFT_ORDER, {
+            orderId: draftOrder.id,
+            couponCode: freeOrderCouponCode,
+        });
+
+        expect(removeCouponCodeFromDraftOrder!.couponCodes).toEqual([]);
+        expect(removeCouponCodeFromDraftOrder!.totalWithTax).toBe(155880);
+    });
+
+    it('eligibleShippingMethodsForDraftOrder', async () => {
+        const { eligibleShippingMethodsForDraftOrder } = await adminClient.query<
+            Codegen.DraftOrderEligibleShippingMethodsQuery,
+            Codegen.DraftOrderEligibleShippingMethodsQueryVariables
+        >(DRAFT_ORDER_ELIGIBLE_SHIPPING_METHODS, {
+            orderId: draftOrder.id,
+        });
+
+        expect(eligibleShippingMethodsForDraftOrder).toEqual([
+            {
+                code: 'standard-shipping',
+                description: '',
+                id: 'T_1',
+                metadata: null,
+                name: 'Standard Shipping',
+                price: 500,
+                priceWithTax: 500,
+            },
+            {
+                code: 'express-shipping',
+                description: '',
+                id: 'T_2',
+                metadata: null,
+                name: 'Express Shipping',
+                price: 1000,
+                priceWithTax: 1000,
+            },
+        ]);
+    });
+
+    it('setDraftOrderShippingMethod', async () => {
+        const { setDraftOrderShippingMethod } = await adminClient.query<
+            Codegen.SetDraftOrderShippingMethodMutation,
+            Codegen.SetDraftOrderShippingMethodMutationVariables
+        >(SET_DRAFT_ORDER_SHIPPING_METHOD, {
+            orderId: draftOrder.id,
+            shippingMethodId: 'T_2',
+        });
+
+        orderGuard.assertSuccess(setDraftOrderShippingMethod);
+
+        expect(setDraftOrderShippingMethod.shippingWithTax).toBe(1000);
+        expect(setDraftOrderShippingMethod.shippingLines.length).toBe(1);
+        expect(setDraftOrderShippingMethod.shippingLines[0].shippingMethod.id).toBe('T_2');
+    });
+});
+
+export const CREATE_DRAFT_ORDER = gql`
+    mutation CreateDraftOrder {
+        createDraftOrder {
+            ...OrderWithLines
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const ADD_ITEM_TO_DRAFT_ORDER = gql`
+    mutation AddItemToDraftOrder($orderId: ID!, $input: AddItemToDraftOrderInput!) {
+        addItemToDraftOrder(orderId: $orderId, input: $input) {
+            ...OrderWithLines
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const ADJUST_DRAFT_ORDER_LINE = gql`
+    mutation AdjustDraftOrderLine($orderId: ID!, $input: AdjustDraftOrderLineInput!) {
+        adjustDraftOrderLine(orderId: $orderId, input: $input) {
+            ...OrderWithLines
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const REMOVE_DRAFT_ORDER_LINE = gql`
+    mutation RemoveDraftOrderLine($orderId: ID!, $orderLineId: ID!) {
+        removeDraftOrderLine(orderId: $orderId, orderLineId: $orderLineId) {
+            ...OrderWithLines
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const SET_CUSTOMER_FOR_DRAFT_ORDER = gql`
+    mutation SetCustomerForDraftOrder($orderId: ID!, $customerId: ID, $input: CreateCustomerInput) {
+        setCustomerForDraftOrder(orderId: $orderId, customerId: $customerId, input: $input) {
+            ...OrderWithLines
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const SET_SHIPPING_ADDRESS_FOR_DRAFT_ORDER = gql`
+    mutation SetDraftOrderShippingAddress($orderId: ID!, $input: CreateAddressInput!) {
+        setDraftOrderShippingAddress(orderId: $orderId, input: $input) {
+            ...OrderWithLines
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const SET_BILLING_ADDRESS_FOR_DRAFT_ORDER = gql`
+    mutation SetDraftOrderBillingAddress($orderId: ID!, $input: CreateAddressInput!) {
+        setDraftOrderBillingAddress(orderId: $orderId, input: $input) {
+            ...OrderWithLines
+            billingAddress {
+                ...ShippingAddress
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const APPLY_COUPON_CODE_TO_DRAFT_ORDER = gql`
+    mutation ApplyCouponCodeToDraftOrder($orderId: ID!, $couponCode: String!) {
+        applyCouponCodeToDraftOrder(orderId: $orderId, couponCode: $couponCode) {
+            ...OrderWithLines
+            ... on Order {
+                couponCodes
+            }
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const REMOVE_COUPON_CODE_FROM_DRAFT_ORDER = gql`
+    mutation RemoveCouponCodeFromDraftOrder($orderId: ID!, $couponCode: String!) {
+        removeCouponCodeFromDraftOrder(orderId: $orderId, couponCode: $couponCode) {
+            ...OrderWithLines
+            ... on Order {
+                couponCodes
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;
+
+export const DRAFT_ORDER_ELIGIBLE_SHIPPING_METHODS = gql`
+    query DraftOrderEligibleShippingMethods($orderId: ID!) {
+        eligibleShippingMethodsForDraftOrder(orderId: $orderId) {
+            id
+            name
+            code
+            description
+            price
+            priceWithTax
+            metadata
+        }
+    }
+`;
+
+export const SET_DRAFT_ORDER_SHIPPING_METHOD = gql`
+    mutation SetDraftOrderShippingMethod($orderId: ID!, $shippingMethodId: ID!) {
+        setDraftOrderShippingMethod(orderId: $orderId, shippingMethodId: $shippingMethodId) {
+            ...OrderWithLines
+            ... on ErrorResult {
+                errorCode
+                message
+            }
+        }
+    }
+    ${ORDER_WITH_LINES_FRAGMENT}
+`;

+ 1 - 1
packages/core/e2e/global-settings.e2e-spec.ts

@@ -61,7 +61,7 @@ describe('GlobalSettings resolver', () => {
         it('includes orderProcess', () => {
             expect(globalSettings.serverConfig.orderProcess[0]).toEqual({
                 name: 'Created',
-                to: ['AddingItems'],
+                to: ['AddingItems', 'Draft'],
             });
         });
 

+ 172 - 27
packages/core/e2e/graphql/generated-e2e-admin-types.ts

@@ -23,13 +23,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -67,13 +65,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2262,7 +2258,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3318,7 +3313,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3340,10 +3335,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3362,7 +3353,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3466,17 +3456,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5277,13 +5257,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;
@@ -5847,6 +5823,100 @@ export type SearchGetPricesQueryVariables = Exact<{
 
 export type SearchGetPricesQuery = { search: { items: Array<{ price: Pick<PriceRange, 'min' | 'max'> | Pick<SinglePrice, 'value'>, priceWithTax: Pick<PriceRange, 'min' | 'max'> | Pick<SinglePrice, 'value'> }> } };
 
+export type CreateDraftOrderMutationVariables = Exact<{ [key: string]: never; }>;
+
+
+export type CreateDraftOrderMutation = { createDraftOrder: OrderWithLinesFragment };
+
+export type AddItemToDraftOrderMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  input: AddItemToDraftOrderInput;
+}>;
+
+
+export type AddItemToDraftOrderMutation = { addItemToDraftOrder: OrderWithLinesFragment | Pick<OrderModificationError, 'errorCode' | 'message'> | Pick<OrderLimitError, 'errorCode' | 'message'> | Pick<NegativeQuantityError, 'errorCode' | 'message'> | Pick<InsufficientStockError, 'errorCode' | 'message'> };
+
+export type AdjustDraftOrderLineMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  input: AdjustDraftOrderLineInput;
+}>;
+
+
+export type AdjustDraftOrderLineMutation = { adjustDraftOrderLine: OrderWithLinesFragment | Pick<OrderModificationError, 'errorCode' | 'message'> | Pick<OrderLimitError, 'errorCode' | 'message'> | Pick<NegativeQuantityError, 'errorCode' | 'message'> | Pick<InsufficientStockError, 'errorCode' | 'message'> };
+
+export type RemoveDraftOrderLineMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  orderLineId: Scalars['ID'];
+}>;
+
+
+export type RemoveDraftOrderLineMutation = { removeDraftOrderLine: OrderWithLinesFragment | Pick<OrderModificationError, 'errorCode' | 'message'> };
+
+export type SetCustomerForDraftOrderMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  customerId?: Maybe<Scalars['ID']>;
+  input?: Maybe<CreateCustomerInput>;
+}>;
+
+
+export type SetCustomerForDraftOrderMutation = { setCustomerForDraftOrder: OrderWithLinesFragment | Pick<EmailAddressConflictError, 'errorCode' | 'message'> };
+
+export type SetDraftOrderShippingAddressMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  input: CreateAddressInput;
+}>;
+
+
+export type SetDraftOrderShippingAddressMutation = { setDraftOrderShippingAddress: OrderWithLinesFragment };
+
+export type SetDraftOrderBillingAddressMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  input: CreateAddressInput;
+}>;
+
+
+export type SetDraftOrderBillingAddressMutation = { setDraftOrderBillingAddress: (
+    { billingAddress?: Maybe<ShippingAddressFragment> }
+    & OrderWithLinesFragment
+  ) };
+
+export type ApplyCouponCodeToDraftOrderMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  couponCode: Scalars['String'];
+}>;
+
+
+export type ApplyCouponCodeToDraftOrderMutation = { applyCouponCodeToDraftOrder: (
+    Pick<Order, 'couponCodes'>
+    & OrderWithLinesFragment
+  ) | Pick<CouponCodeExpiredError, 'errorCode' | 'message'> | Pick<CouponCodeInvalidError, 'errorCode' | 'message'> | Pick<CouponCodeLimitError, 'errorCode' | 'message'> };
+
+export type RemoveCouponCodeFromDraftOrderMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  couponCode: Scalars['String'];
+}>;
+
+
+export type RemoveCouponCodeFromDraftOrderMutation = { removeCouponCodeFromDraftOrder?: Maybe<(
+    Pick<Order, 'couponCodes'>
+    & OrderWithLinesFragment
+  )> };
+
+export type DraftOrderEligibleShippingMethodsQueryVariables = Exact<{
+  orderId: Scalars['ID'];
+}>;
+
+
+export type DraftOrderEligibleShippingMethodsQuery = { eligibleShippingMethodsForDraftOrder: Array<Pick<ShippingMethodQuote, 'id' | 'name' | 'code' | 'description' | 'price' | 'priceWithTax' | 'metadata'>> };
+
+export type SetDraftOrderShippingMethodMutationVariables = Exact<{
+  orderId: Scalars['ID'];
+  shippingMethodId: Scalars['ID'];
+}>;
+
+
+export type SetDraftOrderShippingMethodMutation = { setDraftOrderShippingMethod: OrderWithLinesFragment | Pick<OrderModificationError, 'errorCode' | 'message'> | Pick<IneligibleShippingMethodError, 'errorCode' | 'message'> | Pick<NoActiveOrderError, 'errorCode' | 'message'> };
+
 export type IdTest1QueryVariables = Exact<{ [key: string]: never; }>;
 
 
@@ -7943,6 +8013,81 @@ export namespace SearchGetPrices {
   export type _SinglePriceInlineFragment = (DiscriminateUnion<(NonNullable<NonNullable<(NonNullable<(NonNullable<SearchGetPricesQuery['search']>)['items']>)[number]>['priceWithTax']>), { __typename?: 'SinglePrice' }>);
 }
 
+export namespace CreateDraftOrder {
+  export type Variables = CreateDraftOrderMutationVariables;
+  export type Mutation = CreateDraftOrderMutation;
+  export type CreateDraftOrder = (NonNullable<CreateDraftOrderMutation['createDraftOrder']>);
+}
+
+export namespace AddItemToDraftOrder {
+  export type Variables = AddItemToDraftOrderMutationVariables;
+  export type Mutation = AddItemToDraftOrderMutation;
+  export type AddItemToDraftOrder = (NonNullable<AddItemToDraftOrderMutation['addItemToDraftOrder']>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<AddItemToDraftOrderMutation['addItemToDraftOrder']>), { __typename?: 'ErrorResult' }>);
+}
+
+export namespace AdjustDraftOrderLine {
+  export type Variables = AdjustDraftOrderLineMutationVariables;
+  export type Mutation = AdjustDraftOrderLineMutation;
+  export type AdjustDraftOrderLine = (NonNullable<AdjustDraftOrderLineMutation['adjustDraftOrderLine']>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<AdjustDraftOrderLineMutation['adjustDraftOrderLine']>), { __typename?: 'ErrorResult' }>);
+}
+
+export namespace RemoveDraftOrderLine {
+  export type Variables = RemoveDraftOrderLineMutationVariables;
+  export type Mutation = RemoveDraftOrderLineMutation;
+  export type RemoveDraftOrderLine = (NonNullable<RemoveDraftOrderLineMutation['removeDraftOrderLine']>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<RemoveDraftOrderLineMutation['removeDraftOrderLine']>), { __typename?: 'ErrorResult' }>);
+}
+
+export namespace SetCustomerForDraftOrder {
+  export type Variables = SetCustomerForDraftOrderMutationVariables;
+  export type Mutation = SetCustomerForDraftOrderMutation;
+  export type SetCustomerForDraftOrder = (NonNullable<SetCustomerForDraftOrderMutation['setCustomerForDraftOrder']>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<SetCustomerForDraftOrderMutation['setCustomerForDraftOrder']>), { __typename?: 'ErrorResult' }>);
+}
+
+export namespace SetDraftOrderShippingAddress {
+  export type Variables = SetDraftOrderShippingAddressMutationVariables;
+  export type Mutation = SetDraftOrderShippingAddressMutation;
+  export type SetDraftOrderShippingAddress = (NonNullable<SetDraftOrderShippingAddressMutation['setDraftOrderShippingAddress']>);
+}
+
+export namespace SetDraftOrderBillingAddress {
+  export type Variables = SetDraftOrderBillingAddressMutationVariables;
+  export type Mutation = SetDraftOrderBillingAddressMutation;
+  export type SetDraftOrderBillingAddress = (NonNullable<SetDraftOrderBillingAddressMutation['setDraftOrderBillingAddress']>);
+  export type BillingAddress = (NonNullable<(NonNullable<SetDraftOrderBillingAddressMutation['setDraftOrderBillingAddress']>)['billingAddress']>);
+}
+
+export namespace ApplyCouponCodeToDraftOrder {
+  export type Variables = ApplyCouponCodeToDraftOrderMutationVariables;
+  export type Mutation = ApplyCouponCodeToDraftOrderMutation;
+  export type ApplyCouponCodeToDraftOrder = (NonNullable<ApplyCouponCodeToDraftOrderMutation['applyCouponCodeToDraftOrder']>);
+  export type OrderInlineFragment = (DiscriminateUnion<(NonNullable<ApplyCouponCodeToDraftOrderMutation['applyCouponCodeToDraftOrder']>), { __typename?: 'Order' }>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<ApplyCouponCodeToDraftOrderMutation['applyCouponCodeToDraftOrder']>), { __typename?: 'ErrorResult' }>);
+}
+
+export namespace RemoveCouponCodeFromDraftOrder {
+  export type Variables = RemoveCouponCodeFromDraftOrderMutationVariables;
+  export type Mutation = RemoveCouponCodeFromDraftOrderMutation;
+  export type RemoveCouponCodeFromDraftOrder = (NonNullable<RemoveCouponCodeFromDraftOrderMutation['removeCouponCodeFromDraftOrder']>);
+  export type OrderInlineFragment = ({ __typename: 'Order' } & Pick<(NonNullable<RemoveCouponCodeFromDraftOrderMutation['removeCouponCodeFromDraftOrder']>), 'couponCodes'>);
+}
+
+export namespace DraftOrderEligibleShippingMethods {
+  export type Variables = DraftOrderEligibleShippingMethodsQueryVariables;
+  export type Query = DraftOrderEligibleShippingMethodsQuery;
+  export type EligibleShippingMethodsForDraftOrder = NonNullable<(NonNullable<DraftOrderEligibleShippingMethodsQuery['eligibleShippingMethodsForDraftOrder']>)[number]>;
+}
+
+export namespace SetDraftOrderShippingMethod {
+  export type Variables = SetDraftOrderShippingMethodMutationVariables;
+  export type Mutation = SetDraftOrderShippingMethodMutation;
+  export type SetDraftOrderShippingMethod = (NonNullable<SetDraftOrderShippingMethodMutation['setDraftOrderShippingMethod']>);
+  export type ErrorResultInlineFragment = (DiscriminateUnion<(NonNullable<SetDraftOrderShippingMethodMutation['setDraftOrderShippingMethod']>), { __typename?: 'ErrorResult' }>);
+}
+
 export namespace IdTest1 {
   export type Variables = IdTest1QueryVariables;
   export type Query = IdTest1Query;

+ 22 - 24
packages/core/e2e/graphql/generated-e2e-shop-types.ts

@@ -1588,7 +1588,6 @@ export type Mutation = {
 export type MutationAddItemToOrderArgs = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1600,7 +1599,6 @@ export type MutationRemoveOrderLineArgs = {
 export type MutationAdjustOrderLineArgs = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1839,7 +1837,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -1861,10 +1859,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   id?: Maybe<IdOperators>;
   createdAt?: Maybe<DateOperators>;
@@ -1881,7 +1875,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -1985,17 +1978,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderList = PaginatedList & {
@@ -3012,12 +2995,8 @@ export type UpdateCustomerInput = {
 
 export type UpdateCustomerPasswordResult = Success | InvalidCredentialsError | PasswordValidationError | NativeAuthStrategyError;
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;
@@ -3380,6 +3359,17 @@ export type GetCustomerOrdersQueryVariables = Exact<{ [key: string]: never; }>;
 
 export type GetCustomerOrdersQuery = { activeOrder?: Maybe<{ customer?: Maybe<{ orders: { items: Array<Pick<Order, 'id'>> } }> }> };
 
+export type GetActiveCustomerOrdersQueryVariables = Exact<{ [key: string]: never; }>;
+
+
+export type GetActiveCustomerOrdersQuery = { activeCustomer?: Maybe<(
+    Pick<Customer, 'id'>
+    & { orders: (
+      Pick<OrderList, 'totalItems'>
+      & { items: Array<Pick<Order, 'id' | 'state'>> }
+    ) }
+  )> };
+
 export type ApplyCouponCodeMutationVariables = Exact<{
   couponCode: Scalars['String'];
 }>;
@@ -3751,6 +3741,14 @@ export namespace GetCustomerOrders {
   export type Items = NonNullable<(NonNullable<(NonNullable<(NonNullable<(NonNullable<GetCustomerOrdersQuery['activeOrder']>)['customer']>)['orders']>)['items']>)[number]>;
 }
 
+export namespace GetActiveCustomerOrders {
+  export type Variables = GetActiveCustomerOrdersQueryVariables;
+  export type Query = GetActiveCustomerOrdersQuery;
+  export type ActiveCustomer = (NonNullable<GetActiveCustomerOrdersQuery['activeCustomer']>);
+  export type Orders = (NonNullable<(NonNullable<GetActiveCustomerOrdersQuery['activeCustomer']>)['orders']>);
+  export type Items = NonNullable<(NonNullable<(NonNullable<(NonNullable<GetActiveCustomerOrdersQuery['activeCustomer']>)['orders']>)['items']>)[number]>;
+}
+
 export namespace ApplyCouponCode {
   export type Variables = ApplyCouponCodeMutationVariables;
   export type Mutation = ApplyCouponCodeMutation;

+ 15 - 0
packages/core/e2e/graphql/shop-definitions.ts

@@ -684,6 +684,21 @@ export const GET_ACTIVE_ORDER_ORDERS = gql`
     }
 `;
 
+export const GET_ACTIVE_CUSTOMER_ORDERS = gql`
+    query GetActiveCustomerOrders {
+        activeCustomer {
+            id
+            orders {
+                totalItems
+                items {
+                    id
+                    state
+                }
+            }
+        }
+    }
+`;
+
 export const APPLY_COUPON_CODE = gql`
     mutation ApplyCouponCode($couponCode: String!) {
         applyCouponCode(couponCode: $couponCode) {

+ 4 - 1
packages/core/src/common/finite-state-machine/validate-transition-definition.spec.ts

@@ -18,7 +18,10 @@ describe('FSM validateTransitionDefinition()', () => {
     it('valid complex definition', () => {
         const orderStateTransitions: Transitions<OrderState> = {
             Created: {
-                to: ['AddingItems'],
+                to: ['AddingItems', 'Draft'],
+            },
+            Draft: {
+                to: ['ArrangingPayment'],
             },
             AddingItems: {
                 to: ['ArrangingPayment', 'Cancelled'],

+ 1 - 0
packages/core/src/service/services/order.service.ts

@@ -321,6 +321,7 @@ export class OrderService {
                 channelId: ctx.channelId,
                 ctx,
             })
+            .andWhere('order.state != "Draft"')
             .andWhere('order.customer.id = :customerId', { customerId })
             .getManyAndCount()
             .then(([items, totalItems]) => {

+ 3 - 27
packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts

@@ -23,13 +23,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -67,13 +65,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2262,7 +2258,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3318,7 +3313,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3340,10 +3335,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3362,7 +3353,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3466,17 +3456,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5277,13 +5257,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 27
packages/payments-plugin/e2e/graphql/generated-admin-types.ts

@@ -23,13 +23,11 @@ export type AddFulfillmentToOrderResult = Fulfillment | EmptyOrderLineSelectionE
 export type AddItemInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddItemToDraftOrderInput = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AddManualPaymentToOrderResult = Order | ManualPaymentStateError;
@@ -67,13 +65,11 @@ export type Address = Node & {
 export type AdjustDraftOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type AdjustOrderLineInput = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 export type Adjustment = {
@@ -2262,7 +2258,6 @@ export type ModifyOrderInput = {
   refund?: Maybe<AdministratorRefundInput>;
   options?: Maybe<ModifyOrderOptions>;
   couponCodes?: Maybe<Array<Scalars['String']>>;
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
 };
 
 export type ModifyOrderOptions = {
@@ -3318,7 +3313,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -3340,10 +3335,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   customerLastName?: Maybe<StringOperators>;
   transactionId?: Maybe<StringOperators>;
@@ -3362,7 +3353,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -3466,17 +3456,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderLineInput = {
@@ -5277,13 +5257,9 @@ export type UpdateOrderAddressInput = {
   phoneNumber?: Maybe<Scalars['String']>;
 };
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
   id: Scalars['ID'];
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 24
packages/payments-plugin/e2e/graphql/generated-shop-types.ts

@@ -1588,7 +1588,6 @@ export type Mutation = {
 export type MutationAddItemToOrderArgs = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1600,7 +1599,6 @@ export type MutationRemoveOrderLineArgs = {
 export type MutationAdjustOrderLineArgs = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1839,7 +1837,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -1861,10 +1859,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   id?: Maybe<IdOperators>;
   createdAt?: Maybe<DateOperators>;
@@ -1881,7 +1875,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -1985,17 +1978,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderList = PaginatedList & {
@@ -3012,12 +2995,8 @@ export type UpdateCustomerInput = {
 
 export type UpdateCustomerPasswordResult = Success | InvalidCredentialsError | PasswordValidationError | NativeAuthStrategyError;
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

+ 3 - 26
packages/payments-plugin/src/mollie/graphql/generated-shop-types.ts

@@ -1689,7 +1689,6 @@ export type Mutation = {
 export type MutationAddItemToOrderArgs = {
   productVariantId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1701,7 +1700,6 @@ export type MutationAddPaymentToOrderArgs = {
 export type MutationAdjustOrderLineArgs = {
   orderLineId: Scalars['ID'];
   quantity: Scalars['Int'];
-  customFields?: Maybe<OrderLineCustomFieldsInput>;
 };
 
 
@@ -1950,7 +1948,7 @@ export type Order = Node & {
   /** A summary of the taxes being applied to this Order */
   taxSummary: Array<OrderTaxSummary>;
   history: HistoryEntryList;
-  customFields?: Maybe<OrderCustomFields>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 
@@ -1973,11 +1971,6 @@ export type OrderAddress = {
   customFields?: Maybe<Scalars['JSON']>;
 };
 
-export type OrderCustomFields = {
-  __typename?: 'OrderCustomFields';
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type OrderFilterParameter = {
   id?: Maybe<IdOperators>;
   createdAt?: Maybe<DateOperators>;
@@ -1994,7 +1987,6 @@ export type OrderFilterParameter = {
   shippingWithTax?: Maybe<NumberOperators>;
   total?: Maybe<NumberOperators>;
   totalWithTax?: Maybe<NumberOperators>;
-  tags?: Maybe<StringListOperators>;
 };
 
 export type OrderItem = Node & {
@@ -2101,18 +2093,7 @@ export type OrderLine = Node & {
   taxLines: Array<TaxLine>;
   order: Order;
   fulfillments?: Maybe<Array<Fulfillment>>;
-  customFields?: Maybe<OrderLineCustomFields>;
-};
-
-export type OrderLineCustomFields = {
-  __typename?: 'OrderLineCustomFields';
-  referrer?: Maybe<Customer>;
-  description?: Maybe<Scalars['String']>;
-};
-
-export type OrderLineCustomFieldsInput = {
-  referrerId?: Maybe<Scalars['ID']>;
-  description?: Maybe<Scalars['String']>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type OrderList = PaginatedList & {
@@ -3188,12 +3169,8 @@ export type UpdateCustomerInput = {
 
 export type UpdateCustomerPasswordResult = Success | InvalidCredentialsError | PasswordValidationError | NativeAuthStrategyError;
 
-export type UpdateOrderCustomFieldsInput = {
-  tags?: Maybe<Array<Scalars['String']>>;
-};
-
 export type UpdateOrderInput = {
-  customFields?: Maybe<UpdateOrderCustomFieldsInput>;
+  customFields?: Maybe<Scalars['JSON']>;
 };
 
 export type UpdateOrderItemsResult = Order | OrderModificationError | OrderLimitError | NegativeQuantityError | InsufficientStockError;

Різницю між файлами не показано, бо вона завелика
+ 0 - 0
schema-admin.json


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
schema-shop.json


Деякі файли не було показано, через те що забагато файлів було змінено