diff --git a/schema.graphql b/schema.graphql index 0ec911388..6ff5c8903 100644 --- a/schema.graphql +++ b/schema.graphql @@ -3027,6 +3027,7 @@ type Order implements Node & ObjectWithMetadata { discountName: String @deprecated(reason: "Use discounts field. This field will be removed in Saleor 4.0.") translatedDiscountName: String @deprecated(reason: "Use discounts field. This field will be removed in Saleor 4.0.") discounts: [OrderDiscount!] + errors: [OrderError!]! } enum OrderAction { @@ -3140,7 +3141,7 @@ type OrderError { message: String code: OrderErrorCode! warehouse: ID - orderLine: ID + orderLines: [ID!] variants: [ID!] addressType: AddressTypeEnum } @@ -3260,6 +3261,8 @@ enum OrderEventsEnum { ORDER_DISCOUNT_DELETED ORDER_LINE_DISCOUNT_UPDATED ORDER_LINE_DISCOUNT_REMOVED + ORDER_LINE_PRODUCT_DELETED + ORDER_LINE_VARIANT_DELETED UPDATED_ADDRESS EMAIL_SENT CONFIRMED diff --git a/src/orders/components/OrderFulfillPage/OrderFulfillPage.stories.tsx b/src/orders/components/OrderFulfillPage/OrderFulfillPage.stories.tsx index a1cb38d07..8d2690daa 100644 --- a/src/orders/components/OrderFulfillPage/OrderFulfillPage.stories.tsx +++ b/src/orders/components/OrderFulfillPage/OrderFulfillPage.stories.tsx @@ -36,7 +36,7 @@ storiesOf("Views / Orders / Fulfill order", module) __typename: "OrderError", code: OrderErrorCode.INSUFFICIENT_STOCK, field: null, - orderLine: orderToFulfill.lines[0].id, + orderLines: [orderToFulfill.lines[0].id], warehouse: warehouseList[0].id, addressType: null } diff --git a/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx b/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx index 36f724627..ecb0bbf43 100644 --- a/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx +++ b/src/orders/components/OrderFulfillPage/OrderFulfillPage.tsx @@ -215,6 +215,31 @@ const OrderFulfillPage: React.FC = props => { return isAtLeastOneFulfilled && areProperlyFulfilled; }; + const isStockError = ( + overfulfill: boolean, + formsetStock: { quantity: number }, + availableQuantity: number, + warehouse: WarehouseFragment, + line: OrderFulfillData_order_lines, + errors: FulfillOrder_orderFulfill_errors[] + ) => { + if (overfulfill) { + return true; + } + + const isQuantityLargerThanAvailable = + line.variant.trackInventory && formsetStock.quantity > availableQuantity; + + const isError = !!errors?.find( + err => + err.warehouse === warehouse.id && + err.orderLines.find((id: string) => id === line.id) && + err.code === OrderErrorCode.INSUFFICIENT_STOCK + ); + + return isQuantityLargerThanAvailable || isError; + }; + return ( @@ -422,19 +447,14 @@ const OrderFulfillPage: React.FC = props => { ) ) } - error={ - overfulfill || - (line.variant.trackInventory && - formsetStock.quantity > - availableQuantity) || - !!errors?.find( - err => - err.warehouse === warehouse.id && - err.orderLine === line.id && - err.code === - OrderErrorCode.INSUFFICIENT_STOCK - ) - } + error={isStockError( + overfulfill, + formsetStock, + availableQuantity, + warehouse, + line, + errors + )} InputProps={{ endAdornment: line.variant .trackInventory && ( diff --git a/src/orders/mutations.ts b/src/orders/mutations.ts index e5d0150a7..b7859f5b9 100644 --- a/src/orders/mutations.ts +++ b/src/orders/mutations.ts @@ -675,7 +675,7 @@ const fulfillOrder = gql` errors { ...OrderErrorFragment warehouse - orderLine + orderLines } order { ...OrderDetailsFragment diff --git a/src/orders/types/FulfillOrder.ts b/src/orders/types/FulfillOrder.ts index 5f4419d60..b794b9d52 100644 --- a/src/orders/types/FulfillOrder.ts +++ b/src/orders/types/FulfillOrder.ts @@ -15,7 +15,7 @@ export interface FulfillOrder_orderFulfill_errors { field: string | null; addressType: AddressTypeEnum | null; warehouse: string | null; - orderLine: string | null; + orderLines: string[] | null; } export interface FulfillOrder_orderFulfill_order_metadata { diff --git a/src/types/globalTypes.ts b/src/types/globalTypes.ts index 9a04580fa..22318cdfd 100644 --- a/src/types/globalTypes.ts +++ b/src/types/globalTypes.ts @@ -679,6 +679,8 @@ export enum OrderEventsEnum { ORDER_FULLY_PAID = "ORDER_FULLY_PAID", ORDER_LINE_DISCOUNT_REMOVED = "ORDER_LINE_DISCOUNT_REMOVED", ORDER_LINE_DISCOUNT_UPDATED = "ORDER_LINE_DISCOUNT_UPDATED", + ORDER_LINE_PRODUCT_DELETED = "ORDER_LINE_PRODUCT_DELETED", + ORDER_LINE_VARIANT_DELETED = "ORDER_LINE_VARIANT_DELETED", ORDER_MARKED_AS_PAID = "ORDER_MARKED_AS_PAID", ORDER_REPLACEMENT_CREATED = "ORDER_REPLACEMENT_CREATED", OTHER = "OTHER",