feat: update return request (#8302)
This commit is contained in:
@@ -420,6 +420,25 @@ medusaIntegrationTestRunner({
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
|
|
||||||
|
result = await api.post(
|
||||||
|
`/admin/returns/${returnId}`,
|
||||||
|
{
|
||||||
|
location_id: location.id,
|
||||||
|
metadata: { hello: "world" },
|
||||||
|
no_notification: true,
|
||||||
|
},
|
||||||
|
adminHeaders
|
||||||
|
)
|
||||||
|
|
||||||
|
expect(result.data.return).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
id: returnId,
|
||||||
|
location_id: location.id,
|
||||||
|
metadata: { hello: "world" },
|
||||||
|
no_notification: true,
|
||||||
|
})
|
||||||
|
)
|
||||||
|
|
||||||
const item = order.items[0]
|
const item = order.items[0]
|
||||||
|
|
||||||
result = await api.post(
|
result = await api.post(
|
||||||
|
|||||||
@@ -151,6 +151,29 @@ export const useRemoveReturnItem = (
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const useUpdateReturn = (
|
||||||
|
id: string,
|
||||||
|
orderId: string,
|
||||||
|
options?: UseMutationOptions<
|
||||||
|
HttpTypes.AdminReturnResponse,
|
||||||
|
Error,
|
||||||
|
HttpTypes.AdminUpdateReturnRequest
|
||||||
|
>
|
||||||
|
) => {
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (payload: HttpTypes.AdminUpdateReturnRequest) => {
|
||||||
|
return sdk.admin.return.updateRequest(id, payload)
|
||||||
|
},
|
||||||
|
onSuccess: (data: any, variables: any, context: any) => {
|
||||||
|
queryClient.invalidateQueries({
|
||||||
|
queryKey: ordersQueryKeys.preview(orderId),
|
||||||
|
})
|
||||||
|
options?.onSuccess?.(data, variables, context)
|
||||||
|
},
|
||||||
|
...options,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export const useAddReturnShipping = (
|
export const useAddReturnShipping = (
|
||||||
id: string,
|
id: string,
|
||||||
orderId: string,
|
orderId: string,
|
||||||
|
|||||||
+10
-1
@@ -37,6 +37,7 @@ import {
|
|||||||
useConfirmReturnRequest,
|
useConfirmReturnRequest,
|
||||||
useDeleteReturnShipping,
|
useDeleteReturnShipping,
|
||||||
useRemoveReturnItem,
|
useRemoveReturnItem,
|
||||||
|
useUpdateReturn,
|
||||||
useUpdateReturnItem,
|
useUpdateReturnItem,
|
||||||
useUpdateReturnShipping,
|
useUpdateReturnShipping,
|
||||||
} from "../../../../../hooks/api/returns"
|
} from "../../../../../hooks/api/returns"
|
||||||
@@ -91,6 +92,8 @@ export const ReturnCreateForm = ({
|
|||||||
|
|
||||||
const { mutateAsync: cancelReturnRequest, isPending: isCanceling } =
|
const { mutateAsync: cancelReturnRequest, isPending: isCanceling } =
|
||||||
useCancelReturnRequest(activeReturn.id, order.id)
|
useCancelReturnRequest(activeReturn.id, order.id)
|
||||||
|
const { mutateAsync: updateReturnRequest, isPending: isUpdating } =
|
||||||
|
useUpdateReturn(activeReturn.id, order.id)
|
||||||
|
|
||||||
const { mutateAsync: addReturnShipping, isPending: isAddingReturnShipping } =
|
const { mutateAsync: addReturnShipping, isPending: isAddingReturnShipping } =
|
||||||
useAddReturnShipping(activeReturn.id, order.id)
|
useAddReturnShipping(activeReturn.id, order.id)
|
||||||
@@ -122,7 +125,8 @@ export const ReturnCreateForm = ({
|
|||||||
isDeletingReturnShipping ||
|
isDeletingReturnShipping ||
|
||||||
isAddingReturnItem ||
|
isAddingReturnItem ||
|
||||||
isRemovingReturnItem ||
|
isRemovingReturnItem ||
|
||||||
isUpdatingReturnItem
|
isUpdatingReturnItem ||
|
||||||
|
isUpdating
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FORM
|
* FORM
|
||||||
@@ -254,6 +258,10 @@ export const ReturnCreateForm = ({
|
|||||||
setIsOpen("items", false)
|
setIsOpen("items", false)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onLocationChange = async (selectedLocationId: string) => {
|
||||||
|
await updateReturnRequest({ location_id: selectedLocationId })
|
||||||
|
}
|
||||||
|
|
||||||
const onShippingOptionChange = async (selectedOptionId: string) => {
|
const onShippingOptionChange = async (selectedOptionId: string) => {
|
||||||
const promises = preview.shipping_methods
|
const promises = preview.shipping_methods
|
||||||
.map((s) => s.actions?.find((a) => a.action === "SHIPPING_ADD")?.id)
|
.map((s) => s.actions?.find((a) => a.action === "SHIPPING_ADD")?.id)
|
||||||
@@ -477,6 +485,7 @@ export const ReturnCreateForm = ({
|
|||||||
value={value}
|
value={value}
|
||||||
onChange={(v) => {
|
onChange={(v) => {
|
||||||
onChange(v)
|
onChange(v)
|
||||||
|
onLocationChange(v)
|
||||||
}}
|
}}
|
||||||
{...field}
|
{...field}
|
||||||
options={(stock_locations ?? []).map(
|
options={(stock_locations ?? []).map(
|
||||||
|
|||||||
@@ -46,6 +46,8 @@ export * from "./return/remove-return-shipping-method"
|
|||||||
export * from "./return/request-item-return"
|
export * from "./return/request-item-return"
|
||||||
export * from "./return/update-receive-item-return-request"
|
export * from "./return/update-receive-item-return-request"
|
||||||
export * from "./return/update-request-item-return"
|
export * from "./return/update-request-item-return"
|
||||||
|
export * from "./return/update-return"
|
||||||
export * from "./return/update-return-shipping-method"
|
export * from "./return/update-return-shipping-method"
|
||||||
export * from "./update-order-change-actions"
|
export * from "./update-order-change-actions"
|
||||||
export * from "./update-tax-lines"
|
export * from "./update-tax-lines"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,73 @@
|
|||||||
|
import { OrderChangeDTO, OrderWorkflow, ReturnDTO } from "@medusajs/types"
|
||||||
|
import { OrderChangeStatus } from "@medusajs/utils"
|
||||||
|
import {
|
||||||
|
WorkflowData,
|
||||||
|
createStep,
|
||||||
|
createWorkflow,
|
||||||
|
transform,
|
||||||
|
} from "@medusajs/workflows-sdk"
|
||||||
|
import { useRemoteQueryStep } from "../../../common"
|
||||||
|
import { updateReturnsStep } from "../../steps"
|
||||||
|
import { previewOrderChangeStep } from "../../steps/preview-order-change"
|
||||||
|
import {
|
||||||
|
throwIfIsCancelled,
|
||||||
|
throwIfOrderChangeIsNotActive,
|
||||||
|
} from "../../utils/order-validation"
|
||||||
|
|
||||||
|
const validationStep = createStep(
|
||||||
|
"validate-update-return",
|
||||||
|
async function ({
|
||||||
|
orderChange,
|
||||||
|
orderReturn,
|
||||||
|
}: {
|
||||||
|
orderReturn: ReturnDTO
|
||||||
|
orderChange: OrderChangeDTO
|
||||||
|
}) {
|
||||||
|
throwIfIsCancelled(orderReturn, "Return")
|
||||||
|
throwIfOrderChangeIsNotActive({ orderChange })
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
export const updateReturnWorkflowId = "update-return"
|
||||||
|
export const updateReturnWorkflow = createWorkflow(
|
||||||
|
updateReturnWorkflowId,
|
||||||
|
function (
|
||||||
|
input: WorkflowData<OrderWorkflow.UpdateReturnWorkflowInput>
|
||||||
|
): WorkflowData {
|
||||||
|
const orderReturn: ReturnDTO = useRemoteQueryStep({
|
||||||
|
entry_point: "return",
|
||||||
|
fields: ["id", "status", "order_id", "canceled_at"],
|
||||||
|
variables: { id: input.return_id },
|
||||||
|
list: false,
|
||||||
|
throw_if_key_not_found: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
const orderChange: OrderChangeDTO = useRemoteQueryStep({
|
||||||
|
entry_point: "order_change",
|
||||||
|
fields: ["id", "status", "version", "actions.*"],
|
||||||
|
variables: {
|
||||||
|
filters: {
|
||||||
|
order_id: orderReturn.order_id,
|
||||||
|
return_id: orderReturn.id,
|
||||||
|
status: [OrderChangeStatus.PENDING, OrderChangeStatus.REQUESTED],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
list: false,
|
||||||
|
}).config({ name: "order-change-query" })
|
||||||
|
|
||||||
|
validationStep({ orderReturn, orderChange })
|
||||||
|
|
||||||
|
const updateData = transform({ input }, ({ input }) => {
|
||||||
|
return {
|
||||||
|
id: input.return_id,
|
||||||
|
location_id: input.location_id,
|
||||||
|
no_notification: input.no_notification,
|
||||||
|
metadata: input.metadata,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
updateReturnsStep([updateData])
|
||||||
|
|
||||||
|
return previewOrderChangeStep(orderReturn.order_id)
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
import { FindParams, HttpTypes, SelectParams } from "@medusajs/types"
|
import { HttpTypes, SelectParams } from "@medusajs/types"
|
||||||
|
|
||||||
import { Client } from "../client"
|
import { Client } from "../client"
|
||||||
import { ClientHeaders } from "../types"
|
import { ClientHeaders } from "../types"
|
||||||
@@ -178,4 +178,21 @@ export class Return {
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async updateRequest(
|
||||||
|
id: string,
|
||||||
|
body: HttpTypes.AdminUpdateReturnRequest,
|
||||||
|
query?: HttpTypes.SelectParams,
|
||||||
|
headers?: ClientHeaders
|
||||||
|
) {
|
||||||
|
return await this.client.fetch<HttpTypes.AdminReturnResponse>(
|
||||||
|
`/admin/returns/${id}`,
|
||||||
|
{
|
||||||
|
method: "POST",
|
||||||
|
headers,
|
||||||
|
body,
|
||||||
|
query,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ export interface AdminConfirmReturnRequest {
|
|||||||
no_notification?: boolean
|
no_notification?: boolean
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface AdminUpdateReturnRequest {
|
||||||
|
location_id?: string
|
||||||
|
no_notification?: boolean
|
||||||
|
metadata?: Record<string, unknown> | null
|
||||||
|
}
|
||||||
|
|
||||||
export interface AdminReturnFilters extends FindParams {
|
export interface AdminReturnFilters extends FindParams {
|
||||||
id?: string[] | string | OperatorMap<string | string[]>
|
id?: string[] | string | OperatorMap<string | string[]>
|
||||||
order_id?: string[] | string | OperatorMap<string | string[]>
|
order_id?: string[] | string | OperatorMap<string | string[]>
|
||||||
|
|||||||
@@ -13,3 +13,5 @@ export * from "./items"
|
|||||||
export * from "./receive-return"
|
export * from "./receive-return"
|
||||||
export * from "./request-item-return"
|
export * from "./request-item-return"
|
||||||
export * from "./shipping-method"
|
export * from "./shipping-method"
|
||||||
|
export * from "./update-return"
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
export interface UpdateReturnWorkflowInput {
|
||||||
|
return_id: string
|
||||||
|
location_id?: string
|
||||||
|
no_notification?: boolean
|
||||||
|
metadata?: Record<string, any> | null
|
||||||
|
}
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import { updateReturnWorkflow } from "@medusajs/core-flows"
|
||||||
import {
|
import {
|
||||||
ContainerRegistrationKeys,
|
ContainerRegistrationKeys,
|
||||||
remoteQueryObjectFromString,
|
remoteQueryObjectFromString,
|
||||||
@@ -6,6 +7,7 @@ import {
|
|||||||
AuthenticatedMedusaRequest,
|
AuthenticatedMedusaRequest,
|
||||||
MedusaResponse,
|
MedusaResponse,
|
||||||
} from "../../../../types/routing"
|
} from "../../../../types/routing"
|
||||||
|
import { AdminPostReturnsReturnReqSchemaType } from "../validators"
|
||||||
|
|
||||||
export const GET = async (
|
export const GET = async (
|
||||||
req: AuthenticatedMedusaRequest,
|
req: AuthenticatedMedusaRequest,
|
||||||
@@ -32,3 +34,34 @@ export const GET = async (
|
|||||||
return: orderReturn,
|
return: orderReturn,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const POST = async (
|
||||||
|
req: AuthenticatedMedusaRequest<AdminPostReturnsReturnReqSchemaType>,
|
||||||
|
res: MedusaResponse
|
||||||
|
) => {
|
||||||
|
const { id } = req.params
|
||||||
|
|
||||||
|
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
|
||||||
|
|
||||||
|
const { result } = await updateReturnWorkflow(req.scope).run({
|
||||||
|
input: { return_id: id, ...req.validatedBody },
|
||||||
|
})
|
||||||
|
|
||||||
|
const queryObject = remoteQueryObjectFromString({
|
||||||
|
entryPoint: "return",
|
||||||
|
variables: {
|
||||||
|
id,
|
||||||
|
filters: {
|
||||||
|
...req.filterableFields,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fields: req.remoteQueryConfig.fields,
|
||||||
|
})
|
||||||
|
|
||||||
|
const [orderReturn] = await remoteQuery(queryObject)
|
||||||
|
|
||||||
|
res.json({
|
||||||
|
order_preview: result,
|
||||||
|
return: orderReturn,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,13 +5,14 @@ import * as QueryConfig from "./query-config"
|
|||||||
import {
|
import {
|
||||||
AdminGetOrdersOrderParams,
|
AdminGetOrdersOrderParams,
|
||||||
AdminGetOrdersParams,
|
AdminGetOrdersParams,
|
||||||
|
AdminPostCancelReturnReqSchema,
|
||||||
AdminPostReceiveReturnItemsReqSchema,
|
AdminPostReceiveReturnItemsReqSchema,
|
||||||
AdminPostReceiveReturnsReqSchema,
|
AdminPostReceiveReturnsReqSchema,
|
||||||
AdminPostCancelReturnReqSchema,
|
|
||||||
AdminPostReturnsConfirmRequestReqSchema,
|
AdminPostReturnsConfirmRequestReqSchema,
|
||||||
AdminPostReturnsReqSchema,
|
AdminPostReturnsReqSchema,
|
||||||
AdminPostReturnsRequestItemsActionReqSchema,
|
AdminPostReturnsRequestItemsActionReqSchema,
|
||||||
AdminPostReturnsRequestItemsReqSchema,
|
AdminPostReturnsRequestItemsReqSchema,
|
||||||
|
AdminPostReturnsReturnReqSchema,
|
||||||
AdminPostReturnsShippingActionReqSchema,
|
AdminPostReturnsShippingActionReqSchema,
|
||||||
AdminPostReturnsShippingReqSchema,
|
AdminPostReturnsShippingReqSchema,
|
||||||
} from "./validators"
|
} from "./validators"
|
||||||
@@ -37,6 +38,17 @@ export const adminReturnRoutesMiddlewares: MiddlewareRoute[] = [
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
method: ["POST"],
|
||||||
|
matcher: "/admin/returns/:id",
|
||||||
|
middlewares: [
|
||||||
|
validateAndTransformBody(AdminPostReturnsReturnReqSchema),
|
||||||
|
validateAndTransformQuery(
|
||||||
|
AdminGetOrdersOrderParams,
|
||||||
|
QueryConfig.retrieveTransformQueryConfig
|
||||||
|
),
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
method: ["POST"],
|
method: ["POST"],
|
||||||
matcher: "/admin/returns",
|
matcher: "/admin/returns",
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ export const defaultAdminReturnFields = [
|
|||||||
"location_id",
|
"location_id",
|
||||||
"order_version",
|
"order_version",
|
||||||
"status",
|
"status",
|
||||||
|
"metadata",
|
||||||
|
"no_notification",
|
||||||
"refund_amount",
|
"refund_amount",
|
||||||
"created_at",
|
"created_at",
|
||||||
"updated_at",
|
"updated_at",
|
||||||
|
|||||||
@@ -50,6 +50,15 @@ export type AdminPostReturnsReqSchemaType = z.infer<
|
|||||||
typeof AdminPostReturnsReqSchema
|
typeof AdminPostReturnsReqSchema
|
||||||
>
|
>
|
||||||
|
|
||||||
|
export const AdminPostReturnsReturnReqSchema = z.object({
|
||||||
|
location_id: z.string().optional(),
|
||||||
|
no_notification: z.boolean().optional(),
|
||||||
|
metadata: z.record(z.unknown()).nullish(),
|
||||||
|
})
|
||||||
|
export type AdminPostReturnsReturnReqSchemaType = z.infer<
|
||||||
|
typeof AdminPostReturnsReturnReqSchema
|
||||||
|
>
|
||||||
|
|
||||||
export const AdminPostOrderExchangesReqSchema = z.object({
|
export const AdminPostOrderExchangesReqSchema = z.object({
|
||||||
order_id: z.string(),
|
order_id: z.string(),
|
||||||
description: z.string().optional(),
|
description: z.string().optional(),
|
||||||
|
|||||||
Reference in New Issue
Block a user