From 44265a928d4e44b0ffb7e60085f8a3906cf90826 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Frane=20Poli=C4=87?= <16856471+fPolic@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:29:12 +0100 Subject: [PATCH] feat(dashboard): transfer order admin (#10189) **What** - request order transfer from order details page - timeline events --- CLOSES CMRC-706 CLOSES CMRC-707 --- .../admin/dashboard/src/hooks/api/orders.tsx | 28 +- .../src/i18n/translations/$schema.json | 60 +++- .../dashboard/src/i18n/translations/en.json | 14 + .../providers/router-provider/route-map.tsx | 5 + .../customer-order-section.tsx | 2 +- .../order-activity-section/order-timeline.tsx | 79 ++++- .../order-customer-section.tsx | 2 +- .../order-general-section.tsx | 2 +- .../create-order-transfer-form.tsx | 150 +++++++++ .../create-order-transfer-form/index.ts | 1 + .../transfer-header.tsx | 303 ++++++++++++++++++ .../orders/order-request-transfer/index.ts | 1 + .../order-request-transfer.tsx | 26 ++ packages/core/js-sdk/src/admin/order.ts | 130 +++++--- .../types/src/http/order/admin/payload.ts | 14 +- packages/core/types/src/http/order/common.ts | 23 +- 16 files changed, 765 insertions(+), 75 deletions(-) create mode 100644 packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/create-order-transfer-form.tsx create mode 100644 packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/index.ts create mode 100644 packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/transfer-header.tsx create mode 100644 packages/admin/dashboard/src/routes/orders/order-request-transfer/index.ts create mode 100644 packages/admin/dashboard/src/routes/orders/order-request-transfer/order-request-transfer.tsx diff --git a/packages/admin/dashboard/src/hooks/api/orders.tsx b/packages/admin/dashboard/src/hooks/api/orders.tsx index f694a00e84..17eddc4b5f 100644 --- a/packages/admin/dashboard/src/hooks/api/orders.tsx +++ b/packages/admin/dashboard/src/hooks/api/orders.tsx @@ -251,13 +251,13 @@ export const useMarkOrderFulfillmentAsDelivered = ( export const useCancelOrder = ( orderId: string, - options?: UseMutationOptions + options?: UseMutationOptions ) => { return useMutation({ - mutationFn: (id) => sdk.admin.order.cancel(id), + mutationFn: () => sdk.admin.order.cancel(orderId), onSuccess: (data: any, variables: any, context: any) => { queryClient.invalidateQueries({ - queryKey: ordersQueryKeys.details(), + queryKey: ordersQueryKeys.detail(orderId), }) queryClient.invalidateQueries({ @@ -269,3 +269,25 @@ export const useCancelOrder = ( ...options, }) } + +export const useRequestTransferOrder = ( + orderId: string, + options?: UseMutationOptions< + HttpTypes.AdminOrderResponse, + FetchError, + HttpTypes.AdminRequestOrderTransfer + > +) => { + return useMutation({ + mutationFn: (payload: HttpTypes.AdminRequestOrderTransfer) => + sdk.admin.order.requestTransfer(orderId, payload), + onSuccess: (data: any, variables: any, context: any) => { + queryClient.invalidateQueries({ + queryKey: ordersQueryKeys.preview(orderId), + }) + + options?.onSuccess?.(data, variables, context) + }, + ...options, + }) +} diff --git a/packages/admin/dashboard/src/i18n/translations/$schema.json b/packages/admin/dashboard/src/i18n/translations/$schema.json index 582afa68b3..ee0ac2f1c2 100644 --- a/packages/admin/dashboard/src/i18n/translations/$schema.json +++ b/packages/admin/dashboard/src/i18n/translations/$schema.json @@ -3820,6 +3820,38 @@ ], "additionalProperties": false }, + "transfer": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "requestSuccess": { + "type": "string" + }, + "currentOwner": { + "type": "string" + }, + "newOwner": { + "type": "string" + }, + "currentOwnerDescription": { + "type": "string" + }, + "newOwnerDescription": { + "type": "string" + } + }, + "required": [ + "title", + "requestSuccess", + "currentOwner", + "newOwner", + "currentOwnerDescription", + "newOwnerDescription" + ], + "additionalProperties": false + }, "payment": { "type": "object", "properties": { @@ -5058,6 +5090,12 @@ ], "additionalProperties": false }, + "from": { + "type": "string" + }, + "to": { + "type": "string" + }, "events": { "type": "object", "properties": { @@ -5268,6 +5306,22 @@ "confirmed" ], "additionalProperties": false + }, + "transfer": { + "type": "object", + "properties": { + "requested": { + "type": "string" + }, + "confirmed": { + "type": "string" + } + }, + "required": [ + "requested", + "confirmed" + ], + "additionalProperties": false } }, "required": [ @@ -5280,7 +5334,8 @@ "note", "claim", "exchange", - "edit" + "edit", + "transfer" ], "additionalProperties": false } @@ -5290,6 +5345,8 @@ "showMoreActivities_one", "showMoreActivities_other", "comment", + "from", + "to", "events" ], "additionalProperties": false @@ -5324,6 +5381,7 @@ "onDateFromSalesChannel", "list", "summary", + "transfer", "payment", "edits", "returns", diff --git a/packages/admin/dashboard/src/i18n/translations/en.json b/packages/admin/dashboard/src/i18n/translations/en.json index ae8604bb43..4725c1885b 100644 --- a/packages/admin/dashboard/src/i18n/translations/en.json +++ b/packages/admin/dashboard/src/i18n/translations/en.json @@ -922,6 +922,14 @@ "discountSubtotal": "Discount Subtotal", "taxTotal": "Tax Total" }, + "transfer": { + "title": "Transfer ownership", + "requestSuccess": "Order transfer request sent to: {{email}}.", + "currentOwner": "Current owner", + "newOwner": "New owner", + "currentOwnerDescription": "The customer currently related to this order.", + "newOwnerDescription": "The customer to transfer this order to." + }, "payment": { "title": "Payments", "isReadyToBeCaptured": "Payment <0/> is ready to be captured.", @@ -1225,6 +1233,8 @@ "addButtonText": "Add comment", "deleteButtonText": "Delete comment" }, + "from": "From", + "to": "To", "events": { "common": { "toReturn": "To return", @@ -1277,6 +1287,10 @@ "edit": { "requested": "Order edit #{{editId}} requested", "confirmed": "Order edit #{{editId}} confirmed" + }, + "transfer": { + "requested": "Order transfer #{{transferId}} requested", + "confirmed": "Order transfer #{{transferId}} confirmed" } } }, diff --git a/packages/admin/dashboard/src/providers/router-provider/route-map.tsx b/packages/admin/dashboard/src/providers/router-provider/route-map.tsx index 5ad5068a60..a29027cd8e 100644 --- a/packages/admin/dashboard/src/providers/router-provider/route-map.tsx +++ b/packages/admin/dashboard/src/providers/router-provider/route-map.tsx @@ -317,6 +317,11 @@ export const RouteMap: RouteObject[] = [ lazy: () => import("../../routes/orders/order-create-refund"), }, + { + path: "transfer", + lazy: () => + import("../../routes/orders/order-request-transfer"), + }, ], }, ], diff --git a/packages/admin/dashboard/src/routes/customers/customer-detail/components/customer-order-section/customer-order-section.tsx b/packages/admin/dashboard/src/routes/customers/customer-detail/components/customer-order-section/customer-order-section.tsx index 4b40d8f2be..9a0caecad9 100644 --- a/packages/admin/dashboard/src/routes/customers/customer-detail/components/customer-order-section/customer-order-section.tsx +++ b/packages/admin/dashboard/src/routes/customers/customer-detail/components/customer-order-section/customer-order-section.tsx @@ -102,7 +102,7 @@ const CustomerOrderActions = ({ order }: { order: HttpTypes.AdminOrder }) => { actions: [ { label: t("transferOwnership.label"), - to: `${order.id}/transfer-ownership`, + to: `${order.id}/transfer`, icon: , }, ], diff --git a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-activity-section/order-timeline.tsx b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-activity-section/order-timeline.tsx index 15741b7c29..8e2b17691a 100644 --- a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-activity-section/order-timeline.tsx +++ b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-activity-section/order-timeline.tsx @@ -16,7 +16,11 @@ import { import { useTranslation } from "react-i18next" import { AdminOrderLineItem } from "@medusajs/types" -import { useOrderChanges, useOrderLineItems } from "../../../../../hooks/api" +import { + useCustomer, + useOrderChanges, + useOrderLineItems, +} from "../../../../../hooks/api" import { useCancelClaim, useClaims } from "../../../../../hooks/api/claims" import { useCancelExchange, @@ -113,10 +117,12 @@ const useActivityItems = (order: AdminOrder): Activity[] => { const { t } = useTranslation() const { order_changes: orderChanges = [] } = useOrderChanges(order.id, { - change_type: ["edit", "claim", "exchange", "return"], + change_type: ["edit", "claim", "exchange", "return", "transfer"], }) - const missingLineItemIds = getMissingLineItemIds(order, orderChanges) + const rmaChanges = orderChanges.filter((oc) => oc.change_type !== "transfer") + + const missingLineItemIds = getMissingLineItemIds(order, rmaChanges) const { order_items: removedLineItems = [] } = useOrderLineItems( order.id, @@ -125,7 +131,7 @@ const useActivityItems = (order: AdminOrder): Activity[] => { item_id: missingLineItemIds, }, { - enabled: !!orderChanges.length, + enabled: !!rmaChanges.length, } ) @@ -370,16 +376,39 @@ const useActivityItems = (order: AdminOrder): Activity[] => { edit.status === "requested" ? edit.requested_at : edit.status === "confirmed" - ? edit.confirmed_at - : edit.status === "declined" - ? edit.declined_at - : edit.status === "canceled" - ? edit.canceled_at - : edit.created_at, + ? edit.confirmed_at + : edit.status === "declined" + ? edit.declined_at + : edit.status === "canceled" + ? edit.canceled_at + : edit.created_at, children: isConfirmed ? : null, }) } + for (const transfer of orderChanges.filter( + (oc) => oc.change_type === "transfer" + )) { + if (transfer.requested_at) { + items.push({ + title: t(`orders.activity.events.transfer.requested`, { + transferId: transfer.id.slice(-7), + }), + timestamp: transfer.requested_at, + children: , + }) + } + + if (transfer.confirmed_at) { + items.push({ + title: t(`orders.activity.events.transfer.confirmed`, { + transferId: transfer.id.slice(-7), + }), + timestamp: transfer.confirmed_at, + }) + } + } + // for (const note of notes || []) { // items.push({ // title: t("orders.activity.events.note.comment"), @@ -862,6 +891,36 @@ const OrderEditBody = ({ edit }: { edit: AdminOrderChange }) => { ) } +const TransferOrderRequestBody = ({ + transfer, +}: { + transfer: AdminOrderChange +}) => { + const { t } = useTranslation() + + const action = transfer.actions[0] + const { customer } = useCustomer(action.reference_id) + + /** + * TODO: change original_email to customer info when action details is changed + */ + + return ( +
+ + {t("orders.activity.from")}: {action.details?.original_email} + + + + {t("orders.activity.to")}:{" "} + {customer?.first_name + ? `${customer?.first_name} ${customer?.last_name}` + : customer?.email} + +
+ ) +} + /** * Returns count of added and removed item quantity */ diff --git a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-customer-section/order-customer-section.tsx b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-customer-section/order-customer-section.tsx index 26217333fd..a0f2bbbc2e 100644 --- a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-customer-section/order-customer-section.tsx +++ b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-customer-section/order-customer-section.tsx @@ -33,7 +33,7 @@ const Header = () => { actions: [ { label: t("transferOwnership.label"), - to: `transfer-ownership`, + to: `transfer`, icon: , }, ], diff --git a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-general-section/order-general-section.tsx b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-general-section/order-general-section.tsx index f079a589ac..ac8f9e0097 100644 --- a/packages/admin/dashboard/src/routes/orders/order-detail/components/order-general-section/order-general-section.tsx +++ b/packages/admin/dashboard/src/routes/orders/order-detail/components/order-general-section/order-general-section.tsx @@ -41,7 +41,7 @@ export const OrderGeneralSection = ({ order }: OrderGeneralSectionProps) => { return } - await cancelOrder(order.id) + await cancelOrder() } return ( diff --git a/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/create-order-transfer-form.tsx b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/create-order-transfer-form.tsx new file mode 100644 index 0000000000..39eaa2e904 --- /dev/null +++ b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/create-order-transfer-form.tsx @@ -0,0 +1,150 @@ +import * as zod from "zod" +import { zodResolver } from "@hookform/resolvers/zod" +import { HttpTypes } from "@medusajs/types" +import { Button, Input, toast } from "@medusajs/ui" +import { useForm } from "react-hook-form" +import { useTranslation } from "react-i18next" + +import { Form } from "../../../../../components/common/form" +import { RouteDrawer, useRouteModal } from "../../../../../components/modals" +import { KeyboundForm } from "../../../../../components/utilities/keybound-form" +import { useComboboxData } from "../../../../../hooks/use-combobox-data" +import { Combobox } from "../../../../../components/inputs/combobox" +import { useRequestTransferOrder } from "../../../../../hooks/api" +import { sdk } from "../../../../../lib/client" +import { TransferHeader } from "./transfer-header" + +type CreateOrderTransferFormProps = { + order: HttpTypes.AdminOrder +} + +const CreateOrderTransferSchema = zod.object({ + customer_id: zod.string().min(1), + current_customer_details: zod.string().min(1), +}) + +export function CreateOrderTransferForm({ + order, +}: CreateOrderTransferFormProps) { + const { t } = useTranslation() + const { handleSuccess } = useRouteModal() + + const form = useForm>({ + defaultValues: { + customer_id: "", + current_customer_details: order.customer?.first_name + ? `${order.customer?.first_name} ${order.customer?.last_name} (${order.customer?.email}) ` + : order.customer?.email, + }, + resolver: zodResolver(CreateOrderTransferSchema), + }) + + const customers = useComboboxData({ + queryKey: ["customers"], + queryFn: (params) => + sdk.admin.customer.list({ ...params, has_account: true }), + getOptions: (data) => + data.customers.map((item) => ({ + label: `${item.first_name || ""} ${item.last_name || ""} (${item.email})`, + value: item.id, + })), + }) + + const { mutateAsync, isPending } = useRequestTransferOrder(order.id) + + const handleSubmit = form.handleSubmit(async (data) => { + try { + await mutateAsync({ + customer_id: data.customer_id, + }) + toast.success(t("orders.transfer.requestSuccess", { email: order.email })) + handleSuccess() + } catch (error) { + toast.error((error as Error).message) + } + }) + + return ( + + + +
+ + { + return ( + + {t("orders.transfer.currentOwner")} + + {t("orders.transfer.currentOwnerDescription")} + + + + + + + + + ) + }} + /> + + { + return ( + + {t("orders.transfer.newOwner")} + + {t("orders.transfer.newOwnerDescription")} + + + + + + + + + ) + }} + /> +
+
+ + +
+ + + + + +
+
+
+
+ ) +} diff --git a/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/index.ts b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/index.ts new file mode 100644 index 0000000000..229210adb8 --- /dev/null +++ b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/index.ts @@ -0,0 +1 @@ +export * from "./create-order-transfer-form" diff --git a/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/transfer-header.tsx b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/transfer-header.tsx new file mode 100644 index 0000000000..a48acda43b --- /dev/null +++ b/packages/admin/dashboard/src/routes/orders/order-request-transfer/components/create-order-transfer-form/transfer-header.tsx @@ -0,0 +1,303 @@ +export function TransferHeader() { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ) +} diff --git a/packages/admin/dashboard/src/routes/orders/order-request-transfer/index.ts b/packages/admin/dashboard/src/routes/orders/order-request-transfer/index.ts new file mode 100644 index 0000000000..f006f7e2b6 --- /dev/null +++ b/packages/admin/dashboard/src/routes/orders/order-request-transfer/index.ts @@ -0,0 +1 @@ +export { OrderRequestTransfer as Component } from "./order-request-transfer" diff --git a/packages/admin/dashboard/src/routes/orders/order-request-transfer/order-request-transfer.tsx b/packages/admin/dashboard/src/routes/orders/order-request-transfer/order-request-transfer.tsx new file mode 100644 index 0000000000..287dd11f30 --- /dev/null +++ b/packages/admin/dashboard/src/routes/orders/order-request-transfer/order-request-transfer.tsx @@ -0,0 +1,26 @@ +import { Heading } from "@medusajs/ui" +import { useTranslation } from "react-i18next" +import { useParams } from "react-router-dom" + +import { RouteDrawer } from "../../../components/modals" +import { useOrder } from "../../../hooks/api" +import { DEFAULT_FIELDS } from "../order-detail/constants" +import { CreateOrderTransferForm } from "./components/create-order-transfer-form" + +export const OrderRequestTransfer = () => { + const { t } = useTranslation() + const params = useParams() + const { order } = useOrder(params.id!, { + fields: DEFAULT_FIELDS, + }) + + return ( + + + {t("orders.transfer.title")} + + + + + ) +} diff --git a/packages/core/js-sdk/src/admin/order.ts b/packages/core/js-sdk/src/admin/order.ts index 8952146b2a..331024e762 100644 --- a/packages/core/js-sdk/src/admin/order.ts +++ b/packages/core/js-sdk/src/admin/order.ts @@ -22,27 +22,27 @@ export class Order { } /** - * This method retrieves an order by its ID. It sends a request to the + * This method retrieves an order by its ID. It sends a request to the * [Get Order](https://docs.medusajs.com/api/admin#orders_getordersid) * API route. - * + * * @param id - The order's ID. * @param query - Configure the fields to retrieve in the order. * @param headers - Headers to pass in the request * @returns The order's details. - * + * * @example * To retrieve an order by its ID: - * + * * ```ts * sdk.admin.order.retrieve("order_123") * .then(({ order }) => { * console.log(order) * }) * ``` - * + * * To specify the fields and relations to retrieve: - * + * * ```ts * sdk.admin.order.retrieve("order_123", { * fields: "id,*items" @@ -51,7 +51,7 @@ export class Order { * console.log(order) * }) * ``` - * + * * Learn more about the `fields` property in the [API reference](https://docs.medusajs.com/api/store#select-fields-and-relations). */ async retrieve(id: string, query?: SelectParams, headers?: ClientHeaders) { @@ -65,14 +65,14 @@ export class Order { } /** - * This method retrieves the preview of an order based on its last associated change. It sends a request to the + * This method retrieves the preview of an order based on its last associated change. It sends a request to the * [Get Order Preview](https://docs.medusajs.com/api/admin#orders_getordersidpreview) API route. - * + * * @param id - The order's ID. * @param query - Query parameters. * @param headers - Headers to pass in the request * @returns The order preview's details. - * + * * @example * sdk.admin.order.retrievePreview("order_123") * .then(({ order }) => { @@ -94,27 +94,27 @@ export class Order { } /** - * This method retrieves a paginated list of orders. It sends a request to the + * This method retrieves a paginated list of orders. It sends a request to the * [List Orders](https://docs.medusajs.com/api/admin#orders_getorders) API route. - * + * * @param queryParams - Filters and pagination configurations. * @param headers - Headers to pass in the request. * @returns The paginated list of orders. - * + * * @example * To retrieve the list of orders: - * + * * ```ts * sdk.admin.order.list() * .then(({ orders, count, limit, offset }) => { * console.log(orders) * }) * ``` - * + * * To configure the pagination, pass the `limit` and `offset` query parameters. - * + * * For example, to retrieve only 10 items and skip 10 items: - * + * * ```ts * sdk.admin.order.list({ * limit: 10, @@ -124,10 +124,10 @@ export class Order { * console.log(orders) * }) * ``` - * + * * Using the `fields` query parameter, you can specify the fields and relations to retrieve * in each order: - * + * * ```ts * sdk.admin.order.list({ * fields: "id,*items" @@ -136,30 +136,31 @@ export class Order { * console.log(orders) * }) * ``` - * + * * Learn more about the `fields` property in the [API reference](https://docs.medusajs.com/api/store#select-fields-and-relations). */ async list( queryParams?: HttpTypes.AdminOrderFilters, headers?: ClientHeaders ) { - return await this.client.fetch< - HttpTypes.AdminOrderListResponse - >(`/admin/orders`, { - query: queryParams, - headers, - }) + return await this.client.fetch( + `/admin/orders`, + { + query: queryParams, + headers, + } + ) } /** * This method cancels an order. It sends a request to the * [Cancel Order](https://docs.medusajs.com/api/admin#orders_postordersidcancel) * API route. - * + * * @param id - The order's ID. * @param headers - Headers to pass in the request. * @returns The order's details. - * + * * @example * sdk.admin.order.cancel("order_123") * .then(({ order }) => { @@ -176,17 +177,51 @@ export class Order { ) } + /** + * This method requests an order transfer. It sends a request to the + * [Request Order Transfer](https://docs.medusajs.com/api/admin#orders_postordersidrequesttransfer) + * API route. + * + * @param id - The order's ID. + * @param headers - Headers to pass in the request. + * @param body - The transfer's details - the id of the next owner. + * @returns The order's details. + * + * @example + * sdk.admin.order.requestTransfer("order_123", { + * customer_id: "cus_123", + * internal_note: "Internal note", + * }) + * .then(({ order }) => { + * console.log(order) + * }) + */ + async requestTransfer( + id: string, + body: HttpTypes.AdminRequestOrderTransfer, + headers?: ClientHeaders + ) { + return await this.client.fetch( + `/admin/orders/${id}/transfer`, + { + method: "POST", + headers, + body, + } + ) + } + /** * This method creates a fulfillment for an order. It sends a request to the * [Create Fulfillment](https://docs.medusajs.com/api/admin#orders_postordersidfulfillments) * API route. - * + * * @param id - The order's ID. * @param body - The fulfillment's details. * @param query - Configure the fields to retrieve in the order. * @param headers - Headers to pass in the request * @returns The order's details. - * + * * @example * sdk.admin.order.createFulfillment("order_123", { * items: [ @@ -221,13 +256,13 @@ export class Order { * This method cancels an order's fulfillment. It sends a request to the * [Cancel Fulfillment](https://docs.medusajs.com/api/admin#orders_postordersidfulfillmentsfulfillment_idcancel) * API route. - * + * * @param id - The order's ID. * @param fulfillmentId - The ID of the fulfillment to cancel. * @param body - The cancelation's details. * @param headers - Headers to pass in the request * @returns The order's details. - * + * * @example * sdk.admin.order.cancelFulfillment( * "order_123", @@ -260,14 +295,14 @@ export class Order { * This method creates a shipment for an order's fulfillment. It sends a request to the * [Create Shipment](https://docs.medusajs.com/api/admin#orders_postordersidfulfillmentsfulfillment_idshipments) * API route. - * + * * @param id - The order's ID. * @param fulfillmentId - The ID of the fulfillment. * @param body - The shipment's details. * @param query - Configure the fields to retrieve in the order. * @param headers - Headers to pass in the request * @returns The order's details. - * + * * @example * sdk.admin.order.createShipment( * "order_123", @@ -307,14 +342,14 @@ export class Order { * This method marks an order's fulfillment as delivered. It sends a request to the * [Mark Delivered ](https://docs.medusajs.com/api/admin#orders_postordersidfulfillmentsfulfillment_idmarkasdelivered) * API route. - * + * * @param id - The order's ID. * @param fulfillmentId - The fulfillment's ID. * @param body - The delivery details. * @param query - Configure the fields to retrieve in the order. * @param headers - Headers to pass in the request * @returns The order's details. - * + * * @example * sdk.admin.order.markAsDelivered( * "order_123", @@ -345,15 +380,15 @@ export class Order { /** * This method retrieves a list of changes made on an order, including returns, exchanges, etc... - * + * * This method sends a request to the [List Changes](https://docs.medusajs.com/api/admin#orders_getordersidchanges) * API route. - * + * * @param id - The order's ID. * @param queryParams - Configure the fields to retrieve in each order change. * @param headers - Headers to pass in the request * @returns The list of order changes. - * + * * @example * sdk.admin.order.listChanges("order_123") * .then(({ order_changes }) => { @@ -377,12 +412,12 @@ export class Order { * This method retrieves the order's line items. It sends a request to the * [List Line Items](https://docs.medusajs.com/api/admin#orders_getordersidlineitems) * API routes. - * + * * @param id - The order's ID. * @param queryParams - Configure the fields to retrieve in each line item. * @param headers - Headers to pass in the request * @returns The list of line items. - * + * * @example * sdk.admin.order.listLineItems("order_123") * .then(({ order_items }) => { @@ -394,11 +429,12 @@ export class Order { queryParams?: FindParams & HttpTypes.AdminOrderItemsFilters, headers?: ClientHeaders ) { - return await this.client.fetch< - HttpTypes.AdminOrderLineItemsListResponse - >(`/admin/orders/${id}/line-items`, { - query: queryParams, - headers, - }) + return await this.client.fetch( + `/admin/orders/${id}/line-items`, + { + query: queryParams, + headers, + } + ) } } diff --git a/packages/core/types/src/http/order/admin/payload.ts b/packages/core/types/src/http/order/admin/payload.ts index fc1d38f962..e46edf2c7a 100644 --- a/packages/core/types/src/http/order/admin/payload.ts +++ b/packages/core/types/src/http/order/admin/payload.ts @@ -5,8 +5,8 @@ export interface AdminCreateOrderFulfillment { items: { /** * The order item's ID. - */ - id: string; + */ + id: string /** * The quantity to fulfill. */ @@ -34,8 +34,8 @@ export interface AdminCreateOrderShipment { items: { /** * The item's ID. - */ - id: string; + */ + id: string /** * The quantity to ship. */ @@ -76,3 +76,9 @@ export interface AdminCancelOrderFulfillment { } export interface AdminMarkOrderFulfillmentAsDelivered {} + +export interface AdminRequestOrderTransfer { + customer_id: string + internal_note?: string + description?: string +} diff --git a/packages/core/types/src/http/order/common.ts b/packages/core/types/src/http/order/common.ts index de2af2f31f..bd44b16b8d 100644 --- a/packages/core/types/src/http/order/common.ts +++ b/packages/core/types/src/http/order/common.ts @@ -224,7 +224,7 @@ export interface BaseOrderAddress { city?: string /** * The address's country code. - * + * * @example us */ country_code?: string @@ -281,7 +281,7 @@ export interface BaseOrderShippingMethod { shipping_option_id: string | null /** * Data relevant for the fulfillment provider handling the shipping. - * + * * Learn more in [this guide](https://docs.medusajs.com/resources/commerce-modules/fulfillment/shipping-option#data-property). */ data: Record | null @@ -631,7 +631,7 @@ export interface BaseOrderTransaction { amount: number /** * The transaction's currency code. - * + * * @example * usd */ @@ -689,7 +689,7 @@ export interface BaseOrderFulfillment { requires_shipping: boolean /** * Data necessary for the provider handling the fulfillment. - * + * * Learn more in [this guide](https://docs.medusajs.com/resources/commerce-modules/fulfillment/shipping-option#data-property). */ data: Record | null @@ -764,7 +764,7 @@ export interface BaseOrder { email: string | null /** * The order's currency code. - * + * * @example * usd */ @@ -925,7 +925,10 @@ export interface BaseOrderFilters /** * Filter by status(es). */ - status?: OrderStatus[] | OrderStatus | OperatorMap + status?: + | OrderStatus[] + | OrderStatus + | OperatorMap } export interface BaseOrderChangesFilters @@ -958,7 +961,13 @@ export interface BaseOrderChange { /** * The type of the order change */ - change_type?: "return" | "exchange" | "claim" | "edit" | "return_request" + change_type?: + | "return" + | "exchange" + | "claim" + | "edit" + | "return_request" + | "transfer" /** * The ID of the associated order