fix(order): order list payment and fulfillment status (#7934)
This commit is contained in:
@@ -15,7 +15,10 @@ export const getOrderDetailWorkflowId = "get-order-detail"
|
||||
export const getOrderDetailWorkflow = createWorkflow(
|
||||
getOrderDetailWorkflowId,
|
||||
(
|
||||
input: WorkflowData<{ fields: string[]; order_id: string }>
|
||||
input: WorkflowData<{
|
||||
fields: string[]
|
||||
order_id: string
|
||||
}>
|
||||
): WorkflowData<OrderDetailDTO> => {
|
||||
const fields = transform(input, ({ fields }) => {
|
||||
return deduplicate([
|
||||
|
||||
@@ -0,0 +1,94 @@
|
||||
import { OrderDTO, OrderDetailDTO } from "@medusajs/types"
|
||||
import { deduplicate } from "@medusajs/utils"
|
||||
import {
|
||||
WorkflowData,
|
||||
createWorkflow,
|
||||
transform,
|
||||
} from "@medusajs/workflows-sdk"
|
||||
import { useRemoteQueryStep } from "../../common"
|
||||
import {
|
||||
getLastFulfillmentStatus,
|
||||
getLastPaymentStatus,
|
||||
} from "../utils/aggregate-status"
|
||||
|
||||
type OrderOutput =
|
||||
| OrderDTO[]
|
||||
| {
|
||||
rows: OrderDTO[]
|
||||
metadata: any
|
||||
}
|
||||
|
||||
export const getOrdersListlWorkflowId = "get-orders-list"
|
||||
export const getOrdersListlWorkflow = createWorkflow(
|
||||
getOrdersListlWorkflowId,
|
||||
(
|
||||
input: WorkflowData<{
|
||||
fields: string[]
|
||||
variables?: Record<string, any>
|
||||
}>
|
||||
): WorkflowData<OrderOutput> => {
|
||||
const fields = transform(input, ({ fields }) => {
|
||||
return deduplicate([
|
||||
...fields,
|
||||
"id",
|
||||
"status",
|
||||
"version",
|
||||
"payment_collections.status",
|
||||
"payment_collections.amount",
|
||||
"payment_collections.captured_amount",
|
||||
"payment_collections.refunded_amount",
|
||||
"fulfillments.packed_at",
|
||||
"fulfillments.shipped_at",
|
||||
"fulfillments.delivered_at",
|
||||
"fulfillments.canceled_at",
|
||||
])
|
||||
})
|
||||
|
||||
const orders: OrderDTO[] = useRemoteQueryStep({
|
||||
entry_point: "orders",
|
||||
fields,
|
||||
variables: input.variables,
|
||||
list: true,
|
||||
})
|
||||
|
||||
const aggregatedOrders = transform(
|
||||
{ orders, input },
|
||||
({ orders, input }) => {
|
||||
const fields = input.fields
|
||||
const requiredPaymentFields = fields.some((f) =>
|
||||
f.includes("payment_collections")
|
||||
)
|
||||
const requiredFulfillmentFields = fields.some((f) =>
|
||||
f.includes("fulfillments")
|
||||
)
|
||||
|
||||
const orders_ = orders as any
|
||||
const data = orders_.rows ? orders_.rows : orders_
|
||||
|
||||
for (const order of data) {
|
||||
const order_ = order as OrderDetailDTO
|
||||
|
||||
order_.payment_status = getLastPaymentStatus(
|
||||
order_
|
||||
) as OrderDetailDTO["payment_status"]
|
||||
order_.fulfillment_status = getLastFulfillmentStatus(
|
||||
order_
|
||||
) as OrderDetailDTO["fulfillment_status"]
|
||||
|
||||
if (!requiredPaymentFields) {
|
||||
// @ts-ignore
|
||||
delete order_.payment_collections
|
||||
}
|
||||
if (!requiredFulfillmentFields) {
|
||||
// @ts-ignore
|
||||
delete order_.fulfillments
|
||||
}
|
||||
}
|
||||
|
||||
return orders
|
||||
}
|
||||
)
|
||||
|
||||
return aggregatedOrders
|
||||
}
|
||||
)
|
||||
@@ -8,5 +8,6 @@ export * from "./create-orders"
|
||||
export * from "./create-return"
|
||||
export * from "./create-shipment"
|
||||
export * from "./get-order-detail"
|
||||
export * from "./get-orders-list"
|
||||
export * from "./receive-return"
|
||||
export * from "./update-tax-lines"
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
import {
|
||||
ContainerRegistrationKeys,
|
||||
remoteQueryObjectFromString,
|
||||
} from "@medusajs/utils"
|
||||
import { getOrdersListlWorkflow } from "@medusajs/core-flows"
|
||||
import { OrderDTO } from "@medusajs/types"
|
||||
import {
|
||||
AuthenticatedMedusaRequest,
|
||||
MedusaResponse,
|
||||
@@ -11,24 +9,28 @@ export const GET = async (
|
||||
req: AuthenticatedMedusaRequest,
|
||||
res: MedusaResponse
|
||||
) => {
|
||||
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY)
|
||||
const variables = {
|
||||
filters: {
|
||||
...req.filterableFields,
|
||||
is_draft_order: false,
|
||||
},
|
||||
...req.remoteQueryConfig.pagination,
|
||||
}
|
||||
|
||||
const queryObject = remoteQueryObjectFromString({
|
||||
entryPoint: "order",
|
||||
variables: {
|
||||
filters: {
|
||||
...req.filterableFields,
|
||||
is_draft_order: false,
|
||||
},
|
||||
...req.remoteQueryConfig.pagination,
|
||||
const workflow = getOrdersListlWorkflow(req.scope)
|
||||
const { result } = await workflow.run({
|
||||
input: {
|
||||
fields: req.remoteQueryConfig.fields,
|
||||
variables,
|
||||
},
|
||||
fields: req.remoteQueryConfig.fields,
|
||||
})
|
||||
|
||||
const { rows: orders, metadata } = await remoteQuery(queryObject)
|
||||
|
||||
const { rows, metadata } = result as {
|
||||
rows: OrderDTO[]
|
||||
metadata: any
|
||||
}
|
||||
res.json({
|
||||
orders,
|
||||
orders: rows,
|
||||
count: metadata.count,
|
||||
offset: metadata.skip,
|
||||
limit: metadata.take,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { CreateOrderDTO, IOrderModuleService } from "@medusajs/types"
|
||||
import { ClaimType, Modules } from "@medusajs/utils"
|
||||
import { moduleIntegrationTestRunner, SuiteOptions } from "medusa-test-utils"
|
||||
import { SuiteOptions, moduleIntegrationTestRunner } from "medusa-test-utils"
|
||||
|
||||
jest.setTimeout(100000)
|
||||
|
||||
@@ -222,7 +222,7 @@ moduleIntegrationTestRunner({
|
||||
}),
|
||||
}),
|
||||
],
|
||||
shipping_methods: [
|
||||
shipping_methods: expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
name: "return shipping method",
|
||||
amount: 10,
|
||||
@@ -231,7 +231,7 @@ moduleIntegrationTestRunner({
|
||||
name: "Claim method",
|
||||
amount: 35,
|
||||
}),
|
||||
],
|
||||
]),
|
||||
refund_amount: null,
|
||||
})
|
||||
)
|
||||
|
||||
@@ -282,11 +282,12 @@ moduleIntegrationTestRunner<IOrderModuleService>({
|
||||
"items.detail.fulfilled_quantity",
|
||||
"items.detail.return_requested_quantity",
|
||||
],
|
||||
relations: ["items", "items.detail"],
|
||||
relations: ["items", "items.detail", "shipping_methods"],
|
||||
})
|
||||
|
||||
serializedOrder = JSON.parse(JSON.stringify(getOrder))
|
||||
|
||||
expect(serializedOrder.shipping_methods).toHaveLength(3)
|
||||
expect(serializedOrder).toEqual(
|
||||
expect.objectContaining({
|
||||
items: [
|
||||
|
||||
@@ -78,14 +78,19 @@ export function setFindMethods<T>(klass: Constructor<T>, entity: any) {
|
||||
|
||||
orderWhere.items ??= {}
|
||||
orderWhere.items.version = version
|
||||
orderWhere.items.deleted_at ??= null
|
||||
|
||||
popWhere.shipping_methods ??= {}
|
||||
popWhere.shipping_methods.version = version
|
||||
popWhere.shipping_methods.deleted_at ??= null
|
||||
|
||||
if (!config.options.orderBy) {
|
||||
config.options.orderBy = { id: "ASC" }
|
||||
}
|
||||
|
||||
config.where ??= {}
|
||||
config.where.deleted_at ??= null
|
||||
|
||||
return await manager.find(entity, config.where, config.options)
|
||||
}
|
||||
|
||||
@@ -152,9 +157,11 @@ export function setFindMethods<T>(klass: Constructor<T>, entity: any) {
|
||||
|
||||
orderWhere.items ??= {}
|
||||
orderWhere.items.version = version
|
||||
orderWhere.items.deleted_at ??= null
|
||||
|
||||
popWhere.shipping_methods ??= {}
|
||||
popWhere.shipping_methods.version = version
|
||||
popWhere.shipping_methods.deleted_at ??= null
|
||||
|
||||
if (!config.options.orderBy) {
|
||||
config.options.orderBy = { id: "ASC" }
|
||||
|
||||
@@ -65,6 +65,8 @@ export function formatOrder(
|
||||
const sm = { ...shippingMethod.shipping_method }
|
||||
|
||||
delete shippingMethod.shipping_method
|
||||
cleanNestedRelations(shippingMethod)
|
||||
|
||||
return {
|
||||
...sm,
|
||||
order_id: shippingMethod.order_id,
|
||||
@@ -87,6 +89,13 @@ export function formatOrder(
|
||||
return isArray ? orders : orders[0]
|
||||
}
|
||||
|
||||
function cleanNestedRelations(obj) {
|
||||
delete obj.order
|
||||
delete obj.return
|
||||
delete obj.claim
|
||||
delete obj.exchange
|
||||
}
|
||||
|
||||
function formatOrderReturn(orderReturn, mainOrder) {
|
||||
orderReturn.items.forEach((orderItem) => {
|
||||
const item = mainOrder.items?.find((item) => item.id === orderItem.item_id)
|
||||
@@ -105,7 +114,7 @@ function formatClaim(claim) {
|
||||
const item = claim.order.items?.find(
|
||||
(item) => item.id === orderItem.item_id
|
||||
)
|
||||
|
||||
cleanNestedRelations(item)
|
||||
orderItem.detail = item?.detail
|
||||
})
|
||||
}
|
||||
@@ -122,6 +131,7 @@ function formatClaim(claim) {
|
||||
(item) => item.id === orderItem.item_id
|
||||
)
|
||||
|
||||
cleanNestedRelations(item)
|
||||
orderItem.detail = item?.detail
|
||||
})
|
||||
}
|
||||
@@ -136,6 +146,7 @@ function formatExchange(exchange) {
|
||||
(item) => item.id === orderItem.item_id
|
||||
)
|
||||
|
||||
cleanNestedRelations(item)
|
||||
orderItem.detail = item?.detail
|
||||
})
|
||||
}
|
||||
@@ -150,6 +161,7 @@ function formatReturn(returnOrder) {
|
||||
(item) => item.id === orderItem.item_id
|
||||
)
|
||||
|
||||
cleanNestedRelations(item)
|
||||
orderItem.detail = item?.detail
|
||||
})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user