fix(order): order list payment and fulfillment status (#7934)

This commit is contained in:
Carlos R. L. Rodrigues authored and GitHub committed 2024-07-04 06:37:25 -03:00
1 parent 41c4307fc7
commit 56394fe0d4
8 files changed
+139 -19

No files matched your search

@@ -15,7 +15,10 @@ export const getOrderDetailWorkflowId = "get-order-detail"
export const getOrderDetailWorkflow = createWorkflow( export const getOrderDetailWorkflow = createWorkflow(
getOrderDetailWorkflowId, getOrderDetailWorkflowId,
( (
input: WorkflowData<{ fields: string[]; order_id: string }> input: WorkflowData<{
fields: string[]
order_id: string
}>
): WorkflowData<OrderDetailDTO> => { ): WorkflowData<OrderDetailDTO> => {
const fields = transform(input, ({ fields }) => { const fields = transform(input, ({ fields }) => {
return deduplicate([ 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-return"
export * from "./create-shipment" export * from "./create-shipment"
export * from "./get-order-detail" export * from "./get-order-detail"
export * from "./get-orders-list"
export * from "./receive-return" export * from "./receive-return"
export * from "./update-tax-lines" export * from "./update-tax-lines"
+15 -13
View File
@@ -1,7 +1,5 @@
import { import { getOrdersListlWorkflow } from "@medusajs/core-flows"
ContainerRegistrationKeys, import { OrderDTO } from "@medusajs/types"
remoteQueryObjectFromString,
} from "@medusajs/utils"
import { import {
AuthenticatedMedusaRequest, AuthenticatedMedusaRequest,
MedusaResponse, MedusaResponse,
@@ -11,24 +9,28 @@ export const GET = async (
req: AuthenticatedMedusaRequest, req: AuthenticatedMedusaRequest,
res: MedusaResponse res: MedusaResponse
) => { ) => {
const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY) const variables = {
const queryObject = remoteQueryObjectFromString({
entryPoint: "order",
variables: {
filters: { filters: {
...req.filterableFields, ...req.filterableFields,
is_draft_order: false, is_draft_order: false,
}, },
...req.remoteQueryConfig.pagination, ...req.remoteQueryConfig.pagination,
}, }
const workflow = getOrdersListlWorkflow(req.scope)
const { result } = await workflow.run({
input: {
fields: req.remoteQueryConfig.fields, fields: req.remoteQueryConfig.fields,
variables,
},
}) })
const { rows: orders, metadata } = await remoteQuery(queryObject) const { rows, metadata } = result as {
rows: OrderDTO[]
metadata: any
}
res.json({ res.json({
orders, orders: rows,
count: metadata.count, count: metadata.count,
offset: metadata.skip, offset: metadata.skip,
limit: metadata.take, limit: metadata.take,
@@ -1,6 +1,6 @@
import { CreateOrderDTO, IOrderModuleService } from "@medusajs/types" import { CreateOrderDTO, IOrderModuleService } from "@medusajs/types"
import { ClaimType, Modules } from "@medusajs/utils" import { ClaimType, Modules } from "@medusajs/utils"
import { moduleIntegrationTestRunner, SuiteOptions } from "medusa-test-utils" import { SuiteOptions, moduleIntegrationTestRunner } from "medusa-test-utils"
jest.setTimeout(100000) jest.setTimeout(100000)
@@ -222,7 +222,7 @@ moduleIntegrationTestRunner({
}), }),
}), }),
], ],
shipping_methods: [ shipping_methods: expect.arrayContaining([
expect.objectContaining({ expect.objectContaining({
name: "return shipping method", name: "return shipping method",
amount: 10, amount: 10,
@@ -231,7 +231,7 @@ moduleIntegrationTestRunner({
name: "Claim method", name: "Claim method",
amount: 35, amount: 35,
}), }),
], ]),
refund_amount: null, refund_amount: null,
}) })
) )
@@ -282,11 +282,12 @@ moduleIntegrationTestRunner<IOrderModuleService>({
"items.detail.fulfilled_quantity", "items.detail.fulfilled_quantity",
"items.detail.return_requested_quantity", "items.detail.return_requested_quantity",
], ],
relations: ["items", "items.detail"], relations: ["items", "items.detail", "shipping_methods"],
}) })
serializedOrder = JSON.parse(JSON.stringify(getOrder)) serializedOrder = JSON.parse(JSON.stringify(getOrder))
expect(serializedOrder.shipping_methods).toHaveLength(3)
expect(serializedOrder).toEqual( expect(serializedOrder).toEqual(
expect.objectContaining({ expect.objectContaining({
items: [ items: [
@@ -78,14 +78,19 @@ export function setFindMethods<T>(klass: Constructor<T>, entity: any) {
orderWhere.items ??= {} orderWhere.items ??= {}
orderWhere.items.version = version orderWhere.items.version = version
orderWhere.items.deleted_at ??= null
popWhere.shipping_methods ??= {} popWhere.shipping_methods ??= {}
popWhere.shipping_methods.version = version popWhere.shipping_methods.version = version
popWhere.shipping_methods.deleted_at ??= null
if (!config.options.orderBy) { if (!config.options.orderBy) {
config.options.orderBy = { id: "ASC" } config.options.orderBy = { id: "ASC" }
} }
config.where ??= {}
config.where.deleted_at ??= null
return await manager.find(entity, config.where, config.options) 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 ??= {}
orderWhere.items.version = version orderWhere.items.version = version
orderWhere.items.deleted_at ??= null
popWhere.shipping_methods ??= {} popWhere.shipping_methods ??= {}
popWhere.shipping_methods.version = version popWhere.shipping_methods.version = version
popWhere.shipping_methods.deleted_at ??= null
if (!config.options.orderBy) { if (!config.options.orderBy) {
config.options.orderBy = { id: "ASC" } config.options.orderBy = { id: "ASC" }
@@ -65,6 +65,8 @@ export function formatOrder(
const sm = { ...shippingMethod.shipping_method } const sm = { ...shippingMethod.shipping_method }
delete shippingMethod.shipping_method delete shippingMethod.shipping_method
cleanNestedRelations(shippingMethod)
return { return {
...sm, ...sm,
order_id: shippingMethod.order_id, order_id: shippingMethod.order_id,
@@ -87,6 +89,13 @@ export function formatOrder(
return isArray ? orders : orders[0] return isArray ? orders : orders[0]
} }
function cleanNestedRelations(obj) {
delete obj.order
delete obj.return
delete obj.claim
delete obj.exchange
}
function formatOrderReturn(orderReturn, mainOrder) { function formatOrderReturn(orderReturn, mainOrder) {
orderReturn.items.forEach((orderItem) => { orderReturn.items.forEach((orderItem) => {
const item = mainOrder.items?.find((item) => item.id === orderItem.item_id) const item = mainOrder.items?.find((item) => item.id === orderItem.item_id)
@@ -105,7 +114,7 @@ function formatClaim(claim) {
const item = claim.order.items?.find( const item = claim.order.items?.find(
(item) => item.id === orderItem.item_id (item) => item.id === orderItem.item_id
) )
cleanNestedRelations(item)
orderItem.detail = item?.detail orderItem.detail = item?.detail
}) })
} }
@@ -122,6 +131,7 @@ function formatClaim(claim) {
(item) => item.id === orderItem.item_id (item) => item.id === orderItem.item_id
) )
cleanNestedRelations(item)
orderItem.detail = item?.detail orderItem.detail = item?.detail
}) })
} }
@@ -136,6 +146,7 @@ function formatExchange(exchange) {
(item) => item.id === orderItem.item_id (item) => item.id === orderItem.item_id
) )
cleanNestedRelations(item)
orderItem.detail = item?.detail orderItem.detail = item?.detail
}) })
} }
@@ -150,6 +161,7 @@ function formatReturn(returnOrder) {
(item) => item.id === orderItem.item_id (item) => item.id === orderItem.item_id
) )
cleanNestedRelations(item)
orderItem.detail = item?.detail orderItem.detail = item?.detail
}) })
} }