From 56394fe0d453bb85a87b48f81503d073d493a8e5 Mon Sep 17 00:00:00 2001 From: "Carlos R. L. Rodrigues" <37986729+carlos-r-l-rodrigues@users.noreply.github.com> Date: Thu, 4 Jul 2024 06:37:25 -0300 Subject: [PATCH] fix(order): order list payment and fulfillment status (#7934) --- .../src/order/workflows/get-order-detail.ts | 5 +- .../src/order/workflows/get-orders-list.ts | 94 +++++++++++++++++++ .../core-flows/src/order/workflows/index.ts | 1 + packages/medusa/src/api/admin/orders/route.ts | 38 ++++---- .../__tests__/order-claim.ts | 6 +- .../__tests__/order-return.ts | 3 +- .../order/src/utils/base-repository-find.ts | 7 ++ .../order/src/utils/transform-order.ts | 14 ++- 8 files changed, 144 insertions(+), 24 deletions(-) create mode 100644 packages/core/core-flows/src/order/workflows/get-orders-list.ts diff --git a/packages/core/core-flows/src/order/workflows/get-order-detail.ts b/packages/core/core-flows/src/order/workflows/get-order-detail.ts index c3c1ab489e..324630c575 100644 --- a/packages/core/core-flows/src/order/workflows/get-order-detail.ts +++ b/packages/core/core-flows/src/order/workflows/get-order-detail.ts @@ -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 => { const fields = transform(input, ({ fields }) => { return deduplicate([ diff --git a/packages/core/core-flows/src/order/workflows/get-orders-list.ts b/packages/core/core-flows/src/order/workflows/get-orders-list.ts new file mode 100644 index 0000000000..b967d8997d --- /dev/null +++ b/packages/core/core-flows/src/order/workflows/get-orders-list.ts @@ -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 + }> + ): WorkflowData => { + 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 + } +) diff --git a/packages/core/core-flows/src/order/workflows/index.ts b/packages/core/core-flows/src/order/workflows/index.ts index 9da719aabe..98a565d75b 100644 --- a/packages/core/core-flows/src/order/workflows/index.ts +++ b/packages/core/core-flows/src/order/workflows/index.ts @@ -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" diff --git a/packages/medusa/src/api/admin/orders/route.ts b/packages/medusa/src/api/admin/orders/route.ts index b89d207248..3afcfacebc 100644 --- a/packages/medusa/src/api/admin/orders/route.ts +++ b/packages/medusa/src/api/admin/orders/route.ts @@ -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 queryObject = remoteQueryObjectFromString({ - entryPoint: "order", - variables: { - filters: { - ...req.filterableFields, - is_draft_order: false, - }, - ...req.remoteQueryConfig.pagination, + const 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, diff --git a/packages/modules/order/integration-tests/__tests__/order-claim.ts b/packages/modules/order/integration-tests/__tests__/order-claim.ts index 6e36f2e172..838847bf0e 100644 --- a/packages/modules/order/integration-tests/__tests__/order-claim.ts +++ b/packages/modules/order/integration-tests/__tests__/order-claim.ts @@ -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, }) ) diff --git a/packages/modules/order/integration-tests/__tests__/order-return.ts b/packages/modules/order/integration-tests/__tests__/order-return.ts index a2ab62bdc9..ac3ff7b71c 100644 --- a/packages/modules/order/integration-tests/__tests__/order-return.ts +++ b/packages/modules/order/integration-tests/__tests__/order-return.ts @@ -282,11 +282,12 @@ moduleIntegrationTestRunner({ "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: [ diff --git a/packages/modules/order/src/utils/base-repository-find.ts b/packages/modules/order/src/utils/base-repository-find.ts index 7d159aaba2..29d2cf8ae6 100644 --- a/packages/modules/order/src/utils/base-repository-find.ts +++ b/packages/modules/order/src/utils/base-repository-find.ts @@ -78,14 +78,19 @@ export function setFindMethods(klass: Constructor, 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(klass: Constructor, 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" } diff --git a/packages/modules/order/src/utils/transform-order.ts b/packages/modules/order/src/utils/transform-order.ts index 0424b29bf5..71c5f704f1 100644 --- a/packages/modules/order/src/utils/transform-order.ts +++ b/packages/modules/order/src/utils/transform-order.ts @@ -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 }) }