diff --git a/integration-tests/http/__tests__/claims/claims.spec.ts b/integration-tests/http/__tests__/claims/claims.spec.ts new file mode 100644 index 0000000000000..814ff58403f1a --- /dev/null +++ b/integration-tests/http/__tests__/claims/claims.spec.ts @@ -0,0 +1,528 @@ +import { + ClaimReason, + ClaimType, + ContainerRegistrationKeys, + ModuleRegistrationName, + Modules, + RuleOperator, +} from "@medusajs/utils" +import { medusaIntegrationTestRunner } from "medusa-test-utils" +import { + adminHeaders, + createAdminUser, +} from "../../../helpers/create-admin-user" + +jest.setTimeout(30000) + +medusaIntegrationTestRunner({ + testSuite: ({ dbConnection, getContainer, api }) => { + let order, order2 + let returnShippingOption + let shippingProfile + let fulfillmentSet + let returnReason + let inventoryItem + let inventoryItemExtra + let location + let productExtra + const shippingProviderId = "manual_test-provider" + + beforeEach(async () => { + const container = getContainer() + await createAdminUser(dbConnection, adminHeaders, container) + + const region = ( + await api.post( + "/admin/regions", + { + name: "test-region", + currency_code: "usd", + }, + adminHeaders + ) + ).data.region + + const customer = ( + await api.post( + "/admin/customers", + { + first_name: "joe", + email: "joe@admin.com", + }, + adminHeaders + ) + ).data.customer + + const salesChannel = ( + await api.post( + "/admin/sales-channels", + { + name: "Test channel", + }, + adminHeaders + ) + ).data.sales_channel + + const product = ( + await api.post( + "/admin/products", + { + title: "Test product", + variants: [ + { + title: "Test variant", + sku: "test-variant", + prices: [ + { + currency_code: "usd", + amount: 10, + }, + ], + }, + ], + }, + adminHeaders + ) + ).data.product + + productExtra = ( + await api.post( + "/admin/products", + { + title: "Extra product", + variants: [ + { + title: "my variant", + sku: "variant-sku", + prices: [ + { + currency_code: "usd", + amount: 123456.1234657890123456789, + }, + ], + }, + ], + }, + adminHeaders + ) + ).data.product + + returnReason = ( + await api.post( + "/admin/return-reasons", + { + value: "return-reason-test", + label: "Test return reason", + }, + adminHeaders + ) + ).data.return_reason + + const orderModule = container.resolve(ModuleRegistrationName.ORDER) + + order = await orderModule.createOrders({ + region_id: region.id, + email: "foo@bar.com", + items: [ + { + title: "Custom Item 2", + variant_id: product.variants[0].id, + quantity: 2, + unit_price: 25, + }, + ], + sales_channel_id: salesChannel.id, + shipping_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + phone: "12345", + }, + billing_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + }, + shipping_methods: [ + { + name: "Test shipping method", + amount: 10, + data: {}, + tax_lines: [ + { + description: "shipping Tax 1", + tax_rate_id: "tax_usa_shipping", + code: "code", + rate: 10, + }, + ], + }, + ], + currency_code: "usd", + customer_id: customer.id, + }) + + order2 = await orderModule.createOrders({ + region_id: region.id, + email: "foo@bar2.com", + items: [ + { + title: "Custom Iasdasd2", + quantity: 1, + unit_price: 20, + }, + ], + sales_channel_id: salesChannel.id, + shipping_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + phone: "12345", + }, + billing_address: { + first_name: "Test", + last_name: "Test", + address_1: "Test", + city: "Test", + country_code: "US", + postal_code: "12345", + }, + currency_code: "usd", + customer_id: customer.id, + }) + + shippingProfile = ( + await api.post( + `/admin/shipping-profiles`, + { + name: "Test", + type: "default", + }, + adminHeaders + ) + ).data.shipping_profile + + location = ( + await api.post( + `/admin/stock-locations`, + { + name: "Test location", + }, + adminHeaders + ) + ).data.stock_location + + location = ( + await api.post( + `/admin/stock-locations/${location.id}/fulfillment-sets?fields=*fulfillment_sets`, + { + name: "Test", + type: "test-type", + }, + adminHeaders + ) + ).data.stock_location + + fulfillmentSet = ( + await api.post( + `/admin/fulfillment-sets/${location.fulfillment_sets[0].id}/service-zones`, + { + name: "Test", + geo_zones: [{ type: "country", country_code: "us" }], + }, + adminHeaders + ) + ).data.fulfillment_set + + inventoryItem = ( + await api.post( + `/admin/inventory-items`, + { sku: "inv-1234" }, + adminHeaders + ) + ).data.inventory_item + + await api.post( + `/admin/inventory-items/${inventoryItem.id}/location-levels`, + { + location_id: location.id, + stocked_quantity: 2, + }, + adminHeaders + ) + + inventoryItemExtra = ( + await api.get(`/admin/inventory-items?sku=variant-sku`, adminHeaders) + ).data.inventory_items[0] + + await api.post( + `/admin/inventory-items/${inventoryItemExtra.id}/location-levels`, + { + location_id: location.id, + stocked_quantity: 4, + }, + adminHeaders + ) + + const remoteLink = container.resolve( + ContainerRegistrationKeys.REMOTE_LINK + ) + + await remoteLink.create([ + { + [Modules.STOCK_LOCATION]: { + stock_location_id: location.id, + }, + [Modules.FULFILLMENT]: { + fulfillment_provider_id: shippingProviderId, + }, + }, + { + [Modules.STOCK_LOCATION]: { + stock_location_id: location.id, + }, + [Modules.FULFILLMENT]: { + fulfillment_set_id: fulfillmentSet.id, + }, + }, + { + [Modules.SALES_CHANNEL]: { + sales_channel_id: salesChannel.id, + }, + [Modules.STOCK_LOCATION]: { + stock_location_id: location.id, + }, + }, + { + [Modules.PRODUCT]: { + variant_id: product.variants[0].id, + }, + [Modules.INVENTORY]: { + inventory_item_id: inventoryItem.id, + }, + }, + { + [Modules.PRODUCT]: { + variant_id: productExtra.variants[0].id, + }, + [Modules.INVENTORY]: { + inventory_item_id: inventoryItemExtra.id, + }, + }, + ]) + + const shippingOptionPayload = { + name: "Return shipping", + service_zone_id: fulfillmentSet.service_zones[0].id, + shipping_profile_id: shippingProfile.id, + provider_id: shippingProviderId, + price_type: "flat", + type: { + label: "Test type", + description: "Test description", + code: "test-code", + }, + prices: [ + { + currency_code: "usd", + amount: 1000, + }, + ], + rules: [ + { + operator: RuleOperator.EQ, + attribute: "is_return", + value: "true", + }, + ], + } + + returnShippingOption = ( + await api.post( + "/admin/shipping-options", + shippingOptionPayload, + adminHeaders + ) + ).data.shipping_option + + const item = order.items[0] + + await api.post( + `/admin/orders/${order.id}/fulfillments`, + { + items: [ + { + id: item.id, + quantity: 2, + }, + ], + }, + adminHeaders + ) + + await api.post( + `/admin/orders/${order2.id}/fulfillments`, + { + items: [ + { + id: order2.items[0].id, + quantity: 1, + }, + ], + }, + adminHeaders + ) + }) + + describe("Returns lifecycle", () => { + it.only("Full flow with 2 orders", async () => { + let result = await api.post( + "/admin/claims", + { + order_id: order.id, + type: ClaimType.REPLACE, + description: "Test", + }, + adminHeaders + ) + + let r2 = await api.post( + "/admin/claims", + { + order_id: order2.id, + type: ClaimType.REFUND, + }, + adminHeaders + ) + + const claimId2 = r2.data.claim.id + const item2 = order2.items[0] + + await api.post( + `/admin/claims/${claimId2}/inbound/items`, + { + items: [ + { + id: item2.id, + quantity: 1, + }, + ], + }, + adminHeaders + ) + + await api.post( + `/admin/claims/${claimId2}/inbound/shipping-method`, + { + shipping_option_id: returnShippingOption.id, + }, + adminHeaders + ) + await api.post(`/admin/claims/${claimId2}/request`, {}, adminHeaders) + + const claimId = result.data.claim.id + + const item = order.items[0] + + result = await api.post( + `/admin/claims/${claimId}/inbound/items`, + { + items: [ + { + id: item.id, + reason_id: returnReason.id, + quantity: 2, + }, + ], + }, + adminHeaders + ) + + await api.post( + `/admin/claims/${claimId}/inbound/shipping-method`, + { + shipping_option_id: returnShippingOption.id, + }, + adminHeaders + ) + + // updated the requested quantity + const updateReturnItemActionId = + result.data.order_preview.items[0].actions[0].id + + result = await api.post( + `/admin/claims/${claimId}/inbound/items/${updateReturnItemActionId}`, + { + quantity: 1, + }, + adminHeaders + ) + + // New Items + await api.post( + `/admin/claims/${claimId}/outbound/items`, + { + items: [ + { + variant_id: productExtra.variants[0].id, + quantity: 2, + }, + ], + }, + adminHeaders + ) + + // Claim Items + await api.post( + `/admin/claims/${claimId}/claim-items`, + { + items: [ + { + id: item.id, + reason: ClaimReason.PRODUCTION_FAILURE, + quantity: 1, + }, + ], + }, + adminHeaders + ) + + result = await api.post( + `/admin/claims/${claimId}/request`, + {}, + adminHeaders + ) + + result = ( + await api.get( + `/admin/claims?fields=*claim_items,*additional_items`, + adminHeaders + ) + ).data.claims + expect(result).toHaveLength(2) + + console.log( + JSON.stringify( + ( + await api.get( + `/admin/orders?fields=*items,total,summary`, + adminHeaders + ) + ).data.orders[0], + null, + 2 + ) + ) + }) + }) + }, +}) diff --git a/integration-tests/http/__tests__/returns/returns.spec.ts b/integration-tests/http/__tests__/returns/returns.spec.ts index 326dff1bec37d..4aaf6ac883493 100644 --- a/integration-tests/http/__tests__/returns/returns.spec.ts +++ b/integration-tests/http/__tests__/returns/returns.spec.ts @@ -140,6 +140,12 @@ medusaIntegrationTestRunner({ }, currency_code: "usd", customer_id: "joe", + transactions: [ + { + amount: 20, + currency_code: "usd", + }, + ], }) shippingProfile = ( @@ -328,6 +334,7 @@ medusaIntegrationTestRunner({ }, adminHeaders ) + await api.post( `/admin/returns/${returnId2}/shipping-method`, { @@ -335,6 +342,7 @@ medusaIntegrationTestRunner({ }, adminHeaders ) + await api.post(`/admin/returns/${returnId2}/request`, {}, adminHeaders) const returnId = result.data.return.id diff --git a/packages/core/core-flows/src/order/steps/create-claim-items.ts b/packages/core/core-flows/src/order/steps/create-claim-items.ts new file mode 100644 index 0000000000000..bbee4a2aca238 --- /dev/null +++ b/packages/core/core-flows/src/order/steps/create-claim-items.ts @@ -0,0 +1,59 @@ +import { IOrderModuleService, OrderChangeActionDTO } from "@medusajs/types" +import { ChangeActionType, ModuleRegistrationName } from "@medusajs/utils" +import { StepResponse, createStep } from "@medusajs/workflows-sdk" + +type CreateOrderClaimItemsInput = { + changes: OrderChangeActionDTO[] + claimId: string +} + +export const createOrderClaimItemsStep = createStep( + "create-claim-items", + async (input: CreateOrderClaimItemsInput, { container }) => { + const orderModuleService = container.resolve( + ModuleRegistrationName.ORDER + ) + + const claimItems = input.changes.map((item) => { + let additionalFields + if (item.action === ChangeActionType.ITEM_ADD) { + additionalFields = { + is_additional_item: true, + } + } else if (item.action === ChangeActionType.WRITE_OFF_ITEM) { + additionalFields = { + reason: item.details?.reason, + } + } + + return { + claim_id: input.claimId, + item_id: item.details?.reference_id! as string, + quantity: item.details?.quantity as number, + note: item.internal_note, + metadata: (item.details?.metadata as Record) ?? {}, + ...additionalFields, + } + }) + + const createdClaimItems = await orderModuleService.createOrderClaimItems( + claimItems + ) + + return new StepResponse( + createdClaimItems, + createdClaimItems.map((i) => i.id) + ) + }, + async (ids, { container }) => { + if (!ids) { + return + } + + const orderModuleService = container.resolve( + ModuleRegistrationName.ORDER + ) + + await orderModuleService.deleteOrderClaimItems(ids) + } +) diff --git a/packages/core/core-flows/src/order/steps/create-return-items.ts b/packages/core/core-flows/src/order/steps/create-return-items.ts index d6e72fd07b2ed..4840596b9f4e7 100644 --- a/packages/core/core-flows/src/order/steps/create-return-items.ts +++ b/packages/core/core-flows/src/order/steps/create-return-items.ts @@ -28,6 +28,7 @@ export const createReturnItemsStep = createStep( metadata: (item.details?.metadata as Record) ?? {}, } as CreateOrderReturnItemDTO }) + const createdReturnItems = await orderModuleService.createReturnItems( returnItems ) diff --git a/packages/core/core-flows/src/order/steps/index.ts b/packages/core/core-flows/src/order/steps/index.ts index 3fbab488c640d..7abbfbfb1e2c9 100644 --- a/packages/core/core-flows/src/order/steps/index.ts +++ b/packages/core/core-flows/src/order/steps/index.ts @@ -5,6 +5,7 @@ export * from "./cancel-order-change" export * from "./cancel-orders" export * from "./cancel-return" export * from "./complete-orders" +export * from "./create-claim-items" export * from "./create-claims" export * from "./create-complete-return" export * from "./create-exchanges" diff --git a/packages/core/core-flows/src/order/workflows/claim/cancel-begin-order-claim.ts b/packages/core/core-flows/src/order/workflows/claim/cancel-begin-order-claim.ts index 28090f9f09da0..fd39a3a25edfa 100644 --- a/packages/core/core-flows/src/order/workflows/claim/cancel-begin-order-claim.ts +++ b/packages/core/core-flows/src/order/workflows/claim/cancel-begin-order-claim.ts @@ -45,7 +45,7 @@ export const cancelBeginOrderClaimWorkflow = createWorkflow( cancelBeginOrderClaimWorkflowId, function (input: WorkflowInput): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "return_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts b/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts index 99421ebc9b5f3..406881d344263 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-add-new-item.ts @@ -100,7 +100,7 @@ export const orderClaimAddNewItemWorkflow = createWorkflow( details: { reference_id: lineItems[index].id, quantity: item.quantity, - unit_price: item.unit_price, + unit_price: item.unit_price ?? lineItems[index].unit_price, metadata: item.metadata, }, })) diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-item.ts b/packages/core/core-flows/src/order/workflows/claim/claim-item.ts index e6254a573199d..b5598fb1a2189 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-item.ts @@ -91,6 +91,7 @@ export const orderClaimItemWorkflow = createWorkflow( reference_id: orderClaim.id, details: { reference_id: item.id, + reason: item.reason, quantity: item.quantity, }, })) diff --git a/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts b/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts index 191fff0df3dd2..d31ccb3f792d5 100644 --- a/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts +++ b/packages/core/core-flows/src/order/workflows/claim/claim-request-item-return.ts @@ -156,6 +156,7 @@ export const orderClaimRequestItemReturnWorkflow = createWorkflow( details: { reference_id: item.id, quantity: item.quantity, + reason_id: item.reason_id, metadata: item.metadata, }, })) diff --git a/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts b/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts new file mode 100644 index 0000000000000..f017ba6b0224d --- /dev/null +++ b/packages/core/core-flows/src/order/workflows/claim/confirm-claim-request.ts @@ -0,0 +1,361 @@ +import { + FulfillmentWorkflow, + OrderChangeActionDTO, + OrderChangeDTO, + OrderClaimDTO, + OrderDTO, +} from "@medusajs/types" +import { ChangeActionType, Modules, OrderChangeStatus } from "@medusajs/utils" +import { + WorkflowData, + createStep, + createWorkflow, + parallelize, + transform, + when, +} from "@medusajs/workflows-sdk" +import { createRemoteLinkStep, useRemoteQueryStep } from "../../../common" +import { createFulfillmentWorkflow } from "../../../fulfillment/workflows/create-fulfillment" +import { createReturnFulfillmentWorkflow } from "../../../fulfillment/workflows/create-return-fulfillment" +import { previewOrderChangeStep } from "../../steps" +import { confirmOrderChanges } from "../../steps/confirm-order-changes" +import { createOrderClaimItemsStep } from "../../steps/create-claim-items" +import { createReturnItemsStep } from "../../steps/create-return-items" +import { + throwIfIsCancelled, + throwIfOrderChangeIsNotActive, +} from "../../utils/order-validation" + +type WorkflowInput = { + claim_id: string +} + +const validationStep = createStep( + "validate-confirm-claim-request", + async function ({ + order, + orderChange, + orderClaim, + }: { + order: OrderDTO + orderClaim: OrderClaimDTO + orderChange: OrderChangeDTO + }) { + throwIfIsCancelled(order, "Order") + throwIfIsCancelled(orderClaim, "Claim") + throwIfOrderChangeIsNotActive({ orderChange }) + } +) + +function prepareFulfillmentData({ + order, + items, + shippingOption, + deliveryAddress, +}: { + order: OrderDTO + items: any[] + shippingOption: { + id: string + provider_id: string + service_zone: { + fulfillment_set: { + location?: { + id: string + address: Record + } + } + } + } + deliveryAddress?: Record +}) { + const orderItemsMap = new Map["items"][0]>( + order.items!.map((i) => [i.id, i]) + ) + const fulfillmentItems = items.map((i) => { + const orderItem = orderItemsMap.get(i.item_id)! + return { + line_item_id: i.item_id, + quantity: i.quantity, + return_quantity: i.quantity, + title: orderItem.variant_title ?? orderItem.title, + sku: orderItem.variant_sku || "", + barcode: orderItem.variant_barcode || "", + } as FulfillmentWorkflow.CreateFulfillmentItemWorkflowDTO + }) + + const locationId = shippingOption.service_zone.fulfillment_set.location?.id! + + // delivery address is the stock location address + const address = + deliveryAddress ?? + shippingOption.service_zone.fulfillment_set.location?.address ?? + {} + + delete address.id + + return { + input: { + location_id: locationId, + provider_id: shippingOption.provider_id, + shipping_option_id: shippingOption.id, + items: fulfillmentItems, + delivery_address: address, + order: order, + }, + } +} + +function transformActionsToItems({ orderChange }) { + const claimItems: OrderChangeActionDTO[] = [] + const returnItems: OrderChangeActionDTO[] = [] + + const actions = orderChange.actions ?? [] + actions.forEach((item) => { + if (item.action === ChangeActionType.RETURN_ITEM) { + returnItems.push(item) + } else if ( + item.action === ChangeActionType.ITEM_ADD || + item.action === ChangeActionType.WRITE_OFF_ITEM + ) { + claimItems.push(item) + } + }) + + return { + claimItems: { + changes: claimItems, + claimId: claimItems?.[0]?.claim_id!, + }, + returnItems: { + changes: returnItems, + returnId: returnItems?.[0]?.return_id!, + }, + } +} + +function extractShippingOption({ orderPreview, orderClaim, returnId }) { + if (!orderPreview.shipping_methods?.length) { + return + } + + let returnShippingMethod + let claimShippingMethod + for (const shippingMethod of orderPreview.shipping_methods) { + const modifiedShippingMethod_ = shippingMethod as any + if (!modifiedShippingMethod_.actions) { + continue + } + + for (const action of modifiedShippingMethod_.actions) { + if (action.action === ChangeActionType.SHIPPING_ADD) { + if (action.return_id === returnId) { + returnShippingMethod = shippingMethod + } else if (action.claim_id === orderClaim.id) { + claimShippingMethod = shippingMethod + } + } + } + } + + return { + returnShippingMethod, + claimShippingMethod, + } +} + +export const confirmClaimRequestWorkflowId = "confirm-claim-request" +export const confirmClaimRequestWorkflow = createWorkflow( + confirmClaimRequestWorkflowId, + function (input: WorkflowInput): WorkflowData { + const orderClaim: OrderClaimDTO = useRemoteQueryStep({ + entry_point: "order_claim", + fields: ["id", "status", "order_id", "canceled_at"], + variables: { id: input.claim_id }, + list: false, + throw_if_key_not_found: true, + }) + + const order: OrderDTO = useRemoteQueryStep({ + entry_point: "orders", + fields: [ + "id", + "version", + "canceled_at", + "items.id", + "items.title", + "items.variant_title", + "items.variant_sku", + "items.variant_barcode", + "shipping_address.*", + ], + variables: { id: orderClaim.order_id }, + list: false, + throw_if_key_not_found: true, + }).config({ name: "order-query" }) + + const orderChange: OrderChangeDTO = useRemoteQueryStep({ + entry_point: "order_change", + fields: [ + "id", + "actions.id", + "actions.claim_id", + "actions.return_id", + "actions.action", + "actions.details", + "actions.reference", + "actions.reference_id", + "actions.internal_note", + ], + variables: { + filters: { + order_id: orderClaim.order_id, + claim_id: orderClaim.id, + status: [OrderChangeStatus.PENDING, OrderChangeStatus.REQUESTED], + }, + }, + list: false, + }).config({ name: "order-change-query" }) + + validationStep({ order, orderClaim, orderChange }) + + const { claimItems, returnItems } = transform( + { orderChange }, + transformActionsToItems + ) + + const orderPreview = previewOrderChangeStep(order.id) + + const [createClaimItems, createdReturnItems] = parallelize( + createOrderClaimItemsStep(claimItems), + createReturnItemsStep(returnItems), + confirmOrderChanges({ changes: [orderChange], orderId: order.id }) + ) + + const returnId = transform( + { createdReturnItems }, + ({ createdReturnItems }) => { + return createdReturnItems?.[0]?.return_id + } + ) + + const claimId = transform({ createClaimItems }, ({ createClaimItems }) => { + return createClaimItems?.[0]?.claim_id + }) + + const { returnShippingMethod, claimShippingMethod } = transform( + { orderPreview, orderClaim, returnId }, + extractShippingOption + ) + + when({ claimShippingMethod }, ({ claimShippingMethod }) => { + return !!claimShippingMethod + }).then(() => { + const claim: OrderClaimDTO = useRemoteQueryStep({ + entry_point: "order_claim", + fields: [ + "id", + "version", + "canceled_at", + "additional_items.id", + "additional_items.title", + "additional_items.variant_title", + "additional_items.variant_sku", + "additional_items.variant_barcode", + ], + variables: { id: claimId }, + list: false, + throw_if_key_not_found: true, + }).config({ name: "claim-query" }) + + const claimShippingOption = useRemoteQueryStep({ + entry_point: "shipping_options", + fields: [ + "id", + "provider_id", + "service_zone.fulfillment_set.location.id", + "service_zone.fulfillment_set.location.address.*", + ], + variables: { + id: claimShippingMethod.shipping_option_id, + }, + list: false, + throw_if_key_not_found: true, + }).config({ name: "claim-shipping-option" }) + + const fulfillmentData = transform( + { + order, + items: claim.additional_items! ?? [], + shippingOption: claimShippingOption, + deliveryAddress: order.shipping_address, + }, + prepareFulfillmentData + ) + + const fulfillment = createFulfillmentWorkflow.runAsStep(fulfillmentData) + + const link = transform({ fulfillment, order }, (data) => { + return [ + { + [Modules.ORDER]: { order_id: data.order.id }, + [Modules.FULFILLMENT]: { fulfillment_id: data.fulfillment.id }, + }, + ] + }) + + createRemoteLinkStep(link).config({ + name: "claim-shipping-fulfillment-link", + }) + }) + + when({ returnShippingMethod }, ({ returnShippingMethod }) => { + return !!returnShippingMethod + }).then(() => { + const returnShippingOption = useRemoteQueryStep({ + entry_point: "shipping_options", + fields: [ + "id", + "provider_id", + "service_zone.fulfillment_set.location.id", + "service_zone.fulfillment_set.location.address.*", + ], + variables: { + id: returnShippingMethod.shipping_option_id, + }, + list: false, + throw_if_key_not_found: true, + }).config({ name: "claim-return-shipping-option" }) + + const fulfillmentData = transform( + { + order, + items: order.items!, + shippingOption: returnShippingOption, + }, + prepareFulfillmentData + ) + + const returnFulfillment = + createReturnFulfillmentWorkflow.runAsStep(fulfillmentData) + + const returnLink = transform( + { returnId, fulfillment: returnFulfillment }, + (data) => { + return [ + { + [Modules.ORDER]: { return_id: data.returnId }, + [Modules.FULFILLMENT]: { fulfillment_id: data.fulfillment.id }, + }, + ] + } + ) + + createRemoteLinkStep(returnLink).config({ + name: "claim-return-shipping-fulfillment-link", + }) + }) + + return orderPreview + } +) diff --git a/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts b/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts index d5b09ca5d9030..b6403c86493a0 100644 --- a/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/claim/create-claim-shipping-method.ts @@ -48,7 +48,7 @@ export const createClaimShippingMethodWorkflow = createWorkflow( custom_price?: BigNumberInput }): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, @@ -115,8 +115,8 @@ export const createClaimShippingMethodWorkflow = createWorkflow( name: option.name, version: orderChange.version, order_id: data.orderClaim.order_id, - return_id: data.orderClaim.id, - claim_id: data.input.claim_id, + return_id: input.return_id, + claim_id: data.orderClaim.id, } } ) @@ -156,8 +156,8 @@ export const createClaimShippingMethodWorkflow = createWorkflow( reference_id: createdMethod.id, amount: methodPrice, order_id: order.id, - return_id: orderClaim.id, - claim_id: input.claim_id, + return_id: input.return_id, + claim_id: orderClaim.id, } } ) diff --git a/packages/core/core-flows/src/order/workflows/claim/remove-claim-item-action.ts b/packages/core/core-flows/src/order/workflows/claim/remove-claim-item-action.ts index 9b640ef1f008a..cebdae442a319 100644 --- a/packages/core/core-flows/src/order/workflows/claim/remove-claim-item-action.ts +++ b/packages/core/core-flows/src/order/workflows/claim/remove-claim-item-action.ts @@ -59,7 +59,7 @@ export const removeItemClaimActionWorkflow = createWorkflow( input: WorkflowData ): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/claim/remove-claim-shipping-method.ts b/packages/core/core-flows/src/order/workflows/claim/remove-claim-shipping-method.ts index 6f49e21b501c4..b1307a13f80e4 100644 --- a/packages/core/core-flows/src/order/workflows/claim/remove-claim-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/claim/remove-claim-shipping-method.ts @@ -59,7 +59,7 @@ export const removeClaimShippingMethodWorkflow = createWorkflow( input: WorkflowData ): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/claim/update-claim-add-item.ts b/packages/core/core-flows/src/order/workflows/claim/update-claim-add-item.ts index 41de3fbd21436..28236c9f6b4bb 100644 --- a/packages/core/core-flows/src/order/workflows/claim/update-claim-add-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/update-claim-add-item.ts @@ -63,7 +63,7 @@ export const updateClaimAddItemWorkflow = createWorkflow( input: WorkflowData ): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/claim/update-claim-item.ts b/packages/core/core-flows/src/order/workflows/claim/update-claim-item.ts index c5dd534dd07c8..c828658983736 100644 --- a/packages/core/core-flows/src/order/workflows/claim/update-claim-item.ts +++ b/packages/core/core-flows/src/order/workflows/claim/update-claim-item.ts @@ -63,7 +63,7 @@ export const updateClaimItemWorkflow = createWorkflow( input: WorkflowData ): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/claim/update-claim-shipping-method.ts b/packages/core/core-flows/src/order/workflows/claim/update-claim-shipping-method.ts index 767155129576a..8e65e92130ff7 100644 --- a/packages/core/core-flows/src/order/workflows/claim/update-claim-shipping-method.ts +++ b/packages/core/core-flows/src/order/workflows/claim/update-claim-shipping-method.ts @@ -61,7 +61,7 @@ export const updateClaimShippingMethodWorkflow = createWorkflow( input: WorkflowData ): WorkflowData { const orderClaim: OrderClaimDTO = useRemoteQueryStep({ - entry_point: "claim", + entry_point: "order_claim", fields: ["id", "status", "order_id", "canceled_at"], variables: { id: input.claim_id }, list: false, diff --git a/packages/core/core-flows/src/order/workflows/index.ts b/packages/core/core-flows/src/order/workflows/index.ts index 1cb2fce952f74..5fb1fcf026125 100644 --- a/packages/core/core-flows/src/order/workflows/index.ts +++ b/packages/core/core-flows/src/order/workflows/index.ts @@ -8,6 +8,7 @@ export * from "./claim/cancel-begin-order-claim" export * from "./claim/claim-add-new-item" export * from "./claim/claim-item" export * from "./claim/claim-request-item-return" +export * from "./claim/confirm-claim-request" export * from "./claim/create-claim-shipping-method" export * from "./claim/remove-claim-item-action" export * from "./claim/remove-claim-shipping-method" diff --git a/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts b/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts index 9ab960ef1c981..c8399b1e35ac9 100644 --- a/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts +++ b/packages/core/core-flows/src/order/workflows/return/confirm-return-request.ts @@ -4,12 +4,7 @@ import { OrderDTO, ReturnDTO, } from "@medusajs/types" -import { - ChangeActionType, - MedusaError, - Modules, - OrderChangeStatus, -} from "@medusajs/utils" +import { ChangeActionType, Modules, OrderChangeStatus } from "@medusajs/utils" import { WorkflowData, createStep, @@ -84,7 +79,7 @@ function prepareFulfillmentData({ }) const locationId = - returnShippingOption.service_zone.fulfillment_set.location?.id + returnShippingOption.service_zone.fulfillment_set.location?.id! // delivery address is the stock location address const address = @@ -92,13 +87,6 @@ function prepareFulfillmentData({ delete address.id - if (!locationId) { - throw new MedusaError( - MedusaError.Types.INVALID_DATA, - `Cannot create return without stock location, either provide a location or you should link the shipping option ${returnShippingOption.id} to a stock location.` - ) - } - return { input: { location_id: locationId, @@ -111,6 +99,31 @@ function prepareFulfillmentData({ } } +function extractReturnShippingOptionId({ orderPreview, orderReturn }) { + if (!orderPreview.shipping_methods?.length) { + return + } + + let returnShippingMethod + for (const shippingMethod of orderPreview.shipping_methods) { + const modifiedShippingMethod_ = shippingMethod as any + if (!modifiedShippingMethod_.actions) { + continue + } + + for (const action of modifiedShippingMethod_.actions) { + if ( + action.action === ChangeActionType.SHIPPING_ADD && + action.return_id === orderReturn.id + ) { + returnShippingMethod = shippingMethod + break + } + } + } + return returnShippingMethod.shipping_option_id +} + export const confirmReturnRequestWorkflowId = "confirm-return-request" export const confirmReturnRequestWorkflow = createWorkflow( confirmReturnRequestWorkflowId, @@ -169,36 +182,16 @@ export const confirmReturnRequestWorkflow = createWorkflow( validationStep({ order, orderReturn, orderChange }) + const orderPreview = previewOrderChangeStep(order.id) + const createdReturnItems = createReturnItemsStep({ returnId: orderReturn.id, changes: returnItemActions, }) - confirmOrderChanges({ changes: [orderChange], orderId: order.id }) - - const returnModified = useRemoteQueryStep({ - entry_point: "return", - fields: [ - "id", - "status", - "order_id", - "canceled_at", - "shipping_methods.shipping_option_id", - ], - variables: { id: input.return_id }, - list: false, - throw_if_key_not_found: true, - }).config({ name: "return-query" }) - const returnShippingOptionId = transform( - { returnModified }, - ({ returnModified }) => { - if (!returnModified.shipping_methods?.length) { - return - } - - return returnModified.shipping_methods[0].shipping_option_id - } + { orderPreview, orderReturn }, + extractReturnShippingOptionId ) when({ returnShippingOptionId }, ({ returnShippingOptionId }) => { @@ -242,6 +235,8 @@ export const confirmReturnRequestWorkflow = createWorkflow( createRemoteLinkStep(link) }) - return previewOrderChangeStep(order.id) + confirmOrderChanges({ changes: [orderChange], orderId: order.id }) + + return orderPreview } ) diff --git a/packages/core/core-flows/src/order/workflows/return/update-request-item-return.ts b/packages/core/core-flows/src/order/workflows/return/update-request-item-return.ts index c6c80ac02dd99..00eb7d5ea7ab6 100644 --- a/packages/core/core-flows/src/order/workflows/return/update-request-item-return.ts +++ b/packages/core/core-flows/src/order/workflows/return/update-request-item-return.ts @@ -97,7 +97,7 @@ export const updateRequestItemReturnWorkflow = createWorkflow( variables: { filters: { order_id: orderReturn.order_id, - return_id: orderReturn.id, + claim_id: input.claim_id, status: [OrderChangeStatus.PENDING, OrderChangeStatus.REQUESTED], }, }, diff --git a/packages/core/types/src/order/common.ts b/packages/core/types/src/order/common.ts index fc29cbd32cb47..e2c04be7b20f9 100644 --- a/packages/core/types/src/order/common.ts +++ b/packages/core/types/src/order/common.ts @@ -3,6 +3,7 @@ import { OperatorMap } from "../dal/utils" import { FulfillmentDTO } from "../fulfillment" import { PaymentCollectionDTO } from "../payment" import { BigNumberInput, BigNumberRawValue, BigNumberValue } from "../totals" +import { ClaimReason } from "./mutations" export type ChangeActionType = | "CANCEL" @@ -1156,6 +1157,40 @@ export interface OrderReturnItemDTO { updated_at?: Date | string } +export interface OrderClaimItemDTO { + id: string + claim_id: string + order_id: string + item_id: string + quantity: number + reason: ClaimReason + raw_quantity: BigNumberRawValue + metadata?: Record | null + created_at?: Date | string + updated_at?: Date | string +} + +export interface OrderClaimItemImageDTO { + id: string + claim_item_id: string + url: string + metadata?: Record | null + created_at?: Date | string + updated_at?: Date | string +} + +export interface OrderExchangeItemDTO { + id: string + exchange_id: string + order_id: string + item_id: string + quantity: number + raw_quantity: BigNumberRawValue + metadata?: Record | null + created_at?: Date | string + updated_at?: Date | string +} + export interface OrderClaimDTO extends Omit { order_id: string @@ -1341,6 +1376,9 @@ export interface OrderChangeActionDTO { * The ID of the associated order */ order_id: string | null + return_id: string | null + claim_id: string | null + exchange_id: string | null /** * The associated order * diff --git a/packages/core/types/src/order/mutations.ts b/packages/core/types/src/order/mutations.ts index d673a798a2342..ce8972c01727a 100644 --- a/packages/core/types/src/order/mutations.ts +++ b/packages/core/types/src/order/mutations.ts @@ -482,6 +482,32 @@ export interface CreateOrderReturnItemDTO { metadata?: Record | null } +export interface CreateOrderClaimItemDTO { + claim_id: string + item_id: string + reason?: ClaimReason + is_additional_item?: boolean + quantity?: BigNumberInput + note?: string + metadata?: Record | null +} + +export interface CreateOrderExchangeItemDTO { + exchange_id: string + item_id: string + quantity?: BigNumberInput + note?: string + metadata?: Record | null +} + +export interface CreateOrderExchangeItemDTO { + exchange_id: string + item_id: string + quantity?: BigNumberInput + note?: string + metadata?: Record | null +} + export interface UpdateOrderReturnWithSelectorDTO { selector: Partial data: Partial @@ -510,7 +536,7 @@ export type ClaimReason = export interface CreateOrderClaimDTO extends BaseOrderBundledActionsDTO { type: OrderClaimType claim_items?: (BaseOrderBundledItemActionsDTO & { - reason: ClaimReason + reason?: ClaimReason images?: { url: string metadata?: Record | null diff --git a/packages/core/types/src/order/service.ts b/packages/core/types/src/order/service.ts index df92d8a4f18f1..656545aa2aee5 100644 --- a/packages/core/types/src/order/service.ts +++ b/packages/core/types/src/order/service.ts @@ -22,8 +22,10 @@ import { OrderChangeDTO, OrderChangeReturn, OrderClaimDTO, + OrderClaimItemDTO, OrderDTO, OrderExchangeDTO, + OrderExchangeItemDTO, OrderItemDTO, OrderLineItemAdjustmentDTO, OrderLineItemDTO, @@ -48,8 +50,10 @@ import { CreateOrderChangeActionDTO, CreateOrderChangeDTO, CreateOrderClaimDTO, + CreateOrderClaimItemDTO, CreateOrderDTO, CreateOrderExchangeDTO, + CreateOrderExchangeItemDTO, CreateOrderLineItemDTO, CreateOrderLineItemTaxLineDTO, CreateOrderReturnDTO, @@ -1889,6 +1893,26 @@ export interface IOrderModuleService extends IModuleService { sharedContext?: Context ): Promise + createOrderClaimItems( + data: CreateOrderClaimItemDTO, + sharedContext?: Context + ): Promise + + createOrderClaimItems( + data: CreateOrderClaimItemDTO[], + sharedContext?: Context + ): Promise + + createOrderExchangeItems( + data: CreateOrderExchangeItemDTO, + sharedContext?: Context + ): Promise + + createOrderExchangeItems( + data: CreateOrderExchangeItemDTO[], + sharedContext?: Context + ): Promise + createReturns( data: CreateOrderReturnDTO, sharedContext?: Context @@ -1959,6 +1983,13 @@ export interface IOrderModuleService extends IModuleService { deleteOrderClaims(ids: string[], sharedContext?: Context): Promise + deleteOrderClaimItems(ids: string[], sharedContext?: Context): Promise + + deleteOrderClaimItemImages( + ids: string[], + sharedContext?: Context + ): Promise + softDeleteOrderClaims( ids: string[], config?: SoftDeleteReturn, @@ -1999,6 +2030,11 @@ export interface IOrderModuleService extends IModuleService { deleteOrderExchanges(ids: string[], sharedContext?: Context): Promise + deleteOrderExchangeItems( + ids: string[], + sharedContext?: Context + ): Promise + softDeleteOrderExchanges( ids: string[], config?: SoftDeleteReturn, diff --git a/packages/core/types/src/workflow/order/items.ts b/packages/core/types/src/workflow/order/items.ts index ef2d8a2ecd306..f27ee206f5b0b 100644 --- a/packages/core/types/src/workflow/order/items.ts +++ b/packages/core/types/src/workflow/order/items.ts @@ -1,3 +1,4 @@ +import { ClaimReason } from "../../order/mutations" import { BigNumberInput } from "../../totals" interface NewItem { @@ -63,7 +64,7 @@ export interface UpdateExchangeAddItemWorkflowInput { export interface OrderClaimItemWorkflowInput { claim_id: string - items: ExistingItem[] + items: (ExistingItem & { reason?: ClaimReason })[] } export interface UpdateClaimItemWorkflowInput { @@ -71,6 +72,7 @@ export interface UpdateClaimItemWorkflowInput { action_id: string data: { quantity?: BigNumberInput + reason_id?: ClaimReason internal_note?: string | null } } diff --git a/packages/medusa/src/api/admin/claims/[id]/claim-items/[action_id]/route.ts b/packages/medusa/src/api/admin/claims/[id]/claim-items/[action_id]/route.ts index 3507e09fad2b7..e906be85aed88 100644 --- a/packages/medusa/src/api/admin/claims/[id]/claim-items/[action_id]/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/claim-items/[action_id]/route.ts @@ -29,7 +29,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { @@ -65,7 +65,7 @@ export const DELETE = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/claim-items/route.ts b/packages/medusa/src/api/admin/claims/[id]/claim-items/route.ts index 5236c9fe363a2..4284c82176cfa 100644 --- a/packages/medusa/src/api/admin/claims/[id]/claim-items/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/claim-items/route.ts @@ -22,7 +22,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/inbound/items/[action_id]/route.ts b/packages/medusa/src/api/admin/claims/[id]/inbound/items/[action_id]/route.ts index 24e10b6baa65b..2df3a5bd0e88a 100644 --- a/packages/medusa/src/api/admin/claims/[id]/inbound/items/[action_id]/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/inbound/items/[action_id]/route.ts @@ -10,6 +10,7 @@ import { AuthenticatedMedusaRequest, MedusaResponse, } from "../../../../../../../types/routing" +import { defaultAdminDetailsReturnFields } from "../../../../../returns/query-config" import { AdminPostReturnsRequestItemsActionReqSchemaType } from "../../../../../returns/validators" export const POST = async ( @@ -22,7 +23,7 @@ export const POST = async ( const [claim] = await remoteQuery( remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, }, @@ -38,6 +39,7 @@ export const POST = async ( input: { data: { ...req.validatedBody }, return_id: claim.return_id, + claim_id: claim.id, action_id, }, }) @@ -45,12 +47,9 @@ export const POST = async ( const queryObject = remoteQueryObjectFromString({ entryPoint: "return", variables: { - id, - filters: { - ...req.filterableFields, - }, + id: claim.return_id, }, - fields: req.remoteQueryConfig.fields, + fields: defaultAdminDetailsReturnFields, }) const [orderReturn] = await remoteQuery(queryObject) diff --git a/packages/medusa/src/api/admin/claims/[id]/inbound/items/route.ts b/packages/medusa/src/api/admin/claims/[id]/inbound/items/route.ts index 6b0d7f76b5cf1..15b25916b3608 100644 --- a/packages/medusa/src/api/admin/claims/[id]/inbound/items/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/inbound/items/route.ts @@ -8,6 +8,7 @@ import { AuthenticatedMedusaRequest, MedusaResponse, } from "../../../../../../types/routing" +import { defaultAdminDetailsReturnFields } from "../../../../returns/query-config" import { AdminPostReturnsRequestItemsReqSchemaType } from "../../../../returns/validators" export const POST = async ( @@ -20,7 +21,7 @@ export const POST = async ( const [claim] = await remoteQuery( remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, }, @@ -33,18 +34,19 @@ export const POST = async ( ) const { result } = await orderClaimRequestItemReturnWorkflow(req.scope).run({ - input: { ...req.validatedBody, return_id: claim.return_id, claim_id: id }, + input: { + ...req.validatedBody, + return_id: claim.return_id, + claim_id: id, + }, }) const queryObject = remoteQueryObjectFromString({ entryPoint: "return", variables: { - id, - filters: { - ...req.filterableFields, - }, + id: claim.return_id, }, - fields: req.remoteQueryConfig.fields, + fields: defaultAdminDetailsReturnFields, }) const [orderReturn] = await remoteQuery(queryObject) diff --git a/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/[action_id]/route.ts b/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/[action_id]/route.ts index a27fddbb0b3e3..6e097c027050a 100644 --- a/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/[action_id]/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/[action_id]/route.ts @@ -10,6 +10,7 @@ import { AuthenticatedMedusaRequest, MedusaResponse, } from "../../../../../../../types/routing" +import { defaultAdminDetailsReturnFields } from "../../../../../returns/query-config" import { AdminPostClaimsShippingActionReqSchemaType } from "../../../../validators" export const POST = async ( @@ -22,7 +23,7 @@ export const POST = async ( const [claim] = await remoteQuery( remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, }, @@ -43,7 +44,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { @@ -71,7 +72,7 @@ export const DELETE = async ( const [claim] = await remoteQuery( remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, }, @@ -93,19 +94,17 @@ export const DELETE = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "return", variables: { - id, - filters: { - ...req.filterableFields, - }, + id: claim.return_id, }, - fields: req.remoteQueryConfig.fields, + fields: defaultAdminDetailsReturnFields, }) - const [orderClaim] = await remoteQuery(queryObject) + + const [orderReturn] = await remoteQuery(queryObject) res.json({ order_preview: orderPreview, - claim: orderClaim, + return: orderReturn, }) } diff --git a/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/route.ts b/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/route.ts index 304d4661f9086..0797e6155cca1 100644 --- a/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/inbound/shipping-method/route.ts @@ -8,6 +8,7 @@ import { AuthenticatedMedusaRequest, MedusaResponse, } from "../../../../../../types/routing" +import { defaultAdminDetailsReturnFields } from "../../../../returns/query-config" import { AdminPostReturnsShippingReqSchemaType } from "../../../../returns/validators" export const POST = async ( @@ -20,7 +21,7 @@ export const POST = async ( const [claim] = await remoteQuery( remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, }, @@ -33,24 +34,25 @@ export const POST = async ( ) const { result } = await createClaimShippingMethodWorkflow(req.scope).run({ - input: { ...req.validatedBody, return_id: claim.return_id, claim_id: id }, + input: { + ...req.validatedBody, + return_id: claim.return_id, + claim_id: id, + }, }) const queryObject = remoteQueryObjectFromString({ entryPoint: "return", variables: { - id, - filters: { - ...req.filterableFields, - }, + id: claim.return_id, }, - fields: req.remoteQueryConfig.fields, + fields: defaultAdminDetailsReturnFields, }) - const [orderClaim] = await remoteQuery(queryObject) + const [orderReturn] = await remoteQuery(queryObject) res.json({ order_preview: result, - return: orderClaim, + return: orderReturn, }) } diff --git a/packages/medusa/src/api/admin/claims/[id]/outbound/items/[action_id]/route.ts b/packages/medusa/src/api/admin/claims/[id]/outbound/items/[action_id]/route.ts index 081d76308cfee..243affb4a83ae 100644 --- a/packages/medusa/src/api/admin/claims/[id]/outbound/items/[action_id]/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/outbound/items/[action_id]/route.ts @@ -29,7 +29,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { @@ -65,7 +65,7 @@ export const DELETE = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/outbound/items/route.ts b/packages/medusa/src/api/admin/claims/[id]/outbound/items/route.ts index 71be05f3b72f2..70539affa707e 100644 --- a/packages/medusa/src/api/admin/claims/[id]/outbound/items/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/outbound/items/route.ts @@ -23,7 +23,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/[action_id]/route.ts b/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/[action_id]/route.ts index 2a6f69552bc7a..ddc4dda13e69b 100644 --- a/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/[action_id]/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/[action_id]/route.ts @@ -29,7 +29,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { @@ -65,7 +65,7 @@ export const DELETE = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/route.ts b/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/route.ts index ed43bb226ab33..ba1c8e21b80f3 100644 --- a/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/route.ts +++ b/packages/medusa/src/api/admin/claims/[id]/outbound/shipping-method/route.ts @@ -22,7 +22,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id, filters: { diff --git a/packages/medusa/src/api/admin/claims/[id]/request/route.ts b/packages/medusa/src/api/admin/claims/[id]/request/route.ts new file mode 100644 index 0000000000000..ab38108e4ba46 --- /dev/null +++ b/packages/medusa/src/api/admin/claims/[id]/request/route.ts @@ -0,0 +1,40 @@ +import { confirmClaimRequestWorkflow } from "@medusajs/core-flows" +import { + ContainerRegistrationKeys, + remoteQueryObjectFromString, +} from "@medusajs/utils" +import { + AuthenticatedMedusaRequest, + MedusaResponse, +} from "../../../../../types/routing" + +export const POST = async ( + req: AuthenticatedMedusaRequest, + res: MedusaResponse +) => { + const { id } = req.params + + const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY) + + const { result } = await confirmClaimRequestWorkflow(req.scope).run({ + input: { claim_id: id }, + }) + + const queryObject = remoteQueryObjectFromString({ + entryPoint: "order_claim", + variables: { + id, + filters: { + ...req.filterableFields, + }, + }, + fields: req.remoteQueryConfig.fields, + }) + + const [orderClaim] = await remoteQuery(queryObject) + + res.json({ + order_preview: result, + claim: orderClaim, + }) +} diff --git a/packages/medusa/src/api/admin/claims/middlewares.ts b/packages/medusa/src/api/admin/claims/middlewares.ts index fd52d0577584d..433085122c13a 100644 --- a/packages/medusa/src/api/admin/claims/middlewares.ts +++ b/packages/medusa/src/api/admin/claims/middlewares.ts @@ -5,8 +5,8 @@ import * as QueryConfig from "./query-config" import { AdminGetOrdersOrderParams, AdminGetOrdersParams, + AdminPostClaimItemsReqSchema, AdminPostClaimsAddItemsReqSchema, - AdminPostClaimsConfirmRequestReqSchema, AdminPostClaimsRequestItemsActionReqSchema, AdminPostClaimsRequestReturnItemsReqSchema, AdminPostClaimsShippingActionReqSchema, @@ -51,7 +51,7 @@ export const adminClaimRoutesMiddlewares: MiddlewareRoute[] = [ method: ["POST"], matcher: "/admin/claims/:id/claim-items", middlewares: [ - validateAndTransformBody(AdminPostClaimsRequestReturnItemsReqSchema), + validateAndTransformBody(AdminPostClaimItemsReqSchema), validateAndTransformQuery( AdminGetOrdersOrderParams, QueryConfig.retrieveTransformQueryConfig @@ -214,7 +214,6 @@ export const adminClaimRoutesMiddlewares: MiddlewareRoute[] = [ method: ["POST"], matcher: "/admin/claims/:id/request", middlewares: [ - validateAndTransformBody(AdminPostClaimsConfirmRequestReqSchema), validateAndTransformQuery( AdminGetOrdersOrderParams, QueryConfig.retrieveTransformQueryConfig @@ -223,7 +222,17 @@ export const adminClaimRoutesMiddlewares: MiddlewareRoute[] = [ }, { method: ["DELETE"], - matcher: "/admin/claims/:id/request", + matcher: "/admin/claims/:id", middlewares: [], }, + { + method: ["POST"], + matcher: "/admin/claims/:id/cancel", + middlewares: [ + validateAndTransformQuery( + AdminGetOrdersOrderParams, + QueryConfig.retrieveTransformQueryConfig + ), + ], + }, ] diff --git a/packages/medusa/src/api/admin/claims/query-config.ts b/packages/medusa/src/api/admin/claims/query-config.ts index 406f95c5c0d39..d71fdcfa53718 100644 --- a/packages/medusa/src/api/admin/claims/query-config.ts +++ b/packages/medusa/src/api/admin/claims/query-config.ts @@ -2,12 +2,10 @@ export const defaultAdminClaimFields = [ "id", "type", "order_id", - "exchange_id", - "claim_id", + "return_id", "display_id", "location_id", "order_version", - "status", "refund_amount", "created_at", "updated_at", @@ -15,8 +13,9 @@ export const defaultAdminClaimFields = [ export const defaultAdminDetailsClaimFields = [ ...defaultAdminClaimFields, - "items.*", - "items.reason.*", + "additional_items.*", + "claim_items.*", + "claim_items.reason.*", ] export const retrieveTransformQueryConfig = { diff --git a/packages/medusa/src/api/admin/claims/route.ts b/packages/medusa/src/api/admin/claims/route.ts index 91290671cd9db..24d1ba55e22d8 100644 --- a/packages/medusa/src/api/admin/claims/route.ts +++ b/packages/medusa/src/api/admin/claims/route.ts @@ -18,7 +18,7 @@ export const GET = async ( const remoteQuery = req.scope.resolve(ContainerRegistrationKeys.REMOTE_QUERY) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claims", + entryPoint: "order_claims", variables: { filters: { ...req.filterableFields, @@ -52,7 +52,7 @@ export const POST = async ( }) const queryObject = remoteQueryObjectFromString({ - entryPoint: "claim", + entryPoint: "order_claim", variables: { id: result.claim_id, filters: { diff --git a/packages/medusa/src/api/admin/claims/validators.ts b/packages/medusa/src/api/admin/claims/validators.ts index 66e5c9103b459..4a4aad5ee88e5 100644 --- a/packages/medusa/src/api/admin/claims/validators.ts +++ b/packages/medusa/src/api/admin/claims/validators.ts @@ -1,4 +1,4 @@ -import { ClaimType } from "@medusajs/utils" +import { ClaimReason, ClaimType } from "@medusajs/utils" import { z } from "zod" import { createFindParams, @@ -150,9 +150,9 @@ export const AdminPostClaimItemsReqSchema = z.object({ z.object({ id: z.string(), quantity: z.number(), + reason: z.nativeEnum(ClaimReason).optional(), description: z.string().optional(), internal_note: z.string().optional(), - metadata: z.record(z.unknown()).optional(), }) ), }) @@ -174,6 +174,7 @@ export type AdminPostClaimsRequestItemsActionReqSchemaType = z.infer< export const AdminPostClaimsItemsActionReqSchema = z.object({ quantity: z.number().optional(), + reason: z.nativeEnum(ClaimReason).nullish().optional(), internal_note: z.string().nullish().optional(), }) diff --git a/packages/medusa/src/api/middlewares.ts b/packages/medusa/src/api/middlewares.ts index ea6b7a82e03c8..fc597848cbf66 100644 --- a/packages/medusa/src/api/middlewares.ts +++ b/packages/medusa/src/api/middlewares.ts @@ -1,6 +1,7 @@ import { defineMiddlewares } from "../utils/define-middlewares" import { adminApiKeyRoutesMiddlewares } from "./admin/api-keys/middlewares" import { adminCampaignRoutesMiddlewares } from "./admin/campaigns/middlewares" +import { adminClaimRoutesMiddlewares } from "./admin/claims/middlewares" import { adminCollectionRoutesMiddlewares } from "./admin/collections/middlewares" import { adminCurrencyRoutesMiddlewares } from "./admin/currencies/middlewares" import { adminCustomerGroupRoutesMiddlewares } from "./admin/customer-groups/middlewares" @@ -17,13 +18,14 @@ import { adminPaymentRoutesMiddlewares } from "./admin/payments/middlewares" import { adminPriceListsRoutesMiddlewares } from "./admin/price-lists/middlewares" import { adminPricePreferencesRoutesMiddlewares } from "./admin/price-preferences/middlewares" import { adminProductCategoryRoutesMiddlewares } from "./admin/product-categories/middlewares" -import { adminProductTypeRoutesMiddlewares } from "./admin/product-types/middlewares" import { adminProductTagRoutesMiddlewares } from "./admin/product-tags/middlewares" +import { adminProductTypeRoutesMiddlewares } from "./admin/product-types/middlewares" import { adminProductRoutesMiddlewares } from "./admin/products/middlewares" import { adminPromotionRoutesMiddlewares } from "./admin/promotions/middlewares" import { adminRegionRoutesMiddlewares } from "./admin/regions/middlewares" import { adminReservationRoutesMiddlewares } from "./admin/reservations/middlewares" import { adminReturnReasonRoutesMiddlewares } from "./admin/return-reasons/middlewares" +import { adminReturnRoutesMiddlewares } from "./admin/returns/middlewares" import { adminSalesChannelRoutesMiddlewares } from "./admin/sales-channels/middlewares" import { adminShippingOptionRoutesMiddlewares } from "./admin/shipping-options/middlewares" import { adminShippingProfilesMiddlewares } from "./admin/shipping-profiles/middlewares" @@ -35,6 +37,7 @@ import { adminUploadRoutesMiddlewares } from "./admin/uploads/middlewares" import { adminUserRoutesMiddlewares } from "./admin/users/middlewares" import { adminWorkflowsExecutionsMiddlewares } from "./admin/workflows-executions/middlewares" import { authRoutesMiddlewares } from "./auth/middlewares" + import { hooksRoutesMiddlewares } from "./hooks/middlewares" import { storeCartRoutesMiddlewares } from "./store/carts/middlewares" import { storeCollectionRoutesMiddlewares } from "./store/collections/middlewares" @@ -48,7 +51,6 @@ import { storeProductRoutesMiddlewares } from "./store/products/middlewares" import { storeRegionRoutesMiddlewares } from "./store/regions/middlewares" import { storeReturnReasonRoutesMiddlewares } from "./store/return-reasons/middlewares" import { storeShippingOptionRoutesMiddlewares } from "./store/shipping-options/middlewares" -import { adminReturnRoutesMiddlewares } from "./admin/returns/middlewares" export default defineMiddlewares([ ...adminCustomerGroupRoutesMiddlewares, @@ -103,4 +105,5 @@ export default defineMiddlewares([ ...storeProductRoutesMiddlewares, ...storeReturnReasonRoutesMiddlewares, ...adminReturnReasonRoutesMiddlewares, + ...adminClaimRoutesMiddlewares, ]) diff --git a/packages/modules/order/integration-tests/__tests__/index.spec.ts b/packages/modules/order/integration-tests/__tests__/index.spec.ts index 223a5076ed964..ca6e0e0a794d0 100644 --- a/packages/modules/order/integration-tests/__tests__/index.spec.ts +++ b/packages/modules/order/integration-tests/__tests__/index.spec.ts @@ -1,7 +1,7 @@ -import { moduleIntegrationTestRunner } from "medusa-test-utils" import { IOrderModuleService } from "@medusajs/types" import { Module, Modules } from "@medusajs/utils" import { OrderModuleService } from "@services" +import { moduleIntegrationTestRunner } from "medusa-test-utils" moduleIntegrationTestRunner({ moduleName: Modules.ORDER, @@ -31,7 +31,10 @@ moduleIntegrationTestRunner({ "return", "returnItem", "orderClaim", + "orderClaimItem", + "orderClaimItemImage", "orderExchange", + "orderExchangeItem", ]) Object.keys(linkable).forEach((key) => { @@ -183,6 +186,22 @@ moduleIntegrationTestRunner({ field: "orderClaim", }, }, + orderClaimItem: { + id: { + field: "orderClaimItem", + linkable: "order_claim_item_id", + primaryKey: "id", + serviceName: "order", + }, + }, + orderClaimItemImage: { + id: { + field: "orderClaimItemImage", + linkable: "order_claim_item_image_id", + primaryKey: "id", + serviceName: "order", + }, + }, orderExchange: { id: { linkable: "order_exchange_id", @@ -191,6 +210,14 @@ moduleIntegrationTestRunner({ field: "orderExchange", }, }, + orderExchangeItem: { + id: { + field: "orderExchangeItem", + linkable: "order_exchange_item_id", + primaryKey: "id", + serviceName: "order", + }, + }, }) }) }) diff --git a/packages/modules/order/src/models/claim-item-image.ts b/packages/modules/order/src/models/claim-item-image.ts index 60fbf7ef1c3d5..2bf5f8b07fd9b 100644 --- a/packages/modules/order/src/models/claim-item-image.ts +++ b/packages/modules/order/src/models/claim-item-image.ts @@ -33,7 +33,7 @@ const ClaimItemIdIndex = createPsqlIndexStatementHelper({ @Entity({ tableName: "order_claim_item_image" }) @Filter(DALUtils.mikroOrmSoftDeletableFilterOptions) -export default class ClaimItemImage { +export default class OrderClaimItemImage { [OptionalProps]?: OptionalClaimItemImageProps @PrimaryKey({ columnType: "text" }) diff --git a/packages/modules/order/src/models/claim-item.ts b/packages/modules/order/src/models/claim-item.ts index 861ac72812608..f969537084c0a 100644 --- a/packages/modules/order/src/models/claim-item.ts +++ b/packages/modules/order/src/models/claim-item.ts @@ -20,7 +20,7 @@ import { Rel, } from "@mikro-orm/core" import Claim from "./claim" -import ClaimItemImage from "./claim-item-image" +import OrderClaimItemImage from "./claim-item-image" import LineItem from "./line-item" type OptionalLineItemProps = DAL.ModelDateColumns @@ -50,10 +50,10 @@ export default class OrderClaimItem { @PrimaryKey({ columnType: "text" }) id: string - @OneToMany(() => ClaimItemImage, (ci) => ci.item, { + @OneToMany(() => OrderClaimItemImage, (ci) => ci.item, { cascade: [Cascade.PERSIST, Cascade.REMOVE], }) - images = new Collection>(this) + images = new Collection>(this) @Enum({ items: () => ClaimReason, nullable: true }) reason: Rel | null = null @@ -123,7 +123,7 @@ export default class OrderClaimItem { @BeforeCreate() onCreate() { this.id = generateEntityId(this.id, "claitem") - this.claim_id = this.claim?.id + this.claim_id ??= this.claim?.id } @OnInit() diff --git a/packages/modules/order/src/models/exchange.ts b/packages/modules/order/src/models/exchange.ts index 14e376d15c848..5ba980ac60578 100644 --- a/packages/modules/order/src/models/exchange.ts +++ b/packages/modules/order/src/models/exchange.ts @@ -19,7 +19,7 @@ import { Property, Rel, } from "@mikro-orm/core" -import { ExchangeItem, Transaction } from "@models" +import { OrderExchangeItem, Transaction } from "@models" import Order from "./order" import OrderShippingMethod from "./order-shipping-method" import Return from "./return" @@ -107,10 +107,10 @@ export default class OrderExchange { @Property({ columnType: "boolean", default: false }) allow_backorder: boolean = false - @OneToMany(() => ExchangeItem, (item) => item.exchange, { + @OneToMany(() => OrderExchangeItem, (item) => item.exchange, { cascade: [Cascade.PERSIST], }) - additional_items = new Collection>(this) + additional_items = new Collection>(this) @OneToMany( () => OrderShippingMethod, diff --git a/packages/modules/order/src/models/index.ts b/packages/modules/order/src/models/index.ts index 08866770eea52..68a91bbc68f39 100644 --- a/packages/modules/order/src/models/index.ts +++ b/packages/modules/order/src/models/index.ts @@ -1,9 +1,9 @@ export { default as Address } from "./address" export { default as OrderClaim } from "./claim" -export { default as ClaimItem } from "./claim-item" -export { default as ClaimItemImage } from "./claim-item-image" +export { default as OrderClaimItem } from "./claim-item" +export { default as OrderClaimItemImage } from "./claim-item-image" export { default as OrderExchange } from "./exchange" -export { default as ExchangeItem } from "./exchange-item" +export { default as OrderExchangeItem } from "./exchange-item" export { default as LineItem } from "./line-item" export { default as LineItemAdjustment } from "./line-item-adjustment" export { default as LineItemTaxLine } from "./line-item-tax-line" diff --git a/packages/modules/order/src/services/actions/create-claim.ts b/packages/modules/order/src/services/actions/create-claim.ts index b9317c1ec2491..0631a211da509 100644 --- a/packages/modules/order/src/services/actions/create-claim.ts +++ b/packages/modules/order/src/services/actions/create-claim.ts @@ -12,7 +12,7 @@ import { isString, promiseAll, } from "@medusajs/utils" -import { ClaimItem, OrderClaim, Return, ReturnItem } from "@models" +import { OrderClaim, OrderClaimItem, Return, ReturnItem } from "@models" function createClaimAndReturnEntities(em, data, order) { const claimReference = em.create(OrderClaim, { @@ -89,7 +89,7 @@ function createClaimAndReturnItems( : undefined ) - return em.create(ClaimItem, { + return em.create(OrderClaimItem, { item_id: item.id, reason: item.reason, quantity: item.quantity, @@ -111,8 +111,8 @@ async function processAdditionalItems( sharedContext ) { const itemsToAdd: any[] = [] - const additionalNewItems: ClaimItem[] = [] - const additionalItems: ClaimItem[] = [] + const additionalNewItems: OrderClaimItem[] = [] + const additionalItems: OrderClaimItem[] = [] data.additional_items?.forEach((item) => { const hasItem = item.id ? order.items.find((o) => o.item.id === item.id) @@ -134,7 +134,7 @@ async function processAdditionalItems( }) additionalItems.push( - em.create(ClaimItem, { + em.create(OrderClaimItem, { item_id: item.id, quantity: item.quantity, note: item.note, @@ -146,7 +146,7 @@ async function processAdditionalItems( itemsToAdd.push(item) additionalNewItems.push( - em.create(ClaimItem, { + em.create(OrderClaimItem, { quantity: item.quantity, note: item.note, metadata: item.metadata, diff --git a/packages/modules/order/src/services/actions/create-exchange.ts b/packages/modules/order/src/services/actions/create-exchange.ts index f1cf263e59ef9..49da0bda848c7 100644 --- a/packages/modules/order/src/services/actions/create-exchange.ts +++ b/packages/modules/order/src/services/actions/create-exchange.ts @@ -11,7 +11,7 @@ import { isString, promiseAll, } from "@medusajs/utils" -import { ExchangeItem, OrderExchange, Return, ReturnItem } from "@models" +import { OrderExchange, OrderExchangeItem, Return, ReturnItem } from "@models" function createExchangeAndReturnEntities(em, data, order) { const exchangeReference = em.create(OrderExchange, { @@ -77,8 +77,8 @@ async function processAdditionalItems( sharedContext ) { const itemsToAdd: any[] = [] - const additionalNewItems: ExchangeItem[] = [] - const additionalItems: ExchangeItem[] = [] + const additionalNewItems: OrderExchangeItem[] = [] + const additionalItems: OrderExchangeItem[] = [] data.additional_items?.forEach((item) => { const hasItem = item.id ? order.items.find((o) => o.item.id === item.id) @@ -100,7 +100,7 @@ async function processAdditionalItems( }) additionalItems.push( - em.create(ExchangeItem, { + em.create(OrderExchangeItem, { item_id: item.id, quantity: item.quantity, note: item.note, @@ -112,7 +112,7 @@ async function processAdditionalItems( itemsToAdd.push(item) additionalNewItems.push( - em.create(ExchangeItem, { + em.create(OrderExchangeItem, { quantity: item.quantity, note: item.note, metadata: item.metadata, diff --git a/packages/modules/order/src/services/order-module-service.ts b/packages/modules/order/src/services/order-module-service.ts index 2b1c0d74f3317..3626834dd7b75 100644 --- a/packages/modules/order/src/services/order-module-service.ts +++ b/packages/modules/order/src/services/order-module-service.ts @@ -41,7 +41,10 @@ import { OrderChange, OrderChangeAction, OrderClaim, + OrderClaimItem, + OrderClaimItemImage, OrderExchange, + OrderExchangeItem, OrderItem, OrderShippingMethod, OrderSummary, @@ -116,7 +119,10 @@ const generateMethodForModels = { Return, ReturnItem, OrderClaim, + OrderClaimItem, + OrderClaimItemImage, OrderExchange, + OrderExchangeItem, } // TODO: rm template args here, keep it for later to not collide with carlos work at least as little as possible @@ -139,7 +145,10 @@ export default class OrderModuleService< TReturn extends Return = Return, TReturnItem extends ReturnItem = ReturnItem, TClaim extends OrderClaim = OrderClaim, - TExchange extends OrderExchange = OrderExchange + TClaimItem extends OrderClaimItem = OrderClaimItem, + TClaimItemImage extends OrderClaimItemImage = OrderClaimItemImage, + TExchange extends OrderExchange = OrderExchange, + TExchangeItem extends OrderExchangeItem = OrderExchangeItem > extends ModulesSdkUtils.MedusaService<{ Order: { dto: OrderTypes.OrderDTO } @@ -159,10 +168,13 @@ export default class OrderModuleService< ReturnReason: { dto: OrderTypes.OrderReturnReasonDTO } OrderSummary: { dto: OrderTypes.OrderSummaryDTO } Transaction: { dto: OrderTypes.OrderTransactionDTO } - Return: { dto: any } // TODO: Add return dto - ReturnItem: { dto: any } // TODO: Add return item dto - OrderClaim: { dto: any } // TODO: Add claim dto - OrderExchange: { dto: any } // TODO: Add exchange dto + Return: { dto: OrderTypes.ReturnDTO } + ReturnItem: { dto: OrderTypes.OrderReturnItemDTO } + OrderClaim: { dto: OrderTypes.OrderClaimDTO } + OrderClaimItem: { dto: OrderTypes.OrderClaimItemDTO } + OrderClaimItemImage: { dto: OrderTypes.OrderClaimItemImageDTO } + OrderExchange: { dto: OrderTypes.OrderExchangeDTO } + OrderExchangeItem: { dto: OrderTypes.OrderExchangeItemDTO } }>(generateMethodForModels) implements IOrderModuleService { @@ -185,7 +197,10 @@ export default class OrderModuleService< protected returnService_: ModulesSdkTypes.IMedusaInternalService protected returnItemService_: ModulesSdkTypes.IMedusaInternalService protected orderClaimService_: ModulesSdkTypes.IMedusaInternalService + protected orderClaimItemService_: ModulesSdkTypes.IMedusaInternalService + protected orderClaimItemImageService_: ModulesSdkTypes.IMedusaInternalService protected orderExchangeService_: ModulesSdkTypes.IMedusaInternalService + protected orderExchangeItemService_: ModulesSdkTypes.IMedusaInternalService constructor( {