Feat(order): post purchase support (#7666)

This commit is contained in:
Carlos R. L. Rodrigues
2024-06-10 18:44:51 -03:00
committed by GitHub
parent 39ddba2491
commit 37426939da
43 changed files with 1645 additions and 476 deletions
@@ -0,0 +1,38 @@
import { Context, OrderTypes } from "@medusajs/types"
import { ChangeActionType } from "../../utils"
export async function cancelFulfillment(
this: any,
data: OrderTypes.CancelOrderFulfillmentDTO,
sharedContext?: Context
): Promise<void> {
const items = data.items.map((item) => {
return {
action: ChangeActionType.CANCEL_ITEM_FULFILLMENT,
internal_note: item.internal_note,
reference: data.reference,
reference_id: data.reference_id,
claim_id: data.claim_id,
exchange_id: data.exchange_id,
details: {
reference_id: item.id,
quantity: item.quantity,
metadata: item.metadata,
},
}
})
const change = await this.createOrderChange_(
{
order_id: data.order_id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions: items,
},
sharedContext
)
await this.confirmOrderChange(change[0].id, sharedContext)
}
@@ -0,0 +1,113 @@
import {
Context,
CreateOrderChangeActionDTO,
OrderTypes,
} from "@medusajs/types"
import {
ReturnStatus,
getShippingMethodsTotals,
isString,
} from "@medusajs/utils"
import { OrderChangeType } from "@types"
import { ChangeActionType } from "../../utils"
export async function createReturn(
this: any,
data: OrderTypes.CreateOrderReturnDTO,
sharedContext?: Context
) {
const order = await this.orderService_.retrieve(
data.order_id,
{
relations: ["items"],
},
sharedContext
)
const [returnRef] = await this.createReturns(
[
{
order_id: data.order_id,
order_version: order.version,
status: ReturnStatus.REQUESTED,
// refund_amount: data.refund_amount ?? null,
},
],
sharedContext
)
let shippingMethodId
if (!isString(data.shipping_method)) {
const methods = await this.createShippingMethods(
[
{
order_id: data.order_id,
...data.shipping_method,
},
],
sharedContext
)
shippingMethodId = methods[0].id
} else {
shippingMethodId = data.shipping_method
}
const method = await this.retrieveShippingMethod(
shippingMethodId,
{
relations: ["tax_lines", "adjustments"],
},
sharedContext
)
const calculatedAmount = getShippingMethodsTotals([method as any], {})[
method.id
]
const actions: CreateOrderChangeActionDTO[] = data.items.map((item) => {
return {
action: ChangeActionType.RETURN_ITEM,
return_id: returnRef.id,
internal_note: item.internal_note,
reference: "return",
reference_id: returnRef.id,
details: {
reference_id: item.id,
return_id: returnRef.id,
quantity: item.quantity,
metadata: item.metadata,
},
}
})
if (shippingMethodId) {
actions.push({
action: ChangeActionType.SHIPPING_ADD,
reference: "order_shipping_method",
reference_id: shippingMethodId,
return_id: returnRef.id,
amount: calculatedAmount.total,
})
}
const change = await this.createOrderChange_(
{
order_id: data.order_id,
return_id: returnRef.id,
change_type: OrderChangeType.RETURN,
reference: "return",
reference_id: returnRef.id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions,
},
sharedContext
)
await this.confirmOrderChange(change[0].id, sharedContext)
return returnRef
}
@@ -0,0 +1,5 @@
export * from "./cancel-fulfillment"
export * from "./create-return"
export * from "./receive-return"
export * from "./register-fulfillment"
export * from "./register-shipment"
@@ -0,0 +1,73 @@
import { Context, OrderTypes } from "@medusajs/types"
import { MathBN, ReturnStatus } from "@medusajs/utils"
import { ChangeActionType } from "../../utils"
export async function receiveReturn(
this: any,
data: OrderTypes.ReceiveOrderReturnDTO,
sharedContext?: Context
) {
const returnEntry = await this.retrieveReturn(
data.return_id,
{
select: ["id", "order_id"],
relations: ["items"],
},
sharedContext
)
const items = data.items.map((item) => {
return {
action: ChangeActionType.RECEIVE_RETURN_ITEM,
internal_note: item.internal_note,
reference: data.reference,
reference_id: data.reference_id,
details: {
reference_id: item.id,
quantity: item.quantity,
metadata: item.metadata,
},
}
})
const change = await this.createOrderChange_(
{
order_id: returnEntry.order_id,
reference: "return",
reference_id: returnEntry.id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions: items,
},
sharedContext
)
await this.confirmOrderChange(change[0].id, sharedContext)
const hasReceivedAllItems = returnEntry.items.every((item) => {
const retItem = items.find((dtItem) => {
return item.detail.item_id === dtItem.details.reference_id
})
const quantity = retItem ? retItem.details.quantity : 0
return MathBN.eq(
MathBN.sub(item.detail.return_requested_quantity, quantity),
0
)
})
const retData = hasReceivedAllItems
? { status: ReturnStatus.RECEIVED, received_at: new Date() }
: { status: ReturnStatus.PARTIALLY_RECEIVED }
const returnRef = await this.updateReturns(
{
selector: { id: returnEntry.id },
data: retData,
},
sharedContext
)
return returnRef
}
@@ -0,0 +1,36 @@
import { Context, OrderTypes } from "@medusajs/types"
import { ChangeActionType } from "../../utils"
export async function registerFulfillment(
this: any,
data: OrderTypes.RegisterOrderFulfillmentDTO,
sharedContext?: Context
): Promise<void> {
const items = data.items.map((item) => {
return {
action: ChangeActionType.FULFILL_ITEM,
internal_note: item.internal_note,
reference: data.reference,
reference_id: data.reference_id,
details: {
reference_id: item.id,
quantity: item.quantity,
metadata: item.metadata,
},
}
})
const change = await this.createOrderChange_(
{
order_id: data.order_id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions: items,
},
sharedContext
)
await this.confirmOrderChange(change[0].id, sharedContext)
}
@@ -0,0 +1,50 @@
import {
Context,
CreateOrderChangeActionDTO,
OrderTypes,
} from "@medusajs/types"
import { ChangeActionType } from "../../utils"
export async function registerShipment(
this: any,
data: OrderTypes.RegisterOrderShipmentDTO,
sharedContext?: Context
): Promise<void> {
let shippingMethodId
const actions: CreateOrderChangeActionDTO[] = data.items.map((item) => {
return {
action: ChangeActionType.SHIP_ITEM,
internal_note: item.internal_note,
reference: data.reference,
reference_id: data.reference_id,
details: {
reference_id: item.id,
quantity: item.quantity,
metadata: item.metadata,
},
}
})
if (shippingMethodId) {
actions.push({
action: ChangeActionType.SHIPPING_ADD,
reference: data.reference,
reference_id: shippingMethodId,
})
}
const change = await this.createOrderChange_(
{
order_id: data.order_id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions,
},
sharedContext
)
await this.confirmOrderChange(change[0].id, sharedContext)
}