chore(order): cancel return (#7881)

This commit is contained in:
Carlos R. L. Rodrigues
2024-07-02 06:52:58 -03:00
committed by GitHub
parent b3236ff31c
commit 07715e6b50
46 changed files with 1339 additions and 121 deletions

View File

@@ -78,7 +78,7 @@ describe("Order Return - Actions", function () {
actions,
})
}).toThrow(
"Cannot request to return more items than what was shipped for item 1."
"Cannot request to return more items than what was fulfilled for item 1."
)
expect(() => {
@@ -190,7 +190,7 @@ describe("Order Return - Actions", function () {
],
})
}).toThrow(
"Cannot request to return more items than what was shipped for item 3."
"Cannot request to return more items than what was fulfilled for item 3."
)
expect(() => {

View File

@@ -0,0 +1,144 @@
import {
Context,
CreateOrderChangeActionDTO,
OrderTypes,
} from "@medusajs/types"
import { promiseAll } from "@medusajs/utils"
import { ChangeActionType } from "../../utils"
async function createOrderChange(
service,
data,
returnRef,
actions,
sharedContext
) {
return await service.createOrderChange_(
{
order_id: returnRef.order_id,
claim_id: returnRef.id,
reference: "return",
reference_id: returnRef.id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions,
},
sharedContext
)
}
export async function cancelClaim(
this: any,
data: OrderTypes.CancelOrderClaimDTO,
sharedContext?: Context
) {
const claimOrder = await this.retrieveClaim(
data.claim_id,
{
select: [
"id",
"order_id",
"return.id",
"return.items.id",
"return.items.quantity",
"claim_items.item_id",
"claim_items.quantity",
"additional_items.id",
"additional_items.quantity",
],
relations: ["return.items", "additional_items", "shipping_methods"],
},
sharedContext
)
const actions: CreateOrderChangeActionDTO[] = []
claimOrder.return.items.forEach((item) => {
actions.push({
action: ChangeActionType.CANCEL_RETURN_ITEM,
order_id: claimOrder.order_id,
claim_id: claimOrder.id,
return_id: claimOrder.return.id,
reference: "return",
reference_id: claimOrder.return.id,
details: {
reference_id: item.id,
order_id: claimOrder.order_id,
claim_id: claimOrder.id,
return_id: claimOrder.return.id,
quantity: item.quantity,
},
})
})
claimOrder.claim_items.forEach((item) => {
actions.push({
action: ChangeActionType.REINSTATE_ITEM,
claim_id: claimOrder.id,
reference: "claim",
reference_id: claimOrder.id,
details: {
reference_id: item.id,
claim_id: claimOrder.id,
quantity: item.quantity,
},
})
})
claimOrder.additional_items.forEach((item) => {
actions.push({
action: ChangeActionType.ITEM_REMOVE,
order_id: claimOrder.order_id,
claim_id: claimOrder.id,
reference: "claim",
reference_id: claimOrder.id,
details: {
reference_id: item.id,
order_id: claimOrder.order_id,
claim_id: claimOrder.id,
quantity: item.quantity,
},
})
})
claimOrder.shipping_methods?.forEach((shipping) => {
actions.push({
action: ChangeActionType.SHIPPING_REMOVE,
order_id: claimOrder.order_id,
claim_id: claimOrder.id,
return_id: claimOrder.return.id,
reference: "claim",
reference_id: shipping.id,
amount: shipping.price,
})
})
const [change] = await createOrderChange(
this,
data,
claimOrder,
actions,
sharedContext
)
await promiseAll([
this.updateClaims(
[
{
data: {
canceled_at: new Date(),
},
selector: {
id: claimOrder.id,
},
},
],
sharedContext
),
this.confirmOrderChange(change.id, sharedContext),
])
return claimOrder
}

View File

@@ -0,0 +1,128 @@
import {
Context,
CreateOrderChangeActionDTO,
OrderTypes,
} from "@medusajs/types"
import { promiseAll } from "@medusajs/utils"
import { ChangeActionType } from "../../utils"
async function createOrderChange(
service,
data,
returnRef,
actions,
sharedContext
) {
return await service.createOrderChange_(
{
order_id: returnRef.order_id,
exchange_id: returnRef.id,
reference: "return",
reference_id: returnRef.id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions,
},
sharedContext
)
}
export async function cancelExchange(
this: any,
data: OrderTypes.CancelOrderExchangeDTO,
sharedContext?: Context
) {
const exchangeOrder = await this.retrieveExchange(
data.exchange_id,
{
select: [
"id",
"order_id",
"return.id",
"return.items.item_id",
"return.items.quantity",
"additional_items.id",
"additional_items.quantity",
],
relations: ["return.items", "additional_items", "shipping_methods"],
},
sharedContext
)
const actions: CreateOrderChangeActionDTO[] = []
exchangeOrder.return.items.forEach((item) => {
actions.push({
action: ChangeActionType.CANCEL_RETURN_ITEM,
order_id: exchangeOrder.order_id,
exchange_id: exchangeOrder.id,
return_id: exchangeOrder.return.id,
reference: "return",
reference_id: exchangeOrder.return.id,
details: {
reference_id: item.item_id,
order_id: exchangeOrder.order_id,
exchange_id: exchangeOrder.id,
return_id: exchangeOrder.return.id,
quantity: item.quantity,
},
})
})
exchangeOrder.additional_items.forEach((item) => {
actions.push({
action: ChangeActionType.ITEM_REMOVE,
order_id: exchangeOrder.order_id,
exchange_id: exchangeOrder.id,
reference: "exchange",
reference_id: exchangeOrder.id,
details: {
order_id: exchangeOrder.order_id,
reference_id: item.item_id,
exchange_id: exchangeOrder.id,
quantity: item.quantity,
},
})
})
exchangeOrder.shipping_methods?.forEach((shipping) => {
actions.push({
action: ChangeActionType.SHIPPING_REMOVE,
order_id: exchangeOrder.order_id,
exchange_id: exchangeOrder.id,
return_id: exchangeOrder.return.id,
reference: "exchange",
reference_id: shipping.id,
amount: shipping.price,
})
})
const [change] = await createOrderChange(
this,
data,
exchangeOrder,
actions,
sharedContext
)
await promiseAll([
this.updateExchanges(
[
{
data: {
canceled_at: new Date(),
},
selector: {
id: exchangeOrder.id,
},
},
],
sharedContext
),
this.confirmOrderChange(change.id, sharedContext),
])
return exchangeOrder
}

View File

@@ -0,0 +1,107 @@
import {
Context,
CreateOrderChangeActionDTO,
OrderTypes,
} from "@medusajs/types"
import { promiseAll } from "@medusajs/utils"
import { ChangeActionType } from "../../utils"
async function createOrderChange(
service,
data,
returnRef,
actions,
sharedContext
) {
return await service.createOrderChange_(
{
order_id: returnRef.order_id,
return_id: returnRef.id,
reference: "return",
reference_id: returnRef.id,
description: data.description,
internal_note: data.internal_note,
created_by: data.created_by,
metadata: data.metadata,
actions,
},
sharedContext
)
}
export async function cancelReturn(
this: any,
data: OrderTypes.CancelOrderReturnDTO,
sharedContext?: Context
) {
const returnOrder = await this.retrieveReturn(
data.return_id,
{
select: [
"id",
"order_id",
"items.item_id",
"items.quantity",
"items.received_quantity",
],
relations: ["items", "shipping_methods"],
},
sharedContext
)
const actions: CreateOrderChangeActionDTO[] = []
returnOrder.items.forEach((item) => {
actions.push({
action: ChangeActionType.CANCEL_RETURN_ITEM,
order_id: returnOrder.order_id,
return_id: returnOrder.id,
reference: "return",
reference_id: returnOrder.id,
details: {
reference_id: item.item_id,
order_id: returnOrder.order_id,
return_id: returnOrder.id,
quantity: item.quantity,
},
})
})
returnOrder.shipping_methods?.forEach((shipping) => {
actions.push({
action: ChangeActionType.SHIPPING_REMOVE,
order_id: returnOrder.order_id,
return_id: returnOrder.id,
reference: "return",
reference_id: shipping.id,
amount: shipping.price,
})
})
const [change] = await createOrderChange(
this,
data,
returnOrder,
actions,
sharedContext
)
await promiseAll([
this.updateReturns(
[
{
data: {
canceled_at: new Date(),
},
selector: {
id: returnOrder.id,
},
},
],
sharedContext
),
this.confirmOrderChange(change.id, sharedContext),
])
return returnOrder
}

View File

@@ -196,9 +196,9 @@ async function processShippingMethods(
const methods = await service.createShippingMethods(
[
{
...shippingMethod,
order_id: data.order_id,
claim_id: claimReference.id,
...shippingMethod,
},
],
sharedContext
@@ -247,10 +247,10 @@ async function processReturnShipping(
const methods = await service.createShippingMethods(
[
{
...data.return_shipping,
order_id: data.order_id,
claim_id: claimReference.id,
return_id: returnReference.id,
...data.return_shipping,
},
],
sharedContext

View File

@@ -162,9 +162,9 @@ async function processShippingMethods(
const methods = await service.createShippingMethods(
[
{
...shippingMethod,
order_id: data.order_id,
exchange_id: exchangeReference.id,
...shippingMethod,
},
],
sharedContext
@@ -208,10 +208,10 @@ async function processReturnShipping(
const methods = await service.createShippingMethods(
[
{
...data.return_shipping,
order_id: data.order_id,
exchange_id: exchangeReference.id,
return_id: returnReference.id,
...data.return_shipping,
},
],
sharedContext

View File

@@ -6,6 +6,7 @@ import {
import {
ReturnStatus,
getShippingMethodsTotals,
isDefined,
isString,
promiseAll,
} from "@medusajs/utils"
@@ -59,13 +60,17 @@ async function processShippingMethod(
) {
let shippingMethodId
if (!isDefined(data.shipping_method)) {
return
}
if (!isString(data.shipping_method)) {
const methods = await service.createShippingMethods(
[
{
...data.shipping_method,
order_id: data.order_id,
return_id: returnRef.id,
...data.shipping_method,
},
],
sharedContext
@@ -90,8 +95,11 @@ async function processShippingMethod(
action: ChangeActionType.SHIPPING_ADD,
reference: "order_shipping_method",
reference_id: shippingMethodId,
return_id: returnRef.id,
amount: calculatedAmount.total,
details: {
order_id: returnRef.order_id,
return_id: returnRef.id,
},
})
}
}
@@ -134,8 +142,11 @@ export async function createReturn(
const em = sharedContext!.transactionManager as any
const returnRef = createReturnReference(em, data, order)
const actions: CreateOrderChangeActionDTO[] = []
returnRef.items = createReturnItems(em, data, returnRef, actions)
await processShippingMethod(this, data, returnRef, actions, sharedContext)
const change = await createOrderChange(
this,
data,

View File

@@ -1,4 +1,7 @@
export * from "./cancel-claim"
export * from "./cancel-exchange"
export * from "./cancel-fulfillment"
export * from "./cancel-return"
export * from "./create-claim"
export * from "./create-exchange"
export * from "./create-return"

View File

@@ -1188,9 +1188,13 @@ export default class OrderModuleService<
return {
shipping_method: dt,
order_id: dt.order_id,
return_id: dt.return_id,
claim_id: dt.claim_id,
exchange_id: dt.exchange_id,
version: mapOrderVersion[dt.order_id],
}
})
methods = await this.createShippingMethodsBulk_(
orderShippingMethodData as any,
sharedContext
@@ -1214,11 +1218,14 @@ export default class OrderModuleService<
sharedContext
)
const methods = data.map((method) => {
const methods = data.map((methodData) => {
return {
shipping_method: method,
shipping_method: methodData,
order_id: order.id,
version: method.version ?? order.version ?? 1,
return_id: methodData.return_id,
claim_id: methodData.claim_id,
exchange_id: methodData.exchange_id,
version: methodData.version ?? order.version ?? 1,
}
})
@@ -1952,6 +1959,9 @@ export default class OrderModuleService<
select: [
"id",
"order_id",
"return_id",
"exchange_id",
"claim_id",
"ordering",
"version",
"applied",
@@ -2108,7 +2118,15 @@ export default class OrderModuleService<
sharedContext?: Context
): Promise<any> {
const options = {
select: ["id", "order_id", "version", "status"],
select: [
"id",
"order_id",
"return_id",
"claim_id",
"exchange_id",
"version",
"status",
],
relations: [] as string[],
order: {},
}
@@ -2253,15 +2271,7 @@ export default class OrderModuleService<
let orders = await super.listOrders(
{ id: deduplicate(ordersIds) },
{
select: [
"id",
"version",
"items.detail",
"transactions",
"shipping_methods",
"summary",
"total",
],
select: ["id", "version", "items.detail", "summary", "total"],
relations: [
"transactions",
"items",
@@ -2277,7 +2287,7 @@ export default class OrderModuleService<
const {
itemsToUpsert,
shippingMethodsToInsert,
shippingMethodsToUpsert,
summariesToUpsert,
orderToUpdate,
} = applyChangesToOrder(orders, actionsMap)
@@ -2295,9 +2305,9 @@ export default class OrderModuleService<
summariesToUpsert.length
? this.orderSummaryService_.upsert(summariesToUpsert, sharedContext)
: null,
shippingMethodsToInsert.length
? this.orderShippingMethodService_.create(
shippingMethodsToInsert,
shippingMethodsToUpsert.length
? this.orderShippingMethodService_.upsert(
shippingMethodsToUpsert,
sharedContext
)
: null,
@@ -2305,7 +2315,7 @@ export default class OrderModuleService<
return {
items: itemsToUpsert as any,
shippingMethods: shippingMethodsToInsert as any,
shippingMethods: shippingMethodsToUpsert as any,
}
}
@@ -2803,8 +2813,7 @@ export default class OrderModuleService<
async createReturn(
data: OrderTypes.CreateOrderReturnDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
// TODO: type ReturnDTO
): Promise<OrderTypes.ReturnDTO> {
const ret = await BundledActions.createReturn.bind(this)(
data,
sharedContext
@@ -2813,7 +2822,12 @@ export default class OrderModuleService<
return await this.retrieveReturn(
ret.id,
{
relations: ["items"],
relations: [
"items",
"shipping_methods",
"shipping_methods.tax_lines",
"shipping_methods.adjustments",
],
},
sharedContext
)
@@ -2823,11 +2837,16 @@ export default class OrderModuleService<
async receiveReturn(
data: OrderTypes.ReceiveOrderReturnDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
): Promise<OrderTypes.ReturnDTO> {
const ret = await this.receiveReturn_(data, sharedContext)
return await this.retrieveReturn(ret.id, {
relations: ["items"],
relations: [
"items",
"shipping_methods",
"shipping_methods.tax_lines",
"shipping_methods.adjustments",
],
})
}
@@ -2839,11 +2858,36 @@ export default class OrderModuleService<
return await BundledActions.receiveReturn.bind(this)(data, sharedContext)
}
@InjectManager("baseRepository_")
async cancelReturn(
data: OrderTypes.CancelOrderReturnDTO,
@MedusaContext() sharedContext?: Context
): Promise<OrderTypes.ReturnDTO> {
const ret = await this.cancelReturn_(data, sharedContext)
return await this.retrieveReturn(ret.id, {
relations: [
"items",
"shipping_methods",
"shipping_methods.tax_lines",
"shipping_methods.adjustments",
],
})
}
@InjectTransactionManager("baseRepository_")
private async cancelReturn_(
data: OrderTypes.CancelOrderReturnDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
return await BundledActions.cancelReturn.bind(this)(data, sharedContext)
}
@InjectManager("baseRepository_")
async createClaim(
data: OrderTypes.CreateOrderClaimDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
): Promise<OrderTypes.OrderClaimDTO> {
const ret = await this.createClaim_(data, sharedContext)
const claim = await this.retrieveOrderClaim(
@@ -2865,7 +2909,7 @@ export default class OrderModuleService<
sharedContext
)
return await this.baseRepository_.serialize<OrderTypes.OrderClaimDTO[]>(
return await this.baseRepository_.serialize<OrderTypes.OrderClaimDTO>(
claim,
{
populate: true,
@@ -2874,18 +2918,38 @@ export default class OrderModuleService<
}
@InjectTransactionManager("baseRepository_")
async createExchange_(
data: OrderTypes.CreateOrderExchangeDTO,
async createClaim_(
data: OrderTypes.CreateOrderClaimDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
return await BundledActions.createExchange.bind(this)(data, sharedContext)
return await BundledActions.createClaim.bind(this)(data, sharedContext)
}
@InjectManager("baseRepository_")
async cancelClaim(
data: OrderTypes.CancelOrderClaimDTO,
@MedusaContext() sharedContext?: Context
): Promise<OrderTypes.OrderClaimDTO> {
const ret = await this.cancelClaim_(data, sharedContext)
return await this.retrieveOrderClaim(ret.id, {
relations: ["items"],
})
}
@InjectTransactionManager("baseRepository_")
private async cancelClaim_(
data: OrderTypes.CancelOrderClaimDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
return await BundledActions.cancelClaim.bind(this)(data, sharedContext)
}
@InjectManager("baseRepository_")
async createExchange(
data: OrderTypes.CreateOrderExchangeDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
): Promise<OrderTypes.OrderExchangeDTO> {
const ret = await this.createExchange_(data, sharedContext)
const claim = await this.retrieveOrderExchange(
@@ -2905,7 +2969,7 @@ export default class OrderModuleService<
sharedContext
)
return await this.baseRepository_.serialize<OrderTypes.OrderExchangeDTO[]>(
return await this.baseRepository_.serialize<OrderTypes.OrderExchangeDTO>(
claim,
{
populate: true,
@@ -2914,11 +2978,31 @@ export default class OrderModuleService<
}
@InjectTransactionManager("baseRepository_")
async createClaim_(
data: OrderTypes.CreateOrderClaimDTO,
async createExchange_(
data: OrderTypes.CreateOrderExchangeDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
return await BundledActions.createClaim.bind(this)(data, sharedContext)
return await BundledActions.createExchange.bind(this)(data, sharedContext)
}
@InjectManager("baseRepository_")
async cancelExchange(
data: OrderTypes.CancelOrderExchangeDTO,
@MedusaContext() sharedContext?: Context
): Promise<OrderTypes.OrderExchangeDTO> {
const ret = await this.cancelExchange_(data, sharedContext)
return await this.retrieveOrderExchange(ret.id, {
relations: ["items"],
})
}
@InjectTransactionManager("baseRepository_")
private async cancelExchange_(
data: OrderTypes.CancelOrderExchangeDTO,
@MedusaContext() sharedContext?: Context
): Promise<any> {
return await BundledActions.cancelExchange.bind(this)(data, sharedContext)
}
@InjectTransactionManager("baseRepository_")