feat(order): fulfillment workflow (#7385)
FIXES: CORE-2162 CORE-2167 CORE-2041
This commit is contained in:
@@ -4,7 +4,7 @@ import {
|
||||
FulfillmentTypes,
|
||||
IFulfillmentProvider,
|
||||
} from "@medusajs/types"
|
||||
import { ModulesSdkUtils, promiseAll, MedusaError } from "@medusajs/utils"
|
||||
import { MedusaError, ModulesSdkUtils, promiseAll } from "@medusajs/utils"
|
||||
import { FulfillmentProvider } from "@models"
|
||||
|
||||
type InjectedDependencies = {
|
||||
@@ -86,7 +86,7 @@ export default class FulfillmentProviderService extends ModulesSdkUtils.internal
|
||||
providerId: string,
|
||||
data: object,
|
||||
items: object[],
|
||||
order: object,
|
||||
order: object | undefined,
|
||||
fulfillment: Record<string, unknown>
|
||||
): Promise<Record<string, unknown>> {
|
||||
const provider = this.retrieveProviderRegistration(providerId)
|
||||
@@ -101,10 +101,7 @@ export default class FulfillmentProviderService extends ModulesSdkUtils.internal
|
||||
return await provider.cancelFulfillment(fulfillment)
|
||||
}
|
||||
|
||||
async createReturn(
|
||||
providerId: string,
|
||||
fulfillment: Record<string, unknown>,
|
||||
) {
|
||||
async createReturn(providerId: string, fulfillment: Record<string, unknown>) {
|
||||
const provider = this.retrieveProviderRegistration(providerId)
|
||||
return await provider.createReturnFulfillment(fulfillment)
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ import {
|
||||
MedusaError,
|
||||
ModulesSdkUtils,
|
||||
isDefined,
|
||||
isString,
|
||||
partitionArray,
|
||||
promiseAll,
|
||||
} from "@medusajs/utils"
|
||||
@@ -799,33 +800,68 @@ export default class InventoryModuleService<
|
||||
* @return The updated inventory level
|
||||
* @throws when the inventory level is not found
|
||||
*/
|
||||
@InjectManager("baseRepository_")
|
||||
@EmitEvents()
|
||||
async adjustInventory(
|
||||
adjustInventory(
|
||||
inventoryItemId: string,
|
||||
locationId: string,
|
||||
adjustment: number,
|
||||
@MedusaContext() context: Context = {}
|
||||
): Promise<InventoryNext.InventoryLevelDTO> {
|
||||
const result = await this.adjustInventory_(
|
||||
inventoryItemId,
|
||||
locationId,
|
||||
adjustment,
|
||||
context
|
||||
)
|
||||
context: Context
|
||||
): Promise<InventoryNext.InventoryLevelDTO>
|
||||
|
||||
context.messageAggregator?.saveRawMessageData({
|
||||
eventName: InventoryEvents.inventory_level_updated,
|
||||
metadata: {
|
||||
service: this.constructor.name,
|
||||
action: CommonEvents.UPDATED,
|
||||
object: "inventory-level",
|
||||
},
|
||||
data: { id: result.id },
|
||||
})
|
||||
adjustInventory(
|
||||
data: {
|
||||
inventoryItemId: string
|
||||
locationId: string
|
||||
adjustment: number
|
||||
}[],
|
||||
context: Context
|
||||
): Promise<InventoryNext.InventoryLevelDTO[]>
|
||||
|
||||
@InjectManager("baseRepository_")
|
||||
@EmitEvents()
|
||||
async adjustInventory(
|
||||
inventoryItemIdOrData: string | any,
|
||||
locationId?: string | Context,
|
||||
adjustment?: number,
|
||||
@MedusaContext() context: Context = {}
|
||||
): Promise<
|
||||
InventoryNext.InventoryLevelDTO | InventoryNext.InventoryLevelDTO[]
|
||||
> {
|
||||
let all: any = inventoryItemIdOrData
|
||||
|
||||
if (isString(inventoryItemIdOrData)) {
|
||||
all = [
|
||||
{
|
||||
inventoryItemId: inventoryItemIdOrData,
|
||||
locationId,
|
||||
adjustment,
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
const results: TInventoryLevel[] = []
|
||||
|
||||
for (const data of all) {
|
||||
const result = await this.adjustInventory_(
|
||||
data.inventoryItemId,
|
||||
data.locationId,
|
||||
data.adjustment,
|
||||
context
|
||||
)
|
||||
results.push(result)
|
||||
|
||||
context.messageAggregator?.saveRawMessageData({
|
||||
eventName: InventoryEvents.inventory_level_updated,
|
||||
metadata: {
|
||||
service: this.constructor.name,
|
||||
action: CommonEvents.UPDATED,
|
||||
object: "inventory-level",
|
||||
},
|
||||
data: { id: result.id },
|
||||
})
|
||||
}
|
||||
|
||||
return await this.baseRepository_.serialize<InventoryNext.InventoryLevelDTO>(
|
||||
result,
|
||||
Array.isArray(inventoryItemIdOrData) ? results : results[0],
|
||||
{
|
||||
populate: true,
|
||||
}
|
||||
|
||||
@@ -489,7 +489,6 @@ moduleIntegrationTestRunner({
|
||||
await service.registerShipment({
|
||||
order_id: createdOrder.id,
|
||||
reference: Modules.FULFILLMENT,
|
||||
shipping_method: createdOrder.shipping_methods![0].id,
|
||||
items: createdOrder.items!.map((item) => {
|
||||
return {
|
||||
id: item.id,
|
||||
|
||||
@@ -2149,35 +2149,12 @@ export default class OrderModuleService<
|
||||
): Promise<void> {
|
||||
let shippingMethodId
|
||||
|
||||
if (!isString(data.shipping_method)) {
|
||||
const methods = await this.createShippingMethods(
|
||||
data.order_id,
|
||||
data.shipping_method as any,
|
||||
sharedContext
|
||||
)
|
||||
shippingMethodId = methods[0].id
|
||||
} else {
|
||||
shippingMethodId = data.shipping_method
|
||||
}
|
||||
|
||||
const method = await this.shippingMethodService_.retrieve(
|
||||
shippingMethodId,
|
||||
{
|
||||
relations: ["tax_lines", "adjustments"],
|
||||
},
|
||||
sharedContext
|
||||
)
|
||||
|
||||
const calculatedAmount = getShippingMethodsTotals([method as any], {})[
|
||||
method.id
|
||||
]
|
||||
|
||||
const actions: CreateOrderChangeActionDTO[] = data.items.map((item) => {
|
||||
return {
|
||||
action: ChangeActionType.SHIP_ITEM,
|
||||
internal_note: item.internal_note,
|
||||
reference: data.reference,
|
||||
reference_id: shippingMethodId,
|
||||
reference_id: data.reference_id,
|
||||
details: {
|
||||
reference_id: item.id,
|
||||
quantity: item.quantity,
|
||||
@@ -2191,7 +2168,6 @@ export default class OrderModuleService<
|
||||
action: ChangeActionType.SHIPPING_ADD,
|
||||
reference: data.reference,
|
||||
reference_id: shippingMethodId,
|
||||
amount: calculatedAmount.total,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user