feat(order): fulfillment workflow (#7385)

FIXES: CORE-2162 CORE-2167 CORE-2041
This commit is contained in:
Carlos R. L. Rodrigues
2024-05-27 12:49:33 +00:00
committed by GitHub
parent 639758ffec
commit 62ef82f497
43 changed files with 1730 additions and 195 deletions
@@ -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,
})
}