Feat(admin-next, core-flows, link-modules, medusa, types): Inventory end to end flows (#7020)

* add reservation endpoints

* add changeset

* initial

* add reservations table

* add edit-item modal

* udpate inventory item attributes

* manage locations skeleton

* add combi batch endpoint

* cleanup

* fix manage locations

* add adjust inventory

* prep for pr

* update versions

* fix for pr

* fix for pr

* cleanup

* Update packages/core-flows/src/inventory/workflows/bulk-create-delete-levels.ts

Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>

* Update packages/core-flows/src/inventory/steps/delete-levels-by-item-and-location.ts

Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>

* rm wack import

* fix build

---------

Co-authored-by: Carlos R. L. Rodrigues <37986729+carlos-r-l-rodrigues@users.noreply.github.com>
This commit is contained in:
Philip Korsholm
2024-04-10 15:17:54 +02:00
committed by GitHub
co-authored by Carlos R. L. Rodrigues
parent 276278cbe7
commit ab7ff64c4a
66 changed files with 2894 additions and 43 deletions
@@ -1,7 +1,4 @@
import {
CreateInventoryLevelInput,
IInventoryServiceNext,
} from "@medusajs/types"
import { IInventoryServiceNext, InventoryNext } from "@medusajs/types"
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
@@ -9,7 +6,7 @@ import { ModuleRegistrationName } from "@medusajs/modules-sdk"
export const createInventoryLevelsStepId = "create-inventory-levels"
export const createInventoryLevelsStep = createStep(
createInventoryLevelsStepId,
async (data: CreateInventoryLevelInput[], { container }) => {
async (data: InventoryNext.CreateInventoryLevelInput[], { container }) => {
const service = container.resolve<IInventoryServiceNext>(
ModuleRegistrationName.INVENTORY
)
@@ -0,0 +1,62 @@
import {
DeleteEntityInput,
ModuleRegistrationName,
Modules,
} from "@medusajs/modules-sdk"
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
import { IInventoryServiceNext } from "@medusajs/types"
import { MedusaError } from "@medusajs/utils"
export const deleteInventoryLevelsFromItemAndLocationsStepId =
"delete-inventory-levels-from-item-and-location-step"
export const deleteInventoryLevelsFromItemAndLocationsStep = createStep(
deleteInventoryLevelsFromItemAndLocationsStepId,
async (
input: { inventory_item_id: string; location_id: string }[],
{ container }
) => {
if (!input.length) {
return new StepResponse(void 0, [])
}
const service = container.resolve<IInventoryServiceNext>(
ModuleRegistrationName.INVENTORY
)
const items = await service.listInventoryLevels({ $or: input }, {})
if (items.some((i) => i.reserved_quantity > 0)) {
const invalidDeletes = items.filter((i) => i.reserved_quantity > 0)
throw new MedusaError(
MedusaError.Types.NOT_ALLOWED,
`Cannot remove Inventory Levels for ${invalidDeletes
.map((i) => `Inventory Level ${i.id} at Location ${i.location_id}`)
.join(
", "
)} because there are reserved quantities for items at locations`
)
}
const deletedIds = items.map((i) => i.id)
const deleted = await service.softDeleteInventoryLevels(deletedIds)
return new StepResponse(
{
[Modules.INVENTORY]: deleted,
} as DeleteEntityInput,
deletedIds
)
},
async (prevLevelIds, { container }) => {
if (!prevLevelIds?.length) {
return
}
const service = container.resolve<IInventoryServiceNext>(
ModuleRegistrationName.INVENTORY
)
await service.restoreInventoryLevels(prevLevelIds)
}
)
@@ -7,3 +7,4 @@ export * from "./validate-inventory-locations"
export * from "./update-inventory-items"
export * from "./delete-inventory-levels"
export * from "./update-inventory-levels"
export * from "./delete-levels-by-item-and-location"
@@ -5,13 +5,13 @@ import {
remoteQueryObjectFromString,
} from "@medusajs/utils"
import { CreateInventoryLevelInput } from "@medusajs/types"
import { InventoryNext } from "@medusajs/types"
import { createStep } from "@medusajs/workflows-sdk"
export const validateInventoryLocationsStepId = "validate-inventory-levels-step"
export const validateInventoryLocationsStep = createStep(
validateInventoryLocationsStepId,
async (data: CreateInventoryLevelInput[], { container }) => {
async (data: InventoryNext.CreateInventoryLevelInput[], { container }) => {
const remoteQuery = container.resolve(
ContainerRegistrationKeys.REMOTE_QUERY
)
@@ -0,0 +1,26 @@
import { InventoryLevelDTO, InventoryNext } from "@medusajs/types"
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
createInventoryLevelsStep,
deleteInventoryLevelsFromItemAndLocationsStep,
} from "../steps"
import { removeRemoteLinkStep } from "../../common"
interface WorkflowInput {
creates: InventoryNext.CreateInventoryLevelInput[]
deletes: { inventory_item_id: string; location_id: string }[]
}
export const bulkCreateDeleteLevelsWorkflowId =
"bulk-create-delete-levels-workflow"
export const bulkCreateDeleteLevelsWorkflow = createWorkflow(
bulkCreateDeleteLevelsWorkflowId,
(input: WorkflowData<WorkflowInput>): WorkflowData<InventoryLevelDTO[]> => {
const deleted = deleteInventoryLevelsFromItemAndLocationsStep(input.deletes)
removeRemoteLinkStep(deleted)
return createInventoryLevelsStep(input.creates)
}
)
@@ -1,4 +1,4 @@
import { CreateInventoryLevelInput, InventoryLevelDTO } from "@medusajs/types"
import { InventoryLevelDTO, InventoryNext } from "@medusajs/types"
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
import {
createInventoryLevelsStep,
@@ -6,7 +6,7 @@ import {
} from "../steps"
interface WorkflowInput {
inventory_levels: CreateInventoryLevelInput[]
inventory_levels: InventoryNext.CreateInventoryLevelInput[]
}
export const createInventoryLevelsWorkflowId =
"create-inventory-levels-workflow"
@@ -4,3 +4,4 @@ export * from "./create-inventory-levels"
export * from "./update-inventory-items"
export * from "./delete-inventory-levels"
export * from "./update-inventory-levels"
export * from "./bulk-create-delete-levels"