diff --git a/.changeset/chilly-timers-jog.md b/.changeset/chilly-timers-jog.md new file mode 100644 index 0000000000..7bd959bb44 --- /dev/null +++ b/.changeset/chilly-timers-jog.md @@ -0,0 +1,7 @@ +--- +"@medusajs/types": patch +"@medusajs/utils": patch +"@medusajs/medusa": patch +--- + +fix(medusa,utils,types): inventory management nullable diff --git a/packages/core/types/src/http/product/common.ts b/packages/core/types/src/http/product/common.ts index acaad36054..dc2837fb37 100644 --- a/packages/core/types/src/http/product/common.ts +++ b/packages/core/types/src/http/product/common.ts @@ -173,10 +173,10 @@ export interface BaseProductVariant { * This field is only retrieved in the [Get Product](https://docs.medusajs.com/api/store#products_getproductsid) * and [List Products](https://docs.medusajs.com/api/store#products_getproducts) API routes if you * pass `+variants.inventory_quantity` in the `fields` query parameter. - * + * * Learn more in the [Retrieve Product Variant's Inventory](https://docs.medusajs.com/resources/storefront-development/products/inventory) storefront guide. */ - inventory_quantity?: number + inventory_quantity?: number | null /** * The variant's HS code. */ diff --git a/packages/core/utils/src/product/get-variant-availability.ts b/packages/core/utils/src/product/get-variant-availability.ts index f17091ffc5..077afd1681 100644 --- a/packages/core/utils/src/product/get-variant-availability.ts +++ b/packages/core/utils/src/product/get-variant-availability.ts @@ -9,7 +9,7 @@ export type VariantAvailabilityResult = { /** * The available inventory quantity for the variant in the sales channel. */ - availability: number + availability: number | null /** * The ID of the sales channel for which the availability was computed. */ @@ -18,7 +18,7 @@ export type VariantAvailabilityResult = { } /** - * Computes the varaint availability for a list of variants in a given sales channel + * Computes the variant availability for a list of variants in a given sales channel * * The availability algorithm works as follows: * 1. For each variant, we retrieve its inventory items. @@ -76,7 +76,7 @@ export async function getTotalVariantAvailability( data: TotalVariantAvailabilityData ): Promise<{ [variant_id: string]: { - availability: number + availability: number | null } }> { const { variantInventoriesMap, locationIds } = await getDataForComputation( @@ -116,7 +116,7 @@ const computeVariantAvailability = ( variantInventoryItems: VariantItems[], channelLocationsSet: Set, { requireChannelCheck } = { requireChannelCheck: true } -) => { +): number | null => { const inventoryQuantities: number[] = [] for (const link of variantInventoryItems) { @@ -143,7 +143,7 @@ const computeVariantAvailability = ( inventoryQuantities.push(maxInventoryQuantity) } - return inventoryQuantities.length ? Math.min(...inventoryQuantities) : 0 + return inventoryQuantities.length ? Math.min(...inventoryQuantities) : null } type VariantAvailabilityData = { diff --git a/packages/medusa/src/api/utils/middlewares/products/__tests__/variant-inventory-quantity.spec.ts b/packages/medusa/src/api/utils/middlewares/products/__tests__/variant-inventory-quantity.spec.ts index ac7b6aca52..8bc05de76d 100644 --- a/packages/medusa/src/api/utils/middlewares/products/__tests__/variant-inventory-quantity.spec.ts +++ b/packages/medusa/src/api/utils/middlewares/products/__tests__/variant-inventory-quantity.spec.ts @@ -7,8 +7,8 @@ import { } from "@medusajs/framework/utils" import { MedusaRequest, MedusaStoreRequest } from "@medusajs/framework/http" import { - wrapVariantsWithTotalInventoryQuantity, wrapVariantsWithInventoryQuantityForSalesChannel, + wrapVariantsWithTotalInventoryQuantity, } from "../variant-inventory-quantity" jest.mock("@medusajs/framework/utils", () => { @@ -79,7 +79,12 @@ describe("variant-inventory-quantity", () => { "variant-1": { availability: 10 }, "variant-2": { availability: 5 }, "variant-3": { availability: 20 }, + "variant-4": { availability: null }, } + const _variants = [ + ...variants, + { id: "variant-4", manage_inventory: true }, + ] ;(getTotalVariantAvailability as jest.Mock).mockResolvedValueOnce( mockAvailability @@ -87,12 +92,13 @@ describe("variant-inventory-quantity", () => { await wrapVariantsWithTotalInventoryQuantity( req as MedusaRequest, - variants + _variants ) - expect(variants[0].inventory_quantity).toBe(10) - expect(variants[1].inventory_quantity).toBe(5) - expect(variants[2].inventory_quantity).toBeUndefined() + expect(_variants[0].inventory_quantity).toBe(10) + expect(_variants[1].inventory_quantity).toBe(5) + expect(_variants[2].inventory_quantity).toBeUndefined() + expect(_variants[3].inventory_quantity).toBeNull() }) }) diff --git a/packages/medusa/src/api/utils/middlewares/products/variant-inventory-quantity.ts b/packages/medusa/src/api/utils/middlewares/products/variant-inventory-quantity.ts index 46f98e3b01..03468b98f0 100644 --- a/packages/medusa/src/api/utils/middlewares/products/variant-inventory-quantity.ts +++ b/packages/medusa/src/api/utils/middlewares/products/variant-inventory-quantity.ts @@ -65,7 +65,7 @@ export const wrapVariantsWithInventoryQuantityForSalesChannel = async ( type VariantInput = { id: string - inventory_quantity?: number + inventory_quantity?: number | null manage_inventory?: boolean }