Skip to main content

Store Warehousing Adapter

The Store adapter provides basic physical inventory management for simple use cases.

Included in Base Preset

This plugin is part of the base preset and loaded automatically. Using the base preset is strongly recommended, so explicit installation is usually not required.

Installation

import '@unchainedshop/plugins/warehousing/store';

Configuration

Create a warehousing provider:

mutation CreateStoreWarehousing {
createWarehousingProvider(warehousingProvider: {
type: PHYSICAL
adapterKey: "shop.unchained.warehousing.store"
}) {
_id
}
}

Configure the name via the Admin UI after creation.

Features

  • Physical inventory management
  • Unlimited stock (returns 99999)
  • Zero production/commissioning time
  • Simple drop-in for development

Adapter Details

PropertyValue
Keyshop.unchained.warehousing.store
TypePHYSICAL
Order Index0
Default Stock99999
Sourcewarehousing/store.ts

Configuration Options

KeyDescriptionDefault
nameStore/warehouse name"Flagship Store"

Behavior

isActive()

Always returns true.

stock()

Returns 99999 - effectively unlimited stock.

productionTime()

Returns 0 - no production delay.

commissioningTime()

Returns 0 - no preparation delay.

Use Cases

Development & Testing

Use the Store adapter during development when you don't need real inventory tracking:

import '@unchainedshop/plugins/warehousing/store';

Simple Stores

For small shops where inventory is managed manually outside the system.

Drop-shipping

Where stock is always available from suppliers:

const DropShipAdapter = {
...StoreAdapter,
key: 'my-shop.dropship',
label: 'Drop Ship',

actions(config, context) {
return {
...StoreAdapter.actions(config, context),

async stock() {
// Always available from supplier
return 99999;
},

async commissioningTime() {
// Supplier needs 2-3 days to ship
return 3 * 24 * 60 * 60 * 1000;
},
};
},
};

Extending for Real Inventory

For production use, extend with actual inventory tracking:

import {
WarehousingDirector,
WarehousingAdapter,
type IWarehousingAdapter
} from '@unchainedshop/core';

const RealStoreAdapter: IWarehousingAdapter = {
...WarehousingAdapter,

key: 'my-shop.real-store',
label: 'Real Store Inventory',
version: '1.0.0',
orderIndex: 0,

typeSupported: (type) => type === 'PHYSICAL',

actions(configuration, context) {
const { product, modules } = context;

return {
...WarehousingAdapter.actions(configuration, context),

isActive() {
return true;
},

configurationError() {
return null;
},

async stock() {
// Get stock from product warehousing data
const sku = product?.warehousing?.sku;
if (!sku) return 0;

// Query your inventory system
const inventory = await db.collection('inventory').findOne({ sku });
return inventory?.quantity || 0;
},

async productionTime() {
const currentStock = await this.stock();
if (currentStock > 0) return 0;

// Out of stock - check backorder time
const sku = product?.warehousing?.sku;
const supplier = await getSupplierLeadTime(sku);
return supplier.leadTimeDays * 24 * 60 * 60 * 1000;
},

async commissioningTime() {
// Standard picking and packing time: 4 hours
return 4 * 60 * 60 * 1000;
},
};
},
};

WarehousingDirector.registerAdapter(RealStoreAdapter);

Integration with Delivery

Warehousing time affects delivery estimates:

// In delivery adapter
async estimatedDeliveryThroughput(warehousingTime) {
// warehousingTime = productionTime + commissioningTime
const shippingTime = 3 * 24 * 60 * 60 * 1000; // 3 days shipping
return warehousingTime + shippingTime;
}

Query Stock Status

query ProductAvailability($productId: ID!) {
product(productId: $productId) {
... on SimpleProduct {
simulatedStocks {
warehousingProvider {
_id
interface { label }
}
quantity
}
}
}
}