v1.1.0
Warehouse Management
Track inventory across multiple locations. Manage stock movements, reservations, and audits with precision. Built for real-time inventory accuracy.
Getting Started
Installation
$ composer require obelaw/ium-wms
Publish Configuration
$ php artisan vendor:publish --tag=ium-wms-config
Run Migrations
$ php artisan migrate
Requirements
- • PHP 8.2+
- • Laravel 10+
- • MySQL 8.0+ or PostgreSQL 14+
Warehouses
Define multiple warehouse locations with zones, aisles, and bins. Each warehouse operates independently with its own stock levels and priority rules.
Creating a Warehouse
use Obelaw\Ium\Wms\Actions\CreateWarehouse;
$warehouse = CreateWarehouse::run([
'name' => 'Main Distribution Center',
'code' => 'MDC-01',
'is_active' => true,
'priority' => 1,
]); Stock
Stock levels are tracked per product per warehouse. Query available, reserved, and total quantities in real-time.
Querying Stock
use Obelaw\Ium\Wms\Queries\GetStockLevel;
$stock = GetStockLevel::run(
'WIDGET-001', // SKU
'MDC-01' // Warehouse code
);
$stock->available; // 150
$stock->reserved; // 23
$stock->total; // 173 Stock Types
- •
available— Ready to ship - •
reserved— Held for orders - •
damaged— Non-sellable - •
in_transit— Being moved
Alerts
- • Low stock threshold alerts
- • Out of stock notifications
- • Overstock warnings
- • Configurable per warehouse
Movements
Every stock change is recorded as a movement with full audit trail. Movements track the source, destination, quantity, and reason for the change.
Recording a Movement
use Obelaw\Ium\Wms\Actions\RecordMovement;
RecordMovement::run([
'sku' => 'WIDGET-001',
'from_warehouse' => 'MDC-01',
'to_warehouse' => 'STORE-05',
'quantity' => 50,
'reason' => 'restock',
]); Reservations
Reserve stock for pending orders to prevent overselling. Reservations are automatically released on cancellation or expiry.
Creating a Reservation
use Obelaw\Ium\Wms\Actions\ReserveStock;
$reservation = ReserveStock::run([
'sku' => 'WIDGET-001',
'warehouse' => 'MDC-01',
'quantity' => 5,
'order_id' => 'ORD-2026-001',
'expires_at' => now()->addHours(24),
]);