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),
]);