Birden fazla depo işletmek, WooCommerce’in doğal olarak ele almak üzere tasarlanmadığı karmaşıklığı beraberinde getirir. WooCommerce ürün başına tek bir stok miktarını takip eder. ERP’niz 3, 5 veya 20 lokasyonda stok takip eder. Bu açığı kapatmak, envanterin nasıl toplandığı, siparişlerin nasıl yönlendirildiği ve müşterilerin kullanılabilirliği nasıl gördüğü hakkında dikkatli mimari kararlar gerektirir.

Çok Depolu Depo Zorluğu

ERP’niz şunu gösterir:

Product: SKU-1234 "Blue Widget"

├── Warehouse A (New York): 50 units

├── Warehouse B (Los Angeles): 30 units

├── Warehouse C (Chicago): 0 units

└── Total Available: 80 units

WooCommerce ne göstermeli? Seçenekler:

  • Toplam kullanılabilir (80) — en basit, ancak başka yerde taahhüt edilmiş stoğu vaat edebilir
  • En yakın depo — sepete eklemeden önce müşteri konumunu bilmeyi gerektirir
  • Yalnızca karşılama deposu — sadece çevrimiçi siparişler için belirlenmiş depodan stoğu göster
  • Kullanılabilir eksi tampon — toplam eksi güvenlik marjı (örn. 72 = 80 – %10)

Mimari

ERP (multi-warehouse stock)

→ Aggregation Logic (middleware)

→ WooCommerce (single stock number per product)

WooCommerce (order placed)

→ Routing Logic (middleware)

→ ERP (assign to optimal warehouse)

Middleware, ERP’nin çok lokasyonlu modeli ile WooCommerce’in tek lokasyonlu modeli arasındaki uyumsuzluğu ele alır.

Envanter Toplama Stratejileri

Strateji 1: Tüm Depoları Topla

function aggregateStock(erpItem) {

const totalStock = erpItem.warehouses.reduce(

(sum, wh) => sum + wh.available, 0

);

return {

sku: erpItem.sku,

stock_quantity: totalStock,

stock_status: totalStock > 0 ? 'instock' : 'outofstock'

};

}

Artıları: Satılabilir envanteri maksimize eder
Eksileri: Depoya özel taahhütler takip edilmiyorsa aşırı satış yapabilir

Strateji 2: Ana Depo + Taşma

Çevrimiçi siparişler için ana karşılama merkezi olarak bir depo belirleyin. Stokunu gösterin, ancak ikincil depolardan taşmaya izin verin:

function aggregateStock(erpItem, primaryWarehouseId) {

const primary = erpItem.warehouses.find(w => w.id === primaryWarehouseId);

const overflow = erpItem.warehouses

.filter(w => w.id !== primaryWarehouseId)

.reduce((sum, w) => sum + w.available, 0);

// Show primary stock + 50% of overflow (buffer for retail/wholesale)

const displayStock = (primary?.available || 0) + Math.floor(overflow * 0.5);

return {

sku: erpItem.sku,

stock_quantity: displayStock,

stock_status: displayStock > 0 ? 'instock' : 'outofstock'

};

}

Strateji 3: Bölgesel Gösterim (İleri Seviye)

Müşterinin tespit edilen bölgesine göre farklı stok seviyelerini gösterin:

async function getRegionalStock(erpItem, customerRegion) {

const regionWarehouseMap = {

'east': ['WH-NYC', 'WH-ATL'],

'west': ['WH-LAX', 'WH-SEA'],

'central': ['WH-CHI', 'WH-DAL']

};

const relevantWarehouses = regionWarehouseMap[customerRegion] || Object.values(regionWarehouseMap).flat();

const regionalStock = erpItem.warehouses

.filter(w => relevantWarehouses.includes(w.id))

.reduce((sum, w) => sum + w.available, 0);

return { stock_quantity: regionalStock };

}

Bu, frontend’de dinamik stok gösterimi gerektirir — genellikle müşterinin konumunu tespit ettikten sonra bir AJAX çağrısı aracılığıyla.

Sipariş Yönlendirme

Bir sipariş geldiğinde, middleware’iniz hangi deponun onu karşılayacağına karar vermelidir:

function routeOrder(order, warehouseStock) {

const shippingState = order.shipping.state;

const items = order.line_items;

// 1. Find warehouses that can fulfill the entire order

const candidates = warehouseStock.filter(wh =>

items.every(item =>

wh.inventory[item.sku] >= item.quantity

)

);

if (candidates.length === 0) {

// No single warehouse can fulfill — need split shipment

return splitShipment(order, warehouseStock);

}

// 2. Score candidates

const scored = candidates.map(wh => ({

warehouse: wh,

score: calculateScore(wh, shippingState, items)

}));

// 3. Select best warehouse

return scored.sort((a, b) => b.score - a.score)[0].warehouse;

}

function calculateScore(warehouse, customerState, items) {

let score = 0;

// Proximity (shipping zone distance)

const distance = getDistance(warehouse.state, customerState);

score += (1000 - distance) * 2; // Closer = higher score

// Stock depth (prefer warehouses with more stock)

const minStockRatio = Math.min(

...items.map(item => warehouse.inventory[item.sku] / item.quantity)

);

score += minStockRatio * 100;

// Workload (prefer less busy warehouses)

score -= warehouse.pendingOrders * 5;

return score;

}

Bölünmüş Kargolar

Hiçbir depo tek başına tüm siparişi karşılayamadığında:

function splitShipment(order, warehouses) {

const shipments = [];

const remaining = [...order.line_items];

// Greedy algorithm: assign items to nearest warehouse with stock

while (remaining.length > 0) {

const item = remaining[0];

const warehouse = warehouses

.filter(wh => wh.inventory[item.sku] >= item.quantity)

.sort((a, b) =>

getDistance(a.state, order.shipping.state) -

getDistance(b.state, order.shipping.state)

)[0];

if (!warehouse) {

throw new Error(Cannot fulfill ${item.sku}: insufficient stock across all warehouses);

}

// Find or create shipment for this warehouse

let shipment = shipments.find(s => s.warehouseId === warehouse.id);

if (!shipment) {

shipment = { warehouseId: warehouse.id, items: [] };

shipments.push(shipment);

}

shipment.items.push(item);

warehouse.inventory[item.sku] -= item.quantity;

remaining.shift();

}

return shipments;

}

Bölünmüş kargolar için müşteri iletişimi:

  • Müşteriye siparişlerinin birden fazla pakette geleceğini bildir
  • Kargo başına ayrı takip numaraları sağla
  • Ekstra kargo ücreti alma (maliyeti karşıla)

WooCommerce Uygulaması

Plugin Yaklaşımı

WooCommerce’e depo başına stok takibi ekleyen bir çok depolu plugin (ATUM veya WooCommerce Multi-Warehouse gibi) kullanın. ERP senkronizasyonunuz her deponun stok seviyesini günceller.

Özel Meta Yaklaşımı

Depo seviyesindeki verileri ürün meta’sında saklayın:

// Store per-warehouse stock in product meta

update_post_meta($product_id, '_warehouse_stock', json_encode([

'WH-NYC' => 50,

'WH-LAX' => 30,

'WH-CHI' => 0

]));

// Display stock is the aggregated number

update_post_meta($product_id, '_stock', 80);

update_post_meta($product_id, '_stock_status', 'instock');

Çok Depolu Operasyonları İzleme

Metrik Neyi Takip Etmeli
Stok doğruluğu ERP stoku vs WooCommerce gösterilen stok
Yönlendirme verimliliği En yakın depodan karşılanan siparişlerin % oranı
Bölünmüş kargo oranı Bölünmüş kargo gerektiren siparişlerin % oranı (hedef: < %5)
Depoya göre karşılama süresi Yavaş depoları tespit et
Stok tükenmesi olayları Toplam stok sıfıra düştüğünde

Sonuç

Çok depolu WooCommerce temelde middleware aracılığıyla çözülen bir ERP problemidir. WooCommerce basitleştirilmiş bir görünüm sergiler; ERP’niz karmaşıklığı yönetir. Temel kararlar — toplama stratejisi, yönlendirme mantığı ve bölünmüş kargo işleme — spesifik lojistik kurulumunuza bağlıdır. En basit toplama ile başlayın (toplam veya ana depo), temel yönlendirme uygulayın ve karmaşıklığı yalnızca veriler buna ihtiyacınız olduğunu gösterdiğinde ekleyin. Bunu haklı çıkaracak sipariş hacmine sahip olmadan önce depo mantığını aşırı mühendislik yapmak geliştirme zamanını boşa harcar.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Close Search Window