🇬🇧 English: Read this in English →

Microsoft Dynamics 365 Business Central, özellikle Microsoft ekosistemine yatırım yapmış orta ölçekli şirketler için tercih edilen ERP’dir. WooCommerce ile entegre etmek, D365’in API manzarasını anlamayı ve senin ölçeğin ile karmaşıklığın için doğru entegrasyon kalıbını seçmeyi gerektirir. Açık konuşayım: bu tür entegrasyonlarda projeyi batıran şey neredeyse hiçbir zaman API’nin kendisi olmaz — yanlış kalıbı seçmek, yani basit bir işe fazla makine ya da ciddi bir işe kırılgan bir kurgu koymak olur. Aşağıda önce seçenekleri, sonra da ben olsam hangi durumda hangisini seçerdim, onu anlatıyorum.

D365 Business Central API Seçenekleri

OData/REST API’leri (Standart)

Business Central, OData v4 endpoint’leri aracılığıyla standart varlıkları sunar:

GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/items

GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/salesOrders

GET https://{tenant}.api.businesscentral.dynamics.com/v2.0/{environment}/api/v2.0/customers

Kimlik Doğrulama: Azure AD üzerinden OAuth 2.0. Azure Portal’da bir uygulama kaydet, Financials.ReadWrite.All izinlerini ver.

Özel API’ler (AL Uzantıları)

Karmaşık entegrasyonlar için, AL dili kullanarak Business Central’da özel API endpoint’leri oluştur:

page 50100 "WooCommerce Items API"

{

PageType = API;

APIPublisher = 'wpclan';

APIGroup = 'woocommerce';

APIVersion = 'v1.0';

EntityName = 'item';

EntitySetName = 'items';

SourceTable = Item;

// ... alan tanımları

}

Dataverse (Gelişmiş)

Değişiklik takibi ile çift yönlü senkronizasyon için, Business Central verileri Dataverse’e (eski adıyla Common Data Service) senkronize edebilir. Bu, webhook benzeri değişiklik bildirimleri sağlar.

Entegrasyon Kalıpları

Kalıp 1: Power Automate (Düşük Kodlu)

En uygun: Basit entegrasyonlar, günde < 100 sipariş

Microsoft Power Automate, HTTP bağlayıcıları aracılığıyla D365’i WooCommerce’e bağlayabilir:

Tetikleyici: WooCommerce siparişi oluşturulduğunda (HTTP webhook)

→ JSON Ayrıştır (sipariş verisi)

→ D365: Müşteri bul veya oluştur

→ D365: Satış siparişi oluştur

→ D365: Satır öğeleri ekle

→ WooCommerce: Sipariş meta'sını D365 referansıyla güncelle

Artıları: Kod yok, görsel iş akışı, yerleşik hata işleme
Eksileri: API çağrı sınırları (Performance planı gerekli), daha yavaş yürütme, sınırlı dönüşüm mantığı

Kalıp 2: Azure Functions + Service Bus (Bulut-Yerel)

En uygun: Orta-yüksek hacim, Microsoft-yığın ekipleri

WooCommerce Webhook → Azure Function → Service Bus Queue → Azure Function → D365 API

D365 Change Feed → Azure Function → Service Bus Queue → Azure Function → WooCommerce API

Azure Functions, API çağrılarını ve veri dönüşümünü işler. Service Bus, dead-letter desteği ile güvenilir mesaj kuyruğu sağlar.

Kalıp 3: Özel Node.js Middleware (Tam Kontrol)

En uygun: Karmaşık gereksinimler, özel iş mantığı

// D365 Business Central istemcisi

class D365Client {

constructor(tenantId, clientId, clientSecret, environment) {

this.baseUrl = https://api.businesscentral.dynamics.com/v2.0/${environment}/api/v2.0;

this.tokenUrl = https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token;

this.clientId = clientId;

this.clientSecret = clientSecret;

}

async getToken() {

const response = await fetch(this.tokenUrl, {

method: 'POST',

headers: { 'Content-Type': 'application/x-www-form-urlencoded' },

body: new URLSearchParams({

grant_type: 'client_credentials',

client_id: this.clientId,

client_secret: this.clientSecret,

scope: 'https://api.businesscentral.dynamics.com/.default'

})

});

const data = await response.json();

return data.access_token;

}

async getItems() {

const token = await this.getToken();

const response = await fetch(${this.baseUrl}/items, {

headers: { 'Authorization': Bearer ${token} }

});

return response.json();

}

async createSalesOrder(orderData) {

const token = await this.getToken();

return fetch(${this.baseUrl}/salesOrders, {

method: 'POST',

headers: {

'Authorization': Bearer ${token},

'Content-Type': 'application/json'

},

body: JSON.stringify(orderData)

});

}

}

Veri Eşleme: D365 → WooCommerce

Öğeler’den Ürünlere

D365 Alanı WooCommerce Notlar
number sku Eşleme için birincil anahtar
displayName name
unitPrice regular_price Fiyat listesinden
inventory stock_quantity Gerçek zamanlı kritik
itemCategoryCode categories Kodları WC kategori ID’lerine eşle
blocked status blocked=true → draft
gtin meta: _gtin Schema markup için

Satış Siparişleri

WooCommerce D365 Satış Siparişi Notlar
order.id externalDocumentNumber Çapraz referans
billing.email customerNumber E-posta ile eşleştir
line_items[].sku salesOrderLines[].itemId Öğe numarasıyla eşleştir
line_items[].quantity salesOrderLines[].quantity
line_items[].total salesOrderLines[].unitPrice İndirimler için yeniden hesapla
shipping_total Ayrı satır veya navlun ücreti olarak ekle

D365’in Sayfalandırmasını İşleme

Business Central API’leri maksimum 20.000 kayıt döner ve sayfalandırma için @odata.nextLink kullanır:

async function getAllItems(client) {

let items = [];

let url = ${client.baseUrl}/items?$top=1000;

while (url) {

const response = await client.authenticatedFetch(url);

const data = await response.json();

items = items.concat(data.value);

url = data['@odata.nextLink'] || null;

}

return items;

}

Envanter Senkronizasyon Stratejisi

D365 Business Central, envanteri lokasyon (depo) seviyesinde takip eder. Senkronizasyonun şu üç soruya karar vermeli:

  • Tek bir WooCommerce stok sayısı için tüm lokasyonları toplamak?
  • Belirli lokasyonları senkronize etmek (örn., sadece e-ticaret deposu)?
  • Tampon stok rezerve etmek (aşırı satışı önlemek için gerçek stokun %90’ını göstermek)?
async function syncInventory() {

const d365Items = await d365.getItems();

const updates = d365Items.value

.filter(item => !item.blocked)

.map(item => ({

sku: item.number,

stock_quantity: Math.floor(item.inventory * 0.95), // %5 tampon

stock_status: item.inventory > 0 ? 'instock' : 'outofstock'

}));

// WooCommerce toplu güncelleme

for (let i = 0; i < updates.length; i += 100) {

await wooApi.post('products/batch', {

update: updates.slice(i, i + 100).map(u => ({

sku: u.sku, // ürün ID'si almak için SKU araması gerektirir

stock_quantity: u.stock_quantity,

stock_status: u.stock_status

}))

});

}

}

Yaygın D365 Entegrasyon Tuzakları

  • OAuth token süre dolumu: Token’lerin 1 saat sonra süresi dolar. API çağrılarından önce her zaman yenile.
  • Hız sınırlaması: Business Central, tenant başına dakikada 600 çağrı sınırına sahiptir. İsteklerini toplu hâlde gönder.
  • Numara dizileri: D365 belge numaralarını otomatik oluşturur. Bunları manuel olarak ayarlamaya çalışma.
  • Boyutlar: D365’in finansal boyutlarının (maliyet merkezi, departman) WooCommerce eşdeğeri yoktur. Bunları nasıl işleyeceğini baştan planla.
  • Çoklu para birimi: D365 çoklu para birimini doğal olarak işler. WooCommerce çoklu para birimi için bir eklentiye ihtiyaç duyar. Döviz kurlarını dikkatli eşle.

Ben olsam hangi kalıbı seçerdim

Üç kalıbı önüne koydum; şimdi de dürüst tercihimi söyleyeyim, çünkü “duruma göre” cevabı kimseyi kurtarmaz. Günde yüzün altında sipariş alan, karmaşık dönüşüm mantığı olmayan bir mağaza için Power Automate’i seçerdim ve bundan utanmazdım — kod yazmadığın her satır, iki yıl sonra bakımını yapmadığın bir satırdır. Görsel iş akışı bir zayıflık değil; küçük hacimde tam da doğru araç.

Hacim orta-yükseğe çıktığında ve ekip zaten Azure içindeyse, Azure Functions + Service Bus kalıbına geçerdim. Buradaki asıl mesele hız değil, dayanıklılık: Service Bus’ın dead-letter kuyruğu, bir siparişin sessizce kaybolması ile üç gün sonra fark edilen bir muhasebe açığı arasındaki farktır. Özel Node.js middleware’i ise yalnızca gerçekten tuhaf iş kuralların — özel fiyatlandırma, çok depolu karmaşık tahsis, standart alanlara sığmayan dönüşümler — varsa açardım. Tam kontrol bedavaya gelmez; onu ancak sorun onu hak ettiğinde satın al.

Açık konuşayım: gördüğüm en pahalı hata, günde otuz sipariş alan bir mağazaya “ölçeklensin” diye özel middleware kurmak. O gün gelmeden yazdığın esneklik, o güne kadar sadece bakım yüküdür. Bugünkü hacmine göre seç, yarınki hayaline göre değil.

Sonuç

D365 Business Central + WooCommerce güçlü bir kombinasyondur. Power Automate basit, düşük hacimli entegrasyonlar için çalışır. Azure Functions güvenilirliğe ihtiyaç duyan Microsoft-yığın ekipleri için uygundur. Özel middleware karmaşık senaryolarda sana tam kontrol verir. Kalıp ne olursa olsun, temel şeyler aynıdır: verilerini dikkatli eşle, envanteri en yüksek öncelikli senkronizasyon olarak işle ve sağlam hata işlemeyi ilk günden kur. Hata işlemeyi sonraya bırakma; entegrasyonlarda “sonra” diye bir zaman hiç gelmez.

Bir yanıt yazın

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

Close Search Window