Mikro ERP Cari Yaşlandırma Raporunu Web'den Otomatik Çekmek

Her hafta Excel ile cari yaşlandırma raporu mu yüklüyorsunuz? Mikro ERP SQL Server'dan doğrudan çekip web dashboard'da gösterme rehberi.

Sorun: Her Hafta Excel Yüklemek

Çok şubeli bir yapıda cari yaşlandırma raporu hazırlamak kabus gibi:

  1. Her şube için Mikro ERP’den raporu çek
  2. Excel’e aktar
  3. Web uygulamasına yükle
  4. 8 şube × haftada 1 = ayda 32 manuel işlem

Hatalı veri, geciken raporlar, tutarsız rakamlar kaçınılmaz.

Çözüm: Doğrudan SQL Server’dan Çekme

Web uygulaması doğrudan Mikro’nun SQL Server veritabanına bağlanıyor ve yaşlandırma verisini otomatik çekiyor.

Web App → HTTPS → Cloudflare → Tünel → Node.js Proxy → SQL Server

Neden arada bir proxy var? Çünkü SQL Server genellikle ofiste çalışır (internet erişimi yok), güvenlik gerekir ve rate limiting şart. Bağlantı detayları ayrı yazımızda.

Proxy Ne Yapıyor?

app.post('/aging-sync', apiKeyKontrolu, async (req, res) => {
  const { sube } = req.body;

  // Şubeye göre doğru veritabanını seç
  const dbConfig = subeDbAyarlari(sube);
  
  // Cari prefix'lere göre SQL oluştur
  const sql = yaslandirmaSorgusuOlustur(sube);
  
  // SQL Server'da çalıştır
  const sonuc = await sorguCalistir(dbConfig, sql);
  
  res.json({ satirlar: sonuc });
});

Her şubenin carileri farklı prefix kodlarıyla başlar (MRK.xxx, ADN.xxx gibi). SQL sorgusunu buna göre oluşturuyoruz.

Uzun Süren Sorgular İçin Arka Plan İşlemi

Yaşlandırma sorgusu tüm cariler için çalıştığında 3-4 dakika sürebilir. HTTP bağlantısı kopar. Çözüm:

1. İstek geldi → "Tamam, başladım" yanıtı dön (HTTP 202)
2. Sorgu arka planda çalışsın
3. Kullanıcıya ilerleme çubuğu göster
4. Bitti → Kullanıcıya sonuçları göster
// İstek kabul et, arka planda çalıştır
const jobId = crypto.randomUUID();
isler.set(jobId, { durum: 'çalışıyor', ilerleme: 0 });

// Arka planda senkronize et
senkronizeEt(jobId, sube);

// Hemen yanıt dön
res.status(202).json({ jobId });

Frontend her 10 saniyede GET /aging-status?jobId=xxx ile durumu kontrol eder.

Otomatik Günlük Güncelleme

Manuel tetikleme yerine her sabah otomatik:

// Her sabah 07:00'da tüm şubeleri güncelle
cron.schedule('0 7 * * *', async () => {
  for (const sube of subeler) {
    await senkronizeEt(sube);
    await bekle(5000);  // Şubeler arası mola
  }
}, { timezone: 'Europe/Istanbul' });

8 şube × ~4 dk = ~30 dakika. Sessizce, arka planda, her sabah.

Tekrar Basma Engeli

Kullanıcıların “Güncelle” butonuna art arda basması sorunu:

// Admin: her zaman çalıştırabilir
// Diğerleri: 1 saat bekleme süresi
const sonGuncelleme = /* veritabanından al */;
const birSaatGectiMi = Date.now() - sonGuncelleme > 60 * 60 * 1000;
const guncellemeYapabilir = isAdmin || birSaatGectiMi;

Sonuç

Bu mimariyle:

  • 32 manuel Excel işlemi → 0 (tam otomasyon)
  • Tutarlı veri: Tüm şubeler aynı sorguyla güncellenir
  • Güncel: Her sabah otomatik
  • Yedek plan: Bağlantı kesilirse Excel yükleme hâlâ aktif

⚠️ Dikkat: SQL’de SET LANGUAGE Turkish ayarı tarih hesaplamalarını bozar. Detaylı yazımıza bakın.


Bu yazı AstaFlow Case Study serisinin bir parçasıdır.