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:
- Her şube için Mikro ERP’den raporu çek
- Excel’e aktar
- Web uygulamasına yükle
- 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 Turkishayarı tarih hesaplamalarını bozar. Detaylı yazımıza bakın.
Bu yazı AstaFlow Case Study serisinin bir parçasıdır.