---
title: "Mikro ERP Cari Yaşlandırma Raporunu Web'den Otomatik Çekmek"
description: "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."
date: 2026-04-12
category: mikro-erp
tags: ["mikro-erp", "sql-server", "cari-yaşlandırma", "nodejs", "otomasyon"]
url: https://mikroerp.dev/blog/mikro-erp-cari-yaslandirma-otomasyonu/
---

## 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ı](/blog/mikro-erp-web-baglanti-cloudflare-tunnel/) ayrı yazımızda.

## Proxy Ne Yapıyor?

```javascript
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
```

```javascript
// İ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:

```javascript
// 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:

```javascript
// 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](/blog/sql-server-set-language-turkish-tarih-tuzagi/) bakın.

---

*Bu yazı [AstaFlow Case Study](/case-study) serisinin bir parçasıdır.*