Mikro ERP Stok Verilerini Google Sheets'ten Web Dashboard'a Taşımak

Mikro ERP stok verilerini Google Sheets'ten okuyarak web üzerinden takip edilebilir bir stok dashboard'u oluşturma rehberi. Supabase ve React ile adım adım.

Stok Verisi Nerede?

Mikro ERP kullanan birçok firma aynı sorunu yaşar: stok bilgisi farklı yerlerde dağınık halde durur.

  • Depocu: Google Sheets’e veya Excel’e sayım girer
  • Muhasebe: Mikro’dan bakar, ama genelde güncel değildir
  • Satış ekibi: Müşteriye “bakayım” deyip WhatsApp’tan sorar
  • Yönetici: Haftalık Excel raporu bekler

Sonuç? Kimse gerçek stok durumunu bilmiyor. Yanlış stok bilgisiyle sipariş veriliyor, müşteriye olmayan ürün satılıyor.

Çözüm: Tüm stok verisini tek bir web sayfasında toplamak. Herkes telefonundan veya bilgisayarından anlık görsün.

Nasıl Çalışıyor?

Genel akış şöyle:

Google Sheets (stok verileri)
    ↓ otomatik okuma
Node.js servisi (veriyi çeker, düzenler)
    ↓ Supabase'e yazar
Web Dashboard (herkes buradan bakar)

1. Google Sheets’ten Veri Okuma

Depocu stok sayımını Google Sheets’e giriyor diyelim. Bu veriyi web’den çekmek çok basit — Sheets’i CSV olarak dışa aktarabilirsiniz:

import Papa from 'papaparse';

async function stokVerisiniOku(sheetsUrl: string) {
  // Google Sheets'in CSV export linki
  const csvUrl = sheetsUrl.replace(/\/edit.*$/, '/export?format=csv');
  
  const response = await fetch(csvUrl);
  const csvText = await response.text();
  
  // CSV'yi parse et — başlık satırını otomatik algılar
  const sonuc = Papa.parse(csvText, {
    header: true,
    skipEmptyLines: true,
  });
  
  return sonuc.data;
}

💡 İpucu: Google Sheets URL’inizi “herkese açık — görüntüleyebilir” yapmanız yeterli. API key’e gerek yok.

2. Veritabanına Yazma

Okuduğumuz stok verilerini Supabase’e (PostgreSQL) toplu olarak yazıyoruz. Böylece web uygulaması bu veritabanından okuyacak:

async function stoklariKaydet(stoklar) {
  // 500'er gruplar halinde kaydet (büyük verilerde performans için)
  const grupBoyutu = 500;
  
  for (let i = 0; i < stoklar.length; i += grupBoyutu) {
    const grup = stoklar.slice(i, i + grupBoyutu);
    
    await supabase
      .from('v3_stock')
      .upsert(grup, { onConflict: 'stok_kodu' });
    // upsert: varsa güncelle, yoksa ekle
  }
}

Veritabanı Tablosu

CREATE TABLE v3_stock (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  stok_kodu VARCHAR(50) UNIQUE NOT NULL,
  stok_adi VARCHAR(255) NOT NULL,
  miktar DECIMAL(18,4) DEFAULT 0,
  birim VARCHAR(20) DEFAULT 'ADET',
  depo VARCHAR(50),
  updated_at TIMESTAMPTZ DEFAULT NOW()
);

3. Dashboard’da Gösterme

React ile basit bir stok tablosu ve birkaç özet kart:

┌─────────────┐  ┌─────────────┐  ┌──────────────┐
│  1.245       │  │  23 ürün     │  │  8 ürün       │
│  toplam ürün │  │  kritik stok │  │  sıfır stok   │
└─────────────┘  └─────────────┘  └──────────────┘

┌──────────────────────────────────────────────┐
│ Stok Kodu  │ Ürün Adı         │ Miktar │ Birim│
│ SRM.001    │ Yer Seramiği 60x │ 250    │ M2   │
│ FYN.012    │ Metro Fayans     │ 0      │ M2   │ ← Kırmızı!
│ BYA.045    │ İç Cephe Boya    │ 12     │ KOVa │
└──────────────────────────────────────────────┘

Kritik stoklar ve sıfır stoklar kırmızıyla vurgulanır. Yönetici bir bakışta “hangi ürünler tükeniyor?” sorusunun cevabını alır.

4. Otomatik Güncelleme

Bu işlemi elle yapmak yerine, bir zamanlayıcı (cron job) ile otomatikleştirebilirsiniz:

import cron from 'node-cron';

// Her 30 dakikada bir güncelle
cron.schedule('*/30 * * * *', async () => {
  const stoklar = await stokVerisiniOku(SHEETS_URL);
  await stoklariKaydet(stoklar);
  console.log(`${stoklar.length} ürün güncellendi`);
});

Artık depocu Sheets’e girdiği anda, 30 dakika içinde web dashboard güncellenmiş oluyor.

Bu Şekilde Neyi Çözmüş Oluyorsunuz?

✅ Herkes aynı stok verisine bakıyor — tek kaynak
✅ Telefon, tablet, bilgisayar — her yerden erişim
✅ Kritik stoklar otomatik vurgulanıyor
✅ Manuel rapor hazırlamaya gerek kalmıyor

Peki, Ölçek Büyüyünce?

Bu yapı tek bir Sheets dosyası ve tek bir depo için harika çalışır. Ama büyüdükçe karşılaşacağınız zorluklar var:

  • 8 şubenin her birinin ayrı Sheets dosyası ve farklı kolon formatları
  • Eski verilerin temizlenmesi (artık depoda olmayan ürünler)
  • ABC analizi, emniyet stok hesaplaması, hareket hızı raporları
  • 15.000+ ürünle performans optimizasyonu

Biz 8 şubeli, 15.000+ ürünlü yapımızda bu sorunların hepsini çözdük. İhtiyacınız olursa deneyimimizden faydalanabilirsiniz.


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