E-ticaret & Stok Yönetimi

Stok Sayımı ve Envanter Doğrulama: Sistemsel Yaklaşım

Fatih Algül
17.03.2026 184 görüntülenme

Stok Sayımı Neden Kritiktir?

Envanter yönetimi, bir işletmenin finansal sağlığını doğrudan etkileyen temel operasyonlardan biridir. Fiziksel stok ile sistem kayıtları arasındaki uyumsuzluklar; kayıp gelir, yanlış sipariş kararları ve muhasebe hatalarına yol açar. Sistemsel bir yaklaşım benimsemek, bu riskleri minimize ederken operasyonel verimliliği artırır.

Geleneksel manuel sayım yöntemleri, insan hatasına açık ve zaman alıcıdır. Modern envanter doğrulama sistemleri ise barkod/RFID teknolojileri, veritabanı entegrasyonları ve otomatik raporlama mekanizmaları ile bu süreci dönüştürür.

Stok Sayım Yöntemleri

1. Periyodik Sayım (Periodic Inventory)

Belirli aralıklarla (aylık, çeyreklik, yıllık) tüm envanterin sayılmasıdır. Küçük işletmeler için uygun olsa da büyük depolarda operasyonu durdurma gerekliliği ciddi bir dezavantajdır.

2. Döngüsel Sayım (Cycle Counting)

Envanterin belirli bölümleri her gün veya hafta sırayla sayılır. ABC analizi ile yüksek değerli ürünler (A sınıfı) daha sık sayılırken, düşük değerli ürünler (C sınıfı) daha seyrek kontrol edilir. Bu yöntem operasyonel kesinti olmadan sürekli doğrulama sağlar.

3. Anlık (Perpetual) Envanter Sistemi

Her giriş ve çıkış işlemi anlık olarak kayıt altına alınır. Barkod veya RFID taramaları ile desteklenen bu sistem, gerçek zamanlı stok görünürlüğü sunar.

Veritabanı Tasarımı ve Veri Modeli

Etkili bir envanter doğrulama sistemi, sağlam bir veri modeline dayanır. Aşağıda temel tablo yapısı yer almaktadır:

CREATE TABLE urunler (
    urun_id SERIAL PRIMARY KEY,
    urun_kodu VARCHAR(50) UNIQUE NOT NULL,
    urun_adi VARCHAR(255) NOT NULL,
    barkod VARCHAR(13) UNIQUE,
    kategori_id INT REFERENCES kategoriler(kategori_id),
    birim VARCHAR(20) DEFAULT 'adet',
    minimum_stok INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE stok_hareketleri (
    hareket_id SERIAL PRIMARY KEY,
    urun_id INT REFERENCES urunler(urun_id),
    depo_id INT REFERENCES depolar(depo_id),
    hareket_tipi VARCHAR(20) CHECK (hareket_tipi IN ('giris', 'cikis', 'sayim', 'transfer')),
    miktar DECIMAL(10,2) NOT NULL,
    referans_no VARCHAR(100),
    kullanici_id INT REFERENCES kullanicilar(kullanici_id),
    tarih TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE sayim_kayitlari (
    sayim_id SERIAL PRIMARY KEY,
    sayim_tarihi DATE NOT NULL,
    depo_id INT REFERENCES depolar(depo_id),
    durum VARCHAR(20) DEFAULT 'devam_ediyor',
    onaylayan_id INT REFERENCES kullanicilar(kullanici_id),
    tamamlanma_tarihi TIMESTAMP
);

CREATE TABLE sayim_detay (
    detay_id SERIAL PRIMARY KEY,
    sayim_id INT REFERENCES sayim_kayitlari(sayim_id),
    urun_id INT REFERENCES urunler(urun_id),
    sistem_miktari DECIMAL(10,2) NOT NULL,
    sayilan_miktar DECIMAL(10,2),
    fark DECIMAL(10,2) GENERATED ALWAYS AS (sayilan_miktar - sistem_miktari) STORED,
    aciklama TEXT
);

Sayım Doğrulama Algoritması

Sayım sonuçlarını analiz eden ve sapmaları raporlayan bir Python örneği:

from dataclasses import dataclass
from decimal import Decimal
from enum import Enum

class SapmaDerecesi(Enum):
    KABUL = "kabul_edilebilir"
    UYARI = "uyari"
    KRITIK = "kritik"

@dataclass
class SayimSonucu:
    urun_kodu: str
    sistem_miktari: Decimal
    sayilan_miktar: Decimal

    @property
    def fark(self) -> Decimal:
        return self.sayilan_miktar - self.sistem_miktari

    @property
    def sapma_orani(self) -> Decimal:
        if self.sistem_miktari == 0:
            return Decimal("100") if self.sayilan_miktar != 0 else Decimal("0")
        return abs(self.fark / self.sistem_miktari) * 100

    @property
    def derece(self) -> SapmaDerecesi:
        oran = self.sapma_orani
        if oran <= 2:
            return SapmaDerecesi.KABUL
        elif oran <= 5:
            return SapmaDerecesi.UYARI
        return SapmaDerecesi.KRITIK


def envanter_dogrulama(sonuclar: list[SayimSonucu]) -> dict:
    rapor = {"kabul": [], "uyari": [], "kritik": []}
    toplam_fark_maliyeti = Decimal("0")

    for sonuc in sonuclar:
        derece = sonuc.derece
        rapor[derece.value.split("_")[0] if "_" not in derece.value else derece.value].append({
            "urun": sonuc.urun_kodu,
            "sistem": sonuc.sistem_miktari,
            "sayim": sonuc.sayilan_miktar,
            "fark": sonuc.fark,
            "sapma": f"%{sonuc.sapma_orani:.1f}"
        })

    rapor["ozet"] = {
        "toplam_urun": len(sonuclar),
        "sapmali_urun": len(rapor["uyari"]) + len(rapor["kritik"]),
        "dogruluk_orani": f"%{((len(rapor.get('kabul', [])) / len(sonuclar)) * 100):.1f}" if sonuclar else "%0"
    }
    return rapor

ABC Analizi ile Önceliklendirme

Tüm ürünleri aynı sıklıkta saymak verimli değildir. ABC analizi, Pareto ilkesine (80/20 kuralı) dayanarak ürünleri değerlerine göre sınıflandırır:

  • A Sınıfı (%20 ürün, %80 değer): Haftalık veya aylık sayım. Yüksek değerli, kritik ürünler.
  • B Sınıfı (%30 ürün, %15 değer): Çeyreklik sayım. Orta değerli ürünler.
  • C Sınıfı (%50 ürün, %5 değer): Yıllık sayım. Düşük değerli, yüksek hacimli ürünler.
SELECT
    u.urun_kodu,
    u.urun_adi,
    SUM(sh.miktar * u.birim_fiyat) AS toplam_deger,
    SUM(SUM(sh.miktar * u.birim_fiyat)) OVER (ORDER BY SUM(sh.miktar * u.birim_fiyat) DESC)
        / SUM(SUM(sh.miktar * u.birim_fiyat)) OVER () * 100 AS kumulatif_yuzde,
    CASE
        WHEN SUM(SUM(sh.miktar * u.birim_fiyat)) OVER (ORDER BY SUM(sh.miktar * u.birim_fiyat) DESC)
             / SUM(SUM(sh.miktar * u.birim_fiyat)) OVER () * 100 <= 80 THEN 'A'
        WHEN SUM(SUM(sh.miktar * u.birim_fiyat)) OVER (ORDER BY SUM(sh.miktar * u.birim_fiyat) DESC)
             / SUM(SUM(sh.miktar * u.birim_fiyat)) OVER () * 100 <= 95 THEN 'B'
        ELSE 'C'
    END AS abc_sinifi
FROM urunler u
JOIN stok_hareketleri sh ON u.urun_id = sh.urun_id
WHERE sh.hareket_tipi = 'cikis'
  AND sh.tarih >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY u.urun_kodu, u.urun_adi
ORDER BY toplam_deger DESC;

Sapma Analizi ve Kök Neden Tespiti

Sayım farkları tespit edildikten sonra, kök neden analizi yapılmalıdır. Yaygın sapma nedenleri şunlardır:

  1. Kayıt Hataları: Giriş/çıkış işlemlerinin sisteme yanlış girilmesi veya hiç girilmemesi.
  2. Hasar ve Fire: Kırılan, bozulan veya son kullanma tarihi geçen ürünlerin zamanında düşülmemesi.
  3. Hırsızlık: İç veya dış kaynaklı kayıplar.
  4. Birim Uyumsuzluğu: Koli/adet/palet gibi birimlerin karıştırılması.
  5. Depo Lokasyon Hataları: Ürünlerin yanlış rafa yerleştirilmesi nedeniyle sayım sırasında atlanması.

Otomatik Sapma Alarmı

Belirli eşik değerlerin üzerindeki sapmalarda otomatik bildirim tetiklemek, hızlı müdahale sağlar:

def sapma_alarmi_kontrol(sayim_sonuclari, bildirim_servisi):
    kritik_esik = Decimal("5")   # %5 üzeri kritik
    uyari_esik = Decimal("2")    # %2 üzeri uyarı

    for sonuc in sayim_sonuclari:
        if sonuc.sapma_orani > kritik_esik:
            bildirim_servisi.gonder(
                kanal="envanter-kritik",
                mesaj=f"KRITIK SAPMA: {sonuc.urun_kodu} - "
                      f"Sistem: {sonuc.sistem_miktari}, "
                      f"Sayim: {sonuc.sayilan_miktar}, "
                      f"Sapma: %{sonuc.sapma_orani:.1f}",
                oncelik="yuksek"
            )
        elif sonuc.sapma_orani > uyari_esik:
            bildirim_servisi.gonder(
                kanal="envanter-uyari",
                mesaj=f"UYARI: {sonuc.urun_kodu} - Sapma: %{sonuc.sapma_orani:.1f}",
                oncelik="normal"
            )

Barkod ve RFID Entegrasyonu

Modern sayım sistemlerinde el terminalleri veya mobil cihazlar üzerinden barkod taraması, hız ve doğruluğu büyük ölçüde artırır. RFID teknolojisi ise özellikle yüksek hacimli depolarda devrim niteliğindedir — tek bir tarama ile bir raftaki tüm ürünleri saniyeler içinde okuyabilir.

Entegrasyon mimarisinde dikkat edilmesi gereken noktalar:

  • Çevrimdışı çalışabilirlik: El terminalleri ağ bağlantısı kesilse bile veri toplayabilmeli, bağlantı geldiğinde senkronize etmelidir.
  • Çift tarama koruması: Aynı ürünün kısa süre içinde iki kez taranmasını engelleyen mantık bulunmalıdır.
  • Gerçek zamanlı ilerleme takibi: Sayım sırasında yöneticilerin tamamlanma oranını ve anlık sapmaları görebileceği bir gösterge paneli sunulmalıdır.

Envanter Doğruluk Metrikleri ve KPI'lar

Sistemsel yaklaşımın başarısını ölçmek için şu metrikleri takip edin:

  • IRA (Inventory Record Accuracy): Doğru kayıt sayısı / Toplam SKU sayısı × 100. Hedef: %97 üzeri.
  • Shrinkage Rate (Fire Oranı): Kayıp stok değeri / Toplam stok değeri × 100. Perakende ortalaması: %1.4.
  • Sayım Tamamlanma Süresi: Birim başına sayım süresi. Barkod ile ortalama 3-5 saniye, RFID ile saniyenin altına düşer.
  • Düzeltme Sıklığı: Ayda yapılan manuel stok düzeltme sayısı. Azalan trend hedeflenir.

Sonuç ve En İyi Uygulamalar

Etkili bir envanter doğrulama sistemi kurmak için şu adımları izleyin:

  1. ABC analizi ile ürünlerinizi sınıflandırın ve sayım sıklığını belirleyin.
  2. Barkod veya RFID destekli bir sayım altyapısı kurun.
  3. Sapma eşiklerini tanımlayın ve otomatik alarm mekanizmaları devreye alın.
  4. Her sapma için kök neden analizi yapılmasını zorunlu tutun.
  5. KPI'ları düzenli olarak izleyin ve sürekli iyileştirme döngüsü oluşturun.
  6. Sayım süreçlerini ERP sisteminizle entegre ederek veri tutarlılığını sağlayın.

Unutmayın: envanter doğruluğu tek seferlik bir proje değil, sürekli bir disiplindir. Sistemsel yaklaşım, bu disiplini sürdürülebilir kılan tek yoldur.

Yazar Hakkında
Fatih Algül
TechSoft Solutions
Proje mi var?

Yazılım, IoT veya otomasyon konularında destek almak ister misiniz?

İletişime Geç