Zincir marketler için karar yazılımı

Ortalama maliyet mi, son alış maliyeti mi? Farkın nereden geldiğini anlamak

Bir market zincirinde maliyet tartışması neredeyse her zaman aynı yerden başlar: satın alma ekibi bir sayı söyler, muhasebe başka bir sayı söyler, mağaza müdürü üçüncü bir sayıyı ekranında görür. Üçü de doğrudur. Üçü farklı soruyu yanıtlar. Bu yazıda ağırlıklı ortalama maliyet ile son alış maliyeti arasındaki farkın nereden geldiğini, veri modelinde nerede saklandığını ve hangi kararda hangisinin kullanılması gerektiğini somut sayılarla ele alıyorum.

İki maliyet, iki ayrı soru

Ağırlıklı ortalama maliyet şu soruyu yanıtlar: elimde şu anda duran stoğun bana toplam kaça mal olduğunu adet başına yazarsam ne çıkar. Bu bir geçmiş sorusudur ve muhasebenin sorusudur. Stok değerlemesi, satılan malın maliyeti ve dönem sonu envanter değeri bu sayı üzerinden kurulur.

Son alış maliyeti ise şu soruyu yanıtlar: bu ürünü bugün yeniden tedarik etsem bana kaça gelir. Bu bir gelecek sorusudur ve fiyatlama ile satın almanın sorusudur. Yeni fiyat etiketi basarken elinizdeki eski partinin ucuz olması sizi ilgilendirmez; yerine koyma bedeli ilgilendirir.

İki sayı ayrıştığında insanlar genellikle hangisinin doğru olduğunu tartışır. Doğru tartışma bu değildir. Doğru tartışma, iki sayının farkının açıklanabilir olup olmadığıdır. Fark açıklanabiliyorsa sistem sağlıklıdır; açıklanamıyorsa veri modelinde bir tanecik ya da tanım sorunu vardır.

Farkın aritmetiği: üç parti, iki sayı

Bir market zincirinde tek bir ürün kodunu, 2 litrelik sızma zeytinyağını ele alalım. Depoda ve şubelerde toplam 200 adet var ve bu 200 adet üç ayrı alım partisinden geliyor.

Bu tabloda ağırlıklı ortalama maliyet (100 x 380 + 60 x 428 + 40 x 468) / 200 = 82.400 / 200 = 412 TL çıkar. Son alış maliyeti ise en son faturanın birim bedelidir: 468 TL. Aradaki 56 TL, tamamen üç partinin farklı fiyatlardan girmiş olmasından gelir. Burada hata yoktur, yalnızca zaman vardır.

56 TL küçük görünebilir. Satış fiyatı KDV hariç 560 TL olduğunda brüt marj ortalama maliyetle yüzde 26,4, son alış maliyetiyle yüzde 16,4 hesaplanır. Aynı ürün, aynı gün, 10 puan fark. Bir kategori yöneticisi bu iki oranı iki farklı ekranda gördüğünde sisteme güvenini kaybeder; oysa yapılması gereken tek şey her ekranın hangi maliyet tanımını kullandığını yazmaktır.

  • Parti A — Ocak alımı, 100 adet, birim 380 TL
  • Parti B — Mart alımı, 60 adet, birim 428 TL
  • Parti C — Haziran alımı, 40 adet, birim 468 TL

Ortalamayı kaydıran gizli kalemler

Fatura birim fiyatı maliyetin tamamı değildir. Ağırlıklı ortalama, faturaya sonradan eklenen kalemleri de emmek zorundadır ve bu kalemler çoğu zaman farkın asıl kaynağıdır.

Bu kalemlerin ortak özelliği, ürünün deposuna girmesinden sonra gelmeleridir. Mal 12 Haziran'da girer, navlun faturası 3 Temmuz'da düşer. Eğer maliyet yordamı yalnızca ileriye doğru çalışıyorsa 12-30 Haziran arasında satılan adetlerin maliyeti eksik kalır. Eğer geriye dönük düzeltme yapıyorsa geçmiş ayın marjı bir gecede değişir ve kimse haber alamaz.

Doğru davranış ikisinin ortası değildir; ikisinin de kayıt altına alınmasıdır. Maliyet düzeltmeleri ayrı bir hareket tipi olarak yazılır, düzeltmenin hangi döneme ait olduğu ve ne zaman işlendiği iki ayrı tarih alanında tutulur. Böylece bir raporun neden değiştiği sorulduğunda yanıt veri içinde durur.

  • Navlun, gümrük ve sigorta gibi dağıtılan alım giderleri
  • Sonradan gelen fiyat farkı faturaları ve satıcı iskontoları
  • İthalat kaynaklı kur farkları ve vade farkları
  • İadeler: hangi maliyetle geri alındığı çoğu sistemde tanımsızdır
  • Fire, zayi ve sayım farklarının maliyeti kimin üstüne yazdığı

Veri modelinde maliyet nerede durur

Yıldız şemalı bir ambarda maliyeti tek bir yerde tutmaya çalışmak en sık yapılan hatadır. Maliyetin iki farklı tanecikte iki farklı hayatı vardır.

Birincisi hareket taneciğidir. Stok hareketi olgu tablosunun bir satırı tek bir hareket satırına karşılık gelir: hangi şube, hangi ürün, hangi tarih, hangi hareket tipi, kaç adet, o anda geçerli birim maliyet ve o anda geçerli ortalama maliyet. Bu tabloya maliyet, hareketin yazıldığı anda dondurularak yazılır. Sonradan hesaplanmaz, çünkü sonradan hesaplanan maliyet geçmişi değiştirir.

İkincisi gün taneciğidir. Maliyet fotoğrafı olgu tablosunun bir satırı şube, ürün ve tarih üçlüsüne karşılık gelir ve o günün kapanışındaki ortalama maliyet ile son alış maliyetini yan yana taşır. Stok değeri raporları bu tablodan okur; hareket tablosunu taramaz.

Her iki tabloyu da besleyen tek bir saklı yordam olmalıdır. İş mantığı ORM katmanında değil, veritabanında durur. Bunun nedeni ideolojik değil pratiktir: maliyet yordamı yüz milyonlarca satırlık bir kümede sıralı çalışır, iş kuralı ile veri aynı yerde olduğunda hem hızlıdır hem de tek bir yerde denetlenebilir.

  • DimUrun, DimSube, DimTarih, DimTedarikci boyutları
  • FactStokHareket — tanecik: tek hareket satırı
  • FactMaliyetGunluk — tanecik: sube x urun x tarih
  • Maliyet düzeltmeleri ayrı hareket tipi, ayrı muhasebe tarihi

Hangi karar hangi maliyeti ister

Fiyat belirlerken son alış maliyeti kullanılır. Yerine koyma bedelinin altında fiyat vermek, stok tükendiğinde marjın negatife dönmesi demektir. Özellikle kur hareketinin sert olduğu dönemlerde ortalama maliyete bakarak indirim kampanyası kurgulamak, geçmişin ucuzluğunu bugünün zararına çevirir.

Dönem karlılığı, stok değeri ve satılan malın maliyeti raporlanırken ağırlıklı ortalama kullanılır. Burada amaç geçmişi doğru anlatmaktır, geleceği tahmin etmek değil.

Tedarikçi pazarlığında ise ikisi birden kullanılır. Ortalama ile son alış arasındaki fark, tedarikçinin son on iki ayda uyguladığı zam patikasının özetidir. 412 TL ile 468 TL arasındaki 56 TL, masaya konulabilecek bir sayıdır.

Alokasyon ve transfer kararlarında ortalama maliyet tercih edilir, çünkü şubeler arası aktarımda tek bir ürün için iki farklı değerleme yapmak stok değerinde sızıntı yaratır.

Ne yapmalı

Önce tanımı yazın, sonra ekranı yapın. Her maliyet alanı için tek satırlık bir tanım, hesaplandığı yordamın adı ve hangi kararda kullanılacağı bir sözlükte dursun. Tanımı olmayan bir maliyet alanı ekrana çıkmasın.

Ekranlarda iki maliyeti yan yana gösterin ve farkı ayrı bir sütun olarak yazın. Farkı saklamak güveni artırmaz, azaltır. Fark sütununa tıklandığında altındaki parti kırılımının açılması, aylarca süren tartışmayı bir dakikaya indirir.

Maliyet düzeltmelerini asla sessizce geriye işlemeyin. Düzeltme bir hareket olsun, hareketin dönemi ve işlenme zamanı ayrı tutulsun, düzeltilen dönemin raporu yeniden basıldığında farkın nedeni satır bazında görülebilsin.

Mindpera'da Mind Cost modülü bu ayrımı varsayılan olarak kurar: ortalama ve son alış maliyeti aynı olgu tablosunda ayrı alanlardır, ikisi de saklı yordamla hesaplanır ve fark kırılımı parti düzeyine kadar açılabilir. Yapay zeka katmanı bu sayıları yeniden hesaplamaz; yalnızca farkın hangi partiden ve hangi gider kaleminden geldiğini cümleye çevirir.

Kendi verinizle görün.