Bu işin en çok yanlış anlaşılan kısmı bu, o yüzden en baştan anlatayım.
Bir apartman kışın 40.000 TL’lik doğalgaz yakıyor. Bu rakam kesin: faturası var. Şimdi bu 40.000 TL’yi 60 daireye bölmek gerekiyor.
“Herkes sayacı kadar ödesin” diyorsun. Denersin, tutmaz. Nedenini anlamak, bu sistemin tamamını anlamak demek.
Neden tutmaz
Üç sebep var ve üçü de fiziksel:
- Isı duvardan geçer. Sen radyatörü hiç açmasan bile üst, alt ve yan komşularından ısı alırsın. Sayacın sıfır gösterir, dairen 19 derecedir.
- Borular ısıtır. Kazandan dairelere giden hatlar bodrumdan ve şaftlardan geçerken ısı kaybeder. O ısı kimsenin sayacında görünmez ama parası ödenmiştir.
- Ortak alanlar ısınır. Merdiven boşluğu, giriş holü, sığınak. Kimsenin dairesi değil, herkesin gideri.
Dolayısıyla 60 sayacın toplamı, binanın gerçek tüketimine eşit değil. Sayaçlar toplam gideri değil, dairelerin birbirine göre oranını ölçer.
sabit pay binanın ortak giderinden düşen kısım — daire alanına göre dağıtılır. tüketim payı ise sayaçların birbirine oranına göre. Oran mevzuatla belirlenir; ısı payı ölçer kullanılan binalarda tipik dağılım %30 sabit / %70 tüketim.
Isı payı ölçer birim ölçmez
Buradaki en ters gelen şey şu: radyatörün üstündeki küçük kutu enerji ölçmüyor.
Ölçtüğü şey radyatör yüzeyi ile oda arasındaki sıcaklık farkı, zamanla çarpılmış hali. Çıkan sayının birimi yok. Bir dairede 1.240 çıkması tek başına hiçbir şey ifade etmiyor.
Anlam kazandığı tek yer binanın kendi içi:
daire A : 1.240 birim
daire B : 890 birim
daire C : 2.010 birim
…
toplam : 74.500 birim
daire A'nın tüketim payı = 1.240 / 74.500 = %1,66
Yani bir binanın rakamını başka bir binayla kıyaslamak anlamsız. Bu, sakinlere en çok anlatmam gereken şey — ve portaldaki “bina ortalaması” kutusunun var olma sebebi.
Motorun iki fazı
Hesap tek geçişte yapılamıyor, çünkü bir dairenin payını bilmek için önce binanın toplamını bilmek gerekiyor. Motor bu yüzden iki fazlı:
FAZ 1 — topla
her hane için:
okuma farkı = son_okuma − ilk_okuma
düzeltmeleri uygula (sayaç değişimi, arıza, tahakkuk)
bina toplamını çıkar
FAZ 2 — dağıt
her hane için:
tüketim payı = (hane birimi / bina toplamı) × dağıtılacak tutar
sabit pay = (hane alanı / bina alanı) × sabit tutar
muafiyet, asgari pay ve ortak alan kurallarını uygula
fatura kalemlerini yaz
Ve sonra gerçek hayat
Yukarısı temiz hâli. Sahada bunların üstüne şunlar biniyor:
| durum | ne yapılır |
|---|---|
| Sayaç dönem ortasında değişti | İki sayacın okumaları birleştirilir; grafikte kesinti görünmemeli |
| Sayaç arızalı | Geçmiş dönem ortalaması ya da bina ortalaması üzerinden tahakkuk |
| Daire boş | Sıfır değil: asgari pay uygulanır (komşulardan ısı alıyor) |
| Muafiyet | Belirli kalemlerden muaf hane, o kalemin dağıtım tabanından çıkarılır |
| Birden çok kazan | Her kazan kendi blok grubunu besler; hesap kazan başına ayrı kurulur |
| Ortak alan | Ayrı bir “hane” gibi modellenir, payı tüm hanelere dağıtılır |
Bunların her biri koda bir if olarak girmiyor — hepsi formül tanımı olarak veritabanında duruyor. Bir sitenin fatura tipi, hangi kalemlerin hangi tabana göre dağıtılacağını tarif ediyor. Yeni bir kural geldiğinde kod değişmiyor, tanım değişiyor.
En zor parça: mahsup
Bir dönem kapanıp faturalar çıktıktan sonra bir hata bulunuyor — bir sayaç yanlış okunmuş, bir daire yanlış bloğa bağlıymış.
Geçmiş dönemi yeniden hesaplayıp faturaları değiştiremezsin; o faturalar ödendi, muhasebeye girdi. Yapılan şey mahsup: farkı bir sonraki dönemin faturasına ayrı bir kalem olarak yansıtmak.
Mahsup kaydı kaynak döneme bağlı tutulur, hedef döneme değil. Çünkü farkın tabanı o dönemin rakamlarıdır. İkisini karıştırırsan, üçüncü bir düzeltme geldiğinde hangi farkın neyin üstüne bindiğini bir daha asla çözemezsin. Bu alan sistemde “dokunma” notuyla işaretli.
Ne öğrendim
Bu motoru anlamak, bana yazılım mimarisi hakkında beklemediğim bir şey öğretti: kural ile veriyi ayırmak, mevzuatla çalışan her sistemin tek yaşama şansı.
Isı payı hesabı beş yılda birkaç kez değişti. Kod bir kez bile yeniden yazılmadı — çünkü değişen şey hiçbir zaman nasıl hesaplandığı değil, hangi oranla dağıtıldığı oldu. Biri kod, diğeri satır.