Yuvarlama, e-pin işinde en küçük görünen ama en sinsi kalemdir. Çoğu işletme sahibi bunu bir görsel detay sanır: "iki hane göster, gerisi teferruat." Oysa yuvarlama bir gösterim tercihi değil, bir muhasebe kararıdır. Müşteriye gösterdiğin tutar, sağlayıcıya gönderdiğin tutar, faturaya yazdığın tutar ve bayiye işlediğin tutar aynı kuruşa oturmuyorsa, sistemin her satışta sessizce kanar.
Ve bu kanama görünmez, çünkü tek işlemde miktarı bir kuruştur. Ama işin doğası gereği hacim yüksektir. Günde 300 sipariş alan bir dükkânda işlem başına ortalama iki kuruşluk bir sapma, yılda beş haneli bir farka dönüşür; üstelik bu farkı nereye yazacağını bilemediğin için raporların da tutmaz. Bu yazıda bir dijital ürün satış scriptinde yuvarlamanın nerede bozulduğunu, hangi sırayla hesap yapılması gerektiğini ve döviz zincirinin marjını nasıl yediğini somut olarak anlatıyorum.
Kuruşlar tam olarak nerede kayboluyor?
Kayıp, hesabın ortasında yapılan yuvarlamalardan doğar. Tipik bir akışı düşün: ürünün dolar maliyeti kura çevrilir, üstüne kâr oranı eklenir, bayi iskontosu uygulanır, KDV hesaplanır, sepette adetle çarpılır, sonra kampanya indirimi düşer. Bu altı adımın her birinde iki haneye yuvarlama yaparsan altı ayrı hata biriktirmiş olursun ve hatalar birbirini götürmez, çoğu zaman aynı yöne birikir.
Doğru yaklaşım şudur: hesabın tamamı yüksek hassasiyetle yürür, yuvarlama yalnızca en sonda, müşteriye ve sağlayıcıya giden tutarda bir kez yapılır. Ara değerleri veritabanına yazacaksan da yuvarlanmış hâlini değil, ham hâlini sakla. Bir e-pin satış yazılımında bu kural tek satırlık bir disiplindir ama uygulanmadığında hiçbir raporun kendi içinde tutmaz.
Float ile para tutmak neden bir tuzak?
Programlamada ondalık sayılar ikilik sistemde saklanır ve 0,1 gibi basit bir değer bile tam olarak temsil edilemez. Bu yüzden bilgisayar için 0,1 ile 0,2'nin toplamı her zaman tam 0,3 değildir; çok küçük bir kuyruk taşır. Tek işlemde bunu görmezsin, ama yüzlerce satırı topladığında bu kuyruklar birikir ve toplam ile kalemlerin toplamı arasında bir kuruş fark çıkar.
Çözüm iki yoldan biridir. Ya parayı tam sayı kuruş olarak tutarsın, yani 149,90 TL yerine 14990 saklarsın ve bütün aritmetiği tam sayıyla yaparsın; ya da veritabanında DECIMAL, kodda ise sabit hassasiyetli ondalık aritmetik kullanırsın. Hangisini seçersen seç, kritik nokta tutarlılıktır: tek bir yerde float'a düşen bir hesap, bütün zincirin güvenilirliğini bozar. Bu yüzden olgun bir epin yazılım mimarisinde para tipi tek bir sınıfa hapsedilir ve o sınıf dışında çıplak aritmetik yapılmaz.
| Hesap adımı | Yanlış yaklaşım | Doğru yaklaşım | Sonuç farkı |
|---|---|---|---|
| Kur çevrimi | Çevirip hemen 2 haneye yuvarla | 4 hane ile taşı | Adette büyüyen sapma |
| KDV | Satır bazında yuvarla, sonra topla | Ham topla, sonda yuvarla | Fatura toplamı tutmaz |
| Adetle çarpım | Yuvarlanmış birim fiyatı çarp | Ham birim fiyatı çarp | 10 adette 10 kat hata |
| Bayi iskontosu | İndirimi yuvarlayıp düş | Ham oran uygula | Marj kayması |
| Kampanya indirimi | Vergiden önce ve sonra karışık | Tek ve tanımlı sıra | İadede uyuşmazlık |
| Sağlayıcıya gönderim | Ekrandaki metni parse et | Kanonik tutardan üret | Tahsilat farkı |
KDV dahil mi hariç mi: sıra her şeyi değiştirir
Tartışma genelde "vergiyi nasıl hesaplayacağız" diye başlar, ama gerçek soru "hangi sırayla" sorusudur. Vergi dahil fiyatla çalışıyorsan indirimi vergi dahil tutardan düşer, sonra vergiyi ayrıştırırsın. Vergi hariç çalışıyorsan indirimi matrahtan düşer, sonra vergiyi eklersin. Bu iki yol aynı yüzdelerle bile birkaç kuruş farklı sonuç verir ve hangisini seçtiğini sistem genelinde tek bir yerde tanımlamazsan sepet, fatura ve iade ekranları birbirinden farklı rakam gösterir.
En çok kanayan yer iadedir. Satışta bir sıra, iadede başka bir sıra kullanan bir sistem, iade edilen tutarı ödenen tutarla eşitleyemez ve geride her seferinde birkaç kuruşluk artık bırakır. Bu artıklar müşteri bakiyesinde toplanır ve bir gün kimsenin açıklayamadığı bir alacak kalemi olarak karşına çıkar. Bu yüzden e-pin scripti tarafında iade, satış hesabının tersini yeniden hesaplayarak değil, satış anında kaydedilmiş kalem kırılımını okuyarak yapılmalı.
Yuvarlama kaynaklı farkların doğduğu noktalar
- Ara adımlarda erken yuvarlama 35%
- Float ile para aritmetiği 30%
- KDV ve indirim sırasının tutarsızlığı 20%
- Kur çarpanı zinciri 15%
Döviz kuru zinciri marjını nasıl yiyor?
E-pin tarafında maliyet çoğu zaman dolar ya da euro, satış ise lira. Yani her fiyat en az iki çarpandan geçiyor: kur ve kâr oranı. Buraya bir de kur farkı payı, komisyon ve bayi iskontosu eklenince zincir dörde beşe çıkıyor. Zincirin her halkasında yuvarlama yaparsan, yuvarlamalar kâr oranıyla çarpılarak büyür; yani bir kuruşluk sapma, ürünün fiyatına göre on kuruşa dönüşebilir.
Bir de kurun ne zaman sabitlendiği sorusu var. Fiyat sayfada gösterildiği andaki kur ile ödeme onaylandığı andaki kur farklı olabilir. Bu farkı yönetmenin doğru yolu, sepet oluşturulduğu anda kuru dondurup sipariş kaydına yazmaktır. Böylece müşteri gördüğü tutarı öder, sen de o siparişin hangi kurla hesaplandığını sonsuza kadar bilirsin. Kuru sipariş anında saklamayan bir dijital ürün satış yazılımında, bir hafta sonra aynı siparişi yeniden hesaplamaya kalktığında farklı bir sayı bulursun.
Fiyatı 149,90 gibi çekici bir değere çekmek bir pazarlama kuralıdır ve hesap zincirinin dışında, en sonda uygulanır. Onu hesabın içine gömdüğün an marj hesabın anlamsızlaşır.
Bayi ve toplu alımda yuvarlama neden daha tehlikeli?
Perakendede bir müşteri bir kod alır, hata bir kuruşta kalır. Bayi tarafında ise aynı yanlış hesap 500 adetle çarpılır. Yuvarlanmış birim fiyatı adetle çarpan bir sistem, 500 adetlik bir siparişte kolayca beş liralık fark üretir ve bayi bunu fark eder. Bu noktada kaybettiğin şey para değil, güvendir; bayi bir kez hesabına güvenmediğinde bütün fiyat listelerini sorgulamaya başlar.
Doğru kurgu, kalem toplamını ham birim fiyat üzerinden hesaplayıp yalnızca kalem toplamını yuvarlamaktır. Kademeli bayi iskontosu varsa da hangi kademenin hangi tutara uygulandığı kalem bazında kaydedilmeli. Ayrıca bayi ekstresinde her satırın yanında ham ve yuvarlanmış tutar farkı görünebiliyorsa, tartışma dakikalar içinde biter. Şeffaflık, burada en iyi savunmadır.
Bir kuruşluk fark raporu neden kilitler?
Mutabakat ikili bir testtir: tutar ya eşittir ya değildir. Bir kuruşluk fark, otomatik eşleştirmeyi bozar ve o günün tamamını elle kontrol etmeye zorlar. Dolayısıyla küçük yuvarlama hatalarının asıl maliyeti kaybedilen para değil, kaybedilen zaman ve güvenilirliktir.
Bunu önlemek için üç alışkanlık yeter. Birincisi, siparişin kalem kırılımını ve toplamını ayrı ayrı sakla; toplamın kalemlerden türetilebilir olduğunu her gece bir kontrol sorgusuyla doğrula. İkincisi, sağlayıcıya gönderilen tutarı da siparişe yaz; ekstreyle karşılaştırman gereken sayı bu. Üçüncüsü, kur, vergi oranı ve indirim oranını sipariş anında dondur. Bu üçünü yapan bir e-pin satış scripti, aylar sonra bile her siparişi kuruşuna kadar yeniden anlatabilir.
| Yuvarlama kontrolü | Nasıl test edilir | Beklenen sonuç |
|---|---|---|
| Para tipi tutarlılığı | Fiyat alanlarının veri tipini kontrol et | DECIMAL veya tam sayı kuruş |
| Tek yuvarlama noktası | 7 adetlik karışık sepet oluştur | Kalem toplamı = sepet toplamı |
| KDV sırası | İndirimli ürünle fatura üret | Matrah, vergi, toplam tutarlı |
| Kur dondurma | Sipariş kaydında kur alanı var mı | Sipariş anındaki kur saklı |
| Bayi çarpımı | 500 adetlik sipariş hesapla | Elle hesapla birebir aynı |
| İade eşitliği | Kısmi iade yap | Artık bakiye oluşmuyor |
| Sağlayıcı tutarı | Ekstre ile panel karşılaştır | Günlük fark sıfır |
Kuruş disiplinini altyapı halletsin
Pinova'da para tipi, tek noktadan yuvarlama, sipariş anında kur dondurma ve kalem kırılımı standart olarak kurulu gelir.
Parayı tam sayı kuruş olarak tutmak zor olmuyor mu?
Başta alışmak gerekir ama tüm aritmetik tam sayı olduğu için hiçbir kuyruk hatası çıkmaz. Gösterim katmanında ikiye bölüp yazdırman yeterlidir.
Ara hesaplarda kaç ondalık yeterli?
Kur ve oran zincirleri için dört hane pratikte güvenli bir alt sınırdır. Daha azına düşünce sapma adetle birlikte büyür.
Fiyatı 149,90 gibi çekici değerlere çekmek yanlış mı?
Yanlış değil, ama bunu hesabın içinde değil en sonda bir pazarlama kuralı olarak uygula ki marj hesabın bozulmasın.
Kuru neden sipariş anında saklamak gerekiyor?
Çünkü kur her gün değişir. Saklamazsan bir hafta sonra aynı siparişi yeniden hesapladığında farklı bir tutar bulur ve mutabakat yapamazsın.
Yuvarlama kuralları, işini büyütmeden önce oturtulması gereken sessiz temellerden biridir. Bir kez doğru kurulduğunda bir daha aklına gelmez; yanlış kurulduğunda ise her ay raporlarında seni bekler. Fiyat zincirinin, kalem kırılımının ve kur dondurmanın gerçek bir panelde nasıl göründüğünü merak ediyorsan canlı demo üzerinden bir sepet oluşturup hesabı adım adım izleyebilir, özellikler ve fiyat bölümlerine göz atabilirsin.

