İçeriğe atla

Perakende — market otomasyonu

İnternet kesildiğinde durmayan kasa

Küçük ve orta ölçekli marketler için kasa, stok ve merkezî panel. Kasa ağa hiç bağlanmadan satış yapar; bağlantı gelince biriken satışlar tek istekte sunucuya gider ve hiçbiri kaybolmaz.

Teknoloji: Go · TypeScript · Electron · React · Next.js · SQLite · PostgreSQL · Docker

Ölçülmüş sonuçlar

61 ms
Ağ kablosu çekili kasada 50 satış
M1 koşu raporu, 22 Ağustos 2026
792 ms
Bağlantı gelince senkron — tek push isteği
M1 koşu raporu, 22 Ağustos 2026
51/51
Sunucunun kabul ettiği olay — 0 red, 0 yeniden deneme
M1 koşu raporu, 22 Ağustos 2026
217 ms
Katalog indirme, tek çağrı
M1 koşu raporu, 22 Ağustos 2026
126
Sözleşme testi — sunucu çıktısı istemcinin şemasına okutuluyor
Market devir notu, 27 Ağustos 2026

Problem

Bir marketin kasası durduğunda market durur. Kasiyerin önünde müşteri vardır ve sıra beklemez.

Küçük ve orta ölçekli marketlerin kullandığı masaüstü otomasyonlarda aynı üç şey tekrar ediyor:

  1. Stok ve fiyat bir programda, satış başka programda durur. Aradaki boşluğu dakikada bir çalışan bir aktarım servisi kapatır. Servis durduğunda kasa, fiyatı değişmiş bir ürünü eski fiyatından satmaya devam eder.
  2. Ana menüde yirmi beşe yakın modül vardır. Küçük bir market bunların belki sekizini kullanır; geri kalanı eğitim süresine ve hata yüzeyine yazılır.
  3. Veritabanı marketin kendi bilgisayarındadır. Bu yüzden kurulum teknisyen ziyaretiyle, destek uzak masaüstü bağlantısıyla yapılır.

Üçünün altında da aynı varsayım yatıyor: kasa, arkasındaki sistem erişilebilir olduğu sürece çalışır. Marketin interneti kesildiğinde bu varsayım çöker.

Yaklaşım

Kasayı ağa bağımlı olmayacak şekilde kurduk. Satış yerel veritabanına yazılır ve kasa ağı hiçbir zaman beklemez. Bu bir hız iyileştirmesi değil, mimarinin kuralı: bir satışın tamamlanması ağın durumuna bağlı olamaz.

Bağlantı geri geldiğinde senkron motoru biriken kayıtları tek yığın hâlinde gönderir. Kuyruktan silme yalnızca sunucunun kabul ettiği kayıtlar için yapılır — kaybolan satış, kabul edilmiş sayılan satıştan gelir.

Sıra da tesadüf değil: kasa oturumunun açılış olayı satışlardan önce kuyruklanır, yoksa sunucu henüz bilmediği bir oturuma bağlı satış alır ve yığını tümden reddeder.

Kurulumu da problemin parçası saydık. Kurulum dosyası internetten indirilir ve uygulama kendi kendini günceller; teknisyen ziyareti kurulum akışından çıkarıldı.

Ne inşa edildi

Sistem bugün şunları yapıyor:

  • Barkotla satış yapar, fiş keser, stok düşer. Ödeme alınır, fiş numarası üretilir, satış kapanır.
  • İnternetsiz çalışır. Katalog araması, barkot okuma ve satış kapatma çevrimdışıyken de yürür; kasa bağlantı yokluğunu bir hata durumu saymaz.
  • Bağlantı gelince kendi senkronlar. Biriken satışlar tek istekte sunucuya gider, kuyruk boşalır; kullanıcı hiçbir düğmeye basmaz.
  • Merkezî panelden yönetilir. Katalog, fiyat ve satış raporları sunucudaki panelden görülür; kasalar katalogu oradan çeker.
  • Kendi kurulumunu ve güncellemesini yapar. Kurulum dosyası internetten indirilir, sonraki sürümler otomatik gelir.
  • Kiracıları veritabanı düzeyinde ayırır. Her marketin verisi PostgreSQL satır düzeyi güvenliğiyle ayrılır; ayrım uygulama kodunun dikkatine bırakılmaz.

Nasıl doğrulandı

Kilometre taşının ölçütü, kod yazılmadan önce tek cümleyle yazılmıştı: ağ kablosu çekilmiş bir bilgisayarda 50 satış yapılır, kablo takılınca hepsi sunucuya ulaşır.

Koşu 22 Ağustos 2026’da, kasanın üretim kodu üzerinden yapıldı — ekrandaki düğmelerin çağırdığı fonksiyonların kendisi çalıştırıldı, test taklidi bir parça kullanılmadı.

  • Katalog canlı sunucudan 217 ms’de, tek çağrıda indi.
  • Kablo çekiliyken 50 satış 61 ms sürdü; satışlar indirilen gerçek ürün ve fiyatlarla, barkot aramasıyla yapıldı.
  • Gönderim kuyruğunda 51 kayıt birikti: 50 satış ve 1 kasa oturumu açılışı.
  • Kablo takıldığında senkron 792 ms’de, tek push isteğinde bitti.
  • Sunucu 51/51 kabul etti: 0 red, 0 taşıma hatası, 0 yeniden deneme. Koşu sonunda kuyruk 0 — hiçbir satış kaybolmadı.

Dört gün sonra zincirin insan tarafı da yürütüldü: barkot okutularak yapılan satış A0001 numaralı fiş, 217,30 ₺, nakit olarak kapandı ve aynı kayıt sunucudan sorgulanarak doğrulandı.

Dağıtım ayağı ayrıca sınandı: kurulum dosyası nesne depolamaya yayımlandı ve kimlik doğrulaması olmadan indirildi — HTTP 200, 77,2 MB, sürüm dosyası sha512 ile doğrulanmış.

Sunucu ile kasa iki ayrı dilde yazıldığı için veri sözleşmesi tek kaynaktan üretiliyor ve 126 sözleşme testi sunucunun gerçek çıktısını istemcinin şemalarına okutuyor: iki tarafın aynı teli konuştuğu iddiası test edilir, umut edilmez.

Teknoloji

Go · TypeScript · Electron · React · Next.js · SQLite · PostgreSQL · Docker