Skip to content
Ercan Labs
← Tüm işlerDESKTOP · Kendi ürünü · in-development

Bakkal Kasa

Mahalle bakkalı için çevrimdışı kasa, stok ve veresiye. Sunucu yok, abonelik yok.

233
test
18
tablo
150
kaynak dosya
18.783
satır kod

Bu nasıl ölçüldü: Test sayısı vitest çıktısından, tablolar migration dosyalarından, satır sayısı izlenen kaynak dosyalarda wc ile alındı.

Mimari233 tests + 4 smoke
  1. WINDOW
    • kasa ekranıReact + Vite
    • PIN kilidiscrypt
  2. MAIN
    • Electron main
    • fiş şablonu
  3. LEDGER
    • stok defterisatır, sayaç değil
  4. FILE
    • SQLiteWAL · 18 tablo
Sunucu yok: kasa, rapor ve yedek aynı dosyaya bakıyor. Senkron katmanı olmadığı için mutabakat hatası da yok.

Problem

Mahalle bakkalı abonelikle çalışmıyor. İnternet kesildiğinde kasa çalışmaya devam etmeli, gün sonunda yazdırılabilir Z raporu çıkmalı. Asıl muhasebe de veresiye defteri: kimin ne kadar borcu var, ne zamandan beri.

Baktığım bulut kasa programlarının hepsi bağlantı ve aylık ücret varsayıyordu. Bu ikisini de varsaymıyor.

Kısıtlar

  • Tamamen çevrimdışı: API yok, hesap yok, telemetri yok.
  • Tek makine, tek kullanıcı: 4-8 haneli PIN, scrypt ile saklanır; iki dakika hareketsizlikte kasa kilitlenir.
  • Veri tek bir SQLite dosyasında, işletim sisteminin kullanıcı dizininde, WAL modunda.

Mimari kararlar

01

SQLite tek doğru kaynak, önbellek değil

Kasa aynı dosyaya yazıyor, raporlar aynı dosyadan okuyor. Arada senkron katmanı olmadığı için mutabakat hatası da olmuyor. Karşılığında ikinci kasa yok; bu bilinçli bir tercih.

Bedeli: İkinci terminal için yazma yolunun yeniden tasarlanması gerekir.

02

Stok sayaç değil, defter

Alış, satış ve elle düzeltme birer satır; eldeki miktar bunlardan hesaplanıyor. Sayaç alanı, biri fiş iptal ettiği ilk gün kayıyor.

Bedeli: Her stok sorgusu toplama yapıyor; indeks ve mutabakat kontrolüyle dengelendi.

03

Fiş ekran görüntüsü değil, şablon

Z raporu ve müşteri fişi kâğıt genişliğini bilen bir şablondan üretiliyor; 58 mm ve 80 mm yazıcı aynı kodla çıkıyor.

Bedeli: Print CSS yerine küçük bir yerleşim motoru yazıldı.

04

Gerçek Electron penceresine dört duman testi

Birim testleri defteri kapsıyor; CDP ile açılan gerçek pencerede kasa, stok, veresiye ve kasa kapanışı tıklanarak deneniyor.

Bedeli: CI yavaşlıyor; karşılığında asıl korkulan arıza yakalanıyor: bozuk pencere.

Kanıt

  • Birim testi233 (31 dosya)
  • Şema tablosu18
  • Duman testi4 (kasa, stok, veresiye, Z raporu)
  • Kaynak dosya150

Bilinen sınırlar

  • Windows paketleme ile yedek/geri yükleme bitmedi; uygulama bugün kaynaktan çalışıyor.
  • Gerçek bir bakkal bir ay kullanmadı; bu vakada saha verisi yok.
  • Tek terminal için tasarlandı; senkronizasyon kapsam dışı, unutulmuş değil.

Ne öğrendim

Çevrimdışı bir özellik anahtarı değil. Sunucuyu kaldırdığınızda kimlik, zaman ve çakışma varsayımları yerel birer probleme dönüşüyor: PIN, saat ve dosya kilidi mimarinin parçası oluyor.

Stack

ElectronViteReactTypeScriptSQLiteDrizzle