Defter iki yerde bozulur. Tezgâhta barkod okunmaz, veresiye “galiba 3.400” olur, gün sonu fiş yığını birikir. Sahada WhatsApp’tan fotoğraf gelir, adres kaybolur, kimin gideceği belli olmaz. İkisi de Excel’e sığmaz; Logo ve Dia bu ölçekte ağırdır. İki ayrı ürünümüz var, ikisini karıştırmayın.
Nalbur.app tezgâhtır: stok, barkod, veresiye, gün sonu. Yayında: nalbur.app. Cloudflare üzerinde durur, günlük yedek ayrı bir depolamaya gider. Fatura kesmez, restoran yazarkasası değildir, çok şube birleştirmez, internet kesilince kasa henüz çalışmaz. Bunları ürün sayfasında da yazıyoruz; blogda gizlemenin alemi yok.
İşlik saha defteridir. Elektrik, tesisat, oto servis iş kartı; fotoğraf ve durum. Ortak üründür, çıkınca haber veriyoruz. Gider Elektrik gibi işlerde gördüğümüz dağınıklık için duruyor. Fatura ve kasa yoktur; nalbur.app’in kasa ekranı değildir.
Bir satış tek işlem olsun
Nalbur’da barkod okununca üç şey aynı anda durmalı: satır, stok, varsa cari. Birini yazıp öbürünü “sonra” derseniz defter yine yalan söyler. Veritabanında bunu tek paket halinde tutuyoruz:
await env.DB.batch([
env.DB.prepare(
"INSERT INTO sale_lines (sale_id, product_id, qty, unit_price) VALUES (?, ?, ?, ?)"
).bind(saleId, productId, qty, unitPrice),
env.DB.prepare(
"UPDATE products SET stock = stock - ? WHERE id = ? AND stock >= ?"
).bind(qty, productId, qty),
]);
İkinci sorgu hiçbir satırı değiştirmezse stok yetmemiştir. Satırı geri alın ve “rafta yok” deyin. Sessiz negatif stok, akşam raporunu yalanlar. Veresiye ise aynı pakete cari hareket eklenir. Ayrı istek, ayrı başarısızlık demektir: stok düşer, borç yazılmaz, ustayla “2.800 demiştik” kavgasının yenisi olur.
Barkod USB okuyucu veya telefon kamerası olabilir. İkisi de aynı barkod alanına düşer. EAN-13 Türkiye’de yaygındır; iç barkod da olur. CSV ile içeri alma ilk günü kurtarır. “Beş dakikada kurulum” iddiası ürünündür; içerik sizin listeniz kadar sürer. Liste yoksa kamera ile tek tek girersiniz. Bunu gizlemiyoruz. Aynı barkod iki ürüne yazılırsa kasa hangisini sepete atacağını bilemez. Çakışan satır içeri almada dursun, sessizce üzerine yazmasın.
CREATE TABLE products (
id TEXT PRIMARY KEY,
barcode TEXT UNIQUE,
name TEXT NOT NULL,
stock INTEGER NOT NULL DEFAULT 0,
price_cents INTEGER NOT NULL
);
Yıllık paket PayTR üzerinden gider. Otomatik yenileme yoktur; sene bitince hatırlatılır, ödenmezse hesap kapanır. Ezbere kart çekmiyoruz. İlk yedi gün iade vardır, yıl ortası yoktur. Bunu da ürün sayfasında yazıyoruz.
İnternet yoksa söyleyin
Nalbur.app şu an çevrim içidir. İnternet kesilince kasa durur. Mobil hat çoğu dükkânda yeter; yetmeyen yerde ürünü alma zamanı değil, kâğıt fiş zamanıdır. Çevrim dışı kasa sonraki iştir. “Her yerde offline çalışır” diye yalan söylemek, kesintide nakit alıp stokta bırakmamaktır. Yedek her gün alınır. İsteyen gün CSV indirir. Hesap kapanırsa veri 30 gün durur. Muhasebe programının yerini tutmayız; e-arşiv yoktur. Mali müşavir hâlâ kendi yazılımındadır. Karışıklık çıkmasın diye başlıkta yazıyoruz.
Saha: iş kartı, kasa değil
İşlik’te gelen talep kart olur. Kaynak site formu veya mesajdır. Durum yeni, yolda, bitti diye ilerler; kim aldı, ne zaman belli olur. Aynı numara tekrar yazınca geçmiş kartlar gelir. Bunu CRM diye şişirmiyoruz. Sahada telefon yeter; bilgisayar şart değil.
type JobStatus = "new" | "assigned" | "done";
type JobCard = {
id: string;
phone: string;
address: string;
photo_keys: string[];
status: JobStatus;
assignee: string | null;
};
WhatsApp kapanmaz. Müşteri yine oradan yazar. Siz işi grupta bırakmayıp karta alırsınız. Nalbur’daki veresiye hatırlatması WhatsApp’a gidebiliyor; İşlik’te atama bildirimi ayrıdır. İkisini tek “mesaj ürünü” sanmayın.
Raf ve barkod varsa nalbur.app. Saha ve fotoğraf varsa İşlik veya size özel panel. İkisi birden nadirdir; nalburcu hem tezgâh hem servis gezisi yapıyorsa konuşulur, ilk gün tek ekranda birleşmez. Stok ve satış takibi, Nalbur işi veya iletişim.