| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Küçük ve orta ölçekli bir işletmenin stoğunu ve müşteri ilişkilerini tek pencereden yönetmesi için yazdığım masaüstü uygulaması. Ürün kartları, satış fişleri, cari bakiye, görüşme geçmişi ve raporlar aynı yerde duruyor.
Kurulum gerektirmiyor. Bilgisayarda Python varsa StockFlow.pyw dosyasına çift tıklamanız yeterli. Kurulum sihirbazı, pip install, sunucu, hesap açma adımı yok. Veriler uygulamanın yanındaki veri/ klasöründe bir SQLite dosyasında tutuluyor, isterseniz o dosyayı kopyalayıp başka makineye taşıyabilirsiniz.
Bitirme projesi olarak teslim edilen bir yazılımın, teslim edildikten iki yıl sonra da açılması gerekiyor. pip install ile çekilen paketler sürüm çakışmasına giriyor, PyPI'dan kaldırılabiliyor, kurulduğu makinede derleyici istiyor. Bu yüzden her şeyi standart kütüphaneyle yazdım:
| İhtiyaç | Kullandığım şey |
|---|---|
| Arayüz | tkinter ve tkinter.ttk |
| Veritabanı | sqlite3 |
| Parola saklama | hashlib (PBKDF2-SHA256, 120.000 tur, kayıt başına tuz) |
| Grafikler | Elle çizilmiş tkinter.Canvas (sütun ve halka grafik) |
| Tarih seçici | Elle yazılmış takvim bileşeni |
| Dışa aktarma | csv |
matplotlib, tkcalendar, Pillow, SQLAlchemy gibi paketlerin hiçbiri yok. Bunun bedeli grafikleri ve takvimi kendim çizmek oldu, karşılığında da Python kurulu olan her makinede tek tıkla açılan bir program çıktı.
Günün özeti. Aktif ürün sayısı, kritik seviyeye düşen kalemler, açık cari bakiye, bu ayın cirosu. Altında son altı ayın ciro grafiği, kategori dağılımı, son satışlar ve takip tarihi yaklaşan görüşmeler.
Ürün kartları, kategori filtresi, kritik seviye takibi. Kâr yüzdesi alış ve satış fiyatından otomatik çıkıyor. Her giriş ve çıkış stok_hareketleri tablosuna işleniyor, yani bir ürünün stoğu neden 12 olmuş diye sorduğunuzda cevabı görebiliyorsunuz.
Ürün kartında alış ve satış fiyatını girdiğiniz anda birim kâr ile marj hesaplanıyor:
Sol tarafta liste, sağ tarafta seçili müşterinin kartı. Üç sekme var: iletişim bilgileri, görüşme geçmişi ve o müşterinin bütün satın almaları. Toplam ciro, fiş sayısı, ortalama sepet ve açık bakiye kartın üstünde duruyor.
Fiş kesme ekranı. Ürünü seçip sepete atıyorsunuz, satır bazında iskonto verebiliyorsunuz, KDV ayarlardaki orandan hesaplanıyor. Ödeme türü veresiye seçilirse tutar müşterinin bakiyesine borç olarak yazılıyor ve müşteri seçmeden fişi kaydedemiyorsunuz.
Altı rapor türü var: satış özeti, en çok satan ürünler, en iyi müşteriler, kategori dağılımı, stok durumu ve ödeme türü dağılımı. Tarih aralığını elle girebilir ya da hazır aralıklardan seçebilirsiniz. Her raporun yanında grafiği, altında da CSV çıktısı var.
CSV dosyalarını utf-8-sig ile yazıyorum. Düz utf-8 yazınca Excel Türkçe karakterleri bozuyor, BOM eklenince düzgün açılıyor.
Python 3.8 veya üzeri gerekiyor. Kontrol etmek için komut satırına python --version yazın.
Python yoksa python.org adresinden indirin. Windows kurulumunda Add python.exe to PATH kutusunu işaretleyin, kurulum bileşenleri arasında tcl/tk and IDLE seçili kalsın. Bu ikincisi tkinter'ı getiriyor, kaldırırsanız uygulama açılmaz.
Sonra bu depoyu indirin:
git clone https://github.com/anilg12/StockFlow.git
cd StockFlowZip olarak indirdiyseniz klasörü istediğiniz yere çıkarın.
Windows: StockFlow.pyw dosyasına çift tıklayın. .pyw uzantısı pythonw.exe ile eşleşiyor, o yüzden arkada siyah konsol penceresi açılmıyor.
Masaüstü kısayolu için dosyaya sağ tıklayın, Gönder > Masaüstü (kısayol oluştur).
Bir sorun çıkarsa ve hata mesajını görmek isterseniz StockFlow.bat dosyasını kullanın, o konsol penceresini açık tutuyor.
Linux / macOS:
python3 StockFlow.pywya da ./calistir.sh
Linux'ta tkinter ayrıca kurulmuş olmayabilir:
sudo apt install python3-tkModül olarak:
python -m stockflowVarsayılan hesap:
kullanıcı adı : admin parola : 1234
Parolayı Ayarlar > Güvenlik sekmesinden değiştirin.
Veritabanı boşsa uygulama ilk açılışta örnek veri üretiyor: 27 ürün, 12 müşteri, altı aya yayılmış yaklaşık 210 satış fişi, stok hareketleri ve görüşme kayıtları. Böylece panel ve raporlar boş ekran yerine dolu geliyor. Kendi verinizle başlamak isterseniz Ayarlar > Veri sekmesinden sıfırlayabilirsiniz.
StockFlow/ ├── StockFlow.pyw çift tıklanan başlatıcı ├── StockFlow.bat konsollu başlatıcı (Windows) ├── calistir.sh başlatıcı (Linux / macOS) ├── stockflow/ │ ├── __init__.py sürüm ve künye sabitleri │ ├── __main__.py python -m stockflow │ ├── uygulama.py Tk kökü, oturum geçişleri, hata yakalama │ ├── cekirdek/ │ │ ├── veritabani.py şema, bağlantı, işlem yönetimi, parola, yedek │ │ ├── servisler.py iş kuralları (arayüzden bağımsız) │ │ ├── yardimcilar.py para ve tarih biçimleme, Türkçe küçültme, CSV │ │ └── demo.py ilk açılış örnek verisi │ └── arayuz/ │ ├── tema.py renk paleti, font seçimi, ttk stilleri │ ├── bilesenler.py buton, kart, tablo, grafik, takvim, dialog │ ├── giris.py oturum açma ekranı │ ├── ana_pencere.py kenar çubuğu ve sayfa yönlendirme │ └── sayfalar/ panel, stok, musteri, satis, rapor, ayarlar ├── assets/ banner ve ekran görüntüleri └── veri/ SQLite dosyası ve yedekler (ilk açılışta oluşur)
Bölünme şu kurala göre: cekirdek/ içindeki hiçbir dosya tkinter import etmiyor, arayuz/ içindeki hiçbir dosya SQL yazmıyor. Arayüz servis çağırıyor, servis veritabanı katmanını çağırıyor. Bu sayede iş kurallarını arayüzü açmadan test edebiliyorum.
kategoriler ──< urunler ──< stok_hareketleri
│
└──< satis_kalemleri >── satislar >── musteriler ──< gorusmeler
│
kullanicilar
Dokuz tablo var: kullanicilar, kategoriler, urunler, musteriler, satislar, satis_kalemleri, stok_hareketleri, gorusmeler, ayarlar.
Birkaç karar açıklama istiyor:
Satış kalemleri ürün adını kopyalıyor. satis_kalemleri tablosunda urun_id ile birlikte urun_kod ve urun_ad da duruyor. Normalleştirme kuralına aykırı görünüyor ama kasıtlı: ürün silinince urun_id NULL'a düşüyor, geçmiş fiş yine de "Logitech MX Master 3S Mouse" yazmaya devam ediyor. Fiş, kesildiği andaki durumun kaydı. Sonradan ürünün adı değişse bile eski fişin değişmemesi gerekiyor.
Stok kolonu tek bir fonksiyondan güncelleniyor. urunler.stok değerine sadece servisler.stok_hareketi() dokunuyor. Satış, iade, sayım farkı, fire, hepsi oradan geçiyor ve her geçiş stok_hareketleri tablosuna öncesi ve sonrası ile yazılıyor. Stoğun neden o değerde olduğu her zaman izlenebilir.
Fiş iptali fişi siliyor. İptal edilen fiş durum = 'İptal' işaretiyle durmuyor, tamamen siliniyor. Yerine stok hareketleri tablosunda "SF202607-118 nolu fiş iptali" açıklamalı iade kayıtları kalıyor. Bunu seçtim çünkü iptal bayrağı taşımak bütün ciro sorgularına WHERE durum != 'İptal' eklemeyi gerektiriyor ve bir yerde unutulduğu anda rapor yanlış çıkıyor.
Yazma işlemleri parça parça değil. Fiş kaydı sırasında başlık yazılıp kalemlerden biri stok kuralına takılırsa geride yarım fiş kalırdı. veritabani.islem() bağlam yöneticisi bu tür çok adımlı yazmaları tek parçaya çeviriyor, ortasında hata çıkarsa hiçbiri kalmıyor.
Servis katmanı IsKurali istisnası fırlatıyor, arayüz bunu yakalayıp kullanıcıya düz bir uyarı kutusunda gösteriyor. Traceback kullanıcıya gitmiyor.
Uygulanan kurallar:
| Tuş | İş |
|---|---|
| Ctrl + 1 … 6 | Sayfalar arası geçiş |
| F5 | Aktif sayfayı yenile |
| Enter | Dialogda kaydet |
| Esc | Dialogu kapat |
| Delete | Seçili satırı sil |
| Sütun başlığına tık | O sütuna göre sırala |
Ayarlar > Veri sekmesinde üç düğme var. Yedek al, veritabanının o anki kopyasını veri/yedek/ klasörüne tarih damgalı olarak yazıyor. Geri yükle, seçtiğiniz yedek dosyasını aktif veritabanının yerine koyuyor. Sıfırla, bütün kayıtları silip boş bir veritabanı bırakıyor.
Kopya alırken dosyayı elle kopyalamıyorum, SQLite'ın kendi backup() çağrısını kullanıyorum. WAL modunda açık bağlantı varken dosyayı kopyalamak bozuk yedek üretebiliyor.
Uygulamayı Xvfb altında başlatıp bütün sayfaları ve dialogları gezerek, sonra da yazma işlemlerini gerçek veritabanına uygulayarak test ettim. Kontrol edilen davranışlar arasında ürün kaydı ve güncellemesi, mükerrer kod reddi, stok giriş ve çıkış hareketleri, negatif stok engeli, geçersiz e-posta reddi, satışın stoğu düşürmesi, veresiye tutarının bakiyeye işlenmesi, iskonto ve KDV hesabı, fiş iptalinde stok ve bakiye iadesi, ürün silindiğinde geçmiş fişin okunabilir kalması, yedek alma, parola değiştirme, CSV çıktısının Türkçe karakterleri ve oturum açma kapama döngüsü var.
Bu turda üç kusur çıktı ve düzeltildi: fiş kaydı atomik değildi, fiş numarası iki ayrı yerde üretiliyordu ve veresiye müşteri zorunluluğu yalnızca arayüzde vardı.
Uygulama tek kullanıcılı. Veritabanı dosyasını ağ paylaşımına koyup iki makineden aynı anda açmak SQLite'ın kilit davranışı yüzünden sorun çıkarır.
Fiş yazdırma yok, çıktı CSV üzerinden alınıyor. Barkod alanı ürün kartında var ama okuyucu entegrasyonu yok, alan elle dolduruluyor.
Arayüz 1120x700'ün altına inmiyor. Daha küçük ekranlarda tablolar sıkışır.
MIT. Ayrıntı için LICENSE dosyasına bakın.
Kapadokya Üniversitesi · Bitirme Projesi
Anıl Gül · 2025
| Back | FazBrowse Home | New Git URL |