StockRoute: Çok Şubeli Firmalar İçin Uçtan Uca Stok ve Transfer Takip Sistemi
Truncgil'deki 20 günlük stajımın sonunda ortaya çıkan ürün olan StockRoute'u anlatmak istiyorum. StockRoute, birden fazla şubesi olan firmaların stoklarını ve şubeler arası ürün transferlerini tek bir sistemden yönetmesini sağlayan, web ve mobil uygulamayı birlikte içeren bir platform.
Hangi Problemi Çözüyor?
Birden çok şubesi olan bir firma düşünün. Merkez depoda bol miktarda ürün var, ama bir şubede stok bitmek üzere. Bu ürünün merkezden o şubeye gönderilmesi gerekiyor. Peki bu süreç nasıl takip edilecek? Kim talep etti, kim onayladı, mal yola çıktı mı, karşı taraf teslim aldı mı, hangi şubede hangi üründen ne kadar kaldı?
Çoğu küçük ve orta ölçekli firmada bu süreç telefon, mesaj ve Excel tablolarıyla, dağınık biçimde yürüyor. StockRoute tam da bu karmaşayı düzenlemek için tasarlandı: her transferin bir yaşam döngüsü, her şubenin anlık bir stok görünümü ve her hareketin bir kaydı var.
Sistem Kimlere Hitap Ediyor?
StockRoute, farklı sorumluluklara sahip dört rol etrafında kurgulandı:
- Firma Yöneticisi — şubeleri, ürünleri ve kullanıcıları yönetir; her şeyi görür.
- Şube Müdürü — transferleri onaylar veya reddeder.
- Depo Personeli — onaylanmış transferleri sevk eder, stok düzeltmesi yapar.
- Saha Personeli — mobil uygulamayla sahada çalışır: barkod okutur, gelen malı teslim alır.
Bu roller, hem web panelinde hem mobil uygulamada her kullanıcının yalnızca yetkili olduğu işlemleri görmesini sağlıyor. Yetkiniz olmayan bir butonu veya menüyü hiç görmüyorsunuz.
Mimari: Üç Parça, Tek Sistem
StockRoute üç ana parçadan oluşuyor ve hepsi ortak bir kod tabanında (monorepo) yaşıyor:
1. Backend (API). NestJS, PostgreSQL ve Prisma ile geliştirilen, katmanlı mimariye sahip bir sunucu. Sistemin beyni burası: tüm iş kuralları, yetkilendirme ve veri işlemleri burada.
2. Web Yönetim Paneli. React ile geliştirilen, masaüstü için tasarlanmış yönetim arayüzü. Firma yöneticileri ve ofis personeli buradan çalışıyor.
3. Mobil Saha Uygulaması. React Native (Expo) ile geliştirilen, depo ve saha personeli için telefon uygulaması. Sahadaki dar ve net ihtiyaçlara odaklı: stok gör, barkod okut, teslim al.
Bu üç parçanın ortak tip tanımlarını ve tasarım kurallarını paylaşan bir yapı kurdum. Böylece web ve mobil aynı görsel dilden besleniyor, aynı veri tiplerini kullanıyor — kod tekrarı olmadan tutarlılık sağlanıyor.
İki Mimari Kararın Öne Çıkanı
Sistemin en kritik iki teknik temeli şunlar:
Çok kiracılılık (Multi-tenancy) ve firma izolasyonu. Sistem tek kurulumla birçok firmaya hizmet verebiliyor, ama her firmanın verisi diğerinden tamamen izole. Bu izolasyon, veritabanı katmanında otomatik olarak uygulanıyor — yani her sorgu, ilgili firmanın verisiyle sınırlı kalıyor ve bir firmanın başka bir firmanın verisine erişmesi mümkün değil. Bu güvenlik sınırını otomatik testlerle de doğruladım.
Gerçek zamanlı senkronizasyon. Bir kullanıcı bir işlem yaptığında, bunun sonucu bağlı tüm ekranlara anında yansıyor. Socket.io ile kurulan bu katman sayesinde, web'de biri transfer sevk ettiğinde saha personelinin telefonunda o transfer anında beliriyor; telefondan teslim alındığında web'deki durum aynı anda güncelleniyor.
Canlı Demo: Bir Transferin Yolculuğu
StockRoute'un nasıl çalıştığını, bir ürünün merkez depodan bir şubeye gidişini adım adım takip ederek anlatayım. Sistemin tamamı tek bir komutla (docker compose up) ayağa kalkıyor; veritabanı, API ve web arayüzü birlikte çalışmaya başlıyor.
Adım 1 — Giriş ve genel bakış. Firma yöneticisi web panelinden firma kodu, e-posta ve şifreyle giriş yapıyor. Karşısına gelen kontrol panelinde canlı özet kartları var: toplam şube, toplam ürün, bekleyen transfer ve düşük stok sayısı. Altında son transferler ve düşük stok listesi. Bu kartlar gerçek zamanlı — başka biri işlem yaptığında kendiliğinden güncelleniyor.
Kontrol paneli ekranını görmek için: [Dashboard görüntüsü]
Adım 2 — Envanter ve stok durumu. Envanter ekranında, seçilen şubedeki tüm ürünlerin stok durumu görünüyor. Stoğu minimum eşiğin altına düşen ürünler kırmızıyla vurgulanıyor, böylece neyin bitmek üzere olduğu bir bakışta anlaşılıyor. Yetkili personel buradan manuel stok düzeltmesi de yapabiliyor ve bu düzeltmenin nedeni kayıt altına alınıyor.
Düşük stokların kırmızıyla vurgulandığı envanter ekranını görmek için: [Envanter ekranı görüntüsü]
Adım 3 — Transfer oluşturma. Bir şubede stok azaldığında, kaynak ve hedef şube seçilerek yeni bir transfer oluşturuluyor. Bir transfer tek seferde birden fazla ürün taşıyabiliyor — örneğin aynı anda hem çay hem şeker gönderilebiliyor. Transfer oluşturulduğunda "Beklemede" durumuna giriyor.
Çoklu ürünlü transfer oluşturma ekranını görmek için: [Transfer oluşturma görüntüsü]
Adım 4 — Onay ve sevkiyat. Transfer, bir durum makinesinden geçiyor: Beklemede → Onaylandı → Yolda → Teslim Alındı. Şube müdürü transferi onaylıyor, depo personeli sevk ediyor. Sevk anında kaynak şubenin stoğu otomatik düşüyor. Her aşamada, o işleme yetkili olmayan kullanıcı ilgili butonu hiç görmüyor.
Farklı durumlardaki transferlerin listelendiği ekranı görmek için: [Transfer listesi görüntüsü]
Adım 5 — Sahada teslim alma (mobil). Burada devreye telefon giriyor. Hedef şubedeki saha personeli, mobil uygulamada "Gelen Transferler" ekranında yola çıkan malı görüyor. "Teslim Al" butonuyla onaylıyor ve hedef şubenin stoğu otomatik artıyor. Bu işlem yapılır yapılmaz, web panelindeki transfer durumu aynı anda "Teslim Alındı"ya dönüyor — işte gerçek zamanlı senkronizasyon burada devreye giriyor.
Mobil uygulamadaki gelen transferler ekranını görmek için: [Mobil teslim ekranı görüntüsü]
Adım 6 — Barkod ile stok sorgulama (mobil). Saha personeli, bir ürünün barkodunu telefonun kamerasıyla okutarak o ürünün bulunduğu şubedeki stok miktarını anında görebiliyor. Depo ortamında hızlı kontrol için tasarlanmış bir özellik.
Barkod tarama sonucu ekranını görmek için: [Barkod tarama görüntüsü]
Adım 7 — Düşük stok bildirimi. Bir ürünün stoğu minimum eşiğin altına düştüğü anda, sistem otomatik bir uyarı yayıyor. Bu uyarı hem web panelinde hem mobil uygulamada anlık olarak beliriyor — kimsenin manuel kontrol etmesine gerek kalmadan.
Bu yedi adımlık akışın tamamını, sistemi sıfırdan kurup baştan sona çalıştırarak defalarca doğruladım.
Teknoloji Özeti
| KatmanTeknolojiler | |
| Backend | NestJS, PostgreSQL, Prisma, Socket.io, JWT |
| Web | React, Material UI, TanStack Query, Zustand |
| Mobil | React Native (Expo), Expo Router |
| Altyapı | Docker, Docker Compose, Nginx, pnpm monorepo |
Sistem, docker compose up --build komutuyla veritabanı, API ve web arayüzü olarak tek seferde ayağa kalkacak şekilde konteynerize edildi. Ayrıca 58 otomatik test, iş mantığını ve firma izolasyonunu güvence altına alıyor.
Kapsam ve Dürüstlük
Her ürün gibi StockRoute'un da bilinçli olarak çizilmiş sınırları var. Bazı özellikleri — örneğin şube seviyesinde sunucu tarafı yetkilendirme, davet e-postasıyla kullanıcı ekleme gibi — kapsam dışı bıraktım ve bu kararların gerekçelerini proje dokümantasyonunda (README) açıkça belirttim. Bunları "eksik" olarak değil, "gelecek sürüme planlanmış" kararlar olarak görüyorum. Bir projenin sınırlarını bilerek çizmek ve dokümante etmek, benim için de öğretici bir olgunluk deneyimi oldu.
Sonuç
StockRoute, tek bir stok tablosunu güncellemekten çok daha fazlası: firma izolasyonu, rol bazlı yetkilendirme, çok adımlı bir transfer iş akışı, gerçek zamanlı senkronizasyon ve web-mobil bütünlüğü olan uçtan uca bir sistem. Yirmi günde, planlamadan teslime kadar tüm süreci disiplinli bir şekilde yürütmek, bana tek bir özellik yazmanın çok ötesinde, bir ürünü baştan sona hayata geçirmenin ne demek olduğunu öğretti.
- Projenin kaynak kodunu ve detaylı dokümantasyonunu incelemek isteyenler için: GitHub - StockRoute