Lojistik ERP · web uygulaması
Kurum içi · canlıdaBEST Freight ERP
BEST Freight ERP, uluslararası karayolu taşımacılığı yapan bir şirket için geliştirdiğim web tabanlı bir ERP sistemi. Ofis ekibi ithalat ve ihracat seferlerini, gümrük beyannamelerini, araçları, şoförleri ve muhasebeyi bu sistemden yürütüyor. Arayüz Türkçe ve sistem her gün kullanılıyor.
Kurum içi bir yazılım olduğu için kaynak kodunu, ekran görüntülerini ve şirkete ait bilgileri paylaşmıyorum. Bu sayfada yalnızca ne yaptığını ve nasıl kurulduğunu anlatıyorum.
Modüller
Operasyon
İthalat ve ihracat seferleri (pozisyonlar), yükler, mühür numaraları, CMR ve diğer belgelerin PDF olarak üretilmesi, taranan evrakların arşivi ve ladametre (yükleme metresi) hesabı.
Gümrük
SGS TransitNet üzerinden NCTS transit beyannameleri, İngiltere için GVMS/GMR ve CDS ihracat beyannameleri, AB'ye girişte ICS/ENS. Beyannamelerin durumu arka planda düzenli olarak sorgulanıyor.
Filo
GPS araç takibi, takograf verilerinin senkronizasyonu, sefer başına km ve yakıt takibi, yakıt kartı hareketleri, ECMT ve UBAK geçiş belgeleri.
Şoförler
Şoför kayıtları, vize ve belge süreleri, şoförlerin telefondan belge yükleyebildiği sayfalar ve şoförlere mesaj gönderme.
Finans
Muhasebe, masraf formları, sefer kârlılığı ve muhasebe yazılımıyla e-fatura entegrasyonu.
Ofis
IMAP üzerinden e-posta takibi ve yazışmaların referans kodlarıyla seferlere bağlanması, ekip içi sohbet ve bildirimler, insan kaynakları ve sigorta kayıtları.
Belge okuma ve asistan
Taranan belgelerden OCR ve yapay zekâ ile bilgi çıkarma. Türkçe sorulan sorulara veritabanından cevap veren bir asistan.
Nasıl kurulu
Sunucu Node.js ve Express 5 ile yazıldı. Katmanlar route, controller ve model (yalnızca SQL) olarak ayrılıyor, dış sistemlerle konuşan kod ayrı servislerde duruyor. Arayüz React 19, TypeScript ve Vite ile yazılmış tek sayfalık bir uygulama, Express onu statik dosya olarak sunuyor.
Veriler birkaç SQLite veritabanında (better-sqlite3) tutuluyor. Ana veriler, gümrük ve mesajlaşma tabloları, denetim kayıtları, GPS ve oturumlar ayrı dosyalarda. Takograf verileri ve canlı GPS için PostgreSQL kullanılıyor.
Bildirimler ve sohbet Socket.IO ile gerçek zamanlı çalışıyor. Gümrük durum sorguları, GPS yenileme, takograf senkronizasyonu ve yedekler gibi işler node-cron ile arka planda zamanlanıyor. Yedekler hem yerelde hem Google Drive'da tutuluyor.
PDF'ler pdf-lib ve pdfmake ile, Excel dosyaları ExcelJS ile üretiliyor. SGS'ye SOAP ile, HMRC'ye OAuth kullanan REST API'leriyle bağlanılıyor.
Zor kısımlar
EJS'den React'e geçiş
Arayüz başta sunucuda üretilen EJS sayfalarıydı. Sistem kullanılmaya devam ederken sayfaları tek tek React ve TypeScript'e taşıdım. Asıl iş API'de değil, eski sayfaların küçük davranışlarını ve görünümlerini birebir yakalamaktaydı.
Her gümrük sisteminin kendi dili var
NCTS için SGS'nin SOAP servisi ve XML şemaları, İngiltere için HMRC'nin OAuth kullanan REST API'leri, ICS/ENS için ayrı bir akış. Her birinin hata kodları ve durum döngüsü farklı. Bu yüzden her entegrasyon ayrı bir servis olarak, kendi arka plan sorgusuyla çalışıyor.
CMR'leri yüklerle eşleştirmek
Teslim edilen tek bir CMR birden fazla yükü kapatabiliyor. Ağırlıklar Türkçe biçimde yazılıyor: “20.840” kilogram, basit bir ayrıştırmayla 20,84'e dönüşüp yanlış satırla eşleşiyor. Eşleştirme mantığı hem arayüzde hem sunucuda var. İkisinin birebir aynı kalması bir testle kontrol ediliyor.
Güvenlik
- Oturum tabanlı giriş ve güvenilir cihaz desteğiyle iki adımlı doğrulama (TOTP).
- CSRF koruması ve giriş denemelerine sınır.
- Rol ve sayfa bazlı yetkiler. İzinler her istekte veritabanından yeniden okunuyor.
- Ayrı bir veritabanında tutulan denetim kayıtları.
- Düzenli yerel ve Google Drive yedekleri.
Durum
Sistem canlıda ve her gün kullanılıyor. Geliştirme küçük ve sık değişikliklerle sürüyor.