Mayıs 2025 ile Şubat 2026 arasında, teslimat ve yerinde kurulum gerektiren ürünler satan bir işletme için bir platform geliştirdim. Müşteri sipariş verip öder, depo seri numaralı stok ayırır, bir kurye teslim eder, bir teknisyen kurar; back office de her adımda parayı ve stoğu izler. Kodun büyük çoğunluğunu ben yazdım; bir başka geliştirici raporlar ve daha küçük özelliklerle katkıda bulundu.
Bağlam
Kurulumlu teslimat, sıradan bir çevrim içi siparişten daha fazla kişiyi ilgilendirir. Müşteriler talep oluşturur ve takip eder, çağrı merkezi personeli telefonla sipariş alır, depo personeli stok girişi ve çıkışı yapar, kuryeler ürünleri taşır, teknisyenler de onları çoğu zaman daha sonraki bir gün kurar. Finans ekibi kuryelere ve teknisyenlere ödeme yapar ve para iadelerini yürütür. Her grup aynı siparişin farklı bir görünümüne ihtiyaç duyar.
Mühendislik problemi
- Tek sipariş, birçok son. Bir talep ödeme bekliyor durumundan atandı, kurye onayı bekliyor, kuryede, teslim edildi ve kuruldu durumlarına ilerler. Ayrıca iptal edilebilir, teslimatta ya da kurulumda başarısız olabilir, iki ziyaretten herhangi birinde müşteri adreste bulunamayabilir ya da iade olarak geri dönebilir. Bu durumların her birinin stok, para ve bildirimler üzerinde sonuçları vardır.
- Para siparişi izler. Çevrim içi ödeme, kuponlar ve ek ücretler, para iadeleri ve her kuryenin ve teknisyenin hak ettiği kazanç, hepsi aynı talebe bağlıdır.
- Stok fizikseldir. Ürünler seri numarası taşır, talep ödendiğinde ayrılır ve seri numaraları teslimatta kaydedilir. Teslimat zaman aralıklarının bir kapasitesi vardır.
- Saha personeli telefondan, trafikte çalışır. Kuryelerin ve teknisyenlerin kısa, net API'lere ve mantıklı rotalara ihtiyacı vardır.
Geliştirdiklerim
- Back office. XPO ve SQL Server üzerinde, Farsça arayüzlü bir DevExpress XAF Blazor uygulaması: her iş nesnesi için görünümler, role dayalı yetkiler, role göre dashboard'lar, bir teslimat takip haritası, bir iş dağıtım konsolu ve günlük operasyonlar, günlük finans özeti, vadesi gelen hesaplaşmalar, başarısız ödemeler ve müşteri RFM analizi gibi raporlar. XAF'ın audit trail özelliği veri değişikliklerini kaydeder.
- Role dayalı Web API'ler. Mobil ve web istemcileri için, role göre gruplanmış yaklaşık 90 ASP.NET Core endpoint'i: müşteri (ürünler ve hizmetleri için talepler, teslimat zaman aralıkları, yeniden planlama, ödeme, faturalar, iadeler, teknisyen puanlama), kurye (günlük, geçmiş ve yaklaşan işler, seri numarası kaydıyla teslimat, müşteri adreste yok, rota optimizasyonu, kazançlar), teknisyen (atamaları kabul ya da reddetme, işleri fotoğraflarla tamamlama, hizmet bölgeleri, kazançlar), depo (mal kabulleri ve envanter) ve çağrı merkezi (müşteriler, talepler ve durum değişiklikleri).
- Giriş. Kullanıcılar cep telefonu numarası ve tek kullanımlık bir kodla kaydolup giriş yapar (kuryeler parola kullanır) ve bir JWT alır. Her rol endpoint'i yalnızca token'daki kullanıcı adının işaret ettiği kurye, teknisyen ya da müşteri kaydıyla çalışır.
- Otomatik teknisyen ataması. Bir hosted service her gece çalışır. Henüz kurulumcusu olmayan teslim edilmiş talepleri önce kurulum önceliğine, sonra bekleme süresine göre sıralayarak alır ve her aktif teknisyeni mesafe (haversine), talebin bekleme süresi ve önceliği, teknisyenin puanı ve mevcut iş yüküne göre skorlar. Her talep için en iyi üç aday, kabul ya da reddedebilecekleri bir atama alır; müşteriler de SMS ile bilgilendirilir.
- Ödemeler. İran'daki üç ödeme geçidi üzerinde tek bir sağlayıcı arayüzü. Servis, seçilen geçidin erişilebilir olup olmadığını kontrol eder ve değilse başka birine geçer; geçitlere yapılan HTTP çağrıları Polly politikalarıyla yeniden denenir.
- Haritalar. İran'daki bir harita API'si üzerinden ters coğrafi kodlama (reverse geocoding), trafiğe göre mesafe ve çok duraklı rota optimizasyonu.
- Bildirimler. Tek kullanımlık kodlar ve şablonlu SMS mesajları; EF Core aracılığıyla ayrı bir bildirim veritabanına kaydedilir.
Tasarım notları
Back office için neden XAF
Back office'te onlarca iş nesnesi var ve her birinin listelere, formlara, filtrelere, yetkilere ve çoğu zaman bir rapora ihtiyacı var. XAF bunları veri modelinden üretiyor; böylece emeğin büyük kısmı ekranlar yerine iş akışlarına ve API'lere gidebildi. Bedeli, framework'ün konvansiyonlarının kodu biçimlendirmesi ve kalıcı nesnelerin (persistent object) içinde yaşayan iş mantığının unit test ile sınanmasının daha zor olması.
Talep entity'sini yönetilebilir tutmak
Talep modelin merkezinde olduğu için hızla büyüdü. Onu sorumluluklara göre partial class'lara ayırdım (entity, fiyatlandırma, finansal, durum ve kalıcılık, zaman damgaları) ve stok ayırmayı ayrı bir domain servisine taşıdım. Durum değişiklikleri tek bir yerde ele alınıyor; burası zaman damgasını kaydediyor, ayrılmış stok kalemlerinin durumunu güncelliyor ve o geçiş için bildirimi gönderiyor. Teslimat zaman aralığı için bir kapasite kontrolü, ödenmiş bir talep ilk kez bir sonraki aşamaya geçtiğinde çalışıyor.
Atama için gecelik bir batch
Atama, her talep geldiğinde değil, gece bir batch olarak çalışıyor. Bir batch tüm açık talepleri tüm teknisyenlerle aynı anda karşılaştırabilir ve sonuç iş günü başlamadan hazır olur. Ağırlıklar ödünleşimleri açık hale getirir: en çok öncelik sayılır, sonra talebin bekleme süresi, ardından puan, iş yükü ve mesafe. Bedeli, batch'in gün içindeki değişikliklere tepki vermemesi.
Geçitler hata verir
Ödeme geçitleri sistemin kontrolü dışındadır ve zaman zaman erişilemez olurlar. Onları tek bir arayüzün arkasına saklamak, başka bir geçide geçmeyi mümkün kıldı: seçilen geçit çalışmıyorsa ödeme bir başkasında başlar; doğrulama da o işlem için kaydedilen geçide gider.
Test ve bir sonraki adım
Otomatik testler bu kod tabanının zayıf kalan tarafı. Solution'da, DevExpress EasyTest ile Selenium üzerinde yazılmış tek bir uçtan uca smoke test var: back office'i temiz bir veritabanıyla başlatıyor, giriş yapıyor ve ana navigasyon öğelerini açıyor.
Ocak 2026'da modüler bir yeniden tasarıma başladım. Platformu bounded context'lere (müşteri, kurye, teknisyen, depo, teslim alma, mağaza, yönetim, finans, kimlik, mesajlaşma, fiyatlandırma kuralları, haritalar, destek, risk ve analitik) ayıran bir modül haritası yazdım ve her biri için API, application, domain ve EF Core infrastructure projelerinden oluşan bir clean architecture iskeleti oluşturdum. Ardından müşteri modülü kendi repository'sine taşındı; orada başka bir geliştirici onu sepet, siparişler ve servis talepleriyle genişletti. Bu, tamamlanmış bir geçiş değil, bir geçişin başlangıcı.
Teknoloji yığını
- .NET 8, ASP.NET Core Web API, JWT
- DevExpress XAF 25.1: Blazor arayüzü, XPO, Web API, raporlar, dashboard'lar, audit trail
- SQL Server, bildirim deposu için EF Core
- Polly, Swagger
- xUnit, DevExpress EasyTest, Selenium
Durum
- Sipariş, ödeme, stok, teslimat, kurulum, hesaplaşmalar ve raporlamayı kapsayan; beş tür kullanıcı için bir back office'i ve role dayalı API'leri olan bir platform.
- Ana repository'nin son commit'i Şubat 2026 tarihli. Modüler yeniden tasarım belgeler ve proje iskeletleri halinde duruyor; en ileri giden müşteri modülü.
İlgili
Saha servisi iş emirleri, en baştan ayrı servisler olarak kurulan çok kiracılı mikroservis platformunda da yer alıyor. .NET üzerinde bir back office'e ya da saha servisi sistemine ihtiyacınız varsa Benimle çalışın sayfasına bakın.
Sık sorulan sorular
Teslimat ve saha servisi platformu ne yapıyor?
Teslimat ve yerinde kurulum gerektiren ürünlerin siparişlerini yönetiyor. Müşteriler sipariş verip öder, depo seri numaralı stok ayırır, bir kurye teslim eder, bir teknisyen kurar; back office de ödemeleri, para iadelerini, hesaplaşmaları ve raporları takip eder.
Teknisyenler işlere nasıl atanıyor?
Her gece bir arka plan servisi çalışıyor. Teslim edilmiş ama hâlâ bir kurulumcuya ihtiyaç duyan talepleri önceliğe ve bekleme süresine göre sıralıyor, her aktif teknisyeni mesafe, talebin bekleme süresi ve önceliği, teknisyenin puanı ve mevcut iş yüküne göre skorluyor ve işi en iyi üç adaya sunuyor; adaylar işi kabul ya da reddedebiliyor.
Platform hangi teknolojileri kullanıyor?
.NET 8 üzerine kurulu: XPO ve SQL Server üzerinde bir DevExpress XAF Blazor back office'i, JWT ile korunan ASP.NET Core Web API'leri, bildirim deposu için EF Core ve ödeme geçitlerine yapılan yeniden denemeler için Polly.
Mahdi Molavi'nin rolü neydi?
Platformu geliştirdi ve Mayıs 2025 ile Şubat 2026 arasında kodunun büyük çoğunluğunu yazdı. Bir başka geliştirici raporlar ve daha küçük özelliklerle katkıda bulundu.
Bu bölümdeki diğer sayfalar
- Uyarlamalı Test Platformu: yaklaşık 89.000 öğrenci için IRT tabanlı değerlendirmeler
- Yapay Zekâ ile Soru Aktarımı: sınav PDF'lerinden yapılandırılmış LaTeX maddelerine
- Hamsayeh: binaları ve konut sitelerini yönetmek için bir SaaS
- Sınav Zirvesinde Yüksek Erişilebilirlik: 45.000–70.000 eşzamanlı kullanıcı için Redis Sentinel
- Refah Bankası Döviz Bürosu için Döviz Havalesi Back Office Sistemi
- MBRI için Finansal Gösterge Dashboard'u
- Çok Kiracılı Mikroservis Platformu: kiracılık, mesajlaşma ve iş akışı temelleri (geliştiriliyor)
Mahdi Molavi