03 / 04
Burhen Halı Yıkama CRM
React ve Flask ile geliştirilen full-stack CRM ve işletme otomasyonu. Müşteri kayıtlarını, m² bazlı fiyatlandırmayı, altı aşamalı sipariş takibini, tahsilat ve kalan bakiye yönetimini, personel yetkilerini ve PDF irsaliye üretimini tek operasyon merkezinde birleştiriyor.

Proje özeti
- Durum
- Tamamlandı
- Rol
- Full-stack geliştirme, operasyon modelleme, API tasarımı, veri mimarisi ve kullanıcı arayüzü
- Teknolojiler
- React · Flask · SQLAlchemy · ReportLab
Genel Bakış
Günlük işletme operasyonlarını tek veri akışında birleştirmek.
- Bağlam
- Burhen Halı Yıkama CRM, temizlik ve halı yıkama işletmelerinin müşteri kayıtlarını, siparişlerini, fiyatlandırmasını, tahsilatlarını ve personel erişimlerini tek merkezden yönetebilmesi için geliştirilen full-stack bir operasyon platformudur. Sistem; tanıtım ve giriş deneyimi, sistem yöneticisi paneli ve işletme çalışma alanı olmak üzere farklı kullanım katmanlarını aynı uygulama içinde birleştirir.
- Hedef
- İşletme tarafındaki günlük akışı müşteri kaydıyla başlatıp sipariş oluşturma, ölçüm ve fiyat hesaplama, durum güncelleme, irsaliye üretimi, müşteri bilgilendirme ve tahsilat yönetimine kadar kesintisiz taşımak.
- Norvane’in rolü
- Full-stack geliştirme, operasyon modelleme, API tasarımı, veri mimarisi ve kullanıcı arayüzü
İhtiyaç
Halı yıkama işletmelerinde müşteri bilgileri, ölçüler, halı türleri, teslim tarihleri, işlem aşamaları ve tahsilatlar aynı sipariş boyunca birlikte takip edilmek zorundadır.
Bu bilgilerin kâğıt, mesajlaşma geçmişi ve farklı tablolar arasında dağılması; fiyat hesaplama hatalarına, geciken siparişlere, eksik tahsilat kayıtlarına ve sorumluluk belirsizliğine yol açabilir.
Burhen’in temel tasarım ve mühendislik problemi, yoğun günlük veri girişini hızlandırırken finansal doğruluğu, kullanıcı yetkilerini ve işlem geçmişini koruyan bir sistem kurmaktı.
- Parçalı müşteri ve sipariş kayıtlarıMüşteri, adres, sipariş ve ödeme bilgilerinin birbirinden kopuk kaynaklarda tutulmasını engellemek.
- Manuel fiyat hesaplamaHalı tipi, en, boy ve m² fiyatı üzerinden tutarı otomatik ve tutarlı biçimde hesaplamak.
- Görünmeyen operasyon durumuSiparişin teslim alınmasından teslim edilmesine kadar güncel aşamayı görünür tutmak.
- Finansal takipToplam tutar, ödenen miktar ve kalan bakiyeyi aynı sipariş ve müşteri bağlamında izlemek.
- Yetki ve sorumlulukİşletme yöneticisi, personel ve sistem yöneticisi işlemlerini kontrollü erişimlerle ayırmak.
Çözüm
Burhen’de operasyonun omurgası siparişin altı aşamalı yaşam döngüsüdür. Bir sipariş teslim alındığı andan teslim edildiği ana kadar aynı kayıt üzerinde ilerler; durum değiştikçe listedeki rozet, panodaki sayaç ve müşteriye hazırlanan mesaj şablonu birlikte güncellenir.
Arayüz bu akışı taşıyacak biçimde kurulmuştur: açık gri uygulama zemini, beyaz içerik yüzeyleri, koyu sidebar ve kontrollü mavi aksan. Mavi dekoratif bir renk değil; ana aksiyonları, aktif navigasyonu ve odak durumlarını işaretler. Başarı, uyarı, tehlike ve bilgi renkleri operasyon durumlarını destekler, ancak durum her yerde metin ve ikonla birlikte verildiği için bilgi yalnız renge bırakılmaz.
Finansal değerler bu sistemde ayrı bir hiyerarşi taşır: tahsilat, kalan bakiye ve toplam tutar en yüksek kontrast ve tipografik ağırlıkla gösterilir, soluk gri meta metnine indirilmez.
Hız sürtünmeyi yener
Aynı akış günde onlarca kez tekrarlandığı için ekranlar en az tıklama ve net varsayılanlar üzerine kurulur.
Para her zaman okunur
Tahsilat, kalan bakiye ve toplam tutar en yüksek kontrast ve ağırlıkta; zarafet uğruna gömülmez.
Durum yalnız renkle anlatılmaz
Sipariş ve ödeme durumu renkle birlikte her zaman metin ve ikon olarak da verilir.
İşletme bazlı veri sahipliği
Her sorgu bağlı olduğu işletme hesabına göre daraltılır; personel kendi işletmesinin havuzunu kullanır.
Sipariş yaşam döngüsü
- Teslim Alındı — müşteri ve sipariş bilgileri kaydedilir, ürün kalemleri sisteme eklenir
- Yıkanıyor — sipariş aktif temizlik sürecine alınır
- Kurulanıyor — yıkama sonrası kurutma aşaması takip edilir
- Paketlendi — temizliği tamamlanan ürünler teslimat için hazırlanır
- Teslimata Çıktı — sipariş müşteriye ulaştırılmak üzere operasyondan çıkar
- Teslim Edildi — sipariş yaşam döngüsü ve teslim süreci tamamlanır
İstek akışı
- React ve Vite arayüzü: tanıtım, giriş ve panolar
- Axios istemcisi JWT’yi interceptor ile korumalı isteklere ekler
- Flask REST API isteği ilgili blueprint’e yönlendirir
- Kimlik ve rol claim’leri doğrulanır, işletme sahipliği uygulanır
- SQLAlchemy ilişkisel veritabanı üzerinde işlemi yürütür
Belge ve iz kaydı
- Sipariş ve müşteri verisi PDF servisine aktarılır
- ReportLab, Türkçe karakterleri destekleyen fontla irsaliyeyi üretir
- Belge yeni sekmede açılır, indirilir veya Web Share akışına verilir
- Aynı işlem SQLAlchemy event’leri tarafından yakalanır
- Değişiklik; işletme, kullanıcı ve alan bağlamıyla audit log’a yazılır
Tasarım token’ları
- Birincil mavi#2563eb
- Koyu sidebar#0f172a
- Uygulama zemini#f1f5f9
- Ödendi / aktif#059669
- Yaklaşan / bekleyen#d97706
- Kalan bakiye / geciken#dc2626

Özellikler
Ölçü, ürün tipi ve birim fiyatı tek hesaplama akışında birleştirmek
Sipariş oluşturma akışı, kayıtlı müşterinin seçilmesiyle başlar. Siparişe birden fazla halı kalemi eklenebilir ve her kalem için halı türü, en ve boy bilgileri girilir.
Halı türü seçildiğinde tanımlı m² fiyatı otomatik olarak uygulanır. Sistem her satırdaki alanı ve tutarı hesaplar, genel toplamı işlem sırasında günceller. Para ve ölçü alanlarında kayan noktalı sayı yerine Decimal tabanlı değerler kullanılır.
İrsaliye numarası boş bırakıldığında sistem tarafından otomatik bir numara üretilir. Halı türü ve fiyatlandırma tanımlanmamışsa sipariş oluşturma engellenerek kullanıcı ilgili yönetim alanına yönlendirilir.
- Çoklu halı kalemi
- Otomatik m² ve tutar hesabı
- Halı tipi başına m² fiyatı
- Otomatik irsaliye numarası


Siparişin durumunu, belgesini ve tahsilatını aynı kayıt üzerinde yönetmek
Sipariş listesi, operasyon durumunu yalnız metin olarak göstermekle kalmaz; renk, ikon ve etiketlerle güncel aşamayı görünür hâle getirir. Teslim tarihine kalan gün sayısı ve geciken siparişler ayrıca işaretlenir.
Yetkili kullanıcılar sipariş durumunu güncelleyebilir, PDF irsaliyeyi oluşturabilir, müşteriye gönderilecek duruma özel mesajı hazırlayabilir, ödeme kaydı ekleyebilir ve ödeme geçmişini inceleyebilir.
- Durum güncelleme
- Duruma özel mesaj hazırlama
- PDF irsaliye görüntüleme ve paylaşma
- Ödeme kaydı ve geçmişi
- Yetkiye bağlı sipariş silme

Müşteri geçmişini operasyonun başlangıç noktası hâline getirmek
Müşteri modülü; isim, iletişim ve adres bilgilerini işletme bazında kayıt altında tutar. Kayıtlı müşteriler yeni siparişlerde ad veya telefon üzerinden hızlıca aranıp seçilebilir.
Telefon numarası üzerinden WhatsApp sohbeti açılabilir, kayıtlı adres harita araması için kullanılabilir. Her ikisi de dış bağlantı olarak çalışır; sistemde ayrı bir harita veya mesajlaşma entegrasyonu bulunmaz.
Aktif siparişi bulunan müşterilerin silinmesi, veri bütünlüğünü korumak amacıyla backend tarafında engellenir.
- İşletme bazlı müşteri kaydı
- Ad, telefon ve adres araması
- Dış WhatsApp ve harita bağlantısı
- Aktif siparişte silme koruması


Tahsilat ve kalan bakiyeyi operasyon akışının görünür bir parçası yapmak
Finans modülü, sipariş toplamını, yapılan tahsilatları ve kalan bakiyeyi aynı işlem bağlamında gösterir. Yetkili kullanıcılar nakit, kart, IBAN veya havale türünde ödeme kaydı oluşturabilir, ödeme geçmişini inceleyebilir ve hatalı kayıtları yetkileri dâhilinde kaldırabilir.
Tahsilat tutarı kalan borcun üzerine çıkamaz; bu kontrol backend tarafında uygulanır ve sipariş bakiyesinin tutarlı kalmasını sağlar.
Panodaki finans özeti toplam ciroyu ve bekleyen tahsilatı gösterir. Tarih aralığı seçildiğinde grafik günlük, genel görünümde ise yılın aylık ciro dağılımını sunar.
Burada tutulan şey bir ödeme kaydıdır: sistem para transferi gerçekleştirmez, sanal POS veya banka servisine bağlanmaz.
- Nakit, kart, IBAN ve havale kaydı
- Kalan bakiyeyi aşmayan tahsilat
- Aylık ve tarih aralığına göre günlük ciro
- Bekleyen tahsilat özeti

Sipariş verisinden paylaşılabilir operasyon belgesi üretmek
Backend, sipariş ve müşteri bilgilerini kullanarak dinamik PDF irsaliye üretir. Belge, Türkçe karakterleri destekleyen font yapılandırmasıyla ReportLab üzerinden oluşturulur; müşteri bilgileri, halı detayları ve ödeme geçmişi ayrı bölümler hâlinde yer alır.
Oluşturulan irsaliye yeni sekmede görüntülenebilir veya indirilebilir. Desteklenen mobil cihazlarda Web Share API üzerinden paylaşım akışına aktarılır; desteklenmeyen masaüstü senaryosunda dosya indirilir ve WhatsApp Web yönlendirmesi açılır.
Üretilen belge operasyonel bir irsaliyedir — resmî e-belge veya mali mevzuata uyumlu bir çıktı değildir.
- ReportLab ile dinamik üretim
- Türkçe karakter desteği
- Web Share API veya indirme

Müşteri bilgilendirmesini sipariş durumuyla ilişkilendirmek
Altı sipariş aşamasının her biri için ayrı mesaj şablonu tanımlıdır. Şablon, müşterinin adı ve siparişin güncel durumuyla doldurulur; böylece gönderilen bilgi her zaman kayıttaki aşamayla uyumlu kalır.
Sistem, telefon numarası ve hazır mesaj içeriğiyle WhatsApp veya WhatsApp Web akışını açar. Mesajın son gönderim işlemi kullanıcı kontrolündedir.
Bu akış resmî WhatsApp Business API üzerine kurulu değildir: sunucudan otomatik mesaj gönderilmez, teslim raporu alınmaz ve toplu gönderim yapılmaz.
- Aşamaya özel mesaj şablonları
- Kullanıcı onayıyla gönderim
- Belge paylaşımı için aynı akış

Operasyonel erişimi görev ve sorumluluğa göre sınırlandırmak
Burhen, sistem yöneticisi, işletme yöneticisi ve personel olmak üzere üç erişim katmanını destekler. Sistem yöneticisi platformdaki işletme hesaplarını yönetir; işletme yöneticisi kendi müşterilerini, siparişlerini, personelini ve fiyatlandırma yapılarını yönetir.
Personel, bağlı olduğu işletmenin ortak veri havuzunu kullanır; eklediği müşteri ve siparişler aynı havuzda toplanır. Finans özetleri gibi alanlar ise rol claim’i üzerinden sınırlandırılır — pano istatistiklerinde ciro ve bekleyen tahsilat yalnız işletme sahibine döndürülür.
Personel hesapları e-posta veya telefon numarasıyla giriş yapar ve işletme yöneticisi tarafından aktif ya da pasif hâle getirilebilir.
- Üç erişim katmanı
- Ortak işletme veri havuzu
- Rol bazlı finans görünürlüğü
- Personel limiti ve hesap durumu

Birden fazla işletme hesabını merkezi kontrol katmanında yönetmek
Sistem yöneticisi paneli, platforma tanımlı işletme hesaplarının ve personel kapasitelerinin merkezi olarak yönetildiği çalışma alanıdır.
Yönetici; hesapları aktif veya pasif hâle getirebilir, personel limitini belirleyebilir, geçerlilik tarihlerini yönetebilir, şifre sıfırlama işlemleri gerçekleştirebilir ve her hesabın personel listesini ayrı ayrı inceleyebilir. Kapasite kullanımı, yaklaşan süre sonları ve son eklenen hesaplar genel bakış panelinde özetlenir.
Burada yönetilen şey lisans ve geçerlilik tarihidir. Sistemde abonelik ödemesi alan bir altyapı bulunmaz; geçerlilik süresi dolmuş bir hesabın girişi doğrudan engellenir.
- Hesap aktifliği ve personel limiti
- Geçerlilik tarihi yönetimi
- Kapasite ve süre sonu özeti



Veri değişikliklerini geriye dönük izlenebilir hâle getirmek
SQLAlchemy event sistemi, veri oluşturma, güncelleme ve silme işlemlerini oturum yazılmadan önce yakalar ve otomatik audit log kayıtlarına dönüştürür. Böylece izleme her route’a ayrı ayrı eklenmez.
İşlem kayıtları ilgili işletmeyi, işlemi gerçekleştiren kullanıcıyı, alan adını ve değerin eski ile yeni hâlini ilişkilendirir. Şifre hash’leri gibi hassas alanlar log dışında bırakılır.
Bu, uygulama içi bir işlem geçmişidir; değiştirilemez bir kayıt defteri veya resmî denetim uyumluluğu iddiası taşımaz.
- Otomatik event tabanlı loglama
- Alan bazında eski ve yeni değer
- Hassas alanlar hariç tutulur

Arayüz



Teknik Yapı
Burhen’in React ve Vite tabanlı frontend’i, Axios üzerinden Flask REST API ile haberleşir; JWT token request interceptor aracılığıyla korumalı isteklere eklenir. Backend, her kaynağı ayrı bir Flask blueprint’i üzerinden yönetir. SQLAlchemy veri modellerini ve ilişkileri yönetirken Flask-Migrate şema değişikliklerini kontrol eder.
- Arayüz
- React 19 · Vite · React Router · Recharts · Framer Motion
- API
- Flask · Flask-JWT-Extended · Flask-CORS · Flask-Limiter · Axios
- Veri
- SQLAlchemy · Flask-Migrate · Decimal tabanlı tutar ve ölçü alanları
- Belge ve izleme
- ReportLab · SQLAlchemy events · Web Share API
Sonuç
Burhen Halı Yıkama CRM; müşteri kaydından sipariş oluşturma ve fiyatlandırmaya, operasyon takibinden tahsilat ve belge yönetimine kadar günlük işletme süreçlerini tek full-stack sistem içinde birleştirir.
Proje yalnızca arayüz tasarımını değil; ilişkisel veri modeli, REST API, JWT tabanlı yetkilendirme, rol ve veri sahipliği, PDF üretimi, audit log ve finansal hesaplama gibi operasyonel yazılımın temel katmanlarını birlikte ele alır.
Çıkarımlar
- Finansal doğruluk bir arayüz meselesi olmadan önce bir tip meselesi: tutar ve ölçü alanlarının Decimal üzerinde tutulması, hesaplamanın her katmanda aynı sonucu vermesini sağlıyor.
- Tahsilatın kalan bakiyeyi aşamaması gibi kuralların backend’de uygulanması, aynı kontrolü her arayüzde tekrar yazma ihtiyacını ortadan kaldırıyor.
- İzlemeyi route’lara tek tek eklemek yerine ORM event’lerine bağlamak, sonradan eklenen her kaynağın da otomatik olarak loglanması anlamına geliyor.
- Eski ve yeni durum değerlerinin bir arada kabul edilip arayüzde okunurken eşlenmesi, veri geçişini kesintiye uğratmadan altı aşamalı akışa geçmeyi mümkün kıldı.
Mevcut kapsam ve sonraki geliştirme alanları
- WhatsApp iletişimi resmî WhatsApp Business API yerine kullanıcı kontrollü bağlantı ve paylaşım akışları üzerinden çalışır; sunucudan otomatik mesaj gönderilmez.
- Tahsilat modülü ödeme kaydı tutar; gerçek para transferi, sanal POS veya banka entegrasyonu gerçekleştirmez.
- PDF çıktısı operasyonel irsaliye üretir; doğrulanmış resmî e-belge entegrasyonu değildir.
- Harita davranışı dış arama bağlantısı üzerinden çalışır; rota veya konum takip sistemi içermez.
- Uygulama arayüzü ve API mesajları mevcut kapsamda Türkçedir.
- Ekran görüntülerindeki tüm kayıtlar geliştirme amaçlı üretilmiş test verisidir; gerçek kullanım hacmini temsil etmez.
- Kullanılan veritabanı bağlantı dizesine bağlıdır; belirli bir production veritabanı sağlayıcısı veya dağıtım ortamı öngörülmez.
- Production kullanımı ve bağımsız güvenlik denetimi doğrulanmadığından bunlara ilişkin bir iddiada bulunulmaz.
İlgili içgörüler
- CRM Projeleri Neden Beklenen Verimi Sağlayamaz?Sorun genellikle araçta değil, aracın günlük işe yerleşmemesinde. Veri girişi yükü ve sahiplik boşluğu sistemi sessizce terk ettirir.
- Manuel Operasyonları Dijitalleştirirken Nereden Başlanmalı?Mevcut süreci izlemeden başlanan dijitalleştirme, kâğıt üzerindeki karmaşayı ekrana taşır. Küçük bir pilot en güvenli ilk adımdır.
- Hangi İş Süreçleri Otomasyona Uygundur?Tekrar eden ve kural tabanlı işler iyi adaydır. Karmaşık bir süreci sadeleştirmeden otomatikleştirmek onu yalnızca hızlandırır.
Benzer bir dijital ürün üzerinde mi çalışıyorsunuz?
İhtiyacı, mevcut durumu ve hedeflerinizi paylaşın. Uygun başlangıç noktasını birlikte değerlendirelim.
