30 Saniyede
Mod İskele, çimento fabrikalarında (Nuh Çimento, Akçansa) iskele kurup söküyor. Bu operasyonun günlük raporu bugüne kadar birinin akşam oturup elle Excel’e girdiği bir işti. Mod ERP o işi ortadan kaldırıyor: saha ekibi işi yürütürken adımları telefondan tıklıyor (keşif → izin → kurulum → kontrol → teslim), her adıma fotoğraf bağlanıyor, ve müşteriye giden günlük rapor günün tiklerinden otomatik derleniyor. Değer önermesi tek cümlede: “günlük rapor artık elle Excel’e girilmiyor, günün tiklerinden derleniyor.” Bu bir hakediş/faturalama sistemi değil — bilinçli olarak operasyon görünürlük katmanı; kim neyi ne zaman yaptığını, fotoğrafıyla, geri döndürülemez biçimde kaydeder.
İş Problemi & Fırsat
Saha operasyonunda asıl kayıp görünürlükte: hangi iskele ne zaman kuruldu, kaç gündür sahada duruyor, haftalık kontrolü yapıldı mı, hangi malzeme geri döndü hangisi sahada bırakıldı? Bunlar telefonla, WhatsApp’la, akşam doldurulan tablolarla takip edilince hem emek yiyor hem de “yapıldı” denen işin kanıtı olmuyor. Müşteri (fabrika) “bu iskele gerçekten kuruldu ve kontrol edildi mi” diye sorduğunda elde tutarlı bir kayıt kalmıyor. Fırsat: sahadaki her adımı olduğu anda, fotoğrafıyla, kimliğiyle kaydedip; müşteriye giden resmî raporu bu kayıtlardan otomatik üretmek. Böylece hem günlük emek ortadan kalkıyor hem de her iş denetlenebilir bir kanıt zincirine bağlanıyor.
Kullanıcı Deneyimi
Saha kullanıcısı (usta/formen) gözünden: Telefonuyla, kurumsal e-postası olmasa da girer — kimlik telefon numarası. Ekranı masaüstünün küçültülmüşü değil; yalnız kendi işini yürüttüğü sade bir adım listesi. Sıradaki adım otomatik açık gelir, “hangi butona basacağım” diye aramaz. Fabrikada sinyal kesildiğinde de çalışır — tıkladığı her şey kuyruğa girer, bağlantı gelince gönderilir. Kanıt fotoğrafı çekmeden bazı adımlar kapanmaz (bu bir kısıt değil, işin doğru yapıldığının güvencesi).
Şantiye şefi gözünden: Sahadayken de panoya, kurulu iskele listesine, güne bakabilir. “Aylardır sahada duran hangi iskele” sorusunu tek ekranda görür; Excel’de yaptığı analizi (üniteye göre süz, en eski kontrolden sırala) artık uygulamada yapar. Günün sonunda “Onayla & Gönder” der, rapor müşteriye HTML + PDF olarak gider — fotoğraflar gömülü, üzerine tıklanınca tam boyut açılır. Kendi kurduğu işi onaylayamaz (regülasyon); sistem buna izin vermez.
Müşteri (fabrika) gözünden: Her sabah operasyonun günlük raporunu alır: ne kuruldu, ne söküldü, metrajı, harcanan saat, fotoğrafları, saha koşulları. Bir iskele teslim edildiğinde “kuruldu” bildirimi gelir; yeşil kartı kaldırıldığında karşılaştırmalı bir uyarı gelir. Her şey kendi gelen kutusunda, kanıtıyla.
Sahibin Amacı / Vizyon
Mod İskele için bu sistem, sahadaki işin kanıtlanabilir ve görünür olmasını sağlayarak müşteri güvenini ve operasyonel disiplini aynı anda büyütmek. Uzun vadeli vizyon şema düzeyinde yazılı: sistem baştan çok müşterili kuruldu — Nuh ile başladı, Akçansa eklendi, SOCAR/Tüpraş gibi yeni tesisler tek tesis için değil “ürünü çoğalt” mantığıyla planlandı. Her yeni fabrika = yeni kod değil, yeni bir kiracı. [?] (Ödeme/hakediş katmanının ileride ekleneceği belgede bilinçli olarak kapsam dışı bırakılmış.)
Nasıl Çalışır (sade)
- Şef iş açar (iş emri kâğıdı fotoğrafıyla); keşifçi ve kurulum ekibi atanır.
- Saha ekibi adımları sırayla tıklar: keşif ölçüsü, izin, kurulum başladı/bitti — her kritik adımda fotoğraf.
- Şef teslim eder; müşteriye otomatik “iskele kuruldu” maili gider (fotoğraflarla).
- İskele sahada durdukça haftalık kontrol takibi işler; vadesi geçen kırmızı, yaklaşan sarı gösterilir.
- Söküm/revize aynı iş kaydı içinde faz olarak yürür; malzeme geri döndü mü sahada mı bırakıldı işaretlenir.
- Günün sonunda günlük rapor tiklerden otomatik derlenir, şef onaylayınca müşteriye HTML + PDF gider.
Teknik özet: Tek container’da NestJS API + React SPA aynı origin’den; iş kuralları ayrı bir domain paketinde (Zod + durum makinesi + değişmez kurallar); kanıt fotoğrafları MinIO’da; her müşterinin verisi Postgres Row-Level Security ile bağlantı düzeyinde izole.
Yeniden Kullanılabilir Yetenekler
- offline-first-saha-pwa — Sinyalsiz fabrikada da çalışan, tıkları kuyruğa alıp bağlantı gelince gönderen saha uygulaması. Depo, üretim, lojistik, inşaat — bağlantının kopabildiği her saha işinde temel.
- baglanti-duzeyi-rls-multi-tenant — Her müşterinin verisini veritabanı düzeyinde izole eden, “WHERE unutulursa sızıntı değil boş sonuç” garantisi veren multi-tenant sınır. Birden çok kuruma aynı SaaS’ı satan her üründe en güçlü izolasyon katmanı.
- degismez-denetim-ve-kanit-zinciri — Her fotoğrafı işe+adıma+zamana bağlayan, silinemez (DB trigger’lı) denetim ve kanıt zinciri. “Yapıldı” iddiasının denetlenebilir olması gereken her operasyon/uyum sürecine taşınır.
- domain-kural-motoru-durum-makinesi — İş kurallarını tek kaynakta (saf fonksiyon + durum makinesi) tutup hem arayüzü hem sunucuyu besleyen mimari. Karmaşık onay/geçiş kuralı olan her üründe kuralın iki yerde ayrışmasını önler.
- operasyondan-otomatik-rapor — Sahadaki tiklerden müşteriye giden resmî günlük raporu (HTML mail + PDF eki + gömülü fotoğraf) otomatik derleyen hat. Elle rapor hazırlanan her operasyonel süreçte emeği sıfırlar.
- oturum-tabanli-kimlik-dogrulama — Telefon + şifreyle giriş, uzun ömürlü oturum (offline açılış için), admin temsil (impersonation). Kurumsal e-postası olmayan saha kadrosunun kullandığı her iç araçta doğru kimlik modeli.
- rol-bazli-erisim-kontrolu — “Kim neyi görebilir/yapabilir” katmanı: şef, mühendis, formen, usta, admin. Rol şantiyeye bağlı — aynı kişi bir tesiste şef, ötekinde mühendis olabilir.
- eposta-bildirim-sistemi — Teslim, yeşil kart kaldırma, günlük rapor gibi olaylarda otomatik, kilit korumalı e-posta. Müşteriye kazara mail gitmesini engelleyen “mail kilidi” katmanıyla.
- excel-rapor-uretimi — İş arşivini süzüp tek tıkla Excel/PDF’e döker; Türkçe karakter ve tarih tuzakları çözülmüş. Yönetime/müşteriye düzenli rapor sunan her projede.
- pilot-gruptan-sirket-geneline-yayginlastirma — Tek müşteri pilotundan ikinci müşteriye, oradan çok tesise güvenli yayılma disiplini (staging doğrulaması, veri göçü, kademeli terfi).
İş Etkisi / Sonuç
Canlıda (erp.rhinorunner.net), Nuh Çimento operasyonu gerçek veriyle çalışıyor: 2021-2026 arası ~1000
geçmiş iş göç ettirildi, 1 Ocak itibarıyla sahada duran iskele sayısı müşterinin beklediğiyle birebir
çıktı (224). İkinci müşteri (Akçansa) canlıya alındı; şef ve ekip tek hesapla girip iki tesis arasında
geçiş yapıyor, verileri veritabanı düzeyinde izole. Müşteriye giden günlük rapor artık elle
hazırlanmıyor — günün tiklerinden derleniyor, fotoğrafları gömülü olarak gidiyor. Somut kullanım/tasarruf
metrikleri müşteri tarafında [?].
Ekran görüntüleri
— Şantiye panosu (kovalar + kurulu metriği + aksiyon kuyruğu)
— Kurulu İskeleler (Excel benzeri süzgeç + çok kolonlu sıralama + vade paneli)
— Saha kullanıcısının mobil adım listesi
— Saha haritası (kurulu iskele + sahada bırakılmış malzeme)
— Müşteriye giden günlük rapor maili (gömülü fotoğraflı)
— “İskele kuruldu” bildirimi (iş emri + onay formu thumbnail)
— Müşteri (tenant) geçiş seçicisi (sidebar logo dropdown)
Teknik Detaylar (geliştiriciler için)
- Monorepo:
packages/domain(Zod şemaları + durum makinesi + K1–K12 kuralları, UI/API’den bağımsız, kabul kriteri olarak test edilir),apps/api(NestJS 11 + Prisma 7 + Postgres 17),apps/web(Vite + React 19 + Tailwind v4 + PWA). - Tek container: API SPA’yı da aynı origin’den servis eder → CORS yok, cookie oturumu sorunsuz, tek deploy/rollback birimi.
- Multi-tenant izolasyon: Postgres RLS + bağlantı düzeyinde
app.site_id(options=-cile bağlantıya gömülü, “SET’i unutmak” imkânsız). Uygulama yetkisizmoderp_approlünü üstlenir;moderp(superuser) yalnız göç + yedek için. Fail-closed: kapsam yoksa hiçbir satır dönmez. - Kanıt zinciri (K8): her fotoğraf bir iş + adım + tarih/saate bağlı;
photos/audit_logüzerinde UPDATE/DELETE reddeden DB trigger’ları (append-only, T4). Müşteri mailindeki fotoğraflar HMAC imzalı, süreli, oturumsuzp/:nobağlantısıyla. - Offline-first (T1): service worker uygulama kabuğunu + API okumalarını önbelleğe alır; yazma
komutları
clientCommandId’li idempotency zarfıyla outbox’a düşer. - Kimlik: telefon + argon2id, 90 günlük oturum (sinyalsiz açılış için), admin temsil (impersonation) — temsil sırasında yetki ve kapsam tamamen hedef kullanıcınındır.
- Mail: useSend (AWS SES), tek çıkış noktası + varsayılan-kilitli “mail kilidi” (müşteriye kazara mail gitmesini engeller); günlük rapor/kuruldu/yeşil kart mailleri, gömülü base64 thumbnail + PDF eki.
- Deploy: Coolify + Docker;
main→ staging,productiondalı → üretim (ayrı DB/MinIO/mail); göçler container açılışında (prisma migrate deploy), rol yetkileri her açılışta idempotent uygulanır.
Tekrar Kullanım Notları
Strateji: Bu proje, “sahadaki işi olduğu anda kanıtıyla kaydet, resmî çıktıyı otomatik üret” kalıbının en olgun örneği. Aynı üçlü — offline-first saha PWA + değişmez kanıt zinciri + operasyondan otomatik rapor — inşaat şantiyesi, tesis bakımı, lojistik teslimat, denetim/uyum saha ekipleri gibi pek çok senaryoya taşınır. Bağlantı düzeyi RLS multi-tenant sınırı, birden çok kuruma aynı ürünü satan her B2B SaaS’ta doğrudan kullanılabilir.
Teknik: İş kuralları mutlaka tek kaynakta (packages/domain) kalmalı — bu repoda tekrar tekrar
kanıtlandı ki aynı kural iki yerde yazıldığında er ya da geç ayrışıyor. RLS’in fiilen çalışması için
uygulamanın yetkisiz rolü üstlenmesi şart (superuser RLS’i baypas eder). Offline-first’ün “yazma”
kadar “okuma” yarısı da baştan düşünülmeli. Mail gönderimi çok müşteride kilidi müşteri alan adlarıyla
birleştirmeli, yoksa yeni müşteride kazara gerçek mail riski doğar.