24 sayfalık, makrolu bir Excel dosyasının yerine Türkiye'deki özel okullar için ortak çalışılabilir, OWASP sertleştirilmiş bir web uygulaması koyan çok kiracılı bir okul programlama platformu.
Rol
Tek başına geliştirici — arka uç, ön yüz ve veritabanı tasarımı
Tarih
Nis 2025 – May 2026
Yığın
Spring Boot
Kotlin
PostgreSQL
Timefold Solver
React
TypeScript
Docker
Traefik
Problem
Türkiye'deki bir üniversite hazırlık okulu, tüm ders programını; 143 öğrenciyi, 20 öğretmeni, 27 sınıfı ve 24.444 ders saatini kapsayan tek bir 24 sayfalık makrolu Excel dosyasından yürütüyordu. Kırılgan, tek kullanıcılı ve öğretmenler, öğrenciler ve velilerle güvenle paylaşılması imkânsızdı.
Kısıtlar
▸
Gerçek program verisi zaten Excel dosyasında vardı ve elle yeniden girilmek yerine taşınmalıydı.
▸
Yöneticiler, öğretmenler, öğrenciler ve veliler aynı verinin farklı ve güvenli görünümlerine ihtiyaç duyar — bu yüzden çok kiracılılık ve rol tabanlı erişim temeldir.
Yaklaşım
Şema-bazlı kiracı yalıtımıyla PostgreSQL üzerinde bir Spring Boot + Kotlin monoliti, baş köşesinde geri-al/yinele ve gerçek zamanlı çakışma tespiti olan 3 panelli sürükle-bırak bir program tasarımcısı bulunan bir React + TypeScript SPA'yı besler. Bir Python içe aktarıcı özgün .xlsm dosyasını taşır ve Timefold kısıt çözücüsü haftalık programları üretir.
Önemli kararlar
Çakışma tespitini bir toplu doğrulama adımı olarak değil, gerçek zamanlı modelle
Öğretmen, sınıf ve öğrenci çakışmaları ile öğretmen uygunsuzluğu, kullanıcı sürüklerken yakalanır; tıkla-git kırmızı-halka çözümüyle — böylece program, sonradan doğrulanmak yerine her zaman yapısı gereği doğrudur.
Baştan itibaren OWASP'a göre sertleştir
Hız sınırlama, hesap kilitleme, yenileme-belirteci döndürme, httpOnly çerezler, HSTS ve CSP başlıkları, sunucu tarafı XSS temizleme, bağımlılık taraması ve bir güvenlik-olayı denetim günlüğü yerleşiktir — öğrenci verisi tutan çok rollü bir platform güvenliği isteğe bağlı sayamaz.
Mimari
React ve TypeScript tek-sayfa uygulaması, Traefik üzerinden bir Spring Boot ve Kotlin monolitine ulaşır. Monolit, şema-yalıtımlı PostgreSQL'e kalıcılaştırır, otomatik program sentezi için Timefold çözücüsünü çalıştırır ve özgün Excel dosyasını tek seferlik bir Python içe aktarıcı üzerinden alır.
flowchart TB
spa["React + TypeScript SPA<br/>3-panel drag-and-drop designer"]
traefik["Traefik"]
api["Spring Boot + Kotlin monolith"]
solver["Timefold Solver<br/>ScheduleConstraintProvider"]
db[("PostgreSQL<br/>schema-per-tenant")]
importer["Python .xlsm importer<br/>(one-off migration)"]
spa --> traefik --> api
api --> solver
api --> db
importer --> db
Timefold çözücülü ve tek seferlik Excel içe aktarıcılı, kiracı-başına-şema bir monolit.
Sonuç
Sarnıç, kırılgan tek kullanıcılı bir hesap tablosunu; yöneticiler, öğretmenler, öğrenciler ve veliler için rol duyarlı görünümler, ayrıca Excel/CSV/PDF dışa aktarımı, bir PWA kabuğu ve Türkçe öncelikli iki dilli arayüzle gerçek, ortak çalışılabilir, çok kiracılı bir web uygulamasına dönüştürdü. Python içe aktarıcı, ilk içe aktarımda özgün dosyadan 13.069 kaydı taşıdı.
Rakamlarla
24,444 Kaynak dosyadaki ders saati
13,069 İlk içe aktarımda taşınan kayıt
50 Geri-al/yinele geçmiş derinliği
5 Rol (yönetici · öğretmen · öğrenci · veli · izleyici)
schema-per-tenant Kiracı yalıtımı
Aşağıdaki yapılandırılmış bölümler Türkçe mevcuttur; ayrıntılı anlatım İngilizce yazılmıştır. Tam Türkçe çeviri henüz mevcut değildir.
Derinlemesine
Sarnıç is named after the İstanbul cisterns — the underground reservoirs that
collect water and distribute it where it is needed. The platform does the same
with school schedules: it collects timetable data and distributes the right view
to admins, teachers, students, and parents.
From a 24-sheet spreadsheet to a real application
The project was born from a concrete pain: a Turkish exam-prep school was
managing 143 students, 20 teachers, 27 sections, and 24,444 schedule
entries out of a single macro-enabled Excel workbook with 24 sheets. A
spreadsheet that large is fragile, single-user, and unsafe to hand to teachers
or parents. The job was to turn it into a real, collaborative web application
without losing the data already in it — so a Python importer reads the
original .xlsm directly and migrated 13,069 entries on the first import.
The schedule designer
The centerpiece of the frontend is a 3-panel drag-and-drop schedule
designer with undo/redo backed by a 50-action history. The important design
choice is that conflict detection runs in real time as the user drags:
teacher, section, and student double-bookings — plus teacher unavailability —
surface immediately with click-to-navigate red-ring resolution. The schedule is
correct-by-construction rather than validated after the fact, and the Timefold
constraint solver (ScheduleConstraintProvider, pinning support,
SolverController) can synthesize weekly schedules automatically.
Multi-tenant and OWASP-hardened
Because the same data must be visible to five different roles, multi-tenancy and
access control are foundational, not bolted on: schema-per-tenant isolation,
tenant-scoped JWTs, a role-aware sidebar, and useCanEdit guards. Security is
built in — rate limiting, account lockout, refresh-token rotation, httpOnly
cookies, HSTS + CSP headers, server-side XSS sanitization, dependency scanning,
and a security-event audit log.
Rounded out with Excel/CSV/PDF export (strategy-pattern renderers and print
templates including the MEB format), a PWA shell, dark/light/system theming, and
a Turkish-first bilingual UI across 16+ pages, Sarnıç is the spreadsheet’s
replacement rather than its companion. The source is on
GitHub.