Çok kiracılı (multi-tenant), **offline-first** kafe/restoran POS + yönetim sistemi. Monorepo: `apps/web` (React PWA), `apps/api` (NestJS), `packages/shared` (ortak tip + zod + maliyet çekirdeği).
%0 uygulama ilerlemesi
Diller
TypeScript, Dockerfile, JavaScript, HTML, CSS
Notlar
Mimari detayları düzenle
Ana dil
TypeScript
QR ile musteri self-kayit + benzersiz musteri no
feat(customers): QR ile musteri self-kayit + benzersiz musteri no - Sema: Customer.musteriNo(unique)/email/passwordHash; @@unique([cafeId,email]) - Public (auth yok) endpoint'ler: POST /public/customers/:slug/register ve /login (customer_crm acikcsa; bcrypt sifre; benzersiz musteriNo uretimi) - Kafe paneli: GET /customers/qr-slug + "Musteri kayit QR'i" karti (QR + link + kopyala) - Public sayfa /kayit/:slug: mobil uyumlu kayit/giris; sonucta musteri no + puan durumu - Musteri liste/detayda musteriNo + email gosterimi Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Merge landing page site structure into main
Merge landing page site structure into main Adds animated, SEO-friendly public landing site (home, özellikler, fiyatlandırma, iletişim) while leaving the existing app/admin/login flows untouched.
Add animated, SEO-friendly landing site (home, özellikler, fiyatlandırma, iletişim)
Add animated, SEO-friendly landing site (home, özellikler, fiyatlandırma, iletişim) Kök rotayı public tanıtım sitesine çevirir: hero + modül vitrini + interaktif uygulama önizlemesi (gerçek renk/bileşenlerle yeniden oluşturulmuş panel görünümleri), ayrı özellik derinlemesine sayfası, plan karşılaştırmalı fiyatlandırma sayfası ve doğrulamalı iletişim formu. Scroll-reveal animasyonları, sayfa başı meta/OG/JSON-LD ve robots.txt/sitemap.xml eklendi.
urun ekleme kategorileri ust sekme duzeni
feat(siparis): urun ekleme kategorileri ust sekme duzeni - Kategoriler artik ust klasor-sekmesi (referans tasarima gore); secili kategorinin urunleri altta buyuk kutularda. Tema uyumlu renkler (aktif sekmede accent cizgi + kategori renk noktasi, sekmede urun sayisi). - Onceki dikey acilir-kapanir bolum duzeni yerine sekme gecisi. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Bolum 3B — 5 Isletme Zekasi alt-ozelligi tamam
feat(insights): Bolum 3B — 5 Isletme Zekasi alt-ozelligi tamam - price_optimization: saf talepEsnekligi (log-log esneklik, yetersiz veri -> tahmin yok) + 5 unit test (52/52) - cashflow_forecast (bagimli forecast): urun tahmini x fiyat -> haftalik/aylik gelir projeksiyonu - auto_supply_suggestion (bagimli forecast): tahmine dayali siparis taslagi (WhatsApp/e-posta formati, otomatik gonderim YOK) - anomaly_detection: personel bazli iade/indirim/ikram oran anomalisi (z-skor, 2 std) + stok-satis tutarsizligi (forecast israf altyapisi) - multi_branch_benchmark: sube modeli olmadigindan tek-subede pasif bilgi doner - 5 feature kaydi (migration + seed, kategori Isletme Zekasi, forecast bagimliliklari) - Zeka sekmesine 5 alt panel eklendi Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Bolum 3B/1 — menu_engineering (menu muhendisligi)
feat(insights): Bolum 3B/1 — menu_engineering (menu muhendisligi) - Saf classifyMenu (populerlik x karlilik -> Yildiz/Yuk Ati/Bilmece/Kopek, ortalama esikleri, kategori onerileri) + 4 unit test (47/47) - InsightsModule: GET /insights/menu-engineering (ReportsService.productProfitability yeniden kullanildi), @RequireFeature("menu_engineering") - Yeni "Isletme Zekasi" sekmesi (anyFeature gruplu) + Menu Muhendisligi paneli (4 kategori ozet karti + kategori bazli oneri/tablo) Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Bolum 3A frontend — Personel paneli + prim ayar UI
feat(staff): Bolum 3A frontend — Personel paneli + prim ayar UI - Yeni "Personel" sekmesi (anyFeature ile gruplu; alt-ozellikler acikse gorunur) - Alt paneller (her biri kendi feature'ina gore): Satis Takibi (ciro grafik+tablo), Prim/Komisyon (MASTER ayar formu: baz/hesap/dagitim, kademe editoru, indirimli haric, prim-disi kategori secimi) + satir satir donem dokumu, Vardiya Performansi (gun-dilimi) - lib/features.ts: hasAnyFeature; AppShell anyFeature gruplu sekme mantigi - seed: 3A feature kayitlari (kategori+bagimli) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
kategori + bagimlilik (Bolum 1 tamamlama)
feat(features): kategori + bagimlilik (Bolum 1 tamamlama) - Feature.kategori (admin UI gruplama) + Feature.bagimli (bagimli feature key'leri) - FeaturesService: etkin durum = kendi cozumlemesi AND tum bagimliliklar (ozyinelemeli); isEnabled/enabledKeys/listForCafe artik bagimlilik-farkinda - Admin toggle: bagimliligi kapali ozellik acilirken 400 + net mesaj; bagimlilik kapaninca bagimli ozellik otomatik pasiflesir (tutarlilik) - Admin modal: kategoriye gore gruplu; bagimliligi kapali switch disabled + not; hata gosterimi Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Bolum 3A backend — satis takibi + prim + vardiya performansi
feat(staff): Bolum 3A backend — satis takibi + prim + vardiya performansi - Sema: Order.satisPersoneliId (adisyonu acan personel, create'te u.sub), OrderItem.indirim, CommissionSettings tablosu; 3 staff feature satiri (staff_sales_tracking, staff_commission_calc[bagimli], staff_shift_performance) - Saf prim cekirdegi packages/shared/commission.ts (sabit/kademeli, bireysel/ekip) + 8 unit test (43/43 gecti) - StaffService/Controller: GET /staff/sales, commission-settings (GET/PUT), commission (satir satir donem raporu), shift-performance; @RequireFeature gate'li. Prim baz: ciro|kar, haric kategoriler + indirimli kalem dislama. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
admin modul paneli + musteri tarafi gizle/kilitle
feat(features): admin modul paneli + musteri tarafi gizle/kilitle - Admin UI: her isletme satirinda "Moduller" -> switch'li modal; anlik kaydeder (invalidate), kaynak rozeti (tenant/plan/varsayilan). Switch bileseni. - Musteri gate: lib/features.ts (FEATURE_LOCK_MODE "hide"|"lock"), AppShell sekmesi feature'a bagli (kapaliysa gizle veya kilit ikonuyla goster), App.tsx route'u <FeatureGate>; FeatureLocked upsell sayfasi. - AuthUser.ozellikler ile sekme/panel kapisi; kapali modul endpoint'i 403. - Seed: 3 modul + PRO plan_feature + demo kafede forecast_module override acik. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
premium modul feature-flag altyapisi (backend)
feat(features): premium modul feature-flag altyapisi (backend) - Sema: Feature / TenantFeature / PlanFeature (additive migration + 3 modul referans veri + PRO->forecast_module plan varsayilani) - FeaturesService: cozumleme onceligi tenant override > plan > varsayilan; isEnabled/enabledKeys/listForCafe/setTenantFeature/clearOverride - @RequireFeature decorator + global FeatureGuard (kapali modulde 403); ForecastController "forecast_module"e baglandi - AuthUser.ozellikler: acik modul anahtarlari login/me ile frontend'e gider - Admin API: GET /admin/features, GET/PATCH/DELETE /admin/cafes/:id/features - Yeni modul = features tablosuna 1 satir (kod degisikligi gerekmez) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Ongoruler paneli — tahmin gorsel katmani
feat(web): Ongoruler paneli — tahmin gorsel katmani - Yeni "Ongoruler" sekmesi (AppShell + /app/ongorular route, raporlar izinli) - Dort ic panel: * Talep: urun secici + Recharts guven araligi grafigi (7/14 gun) + dusuk/orta/yuksek guven etiketleri + tum urunler ozet tablosu * Stok: siparis onerisi kartlari; bozulabilir kalemlerde ihtiyatli uyari * Israf: anomali kartlari (beklenen/fiili/fazla + siddet) * Personel: saatlik yogunluk-vardiya uyum cubuklari (yetersiz/yeterli/fazla) + vardiya listesi/ekle/sil formu (MASTER) - Yetersiz veri ve veri-kalitesi durumlari kullaniciya net gosterilir - Mevcut UI bozulmadan ayri sekme olarak eklendi Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
API modulu — talep/stok/israf/personel endpoint'leri
feat(forecast): API modulu — talep/stok/israf/personel endpoint'leri - ForecastService: kapanmis adisyonlardan urun x is-gunu seri kurar, saf forecast cekirdegini cagirir, sonucu ForecastSnapshot'a (24s cache) yazar. Agir trafik hesabi snapshot'ta; vardiya ustu-katmani istek aninda canli hesaplanir (vardiya degisince aninda guncel). - Endpoint'ler (raporlar izinli): GET products?days, stock, waste, staffing, overview; POST refresh (MASTER); Vardiya CRUD (GET/POST/DELETE shifts). - Stok onerisi recete uzerinden malzeme tuketimine cevrilir; bozulabilir kalemlerde ihtiyatli. Israf: teorik vs fiili sarfiyat z-skor/oran esigi. - @nestjs/schedule: gunluk 04:00 batch (ForecastCron), serverless'te snapshot bayatlik kontrolu ile tamamlanir. - StockItem create/update artik bozulabilir/rafOmruGun kabul eder. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
tahmin cekirdegi + sema temeli (predictive analytics)
feat(forecast): tahmin cekirdegi + sema temeli (predictive analytics) - Prisma: StockItem.bozulabilir/rafOmruGun alanlari + Vardiya ve ForecastSnapshot modelleri (additive migration, mevcut sema bozulmaz) - packages/shared/forecast.ts: DB'siz saf tahmin fonksiyonlari (hareketli ortalama, ustel duzeltme, haftalik mevsimsellik profili, guven etiketi, israf/z-skor, siparis onerisi, personel-trafik uyumu) - Istatistik varsayimlari (duraganlik/mevsimsellik/yetersiz veri) kod yorumlarinda aciklandi; ForecastMethod stratejisiyle ARIMA/Prophet'e acik - 27 birim testi (apps/api/test/forecast.spec.ts), 35/35 gecti Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012SyR6VCBtW3cyQZXBLTvuc
Y4 (3/3): siparis boy/opsiyon secim diyalogu
Y4 (3/3): siparis boy/opsiyon secim diyalogu - Urun kutusu ana fiyattan ekler; kosedeki ... boy+opsiyon diyalogunu acar - Diyalog: boy (standart/varyant) + opsiyon gruplari (tekli/coklu) + canli fiyat - Ana fiyattan da eklenebilir (onceki: sadece boy fiyati) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Y4 (2/3): menu opsiyon yonetimi UI
Y4 (2/3): menu opsiyon yonetimi UI - Opsiyon/Ekstra Gruplari yoneticisi: grup + secenek (ad/fiyat), tekli/zorunlu - Urun panelinde "Opsiyonlar" ile gruplari urune bagla Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Y4 (1/3): opsiyon/modifier backend
Y4 (1/3): opsiyon/modifier backend - ModifierGroup/Option/MenuItemModifier semasi + migration - Menu: grup/secenek CRUD, urune grup baglama, fullMenu urun modifierGroups doner - Siparis addItem: modifierOptionIds -> ad+fiyat snapshot (urune bagli gruplardan dogrula) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Y1: kalem bazli bolunmus odeme (adet dusurerek)
Y1: kalem bazli bolunmus odeme (adet dusurerek) - OrderItem.odenenAdet (sema+migration); pay-items endpoint (secilen kalemlerden N adet ode) - Odenen adetler tekrar secilemez; hepsi odenince adisyon otomatik kapanir - Odenmis kalem silinemez/adedi azaltilamaz - Adisyonda kaleme dokun -> adet sec; secim yoksa tumu odenir Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Y2: Isletme ayarlari sekmesi + acilis/kapanis saati
Y2: Isletme ayarlari sekmesi + acilis/kapanis saati - Cafe.acilisSaat/kapanisSaat (sema+migration); /settings (MASTER) get/update - Dashboard is-gunune gore: acilis saatinden itibaren; gece satislari ayni gune - Yeni "Isletme Ayarlari" sekmesi: isletme bilgileri + saatler + kullanicilar (Kullanicilar buraya tasindi) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Y3+Y5: dashboard anlik guncelleme + adisyon panel duzeni
Y3+Y5: dashboard anlik guncelleme + adisyon panel duzeni - Realtime AppShell'e tasindi; her islemde dashboard+rapor invalidate (anlik ciro/grafik) - Adisyon paneli: menu buyuk (flex-1, 2-4 sutun), adisyon dar sabit sutun, panel buyutuldu (max-w-6xl) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UX: add color support for menu categories and items
UX: add color support for menu categories and items
UX-F: stok ozel birim/tur (#7)
UX-F: stok ozel birim/tur (#7) - StockItem.tur enum -> String (guvenli cast migration, veri korunur); ozel turler eklenebilir - Kalemler formunda tur ve birim combobox (datalist): varsayilanlari oner + ozel deger yaz - turLabel/turTone fallback (ozel turler kendi adiyla, notr renk) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UX-E: urun boylari/varyant (#3)
UX-E: urun boylari/varyant (#3) - MenuItemVariant modeli + migration (boy sadece fiyati degistirir, maliyet urun recetesiyle ayni) - Menu: urun ici boy editoru + "N boy" rozeti - Siparis: boy secimi (adisyon menu seciciden), OrderItem ad "Urun (Boy)" snapshot - Public menu: boylar + fiyatlari Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UX-C: raporlar ozel tarih araligi (#9) + sayim siralama (#8)
UX-C: raporlar ozel tarih araligi (#9) + sayim siralama (#8) - Raporlarda "Ozel" secenegi + iki tarih arasi date picker (backend from/to hazir) - Yeni sayimda kalemleri Ture/Miktara/Ada gore siralama secici Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UX-B: sidebar acilir/kapanir + mobil uyumluluk (#5,#6)
UX-B: sidebar acilir/kapanir + mobil uyumluluk (#5,#6) - Mobilde hamburger + kayan drawer + backdrop; masaustunde daralt/ac - Dokunmatik hedefler buyutuldu, mobil ust bar - Sidebar disi tum icerik zaten responsive (grid/overflow-x tablolar) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
UX-A: admin geri link, masa yan-yana + isim duzenleme, menu form 70/30 + isim duzenleme
UX-A: admin geri link, masa yan-yana + isim duzenleme, menu form 70/30 + isim duzenleme - Admin login'de "Kafe girisine don" linki (#1) - Masa ekleyince izgara duzeninde yan yana konumlanir, ust uste binmez (#2) - Duzenle modunda masa ismi satir-ici duzenlenebilir (#2.1) - Menu urun ekleme formu isim %70 / fiyat %30 (#4) - Menu urun ismi satir-ici duzenlenebilir (#10) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M10: Sertlestirme
M10: Sertlestirme - Rate limit (@nestjs/throttler): global 120/dk, login 10/dk (brute-force) - Global exception filter (tek bicim hata, 500'de stack sizmaz) - Maliyet cekirdegi testleri (vitest, 8/8): birim cevrimi + Latte §4 + Ikram kenar durumu - EINVOICE_PROVIDER env notu Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M7: PWA / offline-first (kismi)
M7: PWA / offline-first (kismi) - vite-plugin-pwa: installable, service worker, app shell cache - API GET'leri NetworkFirst runtime cache (offline'da son veri gorunur) - Cevrimdisi bant gostergesi (useOnline) - NOT: offline siparis-yazma kuyrugu (Dexie) ayrica ele alinacak (mutasyon idempotency) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M9: e-Adisyon & OKC iskeleti
M9: e-Adisyon & OKC iskeleti - EInvoiceProvider/OkcProvider arayuzleri + Mock + entegrator yer tutucu - Adisyon kapaninca idempotent iletim (orderId unique), kuyruk 60sn'de yeniden dener - Durum takibi (BEKLIYOR/ILETILDI/HATA) + tekrar dene; Raporlar > e-Adisyon sekmesi Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M8: Raporlar & dashboard (M6 gelir/COGS dahil)
M8: Raporlar & dashboard (M6 gelir/COGS dahil) - Dashboard: KPI'lar, saatlik satis (bar), odeme dagilimi (pie), gunun ozeti icgoruler - Urun karliligi: urun bazli adet/ciro/maliyet/kar/marj + Ciro/COGS/Brut Kar ozeti - Nakit akisi: gelir (Ikram haric) vs gider/COGS, net kar/marj, gider CRUD - Malzeme sarfi: satislardan teorik tuketim + maliyet - Tarih araligi (hafta/ay/yil), CSV export Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
README: M4/M5 tamamlandi olarak isaretle
README: M4/M5 tamamlandi olarak isaretle Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M5: Siparis & masa haritasi + realtime
M5: Siparis & masa haritasi + realtime - Masa CRUD + surukle-birak konumlandirma, duzenle modu - Adisyon: kalem ekle/adet/sil (birimMaliyet snapshot ekleme aninda), tasima, iptal - Parcali odeme (Kalan/½/⅓/¼, Nakit/Kart/Ikram), bakiye 0'da otomatik kapanis - Socket.io gateway: kafe odasina anlik yayin (tables/orders changed) - 3 gorunum: masa haritasi, aktif, kapatilan Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
M4: Menu & QR & Recete paneli
M4: Menu & QR & Recete paneli - Menu modulu: kategori/urun CRUD, urun ici recete editoru (canli maliyet/kar/marj/food-cost) - Public QR menu (/m/:slug, auth yok), QR kod uretimi, tema/baslik ayarlari - Marj rozeti + "recete yok" gostergesi; fiyat/recete degisince aninda yansir Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Deploy hedefini Railway'den Render'a tasi
Deploy hedefini Railway'den Render'a tasi - render.yaml (Blueprint) eklendi: Docker build + migrate/seed/start - railway.json kaldirildi - DEPLOY.md + README Render'a gore guncellendi Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
first commit
first commit