first commit
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,80 @@
|
||||
# Progress Log
|
||||
|
||||
Faz tanımları için [ROADMAP.md](./ROADMAP.md). Bu dosya ne yapıldığını, ne yapılmadığını ve bilinen sınırlamaları takip eder — faz atlarken buraya bakıp neyin gerçek neyin stub olduğunu hatırlamak için.
|
||||
|
||||
## Faz 0 — Altyapı ✅ (2026-08-19)
|
||||
|
||||
- pnpm monorepo: `apps/api` (Fastify), `apps/web` (Next.js), `apps/mobile` (Expo Router), `packages/shared`
|
||||
- `apps/api`: health check + PRD §23'teki endpointlerin stub'ları
|
||||
- `apps/web`: host-header tabanlı wildcard subdomain middleware, `/menu/[slug]` route
|
||||
- `apps/mobile`: Expo Router iskeleti, onboarding stub ekranları
|
||||
- `supabase/migrations/20260819000000_initial_schema.sql`: PRD §22'deki 17 tablo, RLS açık, owner-scoped + published-menu public read policy'leri
|
||||
- `supabase/seed.sql`: 5 başlangıç teması
|
||||
- Doğrulama: `tsc --noEmit` tüm app'lerde temiz, API `/health` gerçekten çalıştırılıp test edildi
|
||||
|
||||
## Faz 1 — Manuel akış ✅ (2026-08-19)
|
||||
|
||||
Hedef: Restoran sahibi mobil uygulamada elle veri girip gerçek bir QR menüyü yayınlayabilsin. **Karşılandı ve gerçek Supabase Cloud projesine karşı canlı test edildi.**
|
||||
|
||||
- [x] API: auth middleware (Supabase JWT doğrulama, `requireAuth`/`requireRestaurantMember`) + restaurant CRUD
|
||||
- [x] API: menu/category/item CRUD + publish/unpublish (`menus`, `menu-categories`, `menu-items` route'ları)
|
||||
- [x] API: QR üretimi (PNG/SVG, `/q/:id` stabil redirect URL ile — PRD §12)
|
||||
- [x] API: `/me/restaurant` — mobile cold-start rehydration için
|
||||
- [x] Supabase: Faz 1 RLS policy migration'ı (`20260819010000_public_menu_access.sql`)
|
||||
- [x] Web: gerçek public menü render (Supabase'ten canlı veri, 5 zengin tema desteği, canlı arama, sticky kategori barı, ürün detay modalı)
|
||||
- [x] Web: `/q/[id]` QR redirect route'u
|
||||
- [x] Mobile: auth ekranları (email login/register) + Supabase client (AsyncStorage session)
|
||||
- [x] Mobile: restoran onboarding formu → API'ye bağlı
|
||||
- [x] Mobile: menü editörü (kategori/ürün CRUD, yayınla butonu) — `apps/mobile/src/app/menu/index.tsx`
|
||||
- [x] Mobile: QR ekranı (üret, göster, native share) — `apps/mobile/src/app/menu/qr.tsx`
|
||||
|
||||
## Faz 2 — AI Menu Scanner ✅ (2026-08-19)
|
||||
|
||||
Hedef: Menü fotoğrafını çekip/yükleyip AI ile saniyeler içinde dijitalleştirmek, onaylayıp canlı menüye aktarmak.
|
||||
|
||||
- [x] Shared: AI çıkarma (`AiExtractedCategory`, `AiExtractedItem`), yanıt (`AiImportResponse`) ve uygulama (`AiImportApplyPayload`) veri sözleşmeleri.
|
||||
- [x] API: `apps/api/src/lib/ai-scanner.ts` — Gemini 1.5 Flash Vision, OpenAI GPT-4o Vision ve akıllı mutfak sezgisel fallback motoru.
|
||||
- [x] API: `POST /menus/:id/import-ai` — menü görselini analiz eder, `ai_imports` ve `ai_import_items` denetim loglarını oluşturur, confidence skorları hesaplar.
|
||||
- [x] API: `GET /ai-imports/:id` — kaydedilmiş import durumunu döner.
|
||||
- [x] API: `POST /ai-imports/:id/apply` — AI Review ekranından onaylanan/düzenlenen kategori ve ürünleri menüye (`menu_categories`, `menu_items`) topluca yazar.
|
||||
- [x] Mobile: `expo-image-picker` entegrasyonu (kamera & galeri izinleri ve fotoğraf seçimi).
|
||||
- [x] Mobile: `apps/mobile/src/app/(onboarding)/scan.tsx` — Menü Fotoğrafı Çek / Galeriden Seç ve aşamalı AI analiz animasyonu ekranı (Adım 2 & 3).
|
||||
- [x] Mobile: `apps/mobile/src/app/(onboarding)/ai-review.tsx` — AI Review & Onay ekranı (Adım 4):
|
||||
- Kategori bazlı ürün listesi
|
||||
- Düşük güven skorlu öğeler için sarı uyarı rozeti (`⚠️ Düşük Güven (Fiyatı Kontrol Edin)`)
|
||||
- Anında ürün adı, fiyat ve açıklama düzenleme
|
||||
- Kategori/ürün silme ve ekleme
|
||||
- "✓ Menüyü Onayla ve Kaydet" butonu ile menüye aktarma
|
||||
- [x] Mobile: `apps/mobile/src/app/menu/index.tsx` içerisine "✨ AI ile Menü Fotoğrafı Tara" tetikleyicisi.
|
||||
- [x] Mobile: `apps/mobile/src/app/account/index.tsx` — Hesabım & Restoran Ayarları ekranı:
|
||||
- Kullanıcı profili ve aktif restoran durumu
|
||||
- Restoran adı, telefon ve adres güncelleme (`PATCH /restaurants/:id`)
|
||||
- Canlı menü linki kopyalama ve tarayıcıda açma
|
||||
- 5 Temadan birini seçip menüye anında uygulama (`GET` / `PUT /restaurants/:id/theme`)
|
||||
- Abonelik plan durumu
|
||||
- Çıkış yapma (Sign out) ve oturum temizleme
|
||||
|
||||
## Faz 3 — Web Frontend & 5 Menü Şablonu Engine ✅ (2026-08-20)
|
||||
|
||||
- [x] Web: `apps/web/src/app/page.tsx` — Lüks Menulio SaaS Landing Page (Hero, 5 Şablon vitrini, Nasıl Çalışır, İstatistikler, Canlı Demo linkleri).
|
||||
- [x] Web: `apps/web/src/lib/theme.ts` — 5 Ayrı Tasarım Şablonu Tanımları:
|
||||
1. 🌟 **Elegant Gold** (Fine dining & lüks restoranlar - Altın & Krem, serif tipografi)
|
||||
2. 💎 **Modern Sapphire** (Kafe & Fast-Casual - Mavi safir & beyaz, 2'li grid layout)
|
||||
3. 🌙 **Luxury Dark** (Gece kulübü & Kokteyl bar - Obsidian & Kehribar lüks mod)
|
||||
4. ❄️ **Nordic Minimal** (Butik kahveci & fırın - Sade monokrom liste mizanpajı)
|
||||
5. 🍷 **Classic Bistro** (Meyhane & Trattoria - Toskana bordo & rustik doku)
|
||||
- [x] Web: `apps/web/src/components/TemplateGalleryClient.tsx` & `/templates` — İnteraktif şablon galerisi ve canlı telefon simülatörü.
|
||||
- [x] Web: `apps/web/src/app/demo/page.tsx` — Tam ekran interaktif demo menü.
|
||||
- [x] Mobil & API: Yerel geliştirme ortamına uyumlu URL ve QR mimarisi (`http://localhost:3000/menu/[slug]`).
|
||||
- [x] Mobil: `ThemeSelectorSheet.tsx` — Menü editöründen tek tıkla 5 şablondan birini seçme ve anında aktifleştirme.
|
||||
- [x] Mobil: Ürün Görseli Ekleme & Düzenleme (`expo-image-picker` ile `AddItemModal` ve `ItemDetailSheet` içinde galeri seçimi ve canlı önizleme).
|
||||
- [x] Mobil: `MenuItemCard.tsx` — Menü ürün kartlarında görsel küçük resim (thumbnail) desteği.
|
||||
- [x] Mobil: `AccountScreen.tsx` — Restoran Logosu yükleme/değiştirme ve detaylı restoran bilgileri güncelleme.
|
||||
- [x] Mobil: Alt barda kalıcı "👁️ Önizle" butonu ile tek tıkla canlı menüyü tarayıcıda açma.
|
||||
- [x] Web: `apps/web/src/components/PublicMenuClient.tsx` — Anında arama, masa numarası parametresi (`?table=X`), garson çağır / hesap iste floating barı, ürün detay modalı ve canlı tema değiştirici çekmecesi.
|
||||
|
||||
**Kapsam dışı bırakılanlar (bilinçli, sonraki fazlara ertelendi):**
|
||||
- Apple/Google login (V1.5+) — sadece email auth
|
||||
- Custom domain (V1.5) — sadece otomatik subdomain
|
||||
- Abonelik/RevenueCat (Faz 5) — bu fazda erişim kısıtı yok
|
||||
- Logo yükleme (media/storage akışı V1.5)
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
# AI QR Menü SaaS — Ürün Roadmap & Faz Planı
|
||||
|
||||
> Bu doküman [AI_QR_Menu_SaaS_PRD.md](./AI_QR_Menu_SaaS_PRD.md) temel ürün dokümanının üzerine inşa edilmiştir. PRD "ne inşa ediyoruz"u tanımlar, bu doküman "hangi sırayla ve ne zaman" inşa ediyoruz'u tanımlar. Ne tamamlandığının detayı için [PROGRESS.md](./PROGRESS.md).
|
||||
>
|
||||
> **Durum:** Faz 0 ✅ · Faz 1 ✅ (2026-08-19) · Faz 2'ye başlanmadı.
|
||||
|
||||
## Yaklaşım
|
||||
|
||||
MVP önce, sonra kademeli genişleme. MVP içinde bile önce **manuel akış** (AI'sız) kurulur — amaç mobile↔API↔Supabase↔public web↔domain↔QR zincirinin uçtan uca çalıştığını en erken kanıtlamaktır. AI, bu iskelet üzerine eklenir; iskeleti riske atmaz.
|
||||
|
||||
---
|
||||
|
||||
## MVP (V1)
|
||||
|
||||
Hedef: Restoran sahibi mobil uygulamayla hesap açabilsin, menü fotoğrafını çekebilsin, AI dijitalleştirsin, tema seçip yayınlayabilsin, QR alabilsin, abone olabilsin.
|
||||
|
||||
### Faz 0 — Altyapı
|
||||
- Monorepo yapısı (mobile / api / public-web)
|
||||
- Supabase local + production şema: users, restaurants, restaurant_members, locations, menus, menu_categories, menu_items, menu_item_options, themes, restaurant_themes, domains, qr_codes, ai_imports, ai_import_items, subscriptions, analytics_events, media
|
||||
- Auth: email, Apple, Google
|
||||
- Node.js API iskeleti (auth middleware, error handling, temel endpointler)
|
||||
|
||||
### Faz 1 — Manuel akış (iskelet doğrulama)
|
||||
- Restoran oluştur / düzenle (isim, logo, telefon, adres)
|
||||
- Kategori/ürün manuel CRUD (mobil)
|
||||
- Otomatik subdomain ataması (slug normalize, benzersizlik)
|
||||
- Public web: 1 varsayılan tema ile menü render
|
||||
- QR kod üretimi (PNG/SVG)
|
||||
- **Çıkış kriteri:** Bir restoran sahibi elle veri girip gerçek bir QR menüyü yayınlayabiliyor.
|
||||
|
||||
### Faz 2 — AI Menu Scanner
|
||||
- Kamera / galeri / çoklu fotoğraf yükleme
|
||||
- AI extraction pipeline (kategori/ürün/fiyat + confidence skoru)
|
||||
- AI Review ekranı — sonuç asla direkt yayınlanmaz, kullanıcı onaylar/düzeltir
|
||||
- `ai_imports` / `ai_import_items` kayıt altına alma (hata analizi, model değişimi için)
|
||||
- Düşük confidence uyarısı ("⚠ Fiyatı kontrol edin")
|
||||
|
||||
### Faz 3 — Theme Engine (minimal)
|
||||
- 2-3 başlangıç teması (örn. Elegant, Modern, Minimal)
|
||||
- Theme config şeması (JSON), data/presentation ayrımı
|
||||
- Mobilden preview
|
||||
|
||||
### Faz 4 — QR & Otomatik Domain
|
||||
- QR: PNG/SVG export, paylaş, yüksek çözünürlük baskı
|
||||
- QR dinamik URL mantığı — menü/domain değişse bile QR bozulmaz
|
||||
- Otomatik subdomain (custom domain V1.5'e ertelendi)
|
||||
|
||||
### Faz 5 — Abonelik
|
||||
- RevenueCat entegrasyonu (`menu_pro_monthly`, `menu_pro_yearly`)
|
||||
- 7 gün free trial
|
||||
- Entitlement + webhook doğrulama (backend authoritative, mobil local state güvenilmez)
|
||||
- Subscription lifecycle: ACTIVE → GRACE PERIOD → SUSPENDED (veri silinmez, public menü geçici kapanır)
|
||||
|
||||
### MVP'ye ek düşük maliyetli özellikler (Faz 2-3 içine serpiştirilir)
|
||||
- **Alerjen / diyet etiketleme** (vegan, glutensiz, acı seviyesi) — küçük DB eklentisi, satış argümanı güçlü
|
||||
- **En çok satan ürün rozeti** — analytics_events'ten otomatik türetilir, ekstra veri girişi gerektirmez
|
||||
|
||||
### MVP Başarı Kriteri
|
||||
PRD bölüm 30'daki kriterler + Ana KPI: **kayıt olan restoranın ilk menüsünü yayınlama oranı** (signup → restaurant → photo → AI → approve → publish → QR → paid funnel'ı takip edilir).
|
||||
|
||||
---
|
||||
|
||||
## V1.5 — İlk Genişleme
|
||||
|
||||
- Custom domain bağlama + DNS verification (CNAME) + Cloudflare SSL
|
||||
- Tam analytics: ürün/kategori bazlı görüntülenme, saatlik yoğunluk, dil kullanımı, QR taramaları
|
||||
- Push notifications ("Menünüz 30 gündür güncellenmedi", "Aboneliğiniz 3 gün sonra yenilenecek", "Bugün 250 kez görüntülendi")
|
||||
- Çoklu dil: TR/EN/DE/AR, restoran tarafından düzenlenebilir çeviri
|
||||
- 5 temaya tamamlama (Elegant, Modern, Minimal, Dark, Classic)
|
||||
- AI açıklama/görsel öneri zenginleştirme (AI, ürün açıklaması taslağı önerir, görsel önerir — restoran onaylar)
|
||||
- Zaman bazlı menü (kahvaltı/öğle/akşam otomatik geçiş)
|
||||
- QR masa materyali üretimi (masa standı / A4 poster PDF, AI image generation ile)
|
||||
- Menü tazelik skoru / gamification (güncelleme dürtmesi, retention için)
|
||||
- Offline/PWA cache — zayıf wifi ortamlarında son yüklenen menü açılabilir
|
||||
|
||||
## V2 — Büyüme Motorları
|
||||
|
||||
- **Zincir/şube desteği** — DB zaten `Restaurant → Location` olarak tasarlı, sadece UI + pricing katmanı eklenir. Yüksek ARPU segmenti.
|
||||
- **Ajans/reseller white-label modeli** — ajanslar müşterileri adına çoklu restoran portföyünü tek hesaptan yönetebilir
|
||||
- **Referral programı** — restoran getir, indirim kazan (growth loop)
|
||||
- **Menü versiyon geçmişi / geri alma** — AI hatalarına karşı güvenlik ağı, audit
|
||||
- **Google review widget** — public menüden Google Maps yorumuna yönlendirme
|
||||
- **Sosyal paylaşım kartı üretimi** — ürün başına otomatik Instagram post görseli (fiyat + QR ile); restoran paylaştıkça marka (`menu.x.com`) organik yayılır
|
||||
- **Turist modu** — tarayıcı diline/lokasyona göre otomatik dil + tahmini döviz kuru gösterimi (resmi değil, tahmini). Turistik bölge restoranları için güçlü farklılaştırıcı.
|
||||
- **Fiyat önerisi / pazar karşılaştırması** — AI, bölgesel fiyat verisiyle "bu ürün bölge ortalamasının altında/üstünde" içgörüsü sunar; premium pakete özel data ürünü
|
||||
|
||||
## V3 — Platform / Uzun Vade
|
||||
|
||||
PRD bölüm 28'deki roadmap:
|
||||
- Online sipariş, masa siparişi
|
||||
- Basit "garson çağır" butonu (tam POS değil, sadece bildirim — V3'e ucuz bir ön adım)
|
||||
- Kitchen Display
|
||||
- Rezervasyon
|
||||
- Loyalty, kampanya yönetimi
|
||||
- POS entegrasyonu
|
||||
|
||||
Bu fazların hiçbiri MVP felsefesini ("AI yardımcıdır karar verici değildir", "public menu hızlıdır, hesap açmaz") bozmamalı; sipariş/rezervasyon gibi özellikler ayrı, opsiyonel modüller olarak eklenmelidir.
|
||||
|
||||
---
|
||||
|
||||
## Faz Bağımlılık Notları
|
||||
|
||||
- Faz 2 (AI) → Faz 1'in veri modeline bağımlı, paralel başlatılamaz
|
||||
- Faz 4 (Custom domain, V1.5) → Cloudflare altyapısı Faz 0'da kurulmalı ama aktif kullanım V1.5'e ertelenir
|
||||
- Faz 5 (Abonelik) → RevenueCat webhook'u backend'de Faz 0'daki API iskeletine bağımlı, ama ürün tarafında en son entegre edilebilir (trial süresince ücretsiz kullanım MVP testi için yeterli)
|
||||
- Zincir/şube desteği (V2) → DB şeması Faz 0'da zaten `Location` katmanıyla hazırlandığı için ek migration riski düşük
|
||||
Reference in New Issue
Block a user