Synaplan
開源 AI 平台,供企業使用:自行託管的 AI 代理、符合 GDPR 的聊天機器人小工具、RAG 知識庫、WhatsApp 與 Outlook AI、MCP、多模型路由。Docker、Kubernetes 或託管於 Germ
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證Çok kiracılı restoran yönetimi: POS, mutfak ekranı, reçeteli stok, RLS ile izolasyon
翻譯準備中
正在載入完整 README。
檢視完整 README ↗Çok kiracılı, rol bazlı bir restoran yönetim sistemi: sipariş alma, mutfak ekranı, kasa, reçeteye dayalı stok düşümü, maliyet kontrolü, satın alma ve denetim kaydı. Erişim kontrolü uygulamada değil, veritabanında (PostgreSQL Row Level Security) zorunlu.
Sorun. Küçük ve orta ölçekli restoranlar sipariş, mutfak, kasa ve stok için ayrı araçlar ya da kâğıt kullanır. Satış stoktan düşmez, reçete maliyeti ve zayiat bilinmez; birden fazla şubede kimin hangi veriyi gördüğü kontrol edilemez.
Çözüm. Tek bir sistemde masadan siparişe, mutfak ekranından kasaya ve gün sonuna kadar akış. Her satış reçeteye göre stoktan düşer, teorik ve fiili tüketim karşılaştırılır. Patron canlı ciroyu ve bekleyen onayları telefondan görür.
Durum. Çekirdek akışlar çalışıyor ve demo olarak yayında. Yazarkasa, e-Arşiv ve paket platformu entegrasyonları adaptör arayüzüyle hazır ama ticari anlaşma gerektirdiği için şimdilik mock (ayrıntı aşağıda).
force row level security; uygulamadaki bir hata başka restoranın verisini açamaz. pgTAP testleriyle doğrulanır.| Garson: salon ve masalar | Mutfak ekranı |
|---|---|
| Patron: raporlar | Patron: telefonda |
|---|---|
| Mod | Ne zaman | Veritabanı |
|---|---|---|
| Demo | DATABASE_URL tanımlı değilken (Vercel) | Sunucu sürecinde çalışan PGlite; her açılışta migration'lar ve demo verisi yüklenir, birkaç saatte bir sıfırlanır |
| Yerel | DATABASE_URL tanımlıyken | Docker'daki PostgreSQL 17; veri kalıcıdır |
İki modda da aynı migration'lar, aynı RLS politikaları ve aynı tetikleyiciler çalışır; dış
bir servise (Supabase vb.) bağlantı yoktur. Demo girişinde her rol için tek tıkla giriş
düğmesi vardır; bütün demo hesaplarının şifresi demo1234.
/m): canlı ciro, bekleyen onaylar, olay akışıAşağıdakiler adaptör arayüzüyle hazır ama mock çalışıyor; gerçek bağlantı ticari anlaşma veya sertifika gerektiriyor:
| Entegrasyon | Durum |
|---|---|
| ÖKC (yeni nesil yazarkasa) fişi | Mock (src/lib/integrations/fiscal-device.ts) |
| e-Arşiv fatura (GİB) | Mock (src/lib/integrations/e-invoice.ts) |
| Yemeksepeti / Getir / Trendyol Go | Mock (src/lib/integrations/delivery-channel.ts) |
| Bildirim e-postaları | Kuyruk ve kurallar gerçek, gönderim mock (src/lib/notifications/process-queue.ts) |
Fiş ve hakediş mutabakatı bu yüzden Excel ile içe aktarılan verilerle yapılır.
Next.js 16 (App Router)
Server Component'ler → sayfa verisini oturumdaki kullanıcının kimliğiyle okur
Server Action'lar → yazma işlemleri; tenant_id her zaman doğrulanmış oturumdan
src/proxy.ts → nonce'lu CSP, oturum tazeleme, rol bazlı yönlendirme
src/lib/db
client.ts → supabase-js istemcileri; istekleri ağa değil süreç içi handler'a gönderir
rest.ts → PostgREST sorgularını (select, iç içe ilişkiler, filtreler, upsert) SQL'e çevirir
auth.ts → şifreyle giriş, token yenileme, personel hesabı; HS256 JWT
storage.ts → menü görselleri storage.objects tablosunda
engine.ts → DATABASE_URL varsa node-postgres, yoksa PGlite
PostgreSQL
RLS → her tabloda enable + force; politikalar JWT claim'lerinden okur
custom_access_token_hook → JWT'ye tenant_id / branch_id / app_role yazar
Trigger'lar → durum geçişleri, append-only denetim kaydı, bildirim üretimi
db/compat.sql → migration'ların beklediği roller ve auth/storage şemaları
Sorgu katmanı olarak supabase-js kullanılıyor, ama arkasında Supabase yok: her istek
transaction içinde anon, authenticated ya da service_role rolüne geçip JWT
claim'lerini request.jwt.claims olarak ayarlar, böylece RLS politikaları Supabase'teki
gibi çalışır.
tenant_id ve force row level security; kiracı kimliği istemciden alınmazsrc/lib/auth/access.ts, src/proxy.ts) kullanıcı deneyimi içindir; veri erişimini RLS belirlerAUTH_SECRET ile imzalanır; arka arkaya 5 hatalı girişte hesap 15 dakika kilitlenirservice_role yalnızca sunucuda ve yalnızca kullanıcı kimliğiyle yapılamayan işlerde kullanılır (QR sipariş, stok düşümü, personel hesabı); modül server-only ile istemciye girmesi engellenirnumeric(14,4); fiyat ve KDV oranı satır anında dondurulurAçık bir sipariş veya sayım ekranındaki mutasyonlar IndexedDB'de kuyruğa alınır ve client_key
idempotency anahtarıyla senkronlanır. Service worker daha önce ziyaret edilmiş sayfaları soğuk
başlangıçta önbellekten açar. Hiç ziyaret edilmemiş bir sayfa ya da yeni masa açmak offline çalışmaz.
Gereken: Node.js 22, Docker.
Tamamı Docker'da:
docker compose up --build # http://localhost:3000
Geliştirme (veritabanı Docker'da, uygulama yerelde):
npm install
cp .env.example .env.local # DATABASE_URL ve AUTH_SECRET
docker compose up -d db
npm run db:setup # migration'lar + demo verisi
npm run dev
npm run db:reset veritabanını silip baştan kurar. DATABASE_URL boş bırakılırsa
npm run dev demo modunda açılır; Docker gerekmez.
npm run dev # geliştirme sunucusu
npm run build # üretim derlemesi
npm run typecheck # tsc --noEmit
npm run lint
npm test # Vitest: para, birim, reçete, fiyat, erişim ve JWT kuralları
npm run test:e2e # Playwright; yerel modda çalışır (DATABASE_URL gerekli)
npm run load-test # yoğun servis yük testi; yerel modda çalışır
npm run db:setup # migration'ları uygular, boşsa demo verisini yükler
Veritabanı güvenlik testleri db/tests/ altında pgTAP ile yazılmıştır
(kiracı izolasyonu, rol yetkileri, stok ve sipariş kuralları); pgTAP kurulu bir
Postgres'te psql -f ile çalıştırılır; CI her push'ta 123 testi de çalıştırır.
Next.js 16 · React 19 · TypeScript · Tailwind CSS v4 · PostgreSQL 17 (RLS, trigger'lar) · PGlite · supabase-js · Zod · ExcelJS · Vitest · Playwright · Docker