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