Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

315 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DENK

Türk hospitality için QR-tabanlı sipariş + item-level hesap bölüşme SaaS'ı.

"Hesap denk, kafalar rahat."

denkhesap.com · Next.js 16 + Supabase · Proprietary (LICENSE)

⚠️ Bu depo görüntülenebilir ama açık kaynak değildir. Okuyabilir ve inceleyebilirsin; ticari kullanım, türev çalışma ve yeniden dağıtım için yazılı izin gerekir. Ayrıntı: LICENSE.


🎯 Ne yapar

Müşteri masadaki QR'ı okutur → menüden sipariş verir → hesabı kalem kalem, aynı anda, birden fazla kişiyle bölüşür → öder. Kasiyer tek ekrandan onaylar.

İki servis modu:

  • 🍽️ Masa servisi (à la carte) — masaya servis, hesap sonra (kafe, bar, nargile)
  • Self-service — sipariş + öde + pickup numarası (zincir kahveci tarzı)

Ödeme rayları — dürüst tablo

Ray Komisyon Durum
🏦 IBAN havale (kuruş imzası + kasiyer onayı) %0 — para doğrudan işletme IBAN'ına ✅ Çalışıyor
💵 Nakit / kafenin kendi POS'u %0 — DENK paraya dokunmaz ✅ Çalışıyor
💳 Kart (PayTR Pazaryeri) PSP oranı (~%2.5) ⏳ Sandbox onayı bekliyor

DENK bir PSP değildir ve paraya dokunmaz — kart rayında para PSP üzerinden doğrudan işletmenin hesabına gider. DENK'in geliri sabit aylık aboneliktir.


🏗️ Stack

Katman Teknoloji
Frontend Next.js 16 (App Router, RSC, PWA) + React 19 + TypeScript
Backend Supabase (Postgres + Realtime + Auth + Storage + RLS)
Styling Tailwind CSS + Motion (Framer)
Hosting Vercel (Frankfurt edge)
Kart ödeme PayTR Pazaryeri (geliştirme aşamasında)
Email Cloudflare Email Routing → dekont auto-confirm
Push Web Push (VAPID)
OCR tesseract.js (browser-side, TR+EN — sıfır API maliyeti)
Rate limit Upstash Redis (in-memory fallback)
Hata izleme Sentry + kendi telemetri hattı

Veritabanı: 100+ sıralı SQL migration (supabase/migrations/) Test: Vitest (unit) + Playwright (E2E, Chromium + iPhone WebKit)


🚀 Local Setup

git clone https://github.com/SerkanSgap/DENK.git
cd DENK
npm install
cp .env.example .env.local   # Doldur — bkz. .env.example
npx supabase start
npx supabase db reset
npm run dev

Açılış:

  • Müşteri: http://localhost:3000/t/<qr-token>
  • Kasa: http://localhost:3000/admin
  • Counter display: http://localhost:3000/c/<venue-slug>
  • Demo (DB'siz): http://localhost:3000/demo

Gerekli ortam değişkenlerinin tam listesi ve nasıl üretileceği: .env.example


🧠 Mimari

Multi-tenant

Tek Supabase projesi, venue_id ile mantıksal ayrım. Her admin bir venue'a bağlı.

Concurrency

Aynı hesabı aynı anda bölüşen birden fazla kişi bu sistemin normal hâli — bu yüzden eşzamanlılık DB'de çözülür, istemcide değil:

  • Tüm mutasyonlar SECURITY DEFINER RPC üzerinden (istemci tabloya doğrudan yazmaz)
  • FOR UPDATE satır kilitleri
  • Kalem durum makinesi: ordered → preparing → served → locked → awaiting_payment → paid
  • TTL'li kilitler + pg_cron janitor (bayat kilit / bayat ödeme temizliği)
  • client_id UUID ile idempotent INSERT

Realtime (lib/realtime/manager.ts)

Ref-counted subscription manager · exponential backoff reconnect (1s → 30s) · presence dedupe · yeniden bağlanmada DB'den state reconciliation.

Güvenlik

  • RLS: müşteri = UUID-secret token; admin = venue-scoped
  • Rate limiting (OTP, join, log endpoint'leri)
  • KVKK: telefon SHA-256+salt hash, 90 gün otomatik anonimleştirme, self-delete RPC
  • CSP + HSTS + X-Frame-Options + Referrer-Policy
  • assert_schema_contract() — DB içi şema/sözleşme drift guard'ı

💰 Ödeme güvenliği

Para rayının %0 komisyonlu ayağı "müşteri havale yaptığını söylüyor" güvenine dayandığı için, doğrulama katmanlı kurgulandı:

  1. Kuruş parmak izi — her hesaba günlük benzersiz kuruş (₺247 → ₺247,73), havaleyi tekilleştirir
  2. Phone reputation — tier: new → known → regular → blocked (SHA-256 hash'li)
  3. Trusted device — doğrulama sonrası 90 gün SMS atlama
  4. Kasiyer onayı — kuruş imzasıyla banka ekstresinden eşleştirme (varsayılan zorunlu)
  5. Email auto-confirm — dekont e-postası → PDF parse → otomatik eşleştirme
  6. Web Share Target OCR — banka uygulamasından "Paylaş → DENK" → tarayıcıda OCR
  7. Günlük mutabakat — sistem toplamı vs. banka toplamı karşılaştırması

Hepsi payment_audit tablosuna yazılır; SECURITY DEFINER + RLS defense-in-depth.


🧪 Test & CI

npm test              # Vitest — unit testler
npm run test:coverage # Coverage (kritik lib'lerde %87+)
npm run e2e           # Playwright — E2E (Chromium + iPhone WebKit)
npx tsc --noEmit      # TypeScript
npx next build        # Production build

GitHub Actions: her push'ta typecheck + unit + build; günlük prod E2E; haftalık Lighthouse.


📚 Dokümantasyon


🔐 Güvenlik açığı bildirimi

Bir güvenlik açığı bulduysan lütfen public issue açma. Bildirim yolu: SECURITY.md


📞 İletişim


Built with 💜 in Düzce, Türkiye.

About

QR-tabanlı sipariş + item-level hesap bölüşme SaaS'ı — Next.js 16, Supabase, Postgres RLS. Türk hospitality için.

Topics

Resources

Security policy

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages