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.
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ı)
| 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.
| 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) |
| 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)
git clone https://github.com/SerkanSgap/DENK.git
cd DENK
npm install
cp .env.example .env.local # Doldur — bkz. .env.examplenpx supabase start
npx supabase db reset
npm run devAçı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
Tek Supabase projesi, venue_id ile mantıksal ayrım. Her admin bir venue'a bağlı.
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 DEFINERRPC üzerinden (istemci tabloya doğrudan yazmaz) FOR UPDATEsatır kilitleri- Kalem durum makinesi:
ordered → preparing → served → locked → awaiting_payment → paid - TTL'li kilitler +
pg_cronjanitor (bayat kilit / bayat ödeme temizliği) client_idUUID ile idempotent INSERT
Ref-counted subscription manager · exponential backoff reconnect (1s → 30s) · presence dedupe · yeniden bağlanmada DB'den state reconciliation.
- 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'ı
Para rayının %0 komisyonlu ayağı "müşteri havale yaptığını söylüyor" güvenine dayandığı için, doğrulama katmanlı kurgulandı:
- Kuruş parmak izi — her hesaba günlük benzersiz kuruş (₺247 → ₺247,73), havaleyi tekilleştirir
- Phone reputation — tier: new → known → regular → blocked (SHA-256 hash'li)
- Trusted device — doğrulama sonrası 90 gün SMS atlama
- Kasiyer onayı — kuruş imzasıyla banka ekstresinden eşleştirme (varsayılan zorunlu)
- Email auto-confirm — dekont e-postası → PDF parse → otomatik eşleştirme
- Web Share Target OCR — banka uygulamasından "Paylaş → DENK" → tarayıcıda OCR
- 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.
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 buildGitHub Actions: her push'ta typecheck + unit + build; günlük prod E2E; haftalık Lighthouse.
- CLAUDE.md — mimari kararlar + proje belleği
- docs/TECHNICAL_OVERVIEW.md — sistem genel bakış
- docs/ODEME_SISTEMI.md — ödeme sistemi derin rehberi
- docs/EMAIL_DEKONT_SETUP.md — Cloudflare Email Worker kurulumu
- docs/MIGRATION_PUSH.md — migration uygulama akışı
Bir güvenlik açığı bulduysan lütfen public issue açma. Bildirim yolu: SECURITY.md
- Web: denkhesap.com
- Email: hi@denkhesap.com
Built with 💜 in Düzce, Türkiye.