37679e83e6
- Next.js 16 + Appwrite multi-tenant emlak CRM - Database: kovakemlak-db (properties, customers, customer_searches, property_matches, presentations, investors, activities, tenant_settings) - Same stack as isletmem-kovakcrm (shadcn/ui template base) - Modules: portföy, müşteri takibi, arama kriterleri, otomatik eşleştirme, sunum linki, yatırımcı portalı
4.0 KiB
4.0 KiB
KovakEmlak CRM
Multi-tenant emlak CRM. Emlak ofisleri portföy yönetimi, müşteri takibi, yatırımcı portalı ve portföy sunumu yapar. Her tenant kendi verilerini görür.
Stack
- Next.js 16 + React 19 (App Router, TypeScript)
- Tailwind CSS v4 + shadcn/ui v3 (Radix primitives)
- Zustand — client state
- TanStack Table, react-hook-form + Zod, Recharts
- Appwrite — DB, Auth, Storage, Teams (tenant izolasyonu)
- pnpm — package manager
- Coolify — Gitea webhook ile auto-deploy
Multi-tenancy modeli
| Concept | Appwrite primitive |
|---|---|
| Tenant | Appwrite Team (1 team = 1 emlak ofisi) |
| Tenant üyesi | Team membership (rol: owner / admin / member) |
| Veri izolasyonu | Her doküman tenantId attribute + Permission.read/update/delete(Role.team(tenantId)) |
Modüller
| Modül | Collection | Notlar |
|---|---|---|
| Portföy | properties |
İlan yönetimi (satılık/kiralık, tüm ilan tipleri) |
| Müşteriler | customers |
Alıcı / kiracı / yatırımcı adayları |
| Arama Kriterleri | customer_searches |
Müşteri bazlı saved search (oda, fiyat, lokasyon) |
| Eşleşmeler | property_matches |
Yeni ilan → kriter eşleşmesi, bildirim takibi |
| Sunumlar | presentations |
Seçilmiş ilanlar → paylaşılabilir sunum linki |
| Yatırımcılar | investors |
Portal erişimi olan yatırımcı profilleri |
| Aktiviteler | activities |
Görüşme, teklif, ziyaret, arama notları |
| Ofis Ayarları | tenant_settings |
Logo, para birimi, iletişim bilgileri |
Appwrite Database
- Database ID:
kovakemlak-db - Project ID:
69f27b51000a5bee46ce(aynı proje, isletmem ile ortak) - Endpoint:
https://db.kovaksoft.com/v1
Özel Özellikler
Otomatik Eşleştirme (Matching Engine)
Yeni ilan eklendiğinde server action içinde customer_searches tablosu filtrelenerek kriterlere uyan müşteriler bulunur ve property_matches'e yazılır.
yeni ilan kaydedildi
→ matchPropertiesForSearches(propertyId, tenantId)
→ customer_searches filtrele (listingType, propertyType, roomCount, fiyat aralığı, lokasyon)
→ property_matches'e yaz (notified: false)
→ danışmana bildirim
Portföy Sunumu
Danışman birden fazla ilan seçer → presentations kaydı oluşur → shareToken ile public URL üretilir → müşteri /sunum/[token] rotasında giriş yapmadan görüntüler.
Yatırımcı Portalı
investors.userId Appwrite user ID'siyle eşleşir. Login olan yatırımcı /portal rotasında kendi kriterlerine uyan aktif ilanları görür.
Rotalar
(auth)/ login, register
(dashboard)/ ana CRM (danışman)
properties/ portföy listesi + detay + ekle
customers/ müşteri listesi + arama kriterleri
presentations/ sunum oluştur + paylaş
investors/ yatırımcı profilleri
activities/ aktivite takibi
settings/ ofis ayarları
(portal)/ yatırımcı portalı (ayrı layout)
sunum/[token]/ public sunum sayfası (auth gerektirmez)
Komutlar
pnpm dev # localhost:3001
pnpm build
pnpm lint
pnpm typecheck # tsc --noEmit
Environment variables
NEXT_PUBLIC_APPWRITE_ENDPOINT=https://db.kovaksoft.com/v1
NEXT_PUBLIC_APPWRITE_PROJECT_ID=69f27b51000a5bee46ce
NEXT_PUBLIC_APPWRITE_DATABASE_ID=kovakemlak-db
APPWRITE_API_KEY= # server-only
APP_URL=https://emlak.kovakcrm.com
Geliştirme prensipleri
- Template görselini bozma. Sayfa layout, sidebar, theme korunur.
- Tenant filtresi şart. Her query'de
tenantIdzorunlu. - Server actions tercih edilir — validation + audit için.
- Schema değişikliği = MCP çağrısı (commit prefix:
db:). - Türkçe UI, kod İngilizce.
- Matching engine idempotent — aynı (propertyId, searchId) çifti için duplicate match yazma.
Gitea Deploy
- Repo:
ssh://git@git.kovaksoft.com:2222/kovakmedya/kovakemlak-crm.git - Production domain:
https://emlak.kovakcrm.com - Workflow:
mainbranch push → Coolify auto-deploy