# 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 ```bash 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 `tenantId` zorunlu. - **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:** `main` branch push → Coolify auto-deploy