Files
kovakemlak-crm/CLAUDE.md
T
egecankomur 37679e83e6 init: kovakemlak-crm project scaffold
- 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ı
2026-05-05 04:37:04 +03:00

109 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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