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ı
This commit is contained in:
@@ -0,0 +1,108 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user