# CLAUDE.md — PeyzajArt Web Projesi

## Proje Genel Bakış

PeyzajArt, dekoratif saksı ve peyzaj ürünleri üreten bir Türk firmasıdır. Bu proje iki ayrı uygulamadan oluşur:

1. **Kurumsal Web Sitesi** → `peyzajart.com` (Next.js)
2. **B2B Bayi Paneli** → `panel.peyzajart.com` (Next.js, ayrı Next.js uygulaması)

Her iki uygulama da aynı monorepo içinde yer alır ancak ayrı Next.js projeleri olarak deploy edilir.

---

## Teknik Stack

| Katman | Teknoloji |
|---|---|
| Frontend (her iki site) | Next.js 14 (App Router) |
| Stil | Tailwind CSS |
| Veritabanı | MySQL (cPanel ile birlikte gelir) |
| ORM | Prisma |
| Auth (B2B) | next-auth v5 — credentials (bayi kodu + şifre) |
| Email | Nodemailer (SMTP via cPanel mail) |
| Ödeme | İyzico (online) + Havale/EFT (manuel) |
| PDF | @react-pdf/renderer (fatura) |
| Storage | cPanel File Manager (ürün görselleri için `/public/uploads`) |
| Deploy | cPanel Node.js App (her uygulama için ayrı) |

---

## Monorepo Yapısı

```
peyzajart/
├── apps/
│   ├── web/          # Kurumsal site (peyzajart.com)
│   └── panel/        # B2B Bayi paneli (panel.peyzajart.com)
├── packages/
│   ├── db/           # Prisma schema + client (paylaşımlı)
│   ├── ui/           # Paylaşımlı UI bileşenleri
│   └── config/       # Tailwind, ESLint config
├── package.json      # Turborepo workspace root
└── CLAUDE.md
```

---

## Veritabanı Şeması (Prisma)

```prisma
model Product {
  id          Int      @id @default(autoincrement())
  slug        String   @unique
  nameTr      String
  nameEn      String
  descTr      String?
  descEn      String?
  category    String   // "CUBO" | "RECTA" | "GLOBE" | "OTHER"
  size        String?  // "40*45" veya "⌀40" formatında
  priceSelf   Float    // Kurumsal site için fiyat (gösterim amaçlı)
  priceB2B    Float    // Bayi fiyatı (USD)
  stock       Int      @default(0)
  images      String   // JSON array of image paths
  isActive    Boolean  @default(true)
  createdAt   DateTime @default(now())
  updatedAt   DateTime @updatedAt
  orderItems  OrderItem[]
}

model Dealer {
  id          Int      @id @default(autoincrement())
  dealerCode  String   @unique  // Bayi giriş kodu
  password    String   // bcrypt hash
  companyName String
  contactName String
  email       String   @unique
  phone       String?
  address     String?
  city        String?
  discountRate Float   @default(0)  // % indirim oranı (admin tarafından atanır)
  isActive    Boolean  @default(true)
  createdAt   DateTime @default(now())
  orders      Order[]
}

model Order {
  id              Int         @id @default(autoincrement())
  orderNo         String      @unique  // "PA-2024-0001" formatı
  dealer          Dealer      @relation(fields: [dealerId], references: [id])
  dealerId        Int
  status          OrderStatus @default(PENDING)
  paymentMethod   PaymentMethod
  paymentStatus   PaymentStatus @default(WAITING)
  totalUSD        Float
  notes           String?
  shippingAddress String
  items           OrderItem[]
  createdAt       DateTime    @default(now())
  updatedAt       DateTime    @updatedAt
}

model OrderItem {
  id        Int     @id @default(autoincrement())
  order     Order   @relation(fields: [orderId], references: [id])
  orderId   Int
  product   Product @relation(fields: [productId], references: [id])
  productId Int
  quantity  Int
  unitPrice Float
}

enum OrderStatus {
  PENDING      // Beklemede
  CONFIRMED    // Onaylandı
  PREPARING    // Hazırlanıyor
  SHIPPED      // Kargoya verildi
  DELIVERED    // Teslim edildi
  CANCELLED    // İptal edildi
}

enum PaymentMethod {
  ONLINE       // İyzico
  BANK_TRANSFER // Havale/EFT
}

enum PaymentStatus {
  WAITING      // Ödeme bekleniyor
  PAID         // Ödendi
  FAILED       // Başarısız
}
```

---

## 1. Kurumsal Web Sitesi (`apps/web`)

### Tasarım Yönü

- **Palet**: Beyaz (`#FAFAF8`), toprak (`#C4A882`), koyu kahve (`#3D2B1F`), açık bej (`#F0E8DC`)
- **Tipografi**: Display → `Cormorant Garamond` (serif, zarif), Body → `DM Sans`
- **Ton**: Doğal, organik, premium ama erişilebilir. İtalyan tasarım estetiği.
- **Animasyon**: Scroll-triggered fade-in, ürün hover'da hafif scale + shadow
- **Layout**: Asimetrik grid, geniş beyaz alan, ürün görselleri büyük ve cesur

### Sayfalar

#### `/` — Ana Sayfa
- Hero: Tam ekran ürün fotoğrafı + "Mekânları Sanatla Çerçeveliyoruz" başlık
- Öne çıkan ürün serileri (CUBO, GLOBE, RECTA kartları)
- Kısa "Hakkımızda" paragrafı
- Portfolyo'dan 3 proje önizleme
- CTA: "Toptan Sipariş İçin Bayi Paneline Girin"
- İletişim bilgileri footer'da

#### `/urunler` — Ürün Kataloğu
- Kategori filtresi (CUBO / RECTA / GLOBE / Doppio / vb.)
- Grid layout, her kart: görsel + isim + boyut + fiyat (USD)
- Dil: TR/EN toggle (next-intl ile)

#### `/urunler/[slug]` — Ürün Detay
- Büyük görsel, boyut bilgisi, açıklama
- "Toptan fiyat için bayi paneline giriş yapın" notu

#### `/projeler` — Portfolyo
- Tamamlanan peyzaj projelerinden görseller
- Proje adı, lokasyon, kullanılan ürünler
- Masonry grid layout

#### `/hakkimizda` — Hakkında
- Firma hikayesi, üretim süreci, değerler
- Ekip fotoğrafı (varsa)

#### `/blog` — Blog
- Peyzaj ipuçları, ürün bakım rehberleri, proje hikayeleri
- Admin'den CMS ile yönetilir (basit markdown tabanlı)

#### `/iletisim` — İletişim
- Form (isim, email, mesaj) → Nodemailer ile admin'e email
- Google Maps embed
- WhatsApp linki

### Çok Dil (i18n)
- `next-intl` kullanılacak
- `/tr/` ve `/en/` path prefix
- Dil seçimi header'da bayrak toggle ile
- Çeviri dosyaları: `apps/web/messages/tr.json` ve `en.json`

---

## 2. B2B Bayi Paneli (`apps/panel`)

### URL: `panel.peyzajart.com`

### Auth Akışı
1. Bayi `/login` sayfasına gelir
2. **Bayi Kodu** (örn: `BAYI-001`) + **Şifre** girer
3. next-auth credentials provider doğrular
4. Session oluşur, `/dashboard`'a yönlendirir
5. Admin ayrı bir `isAdmin` flag'ı ile giriş yapar

### Bayi Panel Sayfaları

#### `/dashboard` — Ana Panel
- Özet: Toplam sipariş, bekleyen sipariş, son sipariş tarihi
- Hızlı sipariş butonu
- Son 5 sipariş listesi

#### `/products` — Ürün Listesi (B2B)
- Tüm aktif ürünler, **bayi fiyatı** gösterilir (discountRate uygulanmış)
- Stok durumu gösterilir
- "Sepete Ekle" butonu

#### `/cart` — Sepet
- Ürün listesi, adet güncelleme, toplam USD
- Teslimat adresi seçimi/girişi
- Ödeme yöntemi seçimi: **İyzico** veya **Havale/EFT**
- Havale seçilirse: Banka hesap bilgileri gösterilir (IBAN, banka adı)
- Sipariş notu alanı
- "Sipariş Oluştur" butonu

#### `/orders` — Sipariş Geçmişi
- Tüm siparişler, durum badge'i ile (Beklemede / Onaylandı / Kargoda / Teslim)
- Sipariş detayına tıklama

#### `/orders/[orderNo]` — Sipariş Detay
- Sipariş kalemleri, tutarlar, durum
- Ödeme bilgisi

#### `/profile` — Profil
- Firma adı, yetkili kişi, email, telefon güncelleme
- Şifre değiştirme
- Kayıtlı teslimat adresleri (CRUD)

---

## 3. Admin Paneli (`/admin` → `panel.peyzajart.com/admin`)

Admin, aynı panelde `/admin` prefix'li route'lara erişir. `isAdmin: true` olan session gerektirir.

### Admin Sayfaları

#### `/admin/dashboard`
- Günlük/haftalık/aylık sipariş özeti
- Toplam gelir (USD)
- Bekleyen sipariş sayısı

#### `/admin/products`
- Ürün listesi, aktif/pasif toggle
- Yeni ürün ekle, düzenle, sil
- Görsel yükleme (cPanel `/public/uploads/`)
- Stok miktarı güncelleme
- B2B fiyat ve kurumsal site fiyatı ayrı ayrı

#### `/admin/dealers`
- Bayi listesi
- Yeni bayi ekle: firma adı, bayi kodu, şifre, email, indirim oranı
- Bayi aktif/pasif yapma
- Bayi detayı: sipariş geçmişi

#### `/admin/orders`
- Tüm siparişler, filtre: durum, bayi, tarih
- Sipariş durumu güncelleme (dropdown)
- Havale siparişlerinde "Ödeme Onaylandı" butonu

#### `/admin/blog`
- Blog yazısı oluştur/düzenle/sil
- Markdown editor (react-md-editor)

---

## Email Bildirimleri (Nodemailer)

| Olay | Alıcı | İçerik |
|---|---|---|
| Sipariş oluşturuldu | Admin + Bayi | Sipariş no, kalemler, toplam, ödeme yöntemi |
| Sipariş durumu değişti | Bayi | Yeni durum, sipariş no, açıklama |
| Havale onaylandı | Bayi | Ödeme alındı bildirimi |

Email template'leri: `packages/email-templates/` (React Email ile)

---

## Ödeme Entegrasyonu

### İyzico
- `iyzipay` npm paketi
- Sandbox → Production geçişi `.env` ile kontrol
- Ödeme başarılıysa sipariş `paymentStatus: PAID` olur
- Callback URL: `panel.peyzajart.com/api/payment/callback`

### Havale/EFT
- Sipariş oluşturulur, `paymentStatus: WAITING` olarak kalır
- Bayi'ye banka bilgileri emailde gönderilir
- Admin manuel olarak "Ödeme Onaylandı" yapar → `paymentStatus: PAID`

---

## Deployment (cPanel)

### cPanel Node.js App Kurulumu
```
Ana site:   /home/user/peyzajart.com/apps/web/
Panel:      /home/user/panel.peyzajart.com/apps/panel/
Node ver:   18.x veya 20.x
Start file: server.js (next start custom server)
Port:       Ana site → 3000, Panel → 3001
```

### `.env` Dosyaları
Her uygulama için ayrı `.env.local`:

```env
# apps/web/.env.local
DATABASE_URL="mysql://user:pass@localhost:3306/peyzajart"
NEXT_PUBLIC_SITE_URL="https://peyzajart.com"

# apps/panel/.env.local
DATABASE_URL="mysql://user:pass@localhost:3306/peyzajart"
NEXTAUTH_SECRET="..."
NEXTAUTH_URL="https://panel.peyzajart.com"
IYZICO_API_KEY="..."
IYZICO_SECRET_KEY="..."
IYZICO_BASE_URL="https://sandbox-api.iyzipay.com"
SMTP_HOST="mail.peyzajart.com"
SMTP_PORT=465
SMTP_USER="noreply@peyzajart.com"
SMTP_PASS="..."
ADMIN_EMAIL="info@peyzajart.com"
```

### Build & Deploy Script
```bash
# Root'ta çalıştır
npm run build --workspace=apps/web
npm run build --workspace=apps/panel
# cPanel'de her iki app için ayrı "Restart" yap
```

---

## Ürün Kataloğu (Başlangıç Verisi)

Seed script ile aşağıdaki ürünler yüklenecek (`packages/db/seed.ts`):

| Model | Boyut | B2B Fiyat (USD) |
|---|---|---|
| cubo-s | 40×45 | 64 |
| cubo-m | 50×52 | 84 |
| cubo-l | 60×65 | 116 |
| recta1 | 30×95×40 | 68 |
| recta2 | 40×95×40 | 68 |
| recta3 | 30×95×60 | 72 |
| recta4 | 30×80×40 | 60 |
| globe-s | ⌀40 | 72 |
| globe-m | ⌀55 | 84 |
| globe-l | ⌀65 | 116 |
| Doppio | 50×40 | 104 |
| Elora | 80×40 | 84 |
| Tripod | 50×45 | 84 |
| Forma | 40×45 | 72 |
| Marbella | — | 84 |
| Colo | — | 84 |
| Ardea | — | 84 |
| Tera | — | 44 |
| Vals | — | 44 |
| Mossa | — | 104 |
| Velis | — | 96 |
| Velis_kab | — | 144 |
| FormaDoppio | — | 104 |
| Aure | — | 44 |

---

## Geliştirme Komutları

```bash
# Bağımlılıkları yükle
npm install

# Veritabanı oluştur + seed
npx prisma db push --schema=packages/db/schema.prisma
npx prisma db seed --schema=packages/db/schema.prisma

# Dev sunucuları başlat
npm run dev --workspace=apps/web    # localhost:3000
npm run dev --workspace=apps/panel  # localhost:3001

# Build
npm run build --workspace=apps/web
npm run build --workspace=apps/panel
```

---

## Kod Standartları

- **TypeScript**: strict mode, her şey typed
- **Bileşenler**: `apps/web/components/` ve `apps/panel/components/`, paylaşılanlar `packages/ui/`
- **API Routes**: `app/api/` (Next.js Route Handlers)
- **Server Actions**: Form submit'ler için Next.js Server Actions tercih edilsin
- **Error Handling**: Her API route try/catch, anlamlı hata mesajları
- **Türkçe**: Kullanıcıya dönük tüm metinler Türkçe (i18n ile EN de hazır)
- **Responsive**: Mobile-first, Tailwind breakpoint'leri kullan

---

## Güvenlik

- Admin ve bayi route'larına middleware ile auth kontrolü (`middleware.ts`)
- Bayi sadece kendi siparişlerini görebilir (dealerId kontrolü her sorguda)
- Şifreler bcrypt ile hash'lenir (salt rounds: 12)
- `.env` dosyaları asla commit edilmez
- İyzico callback'leri HMAC signature ile doğrulanır

---

## Claude'a Notlar

- cPanel'de Next.js deploy için `server.js` custom server dosyası gerekir — bunu oluştur
- `next export` kullanma, SSR aktif kalmalı (API routes için)
- MySQL'de `@db.Text` kullan uzun string'ler için (Prisma)
- Ürün görselleri için `sharp` paketi gerekebilir — cPanel'de binary uyumluluğunu kontrol et
- İyzico entegrasyonunu önce sandbox'ta test et, env'de `IYZICO_BASE_URL` ile ortam kontrolü yap
- Bayi kodu format önerisi: `PA-XXXX` (PeyzajArt prefix)
- İlk admin hesabı seed script'te oluşturulsun
