Files
sitarapart/docs/prd.md
T

187 lines
7.5 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.
# PRD — Sitar Apart & Otel Web Sitesi
## 1. Proje Özeti
**İşletme:** Sitar Apart & Otel
**Konum:** Akyaka, İnişdibi Cd. No:46, Ula/Muğla
**Telefon:** 0 530 510 98 42
**Mevcut domain:** www.akyakastarapart.com
**Slogan:** "Akyaka'nın Huzuru Sizinle!"
Akyaka'da, denize 10 dakika yürüme mesafesinde, merkezi konumda (market, pazaryeri, kafelere yakın) faaliyet gösteren self-catering apart otel. Kaynak içerik: işletmenin mevcut tanıtım broşüründen (sitar apart.pdf) çıkarıldı.
**Site tipi:** Otel / Apart Otel (self-catering)
## 2. Marka Bilgileri
- **Logo:** Ev/dalga siluetli çizgi logo, turkuaz (#2FB6C4 civarı) renkte, "SİTAR APART & OTEL" yazısı
- **Ana renk:** Turkuaz / camgöbeği (broşürde üst-alt bantlarda kullanılan turkuaz)
- **Yardımcı renkler:** Kirli beyaz / krem arka plan, koyu kahve (ahşap balkon detayları)
- **Ton:** Sıcak, sade, huzurlu — butik apart otel havası (5 yıldızlı lüks otel değil)
## 3. Site Haritası (Sayfa Envanteri)
| Route | Açıklama |
|---|---|
| `/` | Ana Sayfa — hero, kısa tanıtım, olanaklar özeti, öne çıkan daireler, CTA (rezervasyon/iletişim) |
| `/dairelerimiz` | Tüm daire tiplerinin listesi (1+0, 1+1 x2 varyant) |
| `/dairelerimiz/[slug]` | Daire detay sayfası — galeri, açıklama, olanaklar, kapasite, rezervasyon formu |
| `/galeri` | Fotoğraf galerisi (kategorili: daireler, dış cephe, manzara, balkon) |
| `/konum` | Akyaka & ulaşım bilgisi, harita gömme, çevredeki market/pazaryeri/kafeler |
| `/iletisim` | İletişim formu, adres, telefon, WhatsApp linki, harita |
| `/admin/*` | Yönetim paneli (bkz. Bölüm 8) |
Not: Bu işletme restoran/spa gibi ek hizmetler sunmuyor (self-catering apart), bu yüzden "Hizmetlerimiz" sayfası yerine olanaklar (amenities) ana sayfada ve daire detayında gösterilir.
## 4. Dil Seçenekleri
`tr`, `en`, `de` (Akyaka bölgesi yoğun Alman turist trafiği alıyor, DE desteği önemli)
→ next-intl locales: `['tr', 'en', 'de']`
`messages/tr.json`, `en.json`, `de.json`
## 5. Servisler / Olanaklar (Amenity)
Broşürden çıkarılan olanaklar:
- Yüzme Havuzu (Pool)
- Wifi
- Özel Mutfak Alanı (Private Kitchen Area)
- Balkon (fotoğraflarda görünüyor, tüm dairelerde var)
- Klima (Akyaka yaz sıcaklarında standart, eklenmesi önerilir — teyit gerekir)
→ Prisma: `model Amenity { slug, labelTr, labelEn, labelDe, icon }`
→ Room modeli üzerinde `amenities String[]` veya `RoomAmenity` join tablosu
## 6. Daire Tipleri (Room)
Broşürden 3 daire konfigürasyonu çıkarıldı:
| Slug | Ad (TR) | Açıklama | Kapasite (tahmini) |
|---|---|---|---|
| `1-0-daire` | 1+0 Dairemiz | Stüdyo tip, tek yatak, mini mutfak, banyo | 1-2 kişi |
| `1-1-daire-a` | 1+1 Dairemiz | Yatak odası + ayrı mutfak köşesi, balkon | 2 kişi |
| `1-1-daire-b` | 1+1 Dairemiz (2 Oda) | 2 kişilik ve 1 kişilik olmak üzere 2 oda, balkon | 3-4 kişi |
Ortak özellikler (broşürden): Denize 10 dk yürüme mesafesi, merkezi konum, market/pazaryeri/kafelere yakınlık.
→ Prisma:
```prisma
enum RoomType {
STUDIO_1_0
SUITE_1_1
}
model Room {
id String @id @default(cuid())
slug String @unique
type RoomType
nameTr String
nameEn String
nameDe String
descriptionTr String
descriptionEn String
descriptionDe String
capacity Int
price Int? // gecelik fiyat (varsa; broşürde fiyat yok, admin'den girilecek)
imageUrl String?
images String[]
amenities String[]
available Boolean @default(true)
featured Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
```
**Not:** Broşürde gecelik fiyat bilgisi yok. İşletme sahibinden fiyat teyidi alınmalı; alınana kadar mock data'da placeholder fiyat kullanılacak ve "Fiyat için iletişime geçin" ibaresi eklenmesi önerilir.
## 7. Rezervasyon Formu Alanları
Bu bir self-catering apart, online ödeme/anlık onay yok — **rezervasyon talebi** (inquiry) formu olarak kurgulanmalı, otomatik onay değil.
Alanlar: `checkIn`, `checkOut`, `adults`, `children`, `roomId` (daire tipi seçimi), `fullName`, `email`, `phone`, `message`
→ Prisma:
```prisma
enum ReservationStatus {
PENDING
CONFIRMED
CANCELLED
}
model Reservation {
id String @id @default(cuid())
roomId String
room Room @relation(fields: [roomId], references: [id])
checkIn DateTime
checkOut DateTime
adults Int
children Int @default(0)
fullName String
email String
phone String
message String?
status ReservationStatus @default(PENDING)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
deletedAt DateTime?
}
```
→ API: `POST /api/reservations` (public), `GET /api/admin/reservations` (liste)
→ Zod: `ReservationSchema`
## 8. İletişim Formu Alanları
`fullName`, `email`, `phone`, `message`
→ Prisma: `model ContactMessage { fullName, email, phone, message, read Boolean @default(false), ... }`
→ API: `POST /api/contact` (public), `GET /api/admin/messages`
## 9. Admin / Yönetim İhtiyaçları
Standart admin paneli (her projede sabit) + bu proje için:
- `/admin/rooms` — daire tipleri CRUD (ad, açıklama TR/EN/DE, kapasite, fiyat, olanaklar, görseller)
- `/admin/reservations` — rezervasyon talepleri listesi, durum güncelleme (PENDING/CONFIRMED/CANCELLED)
- `/admin/gallery` — galeri görselleri CRUD, kategori bazlı
- `/admin/messages` — iletişim mesajları listesi, okundu işaretleme
- `/admin/amenities` — olanaklar listesi (opsiyonel, sabit liste de olabilir)
- Dashboard: toplam daire sayısı, bekleyen rezervasyon sayısı, okunmamış mesaj sayısı
## 10. Sosyal Medya / 3. Parti Entegrasyonlar
- **WhatsApp click-to-chat:** `0 530 510 98 42` numarasına yönlenen buton (header + iletişim sayfası)
- **Google Maps embed:** Akyaka, İnişdibi Cd. No:46, Ula/Muğla konumu
- Instagram/Facebook hesabı broşürde belirtilmemiş — işletme sahibinden teyit alınmalı, varsa footer'a eklenir
→ Env: `NEXT_PUBLIC_WHATSAPP_NUMBER`, `NEXT_PUBLIC_MAPS_EMBED_URL`
## 11. Teknik Notlar
- Mevcut domain `www.akyakastarapart.com` — yeni site bu domain üzerine yayınlanacak (Coolify deploy sürecinde teyit edilmeli)
- Broşürdeki fotoğraflar (3 sayfa, düşük-orta çözünürlük) başlangıç mock görseli olarak kullanılabilir; ancak production için işletmeden yüksek çözünürlüklü orijinal fotoğraf talep edilmesi önerilir
- Fiyat bilgisi eksik — admin panelinden sonradan girilecek şekilde `price` alanı nullable
- Tek işletme, çoklu şube yok — `Location`/`Branch` modeline gerek yok
## 12. Rebranding / Öncelik Sırası (Todo)
1. Ana Sayfa + Daireler listesi + Daire detay (temel akış)
2. Rezervasyon talep formu + admin onay ekranı
3. Galeri sayfası
4. İletişim sayfası + WhatsApp/Harita entegrasyonu
5. Admin panel (rooms, reservations, gallery, messages)
6. TR/EN/DE içerik doldurma
7. Openinary görsel yükleme entegrasyonu
8. Coolify deploy (bkz. `/coolify-deploy` skill)
---
## PRD'den Çıkarılanlar (Özet)
- **Modeller:** Room, Reservation, Amenity, Gallery, ContactMessage
- **Lokaller:** tr, en, de
- **Admin sayfaları:** rooms, reservations, gallery, messages, amenities
- **Özel route'lar:** `/api/reservations` (public POST), `/api/contact` (public POST)
- **Eksik / teyit gereken bilgiler:** gecelik fiyatlar, sosyal medya hesapları, klima olup olmadığı, yüksek çözünürlüklü görseller