187 lines
7.5 KiB
Markdown
187 lines
7.5 KiB
Markdown
# 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 |