# 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