Files
sitarapart/docs/prd.md
T

7.5 KiB
Raw Blame History

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:

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:

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