# Gereksinimler Dokümanı

## Giriş

Safnaturel, kullanıcıların bileklik, kolye ve tesbih gibi takı türlerini özel taşlarla tasarlayabildiği bir web uygulamasıdır. Uygulama; bir ana sayfa (landing page), görsel bir tasarım editörü, yönetilebilir takı modelleri ve sipariş oluşturma akışı sunar. Kullanıcılar taş kataloğundan seçim yaparak sürükle-bırak yöntemiyle takı modellerini kişiselleştirir ve sipariş oluşturur.

Uygulama ayrıca bir admin paneli ve PHP + MySQL backend içerir. Admin paneli üzerinden taş kataloğu, model şablonları ve siparişler yönetilir. Backend, standart shared hosting (cPanel) ortamında çalışacak şekilde PHP ile geliştirilir ve MySQL veritabanı kullanır. Frontend, localStorage yerine REST API üzerinden backend ile iletişim kurar.

## Sözlük

- **Uygulama**: Safnaturel özel tasarım takı web uygulaması
- **Tasarım_Editörü**: Kullanıcının taşları seçip takı modeline yerleştirdiği ana çalışma ekranı
- **Taş_Kataloğu**: Sol panelde yer alan, aranabilir taş listesi bileşeni
- **Takı_Modeli**: Orta alanda gösterilen, taşların yerleştirildiği şablon (bileklik, kolye veya tesbih). Her tasarım türü için birden fazla model bulunabilir
- **Model_Şablonu**: Belirli bir takı türüne ait yüklenebilir ve yönetilebilir görsel şablon (ör. yuvarlak boncuklu bileklik, düz boncuklu bileklik)
- **Sepet**: Sağ panelde yer alan, modele eklenen taşların listesini ve sayısını gösteren bileşen
- **Taş**: Takı tasarımında kullanılan doğal taş birimi (ör. Akik, Amazonit, Akuamarin)
- **Tasarım_Türü**: Bileklik, Kolye veya Tesbih seçeneklerinden biri
- **Taş_Boyutu**: Taşın milimetre cinsinden çapı (6mm veya 8mm)
- **Takı_Ölçüsü**: Takının fiziksel boyutu (S, M, L)
- **Sipariş**: Kullanıcının tamamladığı tasarımı satın alma talebi olarak oluşturduğu kayıt
- **Admin_Paneli**: Yetkili kullanıcıların taş kataloğu, model şablonları ve siparişleri yönettiği web arayüzü
- **Admin_Kullanıcı**: Admin paneline giriş yetkisi olan kullanıcı
- **REST_API**: Frontend ve admin panelinin backend ile iletişim kurduğu PHP tabanlı HTTP arayüzü
- **Veritabanı**: MySQL veritabanı; taşlar, şablonlar, siparişler ve admin kullanıcı bilgilerini saklar
- **Sipariş_Durumu**: Siparişin mevcut aşaması (beklemede, onaylandı, hazırlanıyor, kargoda, teslim_edildi, iptal)

## Gereksinimler

### Gereksinim 1: Ana Sayfa Görüntüleme

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, uygulamaya girdiğimde marka kimliğini ve takı kategorilerini görmek istiyorum, böylece tasarlamak istediğim takı türünü seçebilirim.

#### Kabul Kriterleri

1. WHEN bir kullanıcı ana sayfayı ziyaret ettiğinde, THE Uygulama SHALL Safnaturel logosunu, "Safnaturel" başlığını ve "Özel Tasarım Takılar" alt başlığını görüntülemek
2. WHEN ana sayfa yüklendiğinde, THE Uygulama SHALL "Tasarım Türü Seçin" başlığı altında Bileklik, Kolye ve Tesbih olmak üzere üç kategori kartını ikonlarıyla birlikte görüntülemek
3. WHEN bir kullanıcı bir kategori kartına tıkladığında, THE Uygulama SHALL seçilen Tasarım_Türü ile Tasarım_Editörü ekranına yönlendirmek

### Gereksinim 2: Taş Kataloğu ve Arama

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, mevcut taşları listeleyip arayabilmek istiyorum, böylece tasarımımda kullanmak istediğim taşı kolayca bulabilirim.

#### Kabul Kriterleri

1. WHEN Tasarım_Editörü açıldığında, THE Taş_Kataloğu SHALL REST_API üzerinden taş verilerini yüklemek ve tüm taşları görsel ve isimleriyle birlikte iki sütunlu grid düzeninde görüntülemek
2. WHEN bir kullanıcı arama çubuğuna metin girdiğinde, THE Taş_Kataloğu SHALL taş listesini girilen metne göre filtrelemek
3. WHEN arama sonucu hiçbir taş bulunamadığında, THE Taş_Kataloğu SHALL kullanıcıya sonuç bulunamadığını belirten bir mesaj göstermek
4. WHEN arama çubuğu temizlendiğinde, THE Taş_Kataloğu SHALL tüm taşları yeniden görüntülemek

### Gereksinim 3: Takı Modeli Yönetimi

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, her tasarım türü için farklı model şablonları arasından seçim yapabilmek istiyorum, böylece çeşitli takı stillerini deneyebilirim.

#### Kabul Kriterleri

1. WHEN Tasarım_Editörü açıldığında, THE Uygulama SHALL REST_API üzerinden seçilen Tasarım_Türüne ait mevcut Model_Şablonlarını yüklemek ve listelemek
2. WHEN bir kullanıcı bir Model_Şablonu seçtiğinde, THE Takı_Modeli SHALL seçilen şablona göre boncuk yuvalarını oluşturmak
3. WHEN yeni bir Model_Şablonu yüklendiğinde, THE Uygulama SHALL şablonu ilgili Tasarım_Türü altında kaydetmek ve kullanıma sunmak
4. WHEN bir Model_Şablonu kaldırıldığında, THE Uygulama SHALL şablonu listeden silmek ve ilişkili verileri temizlemek

### Gereksinim 4: Takı Modeli Görüntüleme ve Etkileşim

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, takı modelini görsel olarak görmek ve yakınlaştırıp uzaklaştırabilmek istiyorum, böylece tasarımımı detaylı inceleyebilirim.

#### Kabul Kriterleri

1. WHEN bir Model_Şablonu seçildiğinde, THE Takı_Modeli SHALL şablona uygun dairesel düzende boncuk yuvalarını görüntülemek
2. WHEN bir kullanıcı yakınlaştırma (+) butonuna tıkladığında, THE Takı_Modeli SHALL modelin görüntü ölçeğini artırmak
3. WHEN bir kullanıcı uzaklaştırma (-) butonuna tıkladığında, THE Takı_Modeli SHALL modelin görüntü ölçeğini azaltmak
4. WHILE Takı_Modeli görüntülenirken, THE Takı_Modeli SHALL her boncuk yuvasının dolu veya boş durumunu görsel olarak ayırt edilebilir şekilde göstermek

### Gereksinim 5: Sürükle-Bırak ile Taş Yerleştirme

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, taşları sürükleyip modelin üzerine bırakarak takımı tasarlamak istiyorum, böylece sezgisel bir şekilde tasarım yapabilirim.

#### Kabul Kriterleri

1. WHEN bir kullanıcı Taş_Kataloğundan bir taşı basılı tuttuğunda, THE Tasarım_Editörü SHALL taşın sürükleme durumunu görsel geri bildirimle göstermek
2. WHEN bir kullanıcı sürüklenen taşı Takı_Modeli üzerindeki boş bir yuvaya bıraktığında, THE Tasarım_Editörü SHALL taşı ilgili yuvaya yerleştirmek ve Sepet bilgisini güncellemek
3. WHEN bir kullanıcı sürüklenen taşı geçersiz bir alana bıraktığında, THE Tasarım_Editörü SHALL yerleştirme işlemini iptal etmek ve modeli değiştirmemek
4. WHEN Sepet kapasitesi dolduğunda, THE Tasarım_Editörü SHALL yeni taş eklenmesini engellemek ve kullanıcıya kapasite dolduğuna dair bilgi vermek

### Gereksinim 6: Tasarım Ayarları

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, tasarım türünü, takı ölçüsünü ve taş boyutunu değiştirebilmek istiyorum, böylece farklı kombinasyonları deneyebilirim.

#### Kabul Kriterleri

1. WHEN Tasarım_Editörü açıldığında, THE Uygulama SHALL Tasarım_Türü (Bileklik, Kolye, Tesbih), Takı_Ölçüsü (S/16cm, M/18cm, L/20cm) ve Taş_Boyutu (8mm, 6mm) ayarlarını sağ panelde görüntülemek
2. WHEN bir kullanıcı Tasarım_Türünü değiştirdiğinde, THE Takı_Modeli SHALL yeni türe uygun şablon listesine geçmek ve mevcut taş yerleşimlerini sıfırlamak
3. WHEN bir kullanıcı Takı_Ölçüsünü değiştirdiğinde, THE Takı_Modeli SHALL yuva sayısını yeni ölçüye göre güncellemek
4. WHEN bir kullanıcı Taş_Boyutunu değiştirdiğinde, THE Takı_Modeli SHALL yuva sayısını yeni boyuta göre yeniden hesaplamak ve modeli güncellemek

### Gereksinim 7: Sepet Yönetimi

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, modele eklediğim taşları sepette görmek ve yönetmek istiyorum, böylece tasarımımın durumunu takip edebilirim.

#### Kabul Kriterleri

1. WHILE Sepet boşken, THE Sepet SHALL "Sepetiniz Boş!" mesajını ve "Taşları Modelin Üzerine Sürükleyip Bırakarak Burada Sepetinizi Görebilirsiniz" açıklama metnini görüntülemek
2. WHEN bir taş Takı_Modeline yerleştirildiğinde, THE Sepet SHALL eklenen taşı listeye eklemek ve toplam taş sayısını güncellemek
3. WHEN bir taş Takı_Modelinden çıkarıldığında, THE Sepet SHALL ilgili taşı listeden kaldırmak ve toplam taş sayısını güncellemek
4. WHILE Sepet taş içerirken, THE Sepet SHALL mevcut taş sayısını ve maksimum kapasiteyi "X/Y" formatında göstermek

### Gereksinim 8: Yuva Sayısı Hesaplama

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, seçtiğim ölçü ve taş boyutuna göre doğru sayıda yuva görmek istiyorum, böylece gerçekçi bir tasarım yapabilirim.

#### Kabul Kriterleri

1. WHEN Takı_Ölçüsü ve Taş_Boyutu belirlendiğinde, THE Uygulama SHALL yuva sayısını takı çevresi ve taş çapına göre hesaplamak
2. THE Uygulama SHALL hesaplanan yuva sayısını Sepet kapasitesi olarak kullanmak
3. WHEN Takı_Ölçüsü veya Taş_Boyutu değiştirildiğinde, THE Uygulama SHALL yuva sayısını yeniden hesaplamak ve Takı_Modelini güncellemek

### Gereksinim 9: Sipariş Oluşturma

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, tasarımımı tamamladıktan sonra sipariş oluşturabilmek istiyorum, böylece özel tasarım takımı satın alabilirim.

#### Kabul Kriterleri

1. WHEN tüm boncuk yuvaları taşlarla doldurulduğunda, THE Sepet SHALL "Sipariş Oluştur" butonunu aktif hale getirmek
2. WHEN bir kullanıcı "Sipariş Oluştur" butonuna tıkladığında, THE Uygulama SHALL tasarım detaylarını (Tasarım_Türü, Model_Şablonu, Takı_Ölçüsü, Taş_Boyutu, taş listesi) içeren bir sipariş özeti göstermek
3. WHEN bir kullanıcı sipariş özetini onayladığında, THE Uygulama SHALL siparişi REST_API aracılığıyla Veritabanına kaydetmek ve kullanıcıya onay mesajı göstermek
4. IF sipariş kaydı sırasında bir hata oluşursa, THEN THE Uygulama SHALL kullanıcıya hata mesajı göstermek ve tasarım verilerini korumak

### Gereksinim 10: Duyarlı Tasarım ve Görsel Tema

**Kullanıcı Hikayesi:** Bir kullanıcı olarak, uygulamanın farklı ekran boyutlarında düzgün çalışmasını ve tutarlı bir görsel temaya sahip olmasını istiyorum, böylece her cihazda rahatça kullanabilirim.

#### Kabul Kriterleri

1. THE Uygulama SHALL mor/mavi gradient arka plan temasını tüm sayfalarda tutarlı şekilde uygulamak
2. WHEN ekran genişliği 768 pikselden küçük olduğunda, THE Uygulama SHALL sol panel, orta alan ve sağ paneli dikey olarak yığılmış düzende göstermek
3. WHEN ekran genişliği 768 piksel veya daha büyük olduğunda, THE Uygulama SHALL üç panelli yatay düzeni korumak

### Gereksinim 11: Admin Paneli Kimlik Doğrulama

**Kullanıcı Hikayesi:** Bir admin kullanıcı olarak, güvenli bir şekilde admin paneline giriş yapabilmek istiyorum, böylece yetkisiz erişimi engelleyebilirim.

#### Kabul Kriterleri

1. WHEN bir kullanıcı admin giriş sayfasını ziyaret ettiğinde, THE Admin_Paneli SHALL kullanıcı adı ve şifre alanlarını içeren bir giriş formu görüntülemek
2. WHEN geçerli kimlik bilgileri girildiğinde, THE Admin_Paneli SHALL kullanıcıyı doğrulamak ve admin dashboard'a yönlendirmek
3. WHEN geçersiz kimlik bilgileri girildiğinde, THE Admin_Paneli SHALL giriş işlemini reddetmek ve hata mesajı göstermek
4. WHILE bir admin oturumu aktifken, THE Admin_Paneli SHALL oturum bilgisini PHP session ile yönetmek
5. WHEN bir admin çıkış yaptığında, THE Admin_Paneli SHALL oturumu sonlandırmak ve giriş sayfasına yönlendirmek
6. IF oturum süresi dolmuşsa, THEN THE Admin_Paneli SHALL kullanıcıyı giriş sayfasına yönlendirmek

### Gereksinim 12: Admin Dashboard

**Kullanıcı Hikayesi:** Bir admin kullanıcı olarak, genel durumu özetleyen bir dashboard görmek istiyorum, böylece işletmenin anlık durumunu takip edebilirim.

#### Kabul Kriterleri

1. WHEN admin dashboard yüklendiğinde, THE Admin_Paneli SHALL toplam taş sayısı, toplam şablon sayısı, toplam sipariş sayısı ve bekleyen sipariş sayısını özet kartlarında görüntülemek
2. WHEN admin dashboard yüklendiğinde, THE Admin_Paneli SHALL son 10 siparişi tarih sırasına göre listelemek

### Gereksinim 13: Taş Kataloğu Yönetimi (Admin)

**Kullanıcı Hikayesi:** Bir admin kullanıcı olarak, taş kataloğunu yönetebilmek istiyorum, böylece müşterilere sunulan taş seçeneklerini güncelleyebilirim.

#### Kabul Kriterleri

1. WHEN admin taş listesi sayfasını açtığında, THE Admin_Paneli SHALL tüm taşları ad, görsel ve durum bilgisiyle tablo formatında listelemek
2. WHEN admin yeni taş ekleme formunu doldurduğunda, THE Admin_Paneli SHALL taş adı ve görsel dosyasını doğrulamak ve Veritabanına kaydetmek
3. WHEN admin bir taşı düzenlediğinde, THE Admin_Paneli SHALL taş bilgilerini güncellemek ve değişiklikleri Veritabanına kaydetmek
4. WHEN admin bir taşı sildiğinde, THE Admin_Paneli SHALL taşı Veritabanından kaldırmak ve ilişkili görsel dosyasını silmek
5. WHEN taş görseli yüklendiğinde, THE Admin_Paneli SHALL dosya boyutunu ve formatını (JPEG, PNG, WebP) doğrulamak
6. IF taş adı boş bırakılırsa, THEN THE Admin_Paneli SHALL kaydetme işlemini engellemek ve doğrulama hatası göstermek

### Gereksinim 14: Model Şablonu Yönetimi (Admin)

**Kullanıcı Hikayesi:** Bir admin kullanıcı olarak, takı model şablonlarını yönetebilmek istiyorum, böylece müşterilere sunulan tasarım seçeneklerini güncelleyebilirim.

#### Kabul Kriterleri

1. WHEN admin şablon listesi sayfasını açtığında, THE Admin_Paneli SHALL tüm şablonları ad, takı türü ve görsel bilgisiyle listelemek
2. WHEN admin yeni şablon ekleme formunu doldurduğunda, THE Admin_Paneli SHALL şablon adı, takı türü ve görsel dosyasını doğrulamak ve Veritabanına kaydetmek
3. WHEN admin bir şablonu düzenlediğinde, THE Admin_Paneli SHALL şablon bilgilerini güncellemek ve değişiklikleri Veritabanına kaydetmek
4. WHEN admin bir şablonu sildiğinde, THE Admin_Paneli SHALL şablonu Veritabanından kaldırmak
5. IF şablon adı veya takı türü boş bırakılırsa, THEN THE Admin_Paneli SHALL kaydetme işlemini engellemek ve doğrulama hatası göstermek

### Gereksinim 15: Sipariş Yönetimi (Admin)

**Kullanıcı Hikayesi:** Bir admin kullanıcı olarak, siparişleri görüntüleyip yönetebilmek istiyorum, böylece müşteri taleplerini takip edebilir ve işleyebilirim.

#### Kabul Kriterleri

1. WHEN admin sipariş listesi sayfasını açtığında, THE Admin_Paneli SHALL tüm siparişleri tarih, durum ve müşteri bilgisiyle tablo formatında listelemek
2. WHEN admin bir siparişin detayına tıkladığında, THE Admin_Paneli SHALL sipariş detaylarını (tasarım türü, model şablonu, takı ölçüsü, taş boyutu, taş listesi, müşteri bilgileri) görüntülemek
3. WHEN admin sipariş durumunu güncellediğinde, THE Admin_Paneli SHALL yeni Sipariş_Durumunu Veritabanına kaydetmek
4. WHEN admin sipariş listesini filtrelediğinde, THE Admin_Paneli SHALL siparişleri seçilen Sipariş_Durumuna göre filtrelemek

### Gereksinim 16: PHP REST API

**Kullanıcı Hikayesi:** Bir geliştirici olarak, frontend ve admin panelinin backend ile iletişim kurabilmesi için REST API endpoint'leri istiyorum, böylece veriler merkezi bir veritabanında yönetilebilsin.

#### Kabul Kriterleri

1. WHEN frontend taş listesini istediğinde, THE REST_API SHALL Veritabanından aktif taşları JSON formatında döndürmek
2. WHEN frontend şablon listesini istediğinde, THE REST_API SHALL Veritabanından şablonları takı türüne göre filtrelenebilir şekilde JSON formatında döndürmek
3. WHEN frontend sipariş oluşturma isteği gönderdiğinde, THE REST_API SHALL sipariş verilerini doğrulamak ve Veritabanına kaydetmek
4. WHEN admin taş CRUD işlemi yaptığında, THE REST_API SHALL işlemi yetki kontrolü yaparak gerçekleştirmek ve sonucu döndürmek
5. WHEN admin şablon CRUD işlemi yaptığında, THE REST_API SHALL işlemi yetki kontrolü yaparak gerçekleştirmek ve sonucu döndürmek
6. WHEN admin sipariş güncelleme isteği gönderdiğinde, THE REST_API SHALL yetki kontrolü yaparak sipariş durumunu güncellemek
7. IF API isteğinde yetkilendirme başarısız olursa, THEN THE REST_API SHALL 401 HTTP durum kodu ve hata mesajı döndürmek
8. IF API isteğinde doğrulama hatası oluşursa, THEN THE REST_API SHALL 422 HTTP durum kodu ve hata detaylarını döndürmek

### Gereksinim 17: MySQL Veritabanı

**Kullanıcı Hikayesi:** Bir geliştirici olarak, uygulama verilerinin kalıcı ve güvenilir bir şekilde saklanmasını istiyorum, böylece veriler sunucu yeniden başlatmalarında kaybolmasın.

#### Kabul Kriterleri

1. THE Veritabanı SHALL stones, templates, orders, order_items ve admin_users tablolarını içermek
2. THE Veritabanı SHALL her tabloda uygun birincil anahtar, yabancı anahtar ve indeks tanımlarını içermek
3. WHEN uygulama ilk kurulduğunda, THE Veritabanı SHALL kurulum SQL betiği ile tüm tabloları ve varsayılan admin kullanıcısını oluşturmak
4. THE Veritabanı SHALL admin kullanıcı şifrelerini bcrypt ile hashleyerek saklamak
5. WHEN sipariş oluşturulduğunda, THE Veritabanı SHALL sipariş ve sipariş kalemleri arasında referans bütünlüğünü korumak
