# OEM PC Sihirbazı — Kurulum

Kısaca: Node.js kur, klasörde üç komut çalıştır, tarayıcıda `http://localhost:8080` aç.
**API anahtarı gerekmez.** Uygulama yapay zeka kullanmıyor; fiyatları kendi kodu topluyor.

## 1. Bir kere yapılacaklar

1. **Node.js 22 (LTS)** kur: https://nodejs.org
2. Klasörde bir terminal aç (Windows: klasörde boş yere Shift + sağ tık → "Terminalde aç") ve çalıştır:

```
npm install
npm run build
```

3. *(İsteğe bağlı)* Sorun bildirimleri e-postana gelsin istiyorsan: `.env.example` dosyasının adını
   `.env` yap, `SMTP_USER` satırına Gmail adresini, `SMTP_PASS` satırına Gmail **uygulama şifresini** yaz.
   Uygulama şifresi: https://myaccount.google.com/apppasswords (2 adımlı doğrulama açık olmalı).
   Bunu yapmazsan bildirimler e-posta yerine sunucunun terminal penceresine yazılır.

## 2. Her kullanımda

```
npm start
```

Sonra tarayıcıda **http://localhost:8080** adresini aç. Kapatmak için terminalde `Ctrl + C`.

Kodda değişiklik yaptıysan `npm start` öncesi tekrar `npm run build` çalıştır.

## Nasıl çalışıyor

1. **Sayfa okuma (mağazadan bağımsız):** Hazır sistem sayfası; JSON-LD, microdata, e-ticaret altyapısının
   (WooCommerce, Shopify, Ticimax, IdeaSoft, T-Soft, OpenCart, Magento, PrestaShop, Amazon) fiyat alanı,
   özellik tabloları, sayfaya gömülü JSON ve sayfa metni sırasıyla okunur. Mağaza tek tek tanıtılmaz.
   Aynı parça için birden çok satır varsa en çok bilgi taşıyanı seçilir, eksikler diğerlerinden tamamlanır
   (ör. "16 GB" + "DDR4" + "3200 MHz"). Yapılandırılabilir ürünlerde en temel seçenek varsayılır.
   Kod: `src/lib/pc/extract/`.
2. **Bot korumalı mağazalar** (Itopya, Vatan, Hepsiburada, Trendyol…): sayfa açılmaz; bunun yerine linkin
   kendi metni okunur (çoğu mağaza ürün adını linke yazar), fiyat Epey'de aynı mağaza teklifi olarak aranır.
   Fiyat bulunamazsa müşteri sonuç ekranında yazabilir. Link hiç bilgi içermiyorsa (ör. Itopya) müşteriden
   ürün sayfasındaki özellik listesini yapıştırması istenir. Hiçbir durumda kırmızı hata gösterilmez.
3. **Fiyat karşılaştırma:** Her parça için **Epey**'de aynı ya da daha iyi sınıftaki en ucuz ürünler aranır.
   Epey; Hepsiburada, Trendyol, n11, Amazon, Vatan, İncehesap, Sinerji, PttAVM, Pazarama, İdefix ve diğer
   mağazaların tekliflerini topladığı için "Mağazaya git" butonu doğrudan o mağazanın ürün sayfasına gider.
   Epey bir parça için sonuç veremezse **Amazon.com.tr** araması kullanılır.
4. "Aynı ya da daha iyi" kararı `src/lib/pc/hardware.ts` içindeki işlemci/ekran kartı güç puanları
   (PassMark'a yakın), anakart çipset sınıfları ve RAM/SSD/PSU kurallarıyla verilir.
   Yeni çıkan bir işlemci ya da ekran kartını bu dosyadaki listeye bir satır ekleyerek tanıtabilirsin.
5. **Oyunlarda tahmini FPS** (Hazır sistem kartı): işlemci ve ekran kartının test puanlarından kuralla hesaplanır
   (yapay zeka yok). Her oyun için RTX 4060 ve Ryzen 5 7600'ın bilinen ortalamaları temel alınır; X3D işlemci,
   tek modül RAM ve yetersiz VRAM etkisi dahildir. DLSS/FSR kapalı, yerel çözünürlük varsayılır.
   Oyun eklemek ya da değerleri düzeltmek için `src/lib/pc/fps.ts` içindeki `GAMES` listesi yeterli.

Bir çözümleme genelde **15-40 saniye** sürer ve ücretsizdir.

## Okuma doğruluğu testi

`tests/extract/` altında gerçek mağaza sayfaları (sıkıştırılmış), mağaza biçiminde yapıştırma metinleri ve
engelli mağaza linkleri ile beklenen değerler var. Çalıştırmak için:

```
npm run test:okuma
```

Alan başına doğruluk raporu basar; %95'in altına düşerse test başarısız olur.
Sorunlu bir sayfa bulursan (sistem düşük güvenli okumaları sana zaten bildirir): sayfayı tarayıcıda
"Farklı kaydet" ile kaydedip `gzip` ile sıkıştır, `tests/extract/fixtures/` altına koy, adresini
`_manifest.json`'a, beklenen değerleri `cases.json`'a yaz. Böylece o tür sayfalar bir daha bozulmaz.

## Yönetim sayfası

**http://localhost:8080/yonetim** — kendi **yönetici girişi** vardır ve sitedeki müşteri girişinden ayrıdır:
aynı tarayıcıda bir sekmede müşteri, diğerinde yönetici olarak girili kalabilirsin; biri diğerini çıkış
yaptırmaz. Sadece `ALERT_EMAIL` (ya da `.env` içindeki `ADMIN_EMAILS`) adresine ait hesap girebilir; bu giriş
ekranından yeni hesap açılamaz. Sitede yönetici hesabıyla girilince üst menüde "Yönetim" bağlantısı çıkar,
müşterilere hiç görünmez. Dönem seçilebilir (Bugün / 7 / 30 / 90 gün); yöneticinin kendi gezintisi ve panel
sayfaları istatistiğe sayılmaz.

| Sekme | Gösterdikleri |
|---|---|
| Genel bakış | Şu an sitede olanlar, ziyaretçi, sayfa görüntüleme, yeni üye, çözümleme, başarı oranı, ortalama süre, mağazaya yönlendirme, hata alan kişi (önceki döneme göre değişimle); gün/saat grafiği; dönüşüm hunisi (ziyaretçi → giriş → çözümleme → sonuç → mağaza); son hareketler |
| Trafik | Trafik kaynakları (Google, Instagram, doğrudan… `?utm_source=` destekli), en çok bakılan sayfalar, cihaz, tarayıcı, yeni/geri dönen, saat ve gün dağılımı |
| Çözümlemeler | Sonuç dağılımı, okuma şekli, mağazalara göre okuma başarısı, ortalama fiyat ve fark, en çok bakılan işlemci/ekran kartı, mağaza yönlendirmeleri, FPS'e bakılan oyunlar, son çözümlemeler |
| Hatalar | Hata nedenleri (ne anlama geldiği ve ne yapılacağıyla), hata alan kullanıcılar, JavaScript hataları, son hatalar |
| Kullanıcılar | Tüm üyeler (aranabilir); satıra tıklayınca kişinin cihazları, kaydettiği sistemler ve giriş öncesi dahil tüm hareketleri |
| Sistem | Epey / Amazon / Akakçe erişimi, `curl`, e-posta ayarı, listeden çıkarılan siteler ("Tekrar dene") ve son bildirimler |

İstatistikler `visits`, `analysis_runs` ve `app_events` tablolarında durur; IP adresi saklanmaz, ziyaretçi
tarayıcıdaki rastgele bir kimlikle sayılır, 180 günden eski kayıtlar kendiliğinden silinir. Hata nedenlerinin
açıklamaları `src/lib/pc/reasons.ts` dosyasındadır.

## Site listesi

Bütün siteler ve durumları `src/lib/pc/sites.ts` dosyasında tek liste halinde durur.

- **Hata veren siteler listeden otomatik çıkar.** Bot korumasına takılan site hemen, üst üste 3 kez
  bağlantı hatası veren site ise 3. hatada listeden çıkarılır. Müşteriye hata gösterilmez, çözümleme
  kalan kaynaklarla sürer ve `ALERT_EMAIL` adresine bildirim gider. Çıkarılan site 24 saat sonra
  kendiliğinden yeniden denenir; çalışırsa listeye geri eklenir ve yine haber verilir.
- Okuma zayıfsa (işlemci / ekran kartı / fiyat bulunamadı ya da çok parça tahmin edildi) günde en fazla
  bir kez "Düşük güvenli okuma" bildirimi gelir.
- Bildirimlerin kaydı veritabanında `problem_log`, sitelerin güncel durumu `store_health` tablosundadır.

Sayfaları okumak için bilgisayardaki `curl` programı da kullanılır (Windows 10/11 ve macOS'ta hazır gelir).

## İnternette yayınlarken

- Yayından sonra `/yonetim` sayfasını aç: **Epey** ve **Amazon** yeşil, **curl** "Var" olmalı.
  Epey'in Cloudflare'i Node'un kendi istemcisini reddedip `curl`'e izin veriyor; `curl` bulunmayan ya da
  IP'si engellenen bir barındırmada fiyatlar gelmeyebilir. O durumda `curl` bulunan bir sunucu (küçük bir VPS)
  gerekir.
- Çözümleme 15-40 saniye sürdüğü için Vercel'de fonksiyon süresi 60 saniyeye ayarlı (`vite.config.ts`).
- Epey sonuçları veritabanında 30 dakika önbelleğe alınır (`source_cache`), aynı parçalar tekrar sorulmaz.

## Bilmen gerekenler

- **Kullanıcı adı** 3-20 karakter olmalı; sadece İngilizce harf, rakam ve alt çizgi (_). Türkçe karakter ve boşluk olmaz. Şifre en az 8 karakter.
- Siteye `localhost`, `127.0.0.1` veya aynı ağdaki başka bir cihazdan bilgisayarın IP adresiyle girebilirsin.
- **Hesaplar ve kayıtlı sistemler** `.data` klasöründe durur. Bu klasörü silersen hepsi silinir.
- **"Mağazaya git"** butonu mağazanın gerçek ürün sayfasına gider. Fiyatlar anlık değişir; satın almadan önce mağaza sayfasından kontrol et.

## Sorun giderme

| Ekranda gördüğün | Çözüm |
|---|---|
| "Bu mağazanın sayfasını otomatik okuyamıyoruz" | Normal: site bot korumalı ve linkte ürün adı yok. Ürün sayfasındaki özellik listesini kopyalayıp yapıştır |
| "Fiyat sayfadan okunamadı" | Hazır sistemin fiyatını sonuç ekranındaki kutuya yaz; karşılaştırma hemen güncellenir |
| Bir parçada "alternatif bulunamadı" | Fiyat kaynağı o an yoğun olabilir; birkaç dakika sonra tekrar dene |
| Bildirim e-postası gelmiyor | `.env` içindeki `SMTP_USER` / `SMTP_PASS` değerlerini kontrol et, sunucuyu yeniden başlat |
| Sayfa açılmıyor / port hatası | 8080 portunu kullanan başka programı kapat |
