# Cihaz Takip v2.3.0

Cep telefonu alım, stok, satış ve tamir operasyonları için responsive PHP uygulaması.

## Özellikler

- Sıfır, yenilenmiş ve ikinci el cihaz alım kaydı
- Cihazın alındığı kişi veya kurumun iletişim bilgileri
- Kişiden alımda kimlik ön/arka fotoğrafı
- Marka, model, hafıza, renk, IMEI, seri numarası, alış tarihi, alış ve hedef satış fiyatı
- Zorunlu alanlara takılmadan hızlı/taslak cihaz kaydı; bilgileri daha sonra tamamlama
- Batarya yüzdesi ile 15 maddelik cihaz kontrol listesi
- Yakınlık, karanlık/ortam ışığı ve Face ID/parmak izi kontrolleri
- Cihaz, kutu ve fatura bölümlerine çoklu görsel yükleme
- Ardışık kamera çekimlerini kaybetmeden biriktiren canlı görsel önizleme
- Yeni çekilen görselleri kayıt öncesi kaldırma ve mevcut görselleri edit ekranından silme
- Stokta / satıldı / iade filtreleri ve hızlı arama
- Alıcı ve satış fiyatı dahil satış kaydı
- Müşteri, arıza, yapılan işlem, ücret ve teslim tarihli tamir modülü
- Yönetici/personel kullanıcıları ve 4 haneli PIN girişi
- Takip kodu + telefonun son 4 hanesiyle müşteriye açık ürün/servis sorgulama ekranı
- Tamirde kullanılan parça, adet, birim maliyet, tamirci ve dış servis kayıtları
- Alış, satış, iade, tamir geliri, parça/servis ve genel giderleri birleştiren muhasebe defteri
- Ürün listelerinde otomatik mini görseller
- Sıfır, yenilenmiş ve ikinci el stoklar için mobil uyumlu müşteriye açık satış vitrini
- Vitrinde cihaz görseli, satış fiyatı, kontroller ve kontrol notu
- Yönetici ana sayfasından cihazı tüm işlem geçmişi ve görselleriyle kalıcı silme
- Tamir kayıtlarını masraf, muhasebe, işlem geçmişi ve görselleriyle tam silme
- Envanter ve Tamir & Servis listelerinde yöneticiye özel silme düğmeleri
- Vitrinde kaydırmalı cihaz galerisi, dokunmatik kaydırma ve büyütülebilir lightbox
- Küçük/büyük harf ile Türkçe karakter farkını kaldıran çok kelimeli stok araması
- Takip ekranında telefonun yalnızca sonu yerine numara içindeki herhangi dört rakamla doğrulama
- Marka, model, hafıza ve renk alanlarında mevcut kayıtlardan akıllı otomatik öneriler
- Vitrindeki her cihaz için paylaşılabilir tekil ürün sayfası
- Cihaz ve tamir listeleri ile detay ekranlarında WhatsApp paylaşım kısayolu
- Ürün ilanı ve servis takip bağlantısı için yerel karekod üretimi, SVG indirme ve yazdırma
- Tamir paylaşımında servis kodu ve telefon doğrulama parçasını içeren doğrudan takip bağlantısı
- Kullanıcı yetkisini Personel/Yönetici olarak değiştirme ve üyeliği güvenli biçimde silme
- Satın alma ve tamir IMEI alanlarında kamera ile barkod, Data Matrix veya karekod okuma
- Kişiden alınan ikinci el cihazlar için kimlik görsellerini içeren A4 alım belgesi
- Satış iadesi, alınan yere iade ve son işlemi güvenli biçimde geri alma
- İşlem geçmişi ve kullanıcı bazlı hareket kaydı
- Telefon ve masaüstüne uyumlu arayüz
- Oturum, parola özeti, CSRF koruması ve oturum açmadan erişilemeyen özel görseller
- Tarayıcıda ve sunucuda 1280 px / JPEG %75 varsayılanıyla otomatik görsel küçültme; EXIF bilgisini temizleme
- Varsayılan SQLite, isteğe bağlı MySQL desteği

## Gereksinimler

- PHP 8.2 veya üzeri
- PDO SQLite (veya PDO MySQL), GD ve Fileinfo PHP eklentileri
- Apache 2.4 ya da Nginx
- HTTPS sertifikası (canlı kullanım için zorunlu tutulması önerilir)

## Hızlı kurulum — SQLite

1. Klasörü sunucunuza yükleyin.
2. `.env.example` dosyasını `.env` adıyla kopyalayın.
3. Web sunucusunun belge kökünü `public` klasörüne yönlendirin.
4. `storage` ve `storage/uploads` klasörlerini PHP kullanıcısının yazabileceği şekilde yetkilendirin.
5. Uygulamayı tarayıcıda açın ve ilk yönetici hesabını oluşturun.

Yerel geliştirme için proje klasöründe:

```bash
cp .env.example .env
php -S 127.0.0.1:8080 -t public
```

Ardından `http://127.0.0.1:8080` adresini açın.

Müşteri sorgulama ekranı:

```text
https://alan-adiniz.example/public/index.php?page=track
```

Müşteriye açık satış vitrini:

```text
https://alan-adiniz.example/public/index.php?page=showcase
```

## `/var/www/html/araclar/cihaz` için yeni kurulum

Paketin sunucuda `/tmp/cihaz-takip-v2.3.0.zip` konumunda olduğunu varsayan örnek:

```bash
sudo mkdir -p /var/www/html/araclar/cihaz
sudo rm -rf /tmp/cihaz-takip-v2.3.0-kurulum
sudo mkdir -p /tmp/cihaz-takip-v2.3.0-kurulum
sudo unzip /tmp/cihaz-takip-v2.3.0.zip -d /tmp/cihaz-takip-v2.3.0-kurulum
sudo cp -a /tmp/cihaz-takip-v2.3.0-kurulum/cihaz-takip/. /var/www/html/araclar/cihaz/
cd /var/www/html/araclar/cihaz
sudo cp .env.example .env
sudo chown -R www-data:www-data storage
sudo find storage -type d -exec chmod 770 {} +
sudo find storage -type f -exec chmod 660 {} +
sudo systemctl restart apache2
```

Ana Apache belge kökünüz `/var/www/html` ise uygulama adresi:

```text
https://alan-adiniz/araclar/cihaz/public/index.php
```

Vitrin adresi:

```text
https://alan-adiniz/araclar/cihaz/public/index.php?page=showcase
```

## Mevcut `/var/www/html/araclar/cihaz` kurulumunu güncelleme

### 1. Yedek alın

```bash
sudo tar -C /var/www/html/araclar \
  -czf /root/cihaz-yedek-$(date +%Y%m%d-%H%M%S).tar.gz cihaz
```

### 2. Paketi geçici klasöre açın

```bash
sudo rm -rf /tmp/cihaz-takip-v2.3.0-guncelleme
sudo mkdir -p /tmp/cihaz-takip-v2.3.0-guncelleme
sudo unzip /tmp/cihaz-takip-v2.3.0.zip -d /tmp/cihaz-takip-v2.3.0-guncelleme
```

### 3. Kodları, mevcut verileri koruyarak aktarın

`rsync` yoksa önce `sudo apt install -y rsync` çalıştırın.

```bash
sudo rsync -a \
  --exclude='.env' \
  --exclude='storage/database.sqlite' \
  --exclude='storage/database.sqlite-shm' \
  --exclude='storage/database.sqlite-wal' \
  --exclude='storage/uploads/' \
  /tmp/cihaz-takip-v2.3.0-guncelleme/cihaz-takip/ \
  /var/www/html/araclar/cihaz/
```

Bu işlem mevcut `.env`, SQLite veritabanı ve yüklenmiş görselleri silmez.

### 4. İzinleri ve servisleri yenileyin

```bash
cd /var/www/html/araclar/cihaz
sudo chown -R www-data:www-data storage
sudo find storage -type d -exec chmod 770 {} +
sudo find storage -type f -exec chmod 660 {} +
sudo systemctl restart apache2
```

### 5. Otomatik veritabanı yükseltmesini çalıştırın

Yönetici giriş sayfasını bir kez açın. Uygulama şu alanları otomatik ekler:

- `devices.listed_price`
- `devices.is_public`
- `checklists.proximity_sensor_ok`
- `checklists.ambient_light_sensor_ok`
- `checklists.biometric_ok`
- `users.deleted_at`

SQLite için ek işlem gerekmez. MySQL kullanılıyorsa uygulama veritabanı kullanıcısının yükseltme sırasında `ALTER` yetkisi bulunmalıdır.

### 6. Görsel küçültme ayarını kontrol edin

Eski `.env` korunduğu için aşağıdaki değerleri elle güncelleyin:

```dotenv
UPLOAD_MAX_MB=12
IMAGE_MAX_WIDTH=1280
IMAGE_MAX_HEIGHT=1280
IMAGE_JPEG_QUALITY=75
```

Paylaşım bağlantılarının doğru alan adını kullanması için `.env` içindeki `APP_URL` değerini uygulamanın dışarıdan açılan tam adresiyle güncelleyin:

```dotenv
APP_URL=https://alan-adiniz/araclar/cihaz/public
```

Değer `localhost` olarak bırakılırsa uygulama ziyaret edilen alan adını otomatik algılamaya çalışır; sabit `APP_URL` kullanılması daha güvenilirdir.

Bir seferde çok sayıda fotoğraf yüklenecekse etkin `php.ini` dosyasını `php --ini` ile bulun ve en az şu sınırları kullanın:

```ini
upload_max_filesize = 12M
post_max_size = 96M
max_file_uploads = 40
```

Ardından:

```bash
sudo systemctl restart apache2
```

### 7. İşlevleri doğrulayın

1. Yönetici ana sayfasında son eklenen cihazın yanında **Aç** ve **Sil** görünmelidir.
2. Deneme cihazını boş alanlarla hızlı kaydedin; stok kodu otomatik oluşmalıdır.
3. Düzenle ekranında satış fiyatını girip **Müşteri vitrininde yayınla** seçeneğini açın.
4. Cihaz/kutu/fatura bölümlerinden aynı anda birkaç fotoğraf seçin.
5. Vitrini mobil telefonda açın ve görsel, fiyat, kontroller ile kontrol notunu doğrulayın.
6. Deneme kaydını silip cihaz listesi, muhasebe ve yüklenen görsellerden kalktığını kontrol edin.
7. Aynı kategori içinde art arda birkaç fotoğraf çekin; hepsinin önizlemede kaldığını ve tek tek kaldırılabildiğini kontrol edin.
8. Tamir kaydını düzenleyip kayıtlı servis fotoğrafını **Sil** olarak işaretleyin ve kaydedin.
9. Vitrinde görselleri sağa/sola kaydırın; görsele dokunup büyük görünümü açın.
10. Stok aramasında `IPH, 128 siYAH` gibi virgüllü ve farklı harfli bir arama deneyin.
11. Marka alanına `A` yazıp kayıtlı `Apple` önerisinin açıldığını kontrol edin.
12. Vitrindeki bir cihazda **Ürünü incele** ile tekil ürün sayfasını açın ve WhatsApp paylaşımını deneyin.
13. Cihaz ve tamir detayında **Karekod** bağlantısını açıp kodu başka telefonla tarayın.
14. Tamir WhatsApp bağlantısının servis kodu ve telefonun dört haneli doğrulama parçasıyla doğrudan kaydı açtığını kontrol edin.
15. Kullanıcılar ekranında deneme personelini yönetici/personel yapın, pasifleştirin ve üyeliğini silin.
16. Cihaz alımı ile tamir formunda IMEI yanındaki kamera simgesine basıp barkod veya karekod okutun.

### Kullanım notları

- Hızlı kayıtta tüm cihaz alanları boş bırakılabilir; boş alış tarihi otomatik olarak bugüne, boş fiyatlar `0` değerine çevrilir.
- Eksik hızlı kayıtlar kendiliğinden müşteriye açılmaz.
- Vitrinde yayınlamak için marka, model ve sıfırdan büyük satış fiyatı gerekir.
- Satış tamamlandığında cihaz vitrinden otomatik kaldırılır.
- **Sil** geri alınamaz ve yalnızca yönetici hesabında görünür.
- Mevcut görsel edit ekranında **Sil** olarak işaretlenir; asıl dosya form başarıyla kaydedildikten sonra kaldırılır.
- Arama metni boşluk veya virgülden bölünür ve her parçanın kayıtta bulunması gerekir.
- Telefon doğrulamasında girilen dört rakam numaranın başında, ortasında veya sonunda olabilir.
- Tamir paylaşım linkinde kayıtlı telefonun son dört rakamı doğrulama parçası olarak kullanılır; tam telefon numarası ve müşteri adı URL'ye yazılmaz.
- Tamir kaydında en az dört telefon rakamı yoksa doğrudan WhatsApp/QR takip düğmesi gösterilmez; önce telefon bilgisini tamamlayın.
- Kullanıcı üyeliği silindiğinde giriş bilgileri geri döndürülemez biçimde kaldırılır. Muhasebe ve işlem geçmişinin bütünlüğü için eski kayıtlar “Silinmiş kullanıcı” adıyla korunur.
- IMEI kamera taraması HTTPS gerektirir. Tarayıcının yerleşik barkod okuyucusu yoksa proje içindeki yerel ZXing okuyucu otomatik yüklenir; görüntü dış servise gönderilmez.
- Tekil ürün sayfası yalnızca stokta, vitrinde yayında olan cihazı ve `extra` kategorisindeki ürün görsellerini gösterir.
- Vitrin yalnızca cihazın `extra` kategorisindeki ürün görselini açar; kimlik, kutu, fatura ve servis evrakları dışarıya sunulmaz.

## Kısa güncelleme özeti

1. Önce `storage/database.sqlite`, `storage/uploads` ve `.env` dosyanızın yedeğini alın.
2. Yeni paketteki `app` ve `public` klasörlerini mevcut kurulumun üzerine yazın.
3. Mevcut `.env`, `storage/database.sqlite` ve `storage/uploads` içeriğini silmeyin.
4. Sayfayı bir kez açın. Yeni tablolar ve eski kayıtların muhasebe/geçmiş bağlantıları otomatik oluşturulur.
5. Apache hata verirse `storage` izinlerini yeniden uygulayıp Apache’yi yeniden başlatın.

### Debian / Ubuntu üzerinde gerekli eklentiler

```bash
sudo apt update
sudo apt install -y php-sqlite3 php-gd
sudo chown -R www-data:www-data /var/www/html/araclar/cihaz/storage
sudo chmod -R u+rwX,g+rwX,o-rwx /var/www/html/araclar/cihaz/storage
sudo systemctl restart apache2
```

Kontrol:

```bash
php -m | grep -Ei 'PDO|sqlite|gd|fileinfo'
```

## MySQL kurulumu

1. Boş bir MySQL veritabanı ve yalnızca bu veritabanına erişen bir kullanıcı oluşturun.
2. `.env` dosyasındaki SQLite satırlarını kapatıp MySQL ayarlarını etkinleştirin.
3. İlk istekte tablolar otomatik oluşturulur.

Örnek:

```dotenv
DB_DRIVER=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=cihaz_takip
DB_USERNAME=cihaz_takip
DB_PASSWORD=uzun_ve_benzersiz_bir_parola
```

## Apache örneği

```apache
<VirtualHost *:443>
    ServerName cihaz.example.com
    DocumentRoot /var/www/cihaz-takip/public

    <Directory /var/www/cihaz-takip/public>
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
```

## Nginx örneği

```nginx
server {
    listen 443 ssl http2;
    server_name cihaz.example.com;
    root /var/www/cihaz-takip/public;
    index index.php;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    }

    location ~ /\. {
        deny all;
    }
}
```

## Güvenlik ve KVKK notları

Kimlik görüntüleri özel nitelikte kişisel veri sayılabilecek kadar hassastır. Canlı kullanımda:

- Uygulamayı yalnızca HTTPS üzerinden yayınlayın.
- Sunucunun ve veritabanının düzenli, şifreli yedeğini alın.
- Personel hesaplarını kişi bazında açın; ortak parola kullanmayın.
- 4 haneli PIN kullanımı nedeniyle personel giriş ekranını mümkünse yalnızca işletme ağı/VPN üzerinden erişilebilir tutun.
- Verilere erişim ve saklama sürenizi işletmenizin KVKK politikasına göre belirleyin.
- Hosting hesabında iki aşamalı doğrulamayı etkinleştirin.
- `storage` klasörünü kesinlikle web belge kökü yapmayın.

## Yedekleme

SQLite kurulumunda uygulamayı kısa süreli bakım moduna aldıktan sonra `storage/database.sqlite` dosyasıyla `storage/uploads` klasörünü birlikte yedekleyin. MySQL kurulumunda veritabanı dökümünü ve aynı görsel klasörünü eş zamanlı saklayın.
