Ana içeriğe geç

Audit & Snapshot — Değişiklik Geçmişi

BulutFilo'da iki ayrı katman kayıt değişikliklerini takip eder:

KatmanKapsamTabloKim Tetikler
Hareket (kullanici_hareketleri)Yüksek seviyeli olay log'u — "X kullanıcı Y ekranda Z işlemini yaptı"kullanici_hareketleriModel boot hook'ları ve TransferObserver elle çağırır
Snapshot (model değişiklik geçmişi)Alan-bazlı değişiklik — "X alanı eski değerden yeni değere geçti"snapshotsSnapshotObserver + HistoryObserver (HistoryTrait) otomatik

Hareket Sistemi

App\Models\Kullanici\Hareket modeli, kullanıcı eylem log'unu tutar. Her kayıt:

AlanAçıklama
aciklamaİnsan-okur özet (örn. "Yeni ceza kaydı oluşturuldu.")
linkİlgili kayda doğrudan link (örn. route('arac.ceza.detay', [...]))
user_idEylemi yapan kullanıcı (otomatik)
created_atZaman

Hareket Yazıcı Yerler

Bunlar şu an doğrulanmış (tüm liste değil):

ModülOlayAçıklama
Sigortacreated"Yeni araç sigorta kaydı oluşturuldu."
Sigortaupdated"Araç sigorta kaydı güncellendi."
Sigortadeleted"Araç sigorta kaydı silindi - {id}"
Cezacreated"Yeni ceza kaydı oluşturuldu."
Cezaupdated"Ceza kaydı güncellendi."
Cezadeleted"Ceza kaydı silindi - {id}"
Transfer (TransferObserver)created"Yeni araç transfer kaydı oluşturuldu."
Transfer (TransferObserver)updated"Araç transfer kaydı güncellendi."
Yakit(HistoryTrait üzerinden)Otomatik snapshot
Kaza(HistoryTrait varsa)Otomatik snapshot

Görüntülenecek yer: Sol Menü → Kullanıcı Yönetimi → Kullanıcı Hareketleri (/kullanici/request-logs).


Snapshot Sistemi

Modules\Kullanici\App\Models\Snapshot her model değişikliğinde alan-bazlı diff tutar.

Mekanizma

Kullanıcı bir kaydı değiştirir


Eloquent updated() event'i fırlar


SnapshotObserver::updated() yakalar


Snapshot::makeSnapshot($model, 'updated') çağrılır


Model'in değişen alanları + eski/yeni değerler


snapshots tablosuna yazılır

HistoryTrait

Bir model HistoryTrait kullanırsa, bu trait boot() içinde static::observe(HistoryObserver::class) ekler. Doğrulanmış kullanıcılar:

ModelHistoryTrait
Sigorta
Yakit
Diğer modeller(kontrol edilmeli)

Snapshot'tan Hariç Tutulan Modeller

SnapshotObserver aşağıdakileri dışarıda bırakır:

ModelSebep
SnapshotSonsuz döngü
EkspertizÇok büyük JSON snapshot, performans
AracEkspertizAynı
AracEkspertizDetayAynı

Görüntülenecek Yer

Sol Menü → Kullanıcı Yönetimi → İşlem Kayıtları (/snapshot/logs).


Pivot Tablosu Özel Durumu

HistoryObserver::deleting() özel bir kontrol içerir:

if (get_parent_class($model::class) == Pivot::class) {
$model = $model->refresh(); // Pivot'larda silme öncesi attribute'lar erişilemez (Laravel 2024-Ekim)
$this->makeSnapshot($model, 'deleting');
}

Yorum (kod içinde): "Pivot modellerde deleted eventinde, attributelara ulaşmak şuanlık mümkün değil (2024-Ekim). Bu sebeple pivot classlarda deleting eventinde model refresh edilir."

Bu sayede ceza_ceza_maddeleri_pivot, ceza_yansitmalar_cezalar gibi pivot kayıtların silme tarihi de log'a düşer.


Audit'in Pratik Kullanımı

SoruNereye bakılır
"X aracın sigortasını kim, ne zaman değiştirdi?"İşlem Kayıtları (/snapshot/logs) — model: Sigorta, ilgili arac_id filtresi
"Kullanıcı Y bugün hangi ekranlarda iş yaptı?"Kullanıcı Hareketleri (/kullanici/request-logs) — user_id = Y, tarih filtresi
"Z personel kartı geçmişte kimde miydi?"Personel detay → Personel Kart Geçmişi (PersonelKartObserver bunu otomatik üretir)
"Z numaralı ceza yanlışlıkla silindi mi?"İşlem Kayıtları → model: Ceza, deleted event filtresi