# İşlem yapan kullanıcı kaydı

Ürün ve satış kayıtları `createdByUserId` (oluşturan) ve `updatedByUserId`
(son işlem yapan) alanlarını taşır. HTTP controller'ları kullanıcı kimliğini
JWT ile doğrulanmış `CurrentUser` üzerinden servise aktarır. Bu alanlar giriş
DTO'larında bulunmaz; istemcinin gönderdiği kullanıcı kimlikleri kabul edilmez.
Düzenleme, iptal ve günlük satış senkronizasyonu ilk oluşturanı değiştirmez.
Liste ve detay yanıtları kullanıcı kimliklerini içerir.

`product_stock_movements` stok değişikliğini aynı transaction içinde kaydeder:

- `productId`, ilgili işlem varsa `saleId`
- `performedByUserId`, işlem tarihi ve `reason`
- `beforeAmount`, `afterAmount`, `delta`
- `stockTypeBefore`, `stockTypeAfter`

İlk stok `INITIAL`, ürün ekranındaki miktar değişikliği `MANUAL_UPDATE`,
satış `SALE`, alış `PURCHASE`, satış düzenleme `SALE_UPDATE` ve iptal
`SALE_CANCEL` olarak kaydedilir. Günlük satış senkronizasyonu `DAILY_SYNC`
ile her etkilenen ürünün toplu işlem öncesi/sonrası miktarını kaydeder;
günlük satış satırlarının kullanıcıları ayrıca `sales` tablosunda tutulur.
Net stok değişimi sıfır olduğunda da toplu işlem kaydı saklanır.

Stok kaydı yazılamazsa ürün, satış ve kasa değişiklikleri de geri alınır.
İptal tekrarları ikinci bir stok veya hareket kaydı oluşturmaz.
Kullanıcı soft delete edildiğinde kimlik referansları ve geçmiş korunur.

Migration `AddOperationUserAudit1791115200000` mevcut kayıtlara kullanıcı
atamaz; bilinmeyen geçmiş kullanıcılar `NULL` kalır. JWT bağlamı bulunmayan
seeder ve dahili işlemler de kullanıcı kimliği uydurmaz.

Doğrulama: `npm run test:operation-audit`. Gerçek JWT ve HTTP controller
yollarını iki test kullanıcısıyla çalıştırır; tüm test verileri rollback edilir.
