▶️ Hisse Sattım — Ne Olur?
Pozisyondaki hisseyi sattığımda K/Z hesap + cüzdana gelir + stopaj
- UI: Portföy detayda "İşlem Ekle" → Sat seçeneği
- Form: Sembol (mevcut pozisyondan), adet, fiyat, tarih, komisyon
- POST:
POST /api/portfolio/trade { "portfolioId": 23919, "sembol": "SVGYO", "tip": "sat", "adet": 500000, "fiyat": 22.50, "tarih": "2026-05-25" } - Backend validasyon:
- Adet ≤ mevcut adet (overdraft önle)
- Gerçekleşen K/Z hesapla:
(satış_fiyat - ort_maliyet) × adet - Pozisyon güncelle (kalan adet)
- Eğer adet = 0 → kapalı pozisyon olur
- Hesaplama:
Gerçekleşen K/Z = (Satış Fiyatı - Ort. Maliyet) × Satılan Adet = (22.50 - 21.22) × 500,000 = ₺640,000 kâr
- Stopaj: Hisse satışı için %0 (HSYF/borsa farklı). Net K/Z = ₺640,000
- DB Transaction (atomic):
BEGIN; INSERT trades (tip='sat', adet=500000, fiyat=22.50); UPDATE positions SET adet = adet - 500000 WHERE portfolio_id=23919 AND sembol='SVGYO'; INSERT wallet_transactions (tip='gelir', tutar=11250000, aciklama='Portföy satış: SVGYO'); UPDATE wallet_balance SET tutar = tutar + 11250000; IF kalan_adet = 0: INSERT closed_positions; COMMIT; - Domain Events:
trade:changed portfolio:changed wallet:transaction balance:changed (varsa) position:closed - UI Refresh: Pozisyon adet düşer, K/Z güncel, cüzdan +₺11,250,000, "Kapalı Pozisyonlar" sekmesi (varsa)
- Bildirim: "SVGYO satışı: 500,000 lot @ ₺22.50 — Gerçekleşen kâr: ₺640,000"
📊 Etkilenen Modüller
| Modül | Etki |
|---|---|
| Portföy | Pozisyon adet düş, gerçekleşen K/Z güncelle |
| Cüzdan | +Gelir kaydı, bakiye artar |
| Kapalı Pozisyonlar | Eğer tamamen satıldıysa → yeni kapalı pozisyon |
| Genel Varlık | Toplam değer recalc |
🔌 Endpoint'ler
POST/api/portfolio/trade
GET/api/portfolio/{id}/realized-pnl
GET/api/portfolio/{id}/closed-positions
GET/api/wallet/transactions
🗄️ DB Tabloları
| Tablo | İşlem |
|---|---|
trades | INSERT (islem_tipi='SAT', adet, fiyat, komisyon) |
positions | UPDATE adet (=0 ise DELETE) |
closed_positions | INSERT (giriş/çıkış fiyatları, realize_pnl) |
wallet_transactions | INSERT (tip='gelir', kategori='hisse_satim') |
portfolio_snapshots | INSERT (yeni durum) |