feat(plan): devreden borç planın parçası, borçlu ayda %45 kuralı

- Devreden borç: elle girilen ya da dönem başından önceki son ay sonu ölçümü
- Borçlu ay: harcanabilir = gelir × oran (vars. %45), kalan borca, artan birikime
- Birikim hedefi ve Kakeibo devri borçlu ayda uygulanmaz; kapanış devir üretmez
- Plan düzenleme ve sihirbazda devreden borç alanı + oran; canlı önizleme
- Plan'daki eski borç bölümü ve taksit önerisi kaldırıldı (veri yerinde)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-14 06:27:12 +03:00
parent d3e012f50b
commit f0d285a9ba
34 changed files with 1376 additions and 462 deletions
+194
View File
@@ -0,0 +1,194 @@
# Kakeibo panel istekleri (güncel: 14 Kasım 2026, 2. tur)
## VS Code'daki Claude'a verilecek prompt
Aşağıdaki metni olduğu gibi kopyalayıp yapıştırın:
```text
docs/KAKEIBO_PANEL_ISTEKLERI.md dosyasını baştan sona oku. Bu dosya, docs/BORC_TAKIBI.md'deki
"Borç sayfası" yaklaşımının yerine geçiyor; borç artık ayrı sayfada değil, aylık planın ve panelin
içinde "Devreden borç" olarak takip edilecek.
Kurallar:
1. Kod yazmadan önce: ilgili dosyaları bul (Planlama, Defter, Ay sonu değerlendirmesi, Panel,
Borç sayfası, nav menüsü) ve bana dosya listesiyle birlikte adım adım bir plan göster.
Onayımı bekle.
2. Mevcut verilere dokunma: veritabanı yedeği al, yalnızca alan ekle, eski kayıtları toplu
değiştirme, koleksiyon silme. Borç sayfasını kaldırırken verisini silme.
3. Bölüm sırasıyla ilerle (A → H). Her bölümden sonra test et, kısa özet ver.
4. Hesapları dosyadaki "Kontrol" rakamlarıyla birim testine dönüştür.
5. Türkçe büyük harf için toLocaleUpperCase("tr-TR") kullan; CSS text-transform kullanma.
6. Bitince npm run lint, typecheck ve testler geçsin; CHANGELOG "Yayınlanmamış" altına yaz.
```
> **Not (Claude, sohbetten):** Bu bilgisayardaki çalışma kopyasında (dal `faz/17-ice-aktarma`, sürüm 1.2.0, 9 Kasım) Planlama, Defter, Ay sonu ve Borç ekranları yok. Bu ekranların bulunduğu güncel sürüm üzerinde çalışılmalı. Dosyalar bulunamazsa Claude tahminle yeni ekran yazmasın, sorsun.
---
## A · Devreden borç: planın parçası olsun
### A1 · Planlama sayfasında yeni kutu
- "Birikim hedefi" kutusunun **üzerine** aynı görünümde **"Devreden borç"** kutusu eklenir.
- Aylık plana alanlar eklenir (eski alanlar değişmez, varsayılan `null`):
- `carriedDebtMinor`: devreden borç (pozitif sayı)
- `carriedDebtSource`: `"auto"` ya da `"manual"`
- `debtPaymentMinor`: bu ay borca giden tutar (hesaplanır)
- `spendableRateBp`: borçlu ayda harcanabilir oranı (varsayılan **4500** = %45)
### A2 · İlk dönem: elle giriş
- Önceki tanımlı dönem yoksa "Devreden borç" boş ve düzenlenebilir gelir. Kullanıcı elle girer (`source = "manual"`).
- Yardım metni: "Maaş hesabının eksi bakiyesi + kartın tüm borcu (ekstre + dönem içi harcama) + kalan taksitler − hesaptaki artı bakiye."
### A3 · Sonraki dönemler: otomatik
- Yeni dönem planı oluşturulurken devreden borç, **önceki dönemin ay sonu borcundan** otomatik dolar (`source = "auto"`). Ay sonu borcunun tanımı için bkz. **C**.
- Kullanıcı isterse elle düzeltebilir. Düzeltince `source = "manual"` olur ve kutuda "elle düzeltildi" rozeti görünür.
### A4 · Borç varsa birikim yok, borç odaklı plan
- `carriedDebtMinor > 0` iken **birikim hedefi plana dahil edilmez** (0 sayılır).
- Planlama sayfasında "Birikim hedefi" kutusu yerine **"Devreden borç"** ve altında **"Bu ay borca giden"** gösterilir. Birikim kutusu gizlenir ya da soluk "Borç bitince açılır" yazısıyla durur.
- Panelde de aynı kutu "Devreden borç" yazar (bkz. D).
### A5 · Harcanabilir hesabı (borçlu ay)
Devreden borcun tamamını tek ayda düşmek harcanabiliri eksiye sokar. Bu yüzden:
```
Harcanabilir = Toplam gelir × %45 (spendableRateBp ile ayarlanabilir)
Bu ay borca giden = Toplam gelir − Sabit giderler − Harcanabilir
```
Kenar durumları:
- `Bu ay borca giden` **devreden borçtan büyükse**: borca yalnızca devreden borç kadar gider, kalan tutar birikime yazılır (borç bu ay biter).
- `Gelir − Sabit < Gelir × %45` ise (sabitler çok yüksek): Harcanabilir = Gelir − Sabit, borca giden 0, kırmızı uyarı: "Sabit giderler çok yüksek, bu ay borç azalmıyor."
- Ekranda formül açıkça yazılsın: `Gelir − Sabit − Bu ay borca giden = Harcanabilir`. Altında küçük satır: "Devreden borç 57.100 · ay sonu hedef 36.376,60."
**Kontrol (Aralık 2026 rakamlarıyla):**
- Gelir 79.509,64 · Sabit 23.006,90 · Devreden borç 57.100
- Harcanabilir = 79.509,64 × 0,45 = **35.779,34**
- Bu ay borca giden = 79.509,64 − 23.006,90 − 35.779,34 = **20.723,40**
- Ay sonu hedef borç = 57.100 − 20.723,40 = **36.376,60**
- Kenar durumu testi: devreden borç 10.000 → borca giden 10.000, birikime 10.723,40.
### A6 · Borç bitince
- Devreden borç 0 olduğunda (otomatik ya da elle) plan normal Kakeibo düzenine döner: `Gelir − Sabit − Birikim hedefi = Harcanabilir`. Birikim kutusu tekrar görünür, %45 kuralı devre dışı kalır.
---
## B · Borçlar sayfası kaldırılsın
- Borç sayfası rotası (`/borc` ya da benzeri), menü bağlantısı ve sayfaya özel bileşenler kaldırılır.
- **Veri silinmez:** `debtSnapshots` / `installmentPlans` koleksiyonları ve modelleri yerinde kalır. Kullanılmayan servis kodu silinebilir, migration ile koleksiyon düşürülmez.
- Taksit yükü bilgisi gerekiyorsa Planlama → Sabit giderler → "Taksitler" satırında öneri olarak kalabilir.
- `docs/BORC_TAKIBI.md` dosyasının en üstüne "Bu yaklaşım KAKEIBO_PANEL_ISTEKLERI.md ile değiştirildi" notu eklenir.
---
## C · Ay sonu: "Ne kadar biriktirdim?" → "Ne kadar borç devretti?"
### Tanım (tek doğru kaynak)
```
Ay sonu borcu = banka hesaplarının eksi bakiyeleri (KMH)
+ kredi kartı tüm borcu (ekstre + dönem içi + provizyon)
+ kalan taksitler
− hesaplardaki artı bakiyeler (nakit, banka, yemek kartı, toplu taşıma)
(sonuç eksiyse borç 0, aradaki fark birikimdir)
```
Hesap, dönem bitiş tarihindeki hesap bakiyelerinden yapılır. Transferler (kart ödemesi, ATM, kendi hesapları arası havale) borcu değiştirmez.
### Ekran
- **Borç varken** başlık: **"4 · Ne kadar borç devretti?"**
- Ana rakam: ay sonu borcu (bir sonraki dönemin devreden borcu olur).
- Altında: "Ay başı 78.530,48 → ay sonu X" ve fark. Azaldıysa yeşil "borç Y TL azaldı", arttıysa kırmızı "borç Y TL arttı".
- Plan karşılaştırması: "Hedef: Z TL borca gidecekti, gerçekleşen: Y TL".
- **Borç yokken** başlık: **"4 · Ne kadar biriktirdim?"**. Değer = ay sonu net artı − ay başı net artı. Eksiyse birikim yazılmaz, "Bu ay birikim yok" denir.
- **Plan hedefi asla gerçekleşen olarak gösterilmez.**
### Mevcut hatanın kontrolü
Kullanıcı hiç birikim girmedi, hesap sürekli ekside, ama ekranda birikim çıkıyor. Şu dört olasılığı kontrol et:
1. Plan hedefi (C) gerçekleşen yerine yazılıyor olabilir.
2. Hesap yalnızca `gelir − gider` olarak yapılıp sabit giderler, kart borcu ya da KMH faizi düşülmüyor olabilir.
3. Kart ödemesi veya hesaplar arası havale birikim sayılıyor olabilir.
4. Eksi sonuç `Math.max(0, …)` ile sıfıra çekiliyor ya da işareti kayboluyor olabilir.
**Kontrol (bankayla doğrulanmış):** 31 Ekim ay sonu borcu **78.530,48**, 13 Kasım **79.078,85** → "borç **548,37 TL arttı**". Birikim gösterilmez.
---
## D · Panel (dashboard)
### D1 · Plan satırı
```
[ Toplam gelir ] − [ Sabit giderler ] − [ Devreden borç ] − [ Toplam birikim ] = [ Harcanabilir ]
```
- "Devreden borç" kutusunun ana rakamı **bu ay borca giden** tutardır. Küçük satırda devreden borcun tamamı yazar: "toplam 57.100". Formül böylece eksiye düşmez.
- Borç varken birikim kutusu 0 ve soluk ("borç bitince"). Borç yokken devreden borç kutusu soluk/gizli.
### D2 · Ödeme türleri satırı (anlık bakiye)
`[ Nakit ] [ Kredi kartı ] [ Banka kartı + Havale/EFT ] [ Yemek kartı ] [ Toplu taşıma kartı ]`
| Kutu | Kaynak (hesap türü) | Ana rakam | Alt satır |
|---|---|---|---|
| Nakit | `cash` | bakiye | bu ay nakit harcama (minibüs, taksi dahil) |
| Kredi kartı | `credit_card` | **dönem içi borç** (ör. −29.713,54) | toplam borç (taksit dahil) · son ödeme · kalan limit |
| Banka kartı + Havale/EFT | `bank` | bakiye (ör. **−39.264,44**, kırmızı) | KMH kullanılan / limit · bu ay çıkış |
| Yemek kartı | `meal_card` | bakiye | bu ay harcanan |
| Toplu taşıma kartı | **yeni** `transit_card` | bakiye | bu ay yükleme / harcama |
Kurallar:
- **Ödeme türü = işlemin hesabının türü.** Defter kodları: N `cash`, KK `credit_card`, BK `bank`, YK `meal_card`, TT `transit_card`.
- **Havale/EFT** banka hesabından çıktığı için "Banka kartı" kutusunda gider sayılır. Kendi hesapları arası havale (maaş → Enpara, kızın ek hesabı) transferdir.
- **Kart ödemesi ve ATM çekimi transferdir**, hiçbir kutuda gider değildir.
- **İstanbulkart:** yükleme, banka/nakit hesabından `transit_card` hesabına transfer. Binişler ulaşım gideri (ya da ay sonunda tek düzeltme kaydı). İçe aktarmada "İSTANBULKART YUKLEME" yeni aktarmalarda bu hesaba transfer olarak eşlensin; eski kayıtlar değişmesin.
- `transit_card` için: `shared/accounts.ts` → `ACCOUNT_TYPES`, hesap formu, `tr.ts` ("Toplu taşıma kartı" / "Toplu taşıma kartları"), ikon. Enum genişlediği için migration gerekmez.
- Her kutuda **son içe aktarma / mutabakat tarihi** küçük yazılsın. Bankayla farklıysa mevcut mutabakat akışına bağlantı.
- **Kontrol (13 Kasım):** Banka kartı **−39.264,44**, Kredi kartı **−29.713,54**. 235 TL provizyon "onay bekleyen" olarak ayrı.
### D3 · Yerleşim
- Orta alan çok dar. Ana kapsayıcının dar `max-w-*` sınırı kaldırılsın ya da genişletilsin (ör. `max-w-screen-2xl`, yanlarda `px-4 lg:px-8`).
- Kutu satırları ekran genişliğine yayılsın:
- Plan satırı: mobilde 2, tablette 3, masaüstünde 5 sütun.
- Ödeme türleri: mobilde 2, masaüstünde 5 sütun.
- Altındaki kartlar iki sütun (`lg:grid-cols-2`).
- Kutular arasındaki "−" ve "=" işaretleri masaüstünde görünsün, mobilde gizlensin.
---
## E · Defter: Açıklama varsayılan büyük harf
- İşlem formu (`transaction-form.tsx`, `name="description"`) ve defter satırlarındaki açıklama alanları.
- `toLocaleUpperCase("tr-TR")`: hem yazarken (onChange) hem sunucuda (zod `.transform`).
- Mevcut kayıtlar toplu değiştirilmez.
## F · Planlama: Sabit gelirler / Sabit giderler kutuları büyük harf
- Bu iki bölümdeki metin kutuları (kalem adı) aynı kuralla.
- Ortak yardımcı: `shared/format.ts` → `upperTr(s)`. Birim testi: `"elma market"` → `"ELMA MARKET"`, `"istanbul"` → `"İSTANBUL"`, `"ılık"` → `"ILIK"`.
## G · Metin değişiklikleri (`tr.ts`)
- "Birikim hedefi" → borçlu ayda "Devreden borç" / "Bu ay borca giden".
- Ay sonu: "Ne kadar biriktirdim?" → borçlu ayda "Ne kadar borç devretti?".
- Panel kutusu: "Devreden borç".
## H · Kabul kriterleri
- [ ] Planlamada "Devreden borç" kutusu birikim hedefinin üstünde. İlk dönemde elle, sonraki dönemlerde otomatik dolar, elle düzeltilebilir.
- [ ] Borç varken birikim hedefi plana girmez. Harcanabilir = gelir × %45. A5 kontrol rakamları testte birebir.
- [ ] Borç 0 olunca plan birikim düzenine döner.
- [ ] Borçlar sayfası ve menü bağlantısı yok. Verisi duruyor.
- [ ] Ay sonu "Ne kadar borç devretti?" gösteriyor. Test: 78.530,48 → 79.078,85 = "borç 548,37 TL arttı".
- [ ] Panelde plan satırı `Gelir − Sabit − Devreden borç − Birikim = Harcanabilir` ve ödeme türleri satırı var. 13 Kasım: −39.264,44 ve −29.713,54.
- [ ] Kart ödemesi, ATM ve kendi hesaplar arası havale hiçbir kutuda gider değil.
- [ ] Panel orta alanı geniş ekranda yayılıyor, mobilde taşma yok.
- [ ] Açıklama ve sabit gelir/gider adları Türkçe büyük harfle kaydediliyor. Eski kayıtlar değişmedi.
- [ ] Lint, typecheck ve testler geçiyor. CHANGELOG güncel.
---
## Kakeibo uyarlaması ve kararlar (kullanıcı, 14 Kasım 2026)
Belge butcem için yazıldı; Kakeibo karşılıkları ve kullanıcı kararları:
1. **Panel bakiyeleri (D2):** son ay sonu ölçümünden (`debt_snapshots`) gelir; canlı banka eşleşmesi yok.
Önceki aydan devreden yoksa planlamada elle yazılır.
2. **Borçlu aylarda Kakeibo'nun kendi aşım devri (`carryovers`) üretilmez** (çifte sayım olmasın).
3. **Taksit planları için ayrı ekran yok.** Taksitler sabit giderlere elle eklenir; taksit önerileri kaldırılır,
`installment_plans` verisi yerinde kalır.
4. **%45 kuralı varsayılan:** açık dönem dahil, borç > 0 olan her dönemde.
5. Mevcut veriye dokunulmaz: yalnızca alan eklenir (`periods.spendable_rate_bp`, `payment_methods.type`),
eski kayıtlar toplu değiştirilmez; `periods.opening_debt` (B1'den) devreden borcun elle değeridir.