Files
butcem/CHANGELOG.md
T
2026-11-06 00:58:51 +03:00

32 KiB
Raw Blame History

Değişiklik Günlüğü

Bu projedeki tüm önemli değişiklikler bu dosyada belgelenir.

Biçim Keep a Changelog esas alınır ve proje Semantic Versioning kullanır.

Yayınlanmamış

Eklendi — Faz 10a: aylık bütçe

  • Bütçe sayfası (/butce?ay=YYYY-MM): ay gezintisi, dönem sınırları hane ayarı budgetMonthStartDay'e göre (ör. 15'i → 15 Kasım – 14 Aralık).
  • Kategori limitleri (budgets): her gider kategorisine limit; üst kategori limiti alt kategorileri kapsar, alt kategori limiti üstün içinde alt sınırdır ve toplam bütçede iki kez sayılmaz. Limitsiz alt kategoriler "Üst kategori limitinde" olarak gösterilir; hiçbir limitin kapsamadığı harcama "Bütçesiz harcama" toplamında.
  • Gerçekleşen / limit / kalan, yüzde çubuğu (ayın geçen kısmı işaretli), %80'de uyarı, %100'de "Limit doldu", aşımda "Limit aşıldı".
  • Ay sonu tahmini: sabit giderler (düzenli işlem, taksit) olduğu gibi + kalan planlı giderler + değişken giderin günlük hızıyla ay sonuna yansıtılması; tahmin limiti aşıyorsa işaret.
  • Bölünmüş işlemler kalem bazında; taksitler hane ayarına göre her biri kendi ayına (varsayılan) veya tamamı alış ayına. Başkasının "yalnızca ben" hesabından giderler hane ayarına göre yalnızca tutar olarak sayılır.
  • "Önceki aydan kopyala" ve "Önceki ayın harcamalarından oluştur" (ana kategori bazında, 100 TL'ye yukarı yuvarlanır); mevcut limitler varsa onay istenir.
  • Limit düzenleyici: tüm etkin gider kategorileri ağaç sırasıyla, anlık toplam bütçe.
  • Dashboard: %80'i geçilen veya aşılan kategori sayısıyla uygulama içi bütçe uyarısı.
  • Seed: Çakır Ailesi'nde önceki ve bu ay için harcamalardan oluşturulmuş bütçeler (bu ay Market limiti düşük, Elektrik alt limiti).
  • 010 migration'ı: budgets index'i (hane × ay benzersiz).
  • Testler: dönem sınırları, eşikler, tahmin, üst/alt limit toplama, bütçesiz harcama, sıra (birim); limitler, bölünmüş işlem, planlı, gizli hesap ayarı, taksit modları, başlangıç günü, kopyala/oluştur, yetki (entegrasyon).

0.9.0 - 2026-11-06

Faz 9: birikim ve varlık takibi, fiyat tablosu (elle), kâr/zarar, net varlık (9a ve 9b alt fazları).

Eklendi — Faz 9b: dönemsel rapor ve net varlık

  • Dönemsel rapor (/birikim toplam, /birikim/:id varlık bazında): 3 ay / 6 ay / 12 ay / tümü (?donem=); dönem başı değer, yatırılan TL, dönem sonu değer, satış geliri, gelen/çıkan hediye ve dönem kâr/zararı (TL ve %, dönemde bağlanan sermayeye oranla). Formül sayfada yazılıdır.
  • Aylık değer grafiği (shadcn charts / Recharts): güncel değer (düz çizgi) ve maliyet (kesikli, basamaklı), lejant, ipucu ve tablo görünümü. Fiyatı olmayan varlık toplam rapora katılmaz ve belirtilir.
  • Net varlık (/birikim üstünde): hesap bakiyeleri + birikim (alış fiyatı) + cari alacaklar + aynî alacaklar (alış) − kart/KMH borçları − cari borçlar − aynî borçlar (satış). Gizli varlık ve cariler yalnızca sahibinin net varlığına girer; gizli hesap bakiyeleri hane ayarına göre.
  • Dashboard: "Toplam hesap bakiyesi", "Kart borçları" ve "Net varlık" kartları gerçek veriyle (gelir/gider kartları Faz 14).
  • Aynî kayıt ↔ varlık bağlantısı: "Ödeme gerçekleşti → Aynı varlıkla" diyaloğunda isteğe bağlı kutucuk. Borç ödemesi seçilen varlıktan ortalama maliyetle düşer; alacak tahsilatı varlığa borç tarihindeki birim fiyatla eklenir. Ödeme ve varlık hareketi tek transaction'da; varlık yetersizse hiçbir şey yazılmaz. Bağlı hareket Birikim'den tek başına silinemez; aynî kayıt silinince bağ çözülür.
  • Fiyat okuma yardımcıları ayrı modülde (features/in-kind/prices.ts).
  • Testler: dönem noktaları, örnek senaryo ("10 gr'ı 25.000'e aldım, her ay ekledim"), başlangıç değeri, fiyat yokluğu, toplam (birim); dönem raporu, gizli varlık ve fiyatsız varlık, net varlık formülü ve değişmezleri (makas, cari borç), aynî borç/alacak bağlantısı, yetersiz varlıkta geri alma, tür uyuşmazlığı (entegrasyon).

Değişti — Faz 9b

  • "Aynı varlıkla" alacak tahsilatında anlamsız olan "varlığı almak için harcanan" tutar alanı kaldırıldı (yalnızca borç ödemesinde gösterilir).
  • recharts bağımlılığı ve components/ui/chart.tsx eklendi.
  • CHANGELOG sürüm karşılaştırma bağlantıları 0.6.0–0.9.0 için tamamlandı.

Eklendi — Faz 9a: varlık lotları ve kâr/zarar

  • Birikim sayfası (/birikim): altın, döviz ve ziynet varlıkları (assets); toplam güncel değer, toplam maliyet, gerçekleşmemiş ve gerçekleşmiş kâr/zarar; elde kalmayan varlıklar ayrı grupta. Fiyatı olmayan varlık toplam değere katılmaz ve belirtilir.
  • Varlık hareketleri (assetMovements): alım, gelen hediye/miras, satış, hediye/çıkış; tarih, miktar, tutar veya birim fiyat (ikisi de boşsa fiyat tablosundan: alımda satış, satış ve hediyede alış fiyatı), hesap, saklama yeri, not. Geçmiş tarihli satış/çıkış o tarihteki miktarla sınırlıdır.
  • Hesap bağlantısı: alım hesaptan varlığa, satış varlıktan hesaba transfer olarak kaydedilir (bakiye değişir, gelir/gider raporlarına girmez). İşlem listesinde varlık adıyla görünür; bağlı işlem tek başına düzenlenemez/silinemez, hareket silinince birlikte silinir.
  • Hesap motoru (shared/portfolio.ts): ağırlıklı ortalama maliyet, satışta ortalama maliyetle gerçekleşmiş K/Z, çıkışta K/Z yazılmaz, gelen hediyenin maliyeti o günkü değer (yatırım sayılmaz); güncel değer alış fiyatıyla (Faz 0), gerçekleşmemiş K/Z TL ve %.
  • /birikim/:id: özet (eldeki miktar, ortalama maliyet, maliyet, güncel değer, K/Z, yatırılan, satış geliri), hareket geçmişi (kalan miktar, satış K/Z'si), hareket silme (sonraki çıkışı eksiye düşürecekse reddedilir).
  • "Yalnızca ben" varlık: varlık, hareketleri ve bağlı hesap işlemleri yalnızca sahibine görünür.
  • Seed: aylık alımlı ve bir satışlı gram altın birikimi, düğün ziynetleri (hediye giriş ve çıkış), Emre'nin "yalnızca ben" dolar varlığı, Annemler'de fiyatsız bilezikler.
  • 009 migration'ı: assets, assetMovements index'leri, işlemlerde assetId. Denetim kaydı: asset.delete, asset.movement.delete.
  • Testler: ortalama maliyet, satış/çıkış, hediye, eksi miktar, oran biçimi (birim); alım/satış transferleri ve bakiye, fiyat tablosundan tutar, gerçekleşmiş K/Z, kilitli işlem, hareket silme, gizli varlık, izleyici ve başka hane (entegrasyon).

0.8.0 - 2026-11-05

Faz 8: cari hesaplar ve aynî borç/alacak (8a ve 8b alt fazları).

Eklendi — Faz 8b: aynî borç/alacak ve fiyat tablosu

  • Varlık türleri: gram altın, çeyrek, yarım, tam, Cumhuriyet altını, 22 ayar bilezik, gümüş, USD, EUR, GBP (birim: gr / adet / birim; miktarlar binde bir hassasiyetle).
  • Fiyat tablosu (/fiyatlar, assetPrices): varlık × tarih × alış/satış, elle giriş; tek fiyat girilirse ikisine de yazılır; gün başına tek kayıt; son fiyatlar ve geçmiş. Faz 9 varlık takibi aynı tabloyu kullanacak.
  • Aynî borç/alacak (inKindDebts), cari sayfasında: cari, yön (ben borçluyum / bana borçlu), varlık, miktar, borç tarihi; o tarihteki birim fiyat ve TL karşılığı not olarak saklanır (boşsa fiyat tablosundan). Değerleme: borç satış, alacak alış fiyatıyla.
  • Borca bağlı birikim planı: birikim hesabı ve aylık tutar; "Birikim ekle" kaynak hesaptan birikim hesabına transfer oluşturur, borç kapanmaz. Kartta güncel değer, biriken, kalan ihtiyaç ve tahmini kapanış ayı.
  • "Ödeme gerçekleşti": aynı varlıkla veya TL karşılığıyla; tarih, miktar/tutar, hesap. TL ödemede miktar boşsa güncel fiyattan hesaplanır; kısmi ödeme miktarı düşürür, kalanı aşan ödeme kalana sınırlanır, tam ödemede kayıt kapanır. Borç ödemesi hesaptan çıkış, alacak tahsilatı hesaba giriş işlemi olarak aynı transaction'da oluşturulur; denetim kaydı (inkind.payment, inkind.close).
  • Cari listesinde açık aynî kayıtlar rozet olarak.
  • Aynî borç hareketleri cari TL bakiyesine ve gelir/gider toplamlarına girmez; "yalnızca ben" carinin aynî kayıtları ve hareketleri başkasına görünmez (hesap ekstresinde ad ve açıklama gizlenir). Ödeme işlemi tek başına silinemez.
  • Seed: son 6 ayın örnek altın/döviz fiyatları (gerçek piyasa verisi değildir), birikim planlı 5 gr altın borcu (iki katkıyla), USD alacağı, Annemler'de çeyrek altın alacağı.
  • 008 migration'ı: assetPrices, inKindDebts index'leri, işlemlerde aynî borç alanları.
  • Testler: değer/miktar karşılığı, değerleme fiyatı, ilerleme ve tahmini kapanış (birim); fiyat tablosu, tarih fiyatı, birikim katkısı, kısmi/tam ödeme, kapanış, alacak tahsilatı, cari bakiye ve gelir/gider ayrımı, gizli cari ve yetki (entegrasyon).

Eklendi — Faz 8a: cari hesaplar

  • Cari kişiler (contacts): ad, yakınlık, telefon, not, açılış bakiyesi (+ bana borçlu / − ben borçluyum), vade tarihi ve hatırlatma günü; arşivleme; aynı adda iki aktif cari engellenir (Türkçe normalize).
  • "Yalnızca ben" cari: kişi ve hareketleri yalnızca sahibine görünür; ortak hesabın ekstresinde bu hareketler görünür ama kişi adı "Gizli cari" olarak maskelenir.
  • Cari hareketleri: "Borç verdim", "Borç ödedim" (hesaptan cariye), "Borç aldım", "Tahsilat" (cariden hesaba). Hepsi transferdir: hesap bakiyesi değişir, gelir/gider toplamlarına girmez. Kısmi ödeme bakiyeyle doğal olarak desteklenir.
  • /cari: bana borçlu / ben borçluyum / net özeti, cari listesi (bakiye, son hareket, vade rozeti), yeni cari, hareket ekle, düzenle, arşivle.
  • /cari/:id: cari ekstresi (tarih sıralı hareketler ve yürüyen bakiye, açılış satırı); hareketi düzenleme ve geri alınabilir silme.
  • Vade uyarısı (uygulama içi): vade geçtiyse veya hatırlatma penceresindeyse cari listesinde rozet ve dashboard'da uyarı.
  • İşlem listesi ve ayrıntısında cari hareketleri kişi adı ve hareket türüyle; ayrıntıdan cariye bağlantı. CSV'de kategori sütununda "Cari: Ad (tür)".
  • Seed: 5 örnek cari (vadesi yaklaşan alacak, kısmen ödenen borç, vadesi geçmiş alacak, "yalnızca ben" cari, Annemler hanesinde bir borç).
  • 007 migration'ı: contacts index'leri, işlemlerde cari alanları. Denetim kaydı: cari arşivleme.
  • Testler: yön/bakiye ve vade durumu (birim); defter, bakiye ve gelir/gider ayrımı, açılış bakiyesi, ekstre, tür değiştirme, vade uyarısı, çift ad, arşiv, yetki, başka hanenin hesabı ve gizli cari izolasyonu (entegrasyon).

Değişti — Faz 8a

  • İşlemlerde kaynak hesap (accountId) artık boş olabilir: cariden girişte para yalnızca hedef hesaba (toAccountId) girer. Bakiye, ekstre, kart ve KMH hesapları ek kural olmadan doğru çalışır.

0.7.0 - 2026-11-05

Faz 7: planlı/düzenli işlemler, kredi kartı ve KMH dönemleri, taksitler (7a ve 7b alt fazları).

Eklendi — Faz 7b: kart ve KMH dönemleri, taksitler

  • Dönem hesabı (shared/card-periods.ts): kesim günü dahil "Hesap Kesim Dönemi", sonrası "Güncel Dönem"; kesim günü ayda yoksa ayın son günü; kesim günü bitmeden dönem kapanmış sayılmaz. Son ödeme: kesimden N gün sonra veya ayın sabit günü.
  • Kart özeti (/hesaplar/:id, kredi kartı): toplam borç, kullanılabilir limit (gelecek taksitler dahil düşülür) ve kullanım çubuğu; hesap kesim dönemi borcu, asgari ödeme, ödenen, kalan, son ödeme tarihi ve kalan gün; güncel dönem harcaması; dönem dönem yaklaşan taksitler; planlı harcamalar; son 6 ekstre.
  • Asgari ödeme: limit 50.000 TL altı %20, üstü %40; kart bazında oran girilebilir (hesap formu).
  • "Borcu öde": ödeme hesabından karta transfer formu kalan dönem borcuyla dolu açılır; ödemeler dönem borcundan düşer (kısmi ödeme desteklenir).
  • Taksitli harcama: kredi kartı giderinde taksit sayısı (2–36). Her taksit ayrı işlem ("Hepsiburada 4/9"); toplam kuruş kaybı olmadan bölünür; vadesi gelen taksit kendi döneminde otomatik gerçekleşir, gelecek taksitler planlıdır ve bakiyeyi etkilemez. Ayrıntıdan "Kalan taksitleri iptal et".
  • KMH özeti (KMH'li banka hesabı): limit, kullanılan, kullanılabilir; geçen ve bu dönem için gün sonu eksi bakiyelerden tahmini faiz; "Faiz kaydı ekle" kesim tarihli, "Banka › Faiz" kategorili gider formunu doldurur (vergiler hariç not).
  • statements koleksiyonu: kart/KMH dönem kayıtları (borç, asgari, ödenen, harcama, tahmini faiz); kart özeti okunurken işlemlerden yeniden hesaplanır.
  • İşlem formuna ön doldurma desteği (kart ödemesi, faiz kaydı).
  • Seed: iki taksitli kart alışverişi.
  • 006 migration'ı: statements index'leri, taksit planı index'i.
  • Testler: dönem/son ödeme/asgari/taksit planı/KMH faizi (birim); kart özeti tutarlılığı (bağımsız bakiye hesabıyla), ödeme etkisi, taksit üretimi ve otomatik gerçekleşme, taksit iptali, taksit kuralları, KMH faiz tahmini ve yetki (entegrasyon).

Düzeltildi — Faz 7b

  • Seed: aynı aydaki satıcısız/kategorisiz transferler aynı seedRef'i aldığı için kart borcu ödemesi ve aylık birikim transferleri hiç oluşmuyordu; artık oluşuyor (mevcut kayıtlar kopyalanmaz). Kart ödemesi son ödeme gününden önceye alındı.

Eklendi — Faz 7a: planlı ve düzenli işlemler

  • Düzenli işlem kuralları (recurringRules): gelir, gider, transfer; sabit veya tahmini tutar; günlük/haftalık/aylık/yıllık, "her N birimde bir", ayın N. günü (ayda yoksa son gün) veya ayın son günü; bitiş yok, tekrar sayısı (ör. 12) veya bitiş tarihi. Formda Türkçe tekrar açıklaması ve ilk tarihlerin önizlemesi.
  • Her tekrar için planned durumunda planlı kayıt; bitiş tarihsiz kurallarda 12 ay ileriye kadar. Ufuk sayfa okunurken ilerletilir (zamanlanmış görev gerekmez); üretim idempotent (recurringRuleId + occurrenceIndex benzersiz). Planlı kayıtlar bakiyeyi etkilemez.
  • /planli: vadesi geçmiş, yaklaşan (60 gün) ve kurallar sekmeleri; "Onayla" (tutar ve tarih düzeltilebilir), "Ertele", "Atla"; seri pozisyonu ("3/12") ve "Tahmini" rozetleri.
  • Seri düzenleme: "Yalnızca bu" (kayıt seriden ayrılır), "Bu ve sonrakiler" (seri bölünür), "Tümü" (onaylanmamış planlı kayıtlar yeniden üretilir; gerçekleşen, atlanan ve ayrılmış kayıtlar korunur). Silmede "bu ve sonrakiler" / "tüm seri"; gerçekleşmiş kayıtlar silinmez.
  • Dashboard'da vadesi geçmiş planlı işlem uyarısı.
  • Seed: 11 örnek düzenli işlem (maaş, kira, aidat, tahmini faturalar, abonelikler, emekli maaşı; vadesi geçmiş örnek olarak 12 taksitli spor salonu).
  • 005 migration'ı: recurringRules index'leri, işlemlerde tekrar alanları. Denetim kaydı: recurring.delete.
  • Testler: tekrar tarihi hesabı (ay sonu, artık yıl, aralık, sayı/bitiş/ufuk) ve form şeması (birim); üretim, onay/atla/ertele, seri düzenleme ve silme, bakiye etkisizliği, yetki ve gizli hesap izolasyonu (entegrasyon).

Değişti — Faz 7a

  • İşlem listesi varsayılan olarak planlı kayıtları göstermez (durum filtresiyle görülebilir); özet toplamları seçili duruma göre hesaplanır.

0.6.0 - 2026-11-05

Faz 6: hesaplar, kategoriler, işlemler, ek dosyalar ve mutabakat (6a, 6b, 6c alt fazları).

  • Depolama soyutlaması lib/storage/ (put, get, delete); yerel disk sürücüsü (UPLOAD_DIR), atomik yazma, rastgele anahtarlar, yol geçişine karşı anahtar doğrulaması.
  • Ek dosya yükleme POST /api/files: tür dosya içeriğinden (imza) tespit edilir — JPEG, PNG, WebP, HEIC, PDF; uzantıya güvenilmez. Dosya başına MAX_UPLOAD_MB (10 MB), kayıt başına 10 dosya. Origin kontrolü.
  • Görseller sharp ile EXIF yönüne göre döndürülür, en fazla 2000 px'e küçültülür, WebP'ye çevrilir; EXIF/GPS dahil tüm meta veri silinir; 320 px küçük resim üretilir. iPhone HEIC dosyaları libheif (WASM, heic-decode) ile çözülür. PDF'ler yapı kontrolünden sonra olduğu gibi saklanır.
  • Yetkili servis GET /api/files/:id (?v=thumb, &indir=1): oturum + hane üyeliği; bekleyen ek yalnızca yükleyene; silinmiş işlemin veya başkasının gizli hesabındaki işlemin eki görünmez (404). Dosyalara özel sıkı CSP, nosniff, private önbellek.
  • attachments koleksiyonu (ownerType, ownerId, tür, boyut, yükleyen, sıra). Ekler işlemle aynı MongoDB transaction'ında bağlanır; hata olursa işlem de oluşmaz. Gider: yalnızca görsel; gelir ve transfer: görsel veya PDF.
  • İşlem formunda küçük "Ek ekle" alanı (çoklu seçim, yükleme göstergesi, küçük önizleme, kaldırma, sayaç); yüklemeler bitmeden kaydedilemez. Kopyada ekler taşınmaz.
  • Görüntüleyici: shadcn Carousel (Embla) — oklar, kaydırma, klavye okları, tam ekran, "2 / 5" göstergesi, indirme; PDF'ler ikon + "Aç" düğmesiyle. Ayrıntıda en fazla 4 küçük resim + "+N".
  • Temizlik npm run cleanup: 24 saatten eski bağlanmamış ekler, 30 günden önce kayıttan çıkarılmış ekler ve 30 günden önce silinmiş işlemlerin ekleri (dosyalarıyla) silinir.
  • Hesap ekstresi /hesaplar/:id?ay=YYYY-MM: ay başı/ay sonu bakiyesi, giriş/çıkış, yürüyen bakiye, mutabakat işaretleri; işlem ayrıntısı ekstreden açılır. Başkasının gizli hesabına transfer ekstrede görünür ama karşı hesap adı gizlenir.
  • Mutabakat: ekstre tarihi ve bakiyesi girilir, uygulama bakiyesiyle karşılaştırılır (kredi kartında borç pozitif girilir). Fark varsa onayla "Mutabakat düzeltmesi" işlemi oluşturulur; o tarihe kadarki işlemler hesap bazında işaretlenir; reconciliations kaydı ve denetim kaydı (account.reconcile) tek transaction'da.
  • 004 migration'ı: attachments ve reconciliations index'leri; işlemlerde reconciledAccountIds ve isAdjustment.
  • Testler: dosya türü tespiti, depolama, ekstre yardımcıları (birim); yükleme/dönüştürme (EXIF silme, yön, boyut, HEIC), bağlama kuralları, erişim izolasyonu, temizlik, ekstre tutarlılığı, mutabakat (entegrasyon).

Değişti — Faz 6c

  • Hesap adı artık hesap ekstresini açar (gizli hesaplarda bağlantı yok).
  • Bakiyeyi etkileyen alanı (tutar, tarih, tür, hesap) değiştirilen işlemin mutabakat işareti kalkar. Mutabakat düzeltmesi düzenlenemez, yalnızca silinebilir.
  • İşlemlerdeki kullanılmayan reconciledAt alanı, hesap bazında reconciledAccountIds ile değiştirildi.

Düzeltildi

  • seed:reset işlemleri ve satıcıları silmiyordu; artık işlemler, satıcılar, ekler (diskteki dosyalarıyla) ve mutabakatlar da temizlenir.

Eklendi — Faz 6b: işlemler

  • İşlemler (/islemler): gelir, gider ve transfer (hesap ↔ hesap). Tutar her zaman pozitif; işaret türden gelir. Hesap bakiyeleri artık açılış bakiyesi + gerçekleşmiş işlemlerden hesaplanır (tek doğruluk kaynağı: işlemler).
  • Bölünmüş işlem: en az 2 kalem, kalemler toplamı = tutar (istemci ve sunucuda aynı zod şeması); kalan tutar göstergesi, "kalanı son kaleme ekle"; listede tek satır, ayrıntıda kalemler.
  • Akıllı giriş: satıcı önerileri (Türkçe normalize arama, kullanım sıklığı) ve satıcının son kullanılan kategori/hesabı; işlemi kopyalama.
  • Liste: güne göre gruplama ve günlük net, gelir/gider/net özetleri, sayfalama; filtreler (tarih aralığı İstanbul gününe göre, tür, durum, hesap — transfer hedefi dahil, kategori — alt kategoriler ve bölünmüş kalemler dahil, ekleyen kişi, tutar aralığı, etiket, metin arama); filtreler URL'de.
  • İşlem ayrıntısı, düzenleme ve yumuşak silme; silme bildiriminde "Geri al".
  • CSV dışa aktarma (/islemler/disa-aktar): listedeki filtrelerle, bölünmüş işlem kalem başına satır; Türkçe Excel uyumlu (noktalı virgül, ondalık virgül, UTF-8 BOM), formül enjeksiyonu koruması.
  • Hızlı ekle her ekrandan doğrudan işlem formunu açar (gider/gelir/transfer sekmeleri).
  • Gizlilik: başkasının "yalnızca ben" hesabına dokunan işlemler listede, ayrıntıda ve CSV'de görünmez; o hesaba yalnızca sahibi işlem girer.
  • Seed: son 6 ayın 221 gerçekçi işlemi (faker.seed(42); maaş, kira, faturalar — kışın doğalgaz yüksek, market — bir kısmı bölünmüş, yakıt, kafe, kart ödemesi, birikim, nakit çekme), satıcı kuralları; idempotent (seedRef).
  • 003 migration'ı: transactions ve payees index'leri. Denetim kaydı: işlem silme/geri alma.
  • Testler: bakiye tutarlılığı (bağımsız doğrulama dahil), izolasyon, gizli hesap, arşivli kategori, filtreler, satıcı kuralları, CSV.

Değişti

  • npm run typecheck önce route tiplerini üretir (next typegen).

Eklendi — Faz 6a: para, hesaplar ve kategoriler

  • shared/money.ts: Türkçe tutar ayrıştırma ("1.250,50" → 125050 kuruş; binlik/ondalık kuralları belgeli), formatMoneyInput, sumMoney, kuruş kaybı olmadan oransal bölme (allocate, splitEvenly).
  • shared/quantity.ts: miktarlar birimin binde biri tamsayı (1,5 kg → 1500); ayrıştırma, biçimlendirme, kg↔g / lt↔ml dönüşümü.
  • shared/dates.ts: İstanbul günü yardımcıları (gün başlangıcı, UTC → yerel gün).
  • Hesaplar (/hesaplar): nakit, vadesiz banka (KMH limiti, aylık faiz, kesim günü), birikim, kredi kartı (limit, kesim günü, son ödeme kuralı, ödeme hesabı), yemek kartı (sağlayıcı); hesap sahibi kişi ve "yalnızca ben" (bakiyeyi yalnızca hesap sahibi görür, toplamlar hane ayarına uyar); renk/ikon, sıralama, arşiv. Varlık / kart borcu / net özet.
  • Kategoriler (/kategoriler): gelir ve gider ağaçları (5 seviyeye kadar), ekleme, düzenleme, taşıma (alt ağaçla, transaction), sıralama, arşivleme (alt ağaçla); kardeşler arasında ad tekrarı engeli (Türkçe normalize).
  • Varsayılan Türkçe kategori seti (44 kategori): yeni hanede aynı transaction'da, mevcut hanelere 002 migration'ıyla, idempotent (defaultKey).
  • Kategori ağacı saf fonksiyonları (buildTree, toOptions, checkMove, rollupTotals …) ve birim testleri.
  • Renk paleti (13 renk, açık/koyu tema değişkenleri) ve ikon kayıt tablosu; ikon/renk seçiciler, MoneyInput.
  • Seed: varsayılan kategoriler ve 7 örnek hesap (KMH'li banka, kredi kartı, birikim, "yalnızca ben" yemek kartı).
  • Denetim kaydı: hesap oluşturma/düzenleme/arşiv, kategori taşıma/arşiv.
  • Entegrasyon testleri: kategori ve hesap izolasyonu, roller, gizli bakiye, kart kuralları, ağaç kuralları.

0.5.0 - 2026-11-05

Faz 5: Haneler, hane içi roller ve veri izolasyonu.

Eklendi

  • Hane içi roller (viewer < member < owner) ve kuralları: son sahip düşürülemez veya çıkarılamaz.
  • DAL: getHouseholdContext (istek başına tek okuma), requireActiveHousehold(minRole), getHouseholdActionContext(minRole), requireHouseholdMember(householdId, minRole). Sistem admini için hane verisinde ayrıcalık yok.
  • Hane servisi (features/households/service.ts, framework'ten bağımsız): her hane kapsamlı fonksiyon üyeliği kendisi de doğrular; hane oluşturma + ilk sahip + denetim kaydı tek MongoDB transaction'ında.
  • Aktif hane seçici (üst bar): seçim sunucuda doğrulanır, butcem.hh cookie'sine yazılır; geçersiz/uydurma cookie yok sayılır. Tercih yoksa en yüksek rolün olduğu hane açılır.
  • /ayarlar: hane adı, bütçe ayı başlangıç günü, taksit modu, günlük plan dağıtımı, "yalnızca ben" hesaplarının toplamlara dahil edilmesi, ek mağaza tasarruf eşiği; üye rolleri ve üye çıkarma (yalnızca sahip; diğer roller salt okunur).
  • /admin/haneler: hane oluşturma (ilk sahip seçerek), kullanıcıyı haneye ekleme, hane içi rol değiştirme, üye çıkarma.
  • /hane-yok: hiçbir haneye üye olmayan kullanıcılar için yönlendirme sayfası.
  • Denetim kaydı (auditLogs): hane ayarları, üye ekleme/rol/çıkarma, hane oluşturma ve tüm admin kullanıcı işlemleri (oluşturma, düzenleme, rol, şifre sıfırlama, askı, silme).
  • Migration mekanizması: npm run migrate, scripts/migrations/NNN-*.ts, uygulananlar migrations koleksiyonunda; 001-initial-indexes. Seed önce migration'ları çalıştırır.
  • Veri izolasyonu entegrasyon testleri (başka hanenin üyeliği/ayrıntısı/ayarları, rol yetersizliği, uydurma ve enjeksiyon denemesi kimlikler, hanesi olmayan admin, çapraz hane üyelik değişikliği, son sahip, transaction).

Değişti

  • İzleyici (viewer) rolünde Hızlı ekle gizlenir/pasifleşir.
  • Kullanıcı silindiğinde tüm hane üyelikleri de temizlenir.

Kaldırıldı

  • Hane mock verisi.

0.4.0 - 2026-11-05

Faz 4: Örnek test verisi.

Eklendi

  • Seed (npm run seed): admin + 7 örnek kullanıcı (biri askıda, biri hanesi olmayan ikinci admin, ikisi e-postasız ve kullanıcı adıyla giriş yapan), 2 hane ("Çakır Ailesi", "Annemler") ve hane içi roller (owner / member / viewer; bir kullanıcı iki hanede farklı rollerle).
  • Seed idempotenttir (kullanıcı adı, hane adı ve üyelik çiftine göre); kullanıcılar Better Auth API'siyle oluşturulur. Geliştirme hesapları konsolda tablo olarak gösterilir.
  • npm run seed:reset: kimlik doğrulama ve hane koleksiyonlarını temizleyip yeniden doldurur; production'da reddedilir. Production'da seed yalnızca admini oluşturur.
  • Mongoose modelleri: households (ayarlar: bütçe ayı başlangıcı, taksit ve günlük plan tercihleri, özel hesaplar, ek mağaza eşiği) ve householdMembers (benzersiz {householdId, userId} index'i).
  • SEED_USER_PASSWORD ortam değişkeni (örnek kullanıcıların ortak geliştirme şifresi).
  • Seed entegrasyon testleri (idempotentlik, roller, askı, e-postasız giriş, reset).

0.3.0 - 2026-11-05

Faz 3: Backend — kimlik doğrulama, yetki katmanı ve güvenlik.

Eklendi

  • Better Auth (MongoDB adaptörü, replica set transaction): e-posta veya kullanıcı adı ile giriş, kayıt (sign-up) kapalı, admin plugin, 30 günlük oturum, HttpOnly/Secure/SameSite=Lax cookie.
  • Rate limit (veritabanında): genel 100 istek/dk, giriş denemeleri 5/dk.
  • Data Access Layer (lib/dal.ts): getCurrentUser (istek başına tek okuma), requireSession, requireRole, getActionUser. Askıdaki kullanıcının oturumu reddedilir.
  • proxy.ts: iyimser oturum cookie kontrolü (oturumsuz → /login); asıl kontrol DAL'da.
  • Admin kullanıcı yönetimi Server Action'ları: oluşturma, düzenleme, rol, şifre sıfırlama (diğer oturumları kapatır), askıya alma/kaldırma, silme. Kendini silememe/askıya alamama ve son admini düşürememe sunucuda da uygulanır; Better Auth hataları Türkçe alan hatalarına çevrilir.
  • E-postası olmayan kullanıcılar için .invalid yer tutucu adres (arayüzde gizlenir).
  • MongoDB (lib/db/mongo.ts) ve Mongoose (lib/db/mongoose.ts) bağlantıları (HMR güvenli tekil örnek, tembel oluşturma).
  • Güvenlik başlıkları: CSP (nonce'suz, Cache Components uyumlu), X-Content-Type-Options, Referrer-Policy, X-Frame-Options, Permissions-Policy, Cross-Origin-Opener-Policy; production'da HSTS.
  • GET /api/health veritabanı ping'i; erişilemezse 503.
  • npm run seed: ilk admini (SEED_ADMIN_*, kullanıcı adı admin) idempotent olarak oluşturur.
  • npm run test:integration: gerçek MongoDB'de (butcem_test) kimlik doğrulama sözleşmesi testleri (kayıt kapalı, giriş, askı, admin yetkisi, rate limit).
  • BÜTÇEM logosu ve ikon seti (logo.svg, logo-dark.svg, icon.svg, icon-maskable.svg); npm run icons SVG kaynaktan üretir.

Değişti

  • Giriş, çıkış, dashboard ve admin sayfaları mock yerine gerçek oturum ve verilerle çalışır; oturuma bağlı kabuk Suspense içinde akış olarak gelir.

Düzeltildi

  • Kullanıcı adı normalizasyonu: tr-TR küçük harf dönüşümü "ADMIN"i "admın" yapıyordu; artık İ/I/ı → i ve ASCII küçük harf.

Kaldırıldı

  • Oturum ve admin kullanıcı listesi mock verileri (hane mock'u Faz 5'e kadar duruyor).

0.2.0 - 2026-11-05

Faz 2: Frontend iskeleti (veriler Faz 3'e kadar mock).

Eklendi

  • Marka paleti: mavi/beyaz oklch tema (açık), lacivert/açık mavi (koyu); anlamsal --income, --expense, --budget, --warning değişkenleri ve grafik renkleri.
  • Açık / Koyu / Sistem tema (next-themes) ve her ekranda tema seçici.
  • Giriş ekranı (/login): kullanıcı adı veya e-posta + şifre, zod doğrulama, şifre göster/gizle, yükleniyor durumu; kayıt bağlantısı yok. / her zaman /login'e yönlenir.
  • Uygulama kabuğu: masaüstünde daraltılabilir yan menü, mobilde alt gezinme çubuğu (ortada Hızlı ekle, "Daha fazla" ile menü), üst bar (hane seçici, Hızlı ekle, tema, kullanıcı menüsü: ad, rol, sürüm, Çıkış yap). Henüz gelmeyen sayfalar "Yakında" olarak pasif.
  • Hızlı ekle (gider / gelir / transfer) seçimi; mobilde alttan açılan Drawer, masaüstünde Dialog (ResponsiveDialog).
  • Dashboard: karşılama ve özet kartları (Suspense + Skeleton).
  • Admin kullanıcı yönetimi (/admin/kullanicilar): TanStack Table v9 ile Türkçe duyarlı arama, sıralama, sayfalama; oluşturma, düzenleme, rol değiştirme, şifre sıfırlama, askıya alma/kaldırma, silme (onaylı). Kendini silememe ve son admini düşürememe kuralları (checkAdminAction).
  • Paylaşılan zod şemaları (src/shared/schemas: giriş, kullanıcı, şifre, askı), Türkçe arama/sıralama (foldTr, compareTr), TL ve İstanbul saatli tarih biçimleri (formatMoney, formatDate).
  • PWA temeli: manifest.webmanifest, tema rengi, Apple web app meta, ikonlar.
  • npm run icons: public/brand/icon.png'den favicon.ico, uygulama, Apple ve maskable PWA ikonları üretir (sharp).
  • Yer tutucu marka dosyaları (public/brand/logo.svg, logo-dark.svg, icon.png).
  • 404, hata (retry) ve global hata sayfaları; yükleniyor ekranları.
  • ActionResult sonuç tipi (Faz 3 Server Action sözleşmesi).

Değişti

  • use-mobile hook'u useSyncExternalStore ile yeniden yazıldı (effect içinde setState yok, hydration güvenli).
  • ESLint: _ önekli bilinçli kullanılmayan değişkenlere izin.

0.1.0 - 2026-11-05

Faz 1: Framework, klasör yapısı ve altyapı.

Eklendi

  • Next.js 16.4 (App Router, Turbopack, Cache Components), React 19.3, TypeScript strict (noUncheckedIndexedAccess), Tailwind CSS 4.
  • shadcn/ui (Radix, Nova preset) başlangıç yapılandırması.
  • Bağımlılıklar: Better Auth, MongoDB sürücüsü 7.7 (Mongoose ile ortak), Mongoose 9, zod 4, react-hook-form, next-themes, sonner, TanStack Table.
  • src/ tabanlı klasör yapısı (features, shared, models, lib/db, lib/storage, i18n, scripts/migrations).
  • zod ile doğrulanan env.ts (tembel doğrulama, build sırasında sır gerektirmez) ve birim testleri.
  • src/i18n/tr.ts arayüz metinleri dosyası.
  • Lokal MongoDB 9 tek düğümlü replica set (docker-compose.yml, rs0, otomatik başlatma, PRIMARY healthcheck, host portu 27019).
  • Çok aşamalı Dockerfile (standalone çıktı, root olmayan kullanıcı, /app/uploads volume, HEALTHCHECK) ve .dockerignore.
  • Geçici GET /api/health (sürüm ve commit bilgisi).
  • Vitest, Prettier (Tailwind eklentisi), EditorConfig, VSCode önerilen eklentiler.
  • .nvmrc (Node 26), engines.node, typecheck, test, format, db:up, seed scriptleri.
  • docs/PROMPT.md (ana prompt ve Faz 0 kararları), README.md, CHANGELOG.md.