Files
butcem/CHANGELOG.md
T
suphicakir 571bf7690d chore(release): 0.8.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-05 12:37:48 +03:00

25 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ış

[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.