This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app).
## Getting Started
First, run the development server:
```bash
npm run dev
# or
yarn dev
# or
pnpm dev
# or
bun dev
```
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel.
## Learn More
To learn more about Next.js, take a look at the following resources:
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome!
## Deploy on Vercel
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details.
- Kurulumu mevcut klasöre (`.`) yap. Klasörde `.git` ve uzak repo (Gitea) **önceden ayarlı** olacak: `git init` yapma, `git remote -v` ile `origin`'i doğrula.
- Her terminal komutundan önce ne yapacağını tek cümleyle söyle.
- Her fazın sonunda sırasıyla:
1. Ne yapıldığını kısaca özetle (yaptığın varsayımlar dahil).
2. Nasıl doğrulanacağını söyle (ör. `npm run dev` → `http://localhost:3000/login`).
3. `npm run lint`, `npm run typecheck`, `npm run test` ve `npm run build` hatasız geçsin.
4. Sürüm numarasını artır, `CHANGELOG.md`'yi güncelle, commit at, etiketle ve push et (bkz. Bölüm 3).
5. **"devam" demeden sonraki faza geçme.**
1. Ne yapıldığını kısaca özetle (yaptığın varsayımlar dahil).
2. Nasıl doğrulanacağını söyle (ör. `npm run dev` → `http://localhost:3000/login`).
3. `npm run lint`, `npm run typecheck`, `npm run test` ve `npm run build` hatasız geçsin.
4. Sürüm numarasını artır, `CHANGELOG.md`'yi güncelle, commit at, etiketle ve push et (bkz. Bölüm 3).
5. **"devam" demeden sonraki faza geçme.**
- Belirsiz ve geri alınması zor kararlarda önce sor. Küçük, geri alınabilir kararlarda makul varsayımı yap ve faz özetinde belirt.
- Kütüphane sürümlerini ve API'lerini hafızadan değil, kurulu sürümün resmi dokümanından doğrula.
- Bir faz çok büyürse alt fazlara böl (ör. 6a, 6b) ve onayımı al.
@@ -39,8 +39,7 @@ Yeni proje: BÜTÇEM
## 3. Sürümleme ve Git Akışı
### 3.1 Semantic Versioning (X.Y.Z)
- Biçim **MAJOR.MINOR.PATCH** ([semver.org](https://semver.org/)). Tek kaynak `package.json` içindeki `version`.
- Biçim **MAJOR.MINOR.PATCH** ([semver.org](https://semver.org)). Tek kaynak `package.json` içindeki `version`.
- Geliştirme süresince **0.Y.Z**: her tamamlanan faz MINOR'u artırır (`0.1.0`, `0.2.0` …), faz içi veya sonrası düzeltmeler PATCH'i artırır (`0.6.1`).
- İlk canlıya alma **`1.0.0`**. Sonrasında: geriye uyumlu yeni özellik → MINOR, hata düzeltme → PATCH, veri modelini veya API'yi kıran değişiklik → MAJOR.
- Her sürüm için annotated git etiketi: `git tag -a v0.6.0 -m "Faz 6: Hesaplar ve işlemler"`.
@@ -48,15 +47,16 @@ Yeni proje: BÜTÇEM
- Uygulama içinde sürüm görünür olsun: kullanıcı menüsünde ve `GET /api/health` cevabında (`version`, `commit`).
### 3.2 Commit ve push
- Commit mesajları**Conventional Commits** (İngilizce tip + Türkçe açıklama): `feat(transactions): bölünmüş işlem desteği`, `fix:`, `chore:`, `docs:`, `refactor:`, `test:`.
- Her faz için dal: `faz/NN-kisa-ad` (ör. `faz/06-hesaplar-islemler`). Faz içinde mantıklı küçük commit'ler at.
- Faz onayından sonra:
```bash
git checkout maingit merge --no-ff faz/06-hesaplar-islemler -m "feat: Faz 6 - hesaplar ve işlemler"git tag -a v0.6.0 -m "Faz 6: Hesaplar ve işlemler"git push origin main --follow-tagsgit branch -d faz/06-hesaplar-islemler
```
```bash
git checkout main
git merge --no-ff faz/06-hesaplar-islemler -m "feat: Faz 6 - hesaplar ve işlemler"
git tag -a v0.6.0 -m "Faz 6: Hesaplar ve işlemler"
git push origin main --follow-tags
git branch -d faz/06-hesaplar-islemler
```
- Push'tan önce `git status` ve `git diff --cached` ile `.env*`, yüklenen dosyalar (`uploads/`) veya sır içeren bir şeyin commit'e girmediğini kontrol et.
- Canlı ortam (Dokploy) `main` dalını izler; otomatik deploy yalnızca canlıya alma fazında açılır.
- Alanlar: tutar, tarih, hesap, kategori, açıklama, satıcı/karşı taraf (payee), etiketler, ekleyen kişi, durum (`planned` | `posted` | `void`).
- **Bölünmüş işlem (split):** Bir işlem birden çok kaleme bölünebilir (ör. 1.200 TL market → Gıda 800, Temizlik 250, Kişisel bakım 150). Kalemlerin her biri kategori, tutar ve opsiyonel açıklama taşır; kalemler toplamı ana tutara eşit olmalı (zod + sunucu doğrulaması, kalan tutar göstergesi, "kalanı son kaleme ekle" kolaylığı). Listede **tek satır** (bölünmüş ikonu ile) görünür, detayda tüm kalemler listelenir. Bütçe ve kategori raporları kalemler üzerinden hesaplanır.
- **Ek dosyalar:**
- Gider: bir veya birden çok **görsel** (fiş, fatura fotoğrafı), zorunlu değil.
- Gelir: bir veya birden çok **görsel veya PDF** (ör. maaş bordrosu), zorunlu değil.
- Formda yalnızca küçük bir "Ek ekle" alanı ve küçük önizleme sayacı görünür; formu ve detay sayfasını şişirme. Görüntüleme **carousel** ile (sağ/sol oklar, kaydırma, klavye okları, tam ekran açma, "2 / 5" göstergesi). shadcn `Carousel` (Embla) kullan. PDF'ler carousel'de ikon + "Aç" butonu olarak görünür.
- Teknik kurallar Bölüm 7.4'te.
- Gider: bir veya birden çok **görsel** (fiş, fatura fotoğrafı), zorunlu değil.
- Gelir: bir veya birden çok **görsel veya PDF** (ör. maaş bordrosu), zorunlu değil.
- Formda yalnızca küçük bir "Ek ekle" alanı ve küçük önizleme sayacı görünür; formu ve detay sayfasını şişirme. Görüntüleme **carousel** ile (sağ/sol oklar, kaydırma, klavye okları, tam ekran açma, "2 / 5" göstergesi). shadcn `Carousel` (Embla) kullan. PDF'ler carousel'de ikon + "Aç" butonu olarak görünür.
- Teknik kurallar Bölüm 7.4'te.
- **Akıllı giriş:** Aynı satıcı için son kullanılan kategori ve hesap otomatik önerilsin (satıcı kuralları). Son işlemi kopyala kısayolu.
- Silme: soft delete (`deletedAt`), geri al (undo) bildirimi.
### 6.4 Cari Hesaplar (Kişiler arası borç/alacak)
- **Kişiler (cari kartlar):** akraba, arkadaş veya üçüncü şahıs; ad, ilişki, telefon, not.
- Her cari için defter: verilen borç, alınan borç, geri ödeme alındı, geri ödeme yapıldı. Cari bakiye: "Bana borçlu" / "Ben borçluyum" ve net tutar.
- **Transfer:** Hesaptan cariye (borç verme / borç ödeme) ve cariden hesaba (borç alma / tahsilat) para transferi. Hesap bakiyesi değişir, gelir/gider raporlarına **girmez** (transferdir).
- Vade tarihi ve hatırlatma (opsiyonel), kısmi ödeme desteği, cari ekstresi (tarih sıralı hareketler ve yürüyen bakiye).
### 6.5 Aynî Borçlar (altın, döviz, ziynet ile borç)
Örnek senaryo: Bir şahıstan 5 gr altın borç aldım.
- Borç kaydı: cari kişi, varlık türü (gram altın, çeyrek, yarım, tam, cumhuriyet, 22 ayar bilezik gram, USD, EUR …), **miktar** (5 gr), borç tarihi, **o tarihteki birim fiyat ve TL karşılığı** (not olarak saklanır; fiyat elle girilir veya fiyat tablosundan önerilir).
- **Birikim planı:** Borca bağlı bir birikim hedefi (aylık ayrılacak tutar). Biriktirilen para seçilen bir hesaba (ör. birikim hesabı) aktarılır; borçla ilişkilendirilir ama borç **kapanmaz**.
- Aynı mantık **aynî alacaklar** için de çalışır (ben altın borç verdiysem).
### 6.6 Birikim ve Varlık Takibi (altın, döviz, ziynet)
- Varlık türleri tablosu (gram altın, çeyrek, yarım, tam, ata, 22 ayar gram, gümüş gram, USD, EUR, GBP …), birim (gr/adet/birim).
- **Alım lotları:** tarih, miktar, birim fiyat, toplam TL, kaynak hesap (para hesaptan çıkar), saklama yeri notu. Satış ve hediye/çıkış kayıtları.
- **Fiyat tablosu:** varlık × tarih × alış/satış fiyatı. İlk aşamada **elle giriş**; otomatik kaynak `AssetPriceProvider` arayüzüyle sonraki fazda (Bölüm 6.12).
@@ -145,7 +137,6 @@ Hesap türleri:
- Net varlık (net worth) özeti: hesap bakiyeleri + varlıkların güncel değeri − borçlar (TL ve aynî).
### 6.7 Planlı ve Düzenli İşlemler
- Tanım: tür (gelir/gider/transfer), tutar (sabit veya tahmini), hesap, kategori, başlangıç tarihi, sıklık (günlük/haftalık/aylık/yıllık, ayın N. günü, ayın son günü), **tekrar sayısı** (ör. 12) veya bitiş tarihi.
- Sistem her tekrar için `planned` durumunda **planlı kayıt** üretir. Planlı kayıtlar bakiyeyi etkilemez; plan/bütçe grafiklerinde ve "yaklaşan" listelerinde görünür.
- **"İşlemi onayla" komutu** ile `posted` olur; onaylarken tutar ve tarih düzenlenebilir (ör. fatura tutarı değişti). "Atla" ve "Ertele" seçenekleri.
@@ -153,7 +144,6 @@ Hesap türleri:
- Seri düzenleme: "yalnızca bu", "bu ve sonrakiler", "tümü".
### 6.8 Kredi Kartı ve Esnek Hesap (KMH) Dönemleri
- Kart tanımı: limit, **hesap kesim günü** (ör. 29), **son ödeme günü** (kesimden N gün sonra veya ayın sabit günü), varsayılan banka hesabı (ödeme için).
- **Dönem mantığı:** Son hesap kesim tarihine kadar (kesim günü dahil) olan işlemler **"Hesap Kesim Dönemi"**, kesim gününden sonraki işlemler **"Güncel Dönem"**. Kesim günü ayda yoksa (ör. 31) ayın son günü kullanılır. Dönemler `statements` koleksiyonunda saklanır (başlangıç, bitiş, son ödeme, dönem borcu, asgari tutar, ödenen).
- Faiz, ücret ve vergi kalemleri (ör. KKDF/BSMV) dönem kesiminden önce elle veya planlı işlem olarak girilebilir.
@@ -163,28 +153,24 @@ Hesap türleri:
- Aynı dönem mantığı esnek hesaplı banka hesaplarında da çalışır (faiz tahakkuku kesim gününde).
### 6.9 Aylık Bütçe ve Günlük Plan
- **Bütçe:** ay bazlı, kategori başına limit; önceki aydan kopyala veya **önceki ayın gerçekleşen giderlerinden oluştur**.
- Gerçekleşen / limit / kalan, yüzde çubuğu, %80 ve %100 eşiklerinde uyarı, ay sonu tahmini (harcama hızına göre).
- **Gelir planı:** ay için beklenen gelirler (planlı gelir işlemlerinden otomatik + elle ek).
- **Günlük plan (dashboard'da):**
- Ayın toplam bütçesi ayın gün sayısına yayılır (ör. Aralık 31 gün). Varsayılan dağıtım: belirli tarihe bağlı giderler (kira, faturalar, planlı işlemler) kendi günlerine, kalan değişken bütçe günlere eşit yayılır. Alternatif: önceki ayın günlük harcama örüntüsüne göre dağıt (ayar).
- Her gün için: planlanan, gerçekleşen, kümülatif planlanan vs. kümülatif gerçekleşen, **yüzde** (ör. "Bugün ayın %42'si geçti, bütçenin %51'i harcandı").
- Planlanan ve gerçekleşen gider, **planlanan gelirle** karşılaştırılır ("Bu tempoda ay sonunda elde kalacak: X TL"). Sonraki ayın planlanan geliriyle karşılaştırma görünümü.
- Ayın toplam bütçesi ayın gün sayısına yayılır (ör. Aralık 31 gün). Varsayılan dağıtım: belirli tarihe bağlı giderler (kira, faturalar, planlı işlemler) kendi günlerine, kalan değişken bütçe günlere eşit yayılır. Alternatif: önceki ayın günlük harcama örüntüsüne göre dağıt (ayar).
- Her gün için: planlanan, gerçekleşen, kümülatif planlanan vs. kümülatif gerçekleşen, **yüzde** (ör. "Bugün ayın %42'si geçti, bütçenin %51'i harcandı").
- Planlanan ve gerçekleşen gider, **planlanan gelirle** karşılaştırılır ("Bu tempoda ay sonunda elde kalacak: X TL"). Sonraki ayın planlanan geliriyle karşılaştırma görünümü.
- Mutfak › Manav, Şarküteri, Bakliyat (Kuru Fasulye, Nohut, Kırmızı Mercimek, Yeşil Mercimek)
- Genel Temizlik › Bulaşık (Tablet Deterjan, Jel Deterjan, Elde Yıkama Deterjanı), Çamaşır (Toz Deterjan, Yumuşatıcı), Genel
- Kişisel Temizlik › Şampuan, Tıraş, Kişisel Bakım
- Mutfak › Manav, Şarküteri, Bakliyat (Kuru Fasulye, Nohut, Kırmızı Mercimek, Yeşil Mercimek)
- Genel Temizlik › Bulaşık (Tablet Deterjan, Jel Deterjan, Elde Yıkama Deterjanı), Çamaşır (Toz Deterjan, Yumuşatıcı), Genel
- Kişisel Temizlik › Şampuan, Tıraş, Kişisel Bakım
2. **Ürün tipi (genel ürün)** — markadan bağımsız ihtiyaç: "Toz Deterjan", "Kırmızı Mercimek". Stok bu seviyede tutulur. Alanlar: kategori, temel ölçü birimi (kg, lt, adet, **özel birim** ör. "yıkama", "tablet"), **hedef (tam) stok miktarı**, kritik eşik yüzdesi (varsayılan **%20**), saklama yeri.
3. **Ürün (marka/varyant)** — "Ariel 5 kg / 50 yıkama". Fiyatlar bu seviyede (Bölüm 6.11).
**İşleyiş:**
- İlk kurulumda kullanıcı evdeki miktarları tahmini veya ambalaj üzerinden girer.
- Stok hareketleri ayrı koleksiyonda: `purchase` (alışveriş), `consume` (tüketim), `waste` (zarar/ziyan/fire, neden ile), `count_adjust` (sayım düzeltmesi). Mevcut miktar hareketlerden türetilir.
- **Periyodik sayım:** ürün tipi veya kategori bazında sayım sıklığı (ör. 15 günde bir). Sayım ekranı: liste halinde beklenen miktar → gerçek miktarı gir → fark otomatik `count_adjust` olur; kullanıcı farkın bir kısmını`waste` olarak işaretleyebilir. Sayımı gelen kategoriler dashboard'da hatırlatılır.
@@ -194,40 +180,34 @@ Hesap türleri:
- Tüketim analizi: ürün tipi başına aylık ortalama tüketim ve maliyet.
### 6.11 Mağazalar, Ürün Fiyatları ve Birim Fiyat Karşılaştırma
- **Mağazalar:** ad, tür (fiziksel market / online platform / pazar), şube, **eve uzaklık (km)**, **taşıma güçlüğü puanı (1–5)**, online ise teslimat ücreti ve ücretsiz teslimat alt limiti, **"Yemek kartı geçerli mi?"** ve geçerli yemek kartı sağlayıcıları, not. Bu bilgilerden "en yakın / en uzak / en zahmetli" sıralaması ve mağaza **zahmet skoru** hesaplanır.
- **Ürün (varyant) kaydı:** ürün tipi, marka, tanım, **ürün görselleri** (bir veya birden çok), barkod (opsiyonel), **paket miktarı ve birimi** (1 paket = 500 g), opsiyonel **kullanım birimi dönüşümü** (5 kg = 50 yıkama; 1 kutu = 40 tablet).
- **Fiyat kaydı:** ürün × mağaza × fiyat × tarih; kampanya/indirim işareti ve geçerlilik tarihi; kaynak `manual` | `receipt` | `provider:<ad>`. Fiyat geçmişi grafiği.
- **Birim fiyat:** Her fiyat otomatik olarak birim fiyata dönüştürülür (TL/kg, TL/lt, TL/adet, TL/yıkama). Aynı ürün tipindeki farklı markalar ve mağazalar **birim fiyat** üzerinden sıralanır; en uygunu vurgulanır.
### 6.12 Alışveriş Listesi, Akıllı Öneri ve Alışveriş Sonrası Karşılaştırma
- **Listeler:** birden çok aktif liste; ürün tipi (genel) veya belirli ürün (marka) eklenir; serbest metin de olabilir; stok eşik önerileri onayla/reddet. Aile üyeleri aynı listeyi kullanır (sayfa odaklanınca ve periyodik yenileme yeterli).
- **Akıllı mağaza önerisi:** Listedeki her kalem için son bilinen fiyatlara göre en ucuz mağaza ve marka önerilir. Planlayıcı şu kuralları birlikte uygular:
1. Toplam maliyeti düşür (birim fiyat üzerinden).
2. Mümkünse **az sayıda mağazada topla** (aynı mağazadan alma tercihi); bir mağaza daha eklemek ancak tasarruf, kullanıcı ayarındaki eşiği (ör. 100 TL) aşıyorsa önerilir.
3. Uzaklık ve taşıma güçlüğü puanını maliyet cezası olarak hesaba kat (ağır/hacimli ürünler yakın veya online mağazaya).
4. **Yemek kartı önceliği:** Yemek kartı bakiyesi varsa, yemek kartı geçen mağazalardaki uygun kalemler önce bu karta yönlendirilir.
5. Online mağazada teslimat ücreti ve ücretsiz teslimat alt limitini hesaba kat.
- Çıktı: "Tek mağaza en iyi seçenek: X TL" vs "Önerilen dağılım: A marketten 7 ürün, B'den 3 ürün: Y TL (Z TL tasarruf)". Algoritmayı saf fonksiyon olarak yaz ve birim testlerle doğrula.
1. Toplam maliyeti düşür (birim fiyat üzerinden).
2. Mümkünse **az sayıda mağazada topla** (aynı mağazadan alma tercihi); bir mağaza daha eklemek ancak tasarruf, kullanıcı ayarındaki eşiği (ör. 100 TL) aşıyorsa önerilir.
3. Uzaklık ve taşıma güçlüğü puanını maliyet cezası olarak hesaba kat (ağır/hacimli ürünler yakın veya online mağazaya).
4. **Yemek kartı önceliği:** Yemek kartı bakiyesi varsa, yemek kartı geçen mağazalardaki uygun kalemler önce bu karta yönlendirilir.
5. Online mağazada teslimat ücreti ve ücretsiz teslimat alt limitini hesaba kat.
- Çıktı: "Tek mağaza en iyi seçenek: X TL" vs "Önerilen dağılım: A marketten 7 ürün, B'den 3 ürün: Y TL (Z TL tasarruf)". Algoritmayı saf fonksiyon olarak yaz ve birim testlerle doğrula.
- **Alışverişe çıkış modu:** mağazaya göre gruplanmış, büyük dokunma alanlı kontrol listesi.
- **Alışveriş sonrası giriş ve karşılaştırma:**
- Eve dönünce kullanıcı alışveriş listesini açar ve aldığı ürünleri listeden tek tek seçer: gerçek ürün (aynı ürün veya **muadil**: aynı ürün tipinde farklı marka/paket), miktar, gerçek fiyat, mağaza.
- Listede olmayan ekstra ürünler de eklenebilir.
- **Karşılaştırma raporu:** planlanan vs. alınan (kalem bazında: aynı / muadil / alınmadı / plansız ekstra), planlanan tutar vs. gerçek tutar, fark ve nedenleri.
- Eve dönünce kullanıcı alışveriş listesini açar ve aldığı ürünleri listeden tek tek seçer: gerçek ürün (aynı ürün veya **muadil**: aynı ürün tipinde farklı marka/paket), miktar, gerçek fiyat, mağaza.
- Listede olmayan ekstra ürünler de eklenebilir.
- **Karşılaştırma raporu:** planlanan vs. alınan (kalem bazında: aynı / muadil / alınmadı / plansız ekstra), planlanan tutar vs. gerçek tutar, fark ve nedenleri.
- **Otomatik fiyat kaynakları (son faz):**`PriceProvider` ve `AssetPriceProvider` arayüzleri. Adaylar: market fiyatları için marketfiyati.org.tr (TÜBİTAK), altın/döviz için TCMB ve açık JSON kaynakları. Entegrasyondan önce resmi API olup olmadığını ve kullanım şartlarını araştırıp bana raporla; izinli olmayan kaynağı tarama (scraping) yapma. O zamana kadar yalnızca elle giriş.
### 6.13 Dashboard
- Üst kartlar: bu ay gelir / gider / kalan, toplam hesap bakiyesi, kart borçları, net varlık.
- **Ana çizgi grafik:** Planlanan Gelir (**yeşil**), Planlanan Gider / Bütçe (**mavi**), Gerçekleşen Gider (**kırmızı**). Periyot seçici: **Haftalık, Aylık, Altı Aylık, Yıllık.** Kümülatif / dönemsel görünüm geçişi. Renkler `--income`, `--budget`, `--expense` değişkenlerinden.
- Günlük plan göstergesi (Bölüm 6.9), bütçe durum çubukları, onay bekleyen planlı işlemler, yaklaşan kart ödemeleri ve taksitler, azalan stoklar ve sayımı gelen kategoriler, aktif alışveriş listesi özeti, son işlemler.
### 6.14 Raporlar
- **Kategori dağılımı:** halka grafik + tablo; her kategorinin **toplam gidere oranı (%)** (ör. toplam 35.000 TL, faturalar 5.000 TL → %14,3). Üst kategori / alt kategori kırılımı, önceki aya göre değişim.
- Aylık trend (son 12 ay), gelir-gider-tasarruf oranı.
- Miktarlar (stok, gram altın) için `quantity` alanı: ölçü birimine göre sabit ölçek (ör. gram için 3 ondalık → miligram tamsayı) kullan; kuralı`lib/quantity.ts` içinde belgele ve test et.
- Fiyat/birim fiyat hesaplarında yuvarlama yalnızca gösterimde yapılır.
### 7.2 Veritabanı
- Tüm alan koleksiyonlarında `householdId` index'i ve sık sorgular için bileşik index'ler (ör. `{ householdId, date: -1 }`, `{ householdId, status, date }`).
- Çok adımlı yazmalar (transfer, alışverişi tamamla, aynî borç kapatma, kart ödemesi, planlı işlem onayı) **MongoDB transaction** ile.
- Soft delete (`deletedAt`) işlemler, ürünler ve cari kayıtlar için; hesaplar ve kategoriler için arşivleme.
@@ -256,7 +234,6 @@ Hesap türleri:
- Audit log: hane ayarları, üye değişiklikleri, silmeler, aynî borç kapatma ve mutabakat düzeltmeleri.
### 7.3 Katmanlar ve mobil hazırlığı
- İş mantığı `features/*/service.ts` içinde, framework'ten bağımsız saf fonksiyonlar/servisler. Hesaplama motorları (bütçe dağıtımı, kart dönemleri, taksit, mağaza önerisi, stok öneri miktarı, varlık kâr/zarar) ayrı ve **birim testli**.
- Web: Server Actions; mobil: `/api/v1/*` Route Handler'ları — ikisi **aynı servisleri** çağırır.
- zod şemaları ve türetilmiş tipler `src/shared/` altında (mobil projede yeniden kullanılacak).
- İzinli türler: JPEG, PNG, WebP, HEIC (WebP'ye dönüştür), PDF. MIME türünü dosya içeriğinden doğrula (uzantıya güvenme). Dosya başına boyut sınırı (`MAX_UPLOAD_MB`, varsayılan 10), kayıt başına en fazla 10 dosya.
- Görseller `sharp` ile yeniden boyutlandırılır, EXIF (konum dahil) temizlenir, küçük resim (thumbnail) üretilir.
@@ -273,7 +249,6 @@ Hesap türleri:
- `uploads/` git'e ve Docker imajına girmez; canlıda yedeklemeye dahildir.
### 7.5 Güvenlik
- Skill'deki güvenlik kuralları + rate limit, güvenlik başlıkları, CSP (carousel ve grafik kütüphaneleriyle uyumlu).
- Sırlar yalnızca `.env.local` (lokal) ve Dokploy ortam değişkenleri (canlı). `.env.example` güncel tutulur.
@@ -282,13 +257,11 @@ Hesap türleri:
## 8. Ortamlar ve Altyapı
### 8.1 Lokal geliştirme
- MongoDB, `docker-compose.yml` ile **tek düğümlü replica set** (`rs0`) olarak çalışır (transaction için zorunlu); kalıcı volume, healthcheck, replica set'i otomatik başlatan init.
- Lokal bağlantı: `mongodb://localhost:27017/butcem?replicaSet=rs0&directConnection=true`.
Skill fazları (0–4) uygulanır, ardından alan fazları gelir. Her faz kendi seed verisini genişletir (gerçekçi Türk market ürünleri ve fiyatları, TL tutarlar, son 6 aylık işlemler, örnek cari ve altın kayıtları).
|Faz|İçerik|Sürüm|
|Faz | İçerik | Sürüm|
|---|---|---|
|0|Keşif: kalan belirsizlikleri sor (en fazla 5), sayfa listesi, koleksiyonlar ve roller planını onayıma sun|—|
|7|Planlı/düzenli işlemler ve onay akışı; **kredi kartı ve KMH dönemleri, taksitler**, kart özeti|0.7.0|
|8|Cari hesaplar, hesap ↔ cari transferleri, **aynî borç/alacak** ve "Ödeme gerçekleşti" akışı|0.8.0|
|9|Birikim ve varlık takibi, fiyat tablosu (elle), kâr/zarar, net varlık|0.9.0|
|10|Aylık bütçe, gelir planı, **günlük plan**|0.10.0|
|11|Ev stoğu: kategori ağacı, ürün tipleri, hareketler, periyodik sayım, %20 eşik, fire ayarlı öneri|0.11.0|
|12|Mağazalar (uzaklık, taşıma, yemek kartı), ürün varyantları ve görselleri, fiyat geçmişi, **birim fiyat**|0.12.0|
|13|Alışveriş listeleri, akıllı mağaza önerisi, alışveriş modu, **alışveriş sonrası giriş ve karşılaştırma**, "alışverişi tamamla" transaction'ı|0.13.0|
|14|Dashboard (çizgi grafik + periyotlar) ve raporlar, CSV dışa aktarma|0.14.0|
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.