base project structure

beginning
This commit is contained in:
2026-11-05 00:40:16 +03:00
parent f315e39aa5
commit 2de5f0cfe1
18 changed files with 7209 additions and 81 deletions
+41
View File
@@ -0,0 +1,41 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
# env files (can opt-in for committing if needed)
.env*
# vercel
.vercel
# typescript
*.tsbuildinfo
next-env.d.ts
+9
View File
@@ -0,0 +1,9 @@
<!-- BEGIN:nextjs-agent-rules -->
## This is NOT the Next.js you know
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.
<!-- END:nextjs-agent-rules -->
+36
View File
@@ -0,0 +1,36 @@
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.
BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

+26
View File
@@ -0,0 +1,26 @@
@import "tailwindcss";
:root {
--background: #ffffff;
--foreground: #171717;
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-geist-sans);
--font-mono: var(--font-geist-mono);
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
--foreground: #ededed;
}
}
body {
background: var(--background);
color: var(--foreground);
font-family: Arial, Helvetica, sans-serif;
}
+29
View File
@@ -0,0 +1,29 @@
import type { Metadata } from "next";
import { Geist, Geist_Mono } from "next/font/google";
import "./globals.css";
const geistSans = Geist({
variable: "--font-geist-sans",
subsets: ["latin"],
});
const geistMono = Geist_Mono({
variable: "--font-geist-mono",
subsets: ["latin"],
});
export const metadata: Metadata = {
title: "Create Next App",
description: "Generated by create next app",
};
export default function RootLayout({ children }: LayoutProps<"/">) {
return (
<html
lang="en"
className={`${geistSans.variable} ${geistMono.variable} h-full antialiased`}
>
<body className="min-h-full flex flex-col">{children}</body>
</html>
);
}
+69
View File
@@ -0,0 +1,69 @@
import Image from "next/image";
export default function Home() {
return (
<div className="flex flex-col flex-1 items-center justify-center bg-zinc-50 font-sans dark:bg-black">
<main className="flex flex-1 w-full max-w-3xl flex-col items-center justify-between py-32 px-16 bg-white dark:bg-black sm:items-start">
<Image
className="dark:invert h-5 w-[100px]"
src="/next.svg"
alt="Next.js logo"
width={100}
height={20}
priority
/>
<div className="flex flex-col items-center gap-6 text-center sm:items-start sm:text-left">
<h1 className="max-w-xs text-3xl font-semibold leading-10 tracking-tight text-black dark:text-zinc-50">
To get started, edit the{" "}
<code className="rounded bg-black/[.06] px-1.5 py-0.5 font-mono text-[0.9em] dark:bg-white/[.08]">
page.tsx
</code>{" "}
file.
</h1>
<p className="max-w-md text-lg leading-8 text-zinc-600 dark:text-zinc-400">
Looking for a starting point or more instructions? Head over to{" "}
<a
href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Templates
</a>{" "}
or the{" "}
<a
href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
className="font-medium text-zinc-950 dark:text-zinc-50"
>
Learning
</a>{" "}
center.
</p>
</div>
<div className="flex flex-col gap-4 text-base font-medium sm:flex-row">
<a
className="flex h-12 w-full items-center justify-center gap-2 rounded-full bg-foreground px-5 text-background transition-colors hover:bg-[#383838] dark:hover:bg-[#ccc] md:w-[158px]"
href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
<Image
className="dark:invert h-[14px] w-4"
src="/vercel.svg"
alt="Vercel logomark"
width={16}
height={14}
/>
Deploy Now
</a>
<a
className="flex h-12 w-full items-center justify-center rounded-full border border-solid border-black/[.08] px-5 transition-colors hover:border-transparent hover:bg-black/[.04] dark:border-white/[.145] dark:hover:bg-[#1a1a1a] md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app"
target="_blank"
rel="noopener noreferrer"
>
Documentation
</a>
</div>
</main>
</div>
);
}
@@ -39,8 +39,7 @@ Yeni proje: BÜTÇEM
## 3. Sürümleme ve Git Akışı ## 3. Sürümleme ve Git Akışı
### 3.1 Semantic Versioning (X.Y.Z) ### 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`). - 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. - İ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"`. - 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`). - 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 ### 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:`. - 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. - 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: - Faz onayından sonra:
```bash ```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 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. - 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. - Canlı ortam (Dokploy) `main` dalını izler; otomatik deploy yalnızca canlıya alma fazında açılır.
@@ -89,9 +89,7 @@ Yeni proje: BÜTÇEM
## 6. Modüller ## 6. Modüller
### 6.1 Hesaplar ### 6.1 Hesaplar
Hesap türleri: Hesap türleri:
- `cash` nakit, `bank` vadesiz banka, `savings` birikim/vadeli, `credit_card` kredi kartı, `meal_card` yemek kartı (Pluxee/Sodexo, Multinet, Edenred, Setcard vb. sağlayıcı alanı). - `cash` nakit, `bank` vadesiz banka, `savings` birikim/vadeli, `credit_card` kredi kartı, `meal_card` yemek kartı (Pluxee/Sodexo, Multinet, Edenred, Setcard vb. sağlayıcı alanı).
- Banka hesabında opsiyonel **esnek hesap (KMH)**: limit, faiz oranı bilgisi, hesap kesim günü. - Banka hesabında opsiyonel **esnek hesap (KMH)**: limit, faiz oranı bilgisi, hesap kesim günü.
- Alanlar: ad, tür, banka/kurum, açılış bakiyesi ve tarihi, renk/ikon, arşiv durumu, sıralama. - Alanlar: ad, tür, banka/kurum, açılış bakiyesi ve tarihi, renk/ikon, arşiv durumu, sıralama.
@@ -99,13 +97,11 @@ Hesap türleri:
- **Mutabakat (reconciliation):** Kullanıcı banka/kart ekstresindeki bakiyeyi girer, fark varsa düzeltme işlemi önerilir; mutabakatı yapılmış işlemler işaretlenir. - **Mutabakat (reconciliation):** Kullanıcı banka/kart ekstresindeki bakiyeyi girer, fark varsa düzeltme işlemi önerilir; mutabakatı yapılmış işlemler işaretlenir.
### 6.2 Kategoriler ### 6.2 Kategoriler
- Gelir ve gider ayrı ağaçlar; **sınırsız derinlik** (pratikte 3 seviye), ikon, renk, sıralama, arşivleme. - Gelir ve gider ayrı ağaçlar; **sınırsız derinlik** (pratikte 3 seviye), ikon, renk, sıralama, arşivleme.
- Hane oluşturulunca varsayılan Türkçe kategori seti yüklenir (Market, Faturalar › Elektrik/Su/Doğalgaz/İnternet, Kira, Ulaşım, Sağlık, Eğitim, Giyim, Eğlence, Abonelikler, Maaş, Ek gelir …). - Hane oluşturulunca varsayılan Türkçe kategori seti yüklenir (Market, Faturalar › Elektrik/Su/Doğalgaz/İnternet, Kira, Ulaşım, Sağlık, Eğitim, Giyim, Eğlence, Abonelikler, Maaş, Ek gelir …).
- Raporlar ve bütçe, alt kategorileri üst kategoriye toplayarak da gösterebilmeli. - Raporlar ve bütçe, alt kategorileri üst kategoriye toplayarak da gösterebilmeli.
### 6.3 İşlemler (gelir, gider, transfer) ### 6.3 İşlemler (gelir, gider, transfer)
- Türler: `income`, `expense`, `transfer` (hesap ↔ hesap, hesap ↔ cari; Bölüm 6.4). - Türler: `income`, `expense`, `transfer` (hesap ↔ hesap, hesap ↔ cari; Bölüm 6.4).
- Alanlar: tutar, tarih, hesap, kategori, açıklama, satıcı/karşı taraf (payee), etiketler, ekleyen kişi, durum (`planned` | `posted` | `void`). - 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. - **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.
@@ -119,16 +115,13 @@ Hesap türleri:
- Silme: soft delete (`deletedAt`), geri al (undo) bildirimi. - Silme: soft delete (`deletedAt`), geri al (undo) bildirimi.
### 6.4 Cari Hesaplar (Kişiler arası borç/alacak) ### 6.4 Cari Hesaplar (Kişiler arası borç/alacak)
- **Kişiler (cari kartlar):** akraba, arkadaş veya üçüncü şahıs; ad, ilişki, telefon, not. - **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. - 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). - **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). - 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ç) ### 6.5 Aynî Borçlar (altın, döviz, ziynet ile borç)
Örnek senaryo: Bir şahıstan 5 gr altın borç aldım. Ö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). - 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**. - **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**.
- Borç ekranında: borç miktarı, borç tarihindeki TL değeri, güncel fiyatla TL değeri, biriken tutar, kalan ihtiyaç, tahmini kapanış ayı. - Borç ekranında: borç miktarı, borç tarihindeki TL değeri, güncel fiyatla TL değeri, biriken tutar, kalan ihtiyaç, tahmini kapanış ayı.
@@ -136,7 +129,6 @@ Hesap türleri:
- Aynı mantık **aynî alacaklar** için de çalışır (ben altın borç verdiysem). - 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) ### 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). - 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ı. - **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). - **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î). - 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 ### 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. - 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. - 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. - **"İş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ü". - Seri düzenleme: "yalnızca bu", "bu ve sonrakiler", "tümü".
### 6.8 Kredi Kartı ve Esnek Hesap (KMH) Dönemleri ### 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). - 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). - **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. - Faiz, ücret ve vergi kalemleri (ör. KKDF/BSMV) dönem kesiminden önce elle veya planlı işlem olarak girilebilir.
@@ -163,7 +153,6 @@ Hesap türleri:
- Aynı dönem mantığı esnek hesaplı banka hesaplarında da çalışır (faiz tahakkuku kesim gününde). - 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 ### 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**. - **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). - 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). - **Gelir planı:** ay için beklenen gelirler (planlı gelir işlemlerinden otomatik + elle ek).
@@ -173,9 +162,7 @@ Hesap türleri:
- 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ü. - 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ü.
### 6.10 Ev Stoğu ### 6.10 Ev Stoğu
**Yapı (üç kavram):** **Yapı (üç kavram):**
1. **Stok kategorileri** — sınırsız derinlikte ağaç. Varsayılan set: 1. **Stok kategorileri** — sınırsız derinlikte ağaç. Varsayılan set:
- Mutfak › Manav, Şarküteri, Bakliyat (Kuru Fasulye, Nohut, Kırmızı Mercimek, Yeşil Mercimek) - 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 - Genel Temizlik › Bulaşık (Tablet Deterjan, Jel Deterjan, Elde Yıkama Deterjanı), Çamaşır (Toz Deterjan, Yumuşatıcı), Genel
@@ -184,7 +171,6 @@ Hesap türleri:
3. **Ürün (marka/varyant)** — "Ariel 5 kg / 50 yıkama". Fiyatlar bu seviyede (Bölüm 6.11). 3. **Ürün (marka/varyant)** — "Ariel 5 kg / 50 yıkama". Fiyatlar bu seviyede (Bölüm 6.11).
**İşleyiş:** **İşleyiş:**
- İlk kurulumda kullanıcı evdeki miktarları tahmini veya ambalaj üzerinden girer. - İ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. - 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. - **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,23 +180,19 @@ Hesap türleri:
- Tüketim analizi: ürün tipi başına aylık ortalama tüketim ve maliyet. - 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 ### 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. - **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). - **Ü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. - **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. - **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 ### 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). - **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: - **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). 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. 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). 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. 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. 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. - Çı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şe çıkış modu:** mağazaya göre gruplanmış, büyük dokunma alanlı kontrol listesi.
- **Alışveriş sonrası giriş ve karşılaştırma:** - **Alışveriş sonrası giriş ve karşılaştırma:**
@@ -221,13 +203,11 @@ Hesap türleri:
- **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ş. - **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 ### 6.13 Dashboard
- Üst kartlar: bu ay gelir / gider / kalan, toplam hesap bakiyesi, kart borçları, net varlık. - Ü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. - **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. - 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 ### 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. - **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ı. - Aylık trend (son 12 ay), gelir-gider-tasarruf oranı.
- Kişi bazlı harcama, hesap bazlı hareket. - Kişi bazlı harcama, hesap bazlı hareket.
@@ -242,13 +222,11 @@ Hesap türleri:
## 7. Veri ve Mimari Kuralları ## 7. Veri ve Mimari Kuralları
### 7.1 Para ve miktar ### 7.1 Para ve miktar
- **Para tutarları tamsayı kuruş** (`amountMinor: number`, 125,50 TL → 12550). Float ile hesap yok. `lib/money.ts`: ayrıştırma (`"1.250,50"` → 125050), biçimlendirme, toplama, **oransal bölme** (kuruş kaybı olmadan; taksit ve split için) ve birim testler. - **Para tutarları tamsayı kuruş** (`amountMinor: number`, 125,50 TL → 12550). Float ile hesap yok. `lib/money.ts`: ayrıştırma (`"1.250,50"` → 125050), biçimlendirme, toplama, **oransal bölme** (kuruş kaybı olmadan; taksit ve split için) ve birim testler.
- 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. - 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. - Fiyat/birim fiyat hesaplarında yuvarlama yalnızca gösterimde yapılır.
### 7.2 Veritabanı ### 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 }`). - 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. - Ç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. - 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. - Audit log: hane ayarları, üye değişiklikleri, silmeler, aynî borç kapatma ve mutabakat düzeltmeleri.
### 7.3 Katmanlar ve mobil hazırlığı ### 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**. - İş 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. - 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). - zod şemaları ve türetilmiş tipler `src/shared/` altında (mobil projede yeniden kullanılacak).
@@ -264,7 +241,6 @@ Hesap türleri:
- `GET /api/health`: DB ping, sürüm, commit — Dokploy healthcheck için. - `GET /api/health`: DB ping, sürüm, commit — Dokploy healthcheck için.
### 7.4 Ek dosyalar (uploads) ### 7.4 Ek dosyalar (uploads)
- Depolama soyutlaması `lib/storage/` (`put`, `get`, `delete`): ilk sürücü **yerel disk** (`UPLOAD_DIR`, canlıda Docker volume), ileride S3 uyumlu (MinIO) eklenebilir. - Depolama soyutlaması `lib/storage/` (`put`, `get`, `delete`): ilk sürücü **yerel disk** (`UPLOAD_DIR`, canlıda Docker volume), ileride S3 uyumlu (MinIO) eklenebilir.
- İ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. - İ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. - 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. - `uploads/` git'e ve Docker imajına girmez; canlıda yedeklemeye dahildir.
### 7.5 Güvenlik ### 7.5 Güvenlik
- Skill'deki güvenlik kuralları + rate limit, güvenlik başlıkları, CSP (carousel ve grafik kütüphaneleriyle uyumlu). - 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. - 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. Ortamlar ve Altyapı
### 8.1 Lokal geliştirme ### 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. - 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`. - Lokal bağlantı: `mongodb://localhost:27017/butcem?replicaSet=rs0&directConnection=true`.
- `env.ts` zod ile doğrular: `MONGODB_URI`, `BETTER_AUTH_SECRET`, `BETTER_AUTH_URL`, `SEED_ADMIN_EMAIL`, `SEED_ADMIN_PASSWORD`, `UPLOAD_DIR`, `MAX_UPLOAD_MB`, `APP_VERSION` (build sırasında). - `env.ts` zod ile doğrular: `MONGODB_URI`, `BETTER_AUTH_SECRET`, `BETTER_AUTH_URL`, `SEED_ADMIN_EMAIL`, `SEED_ADMIN_PASSWORD`, `UPLOAD_DIR`, `MAX_UPLOAD_MB`, `APP_VERSION` (build sırasında).
### 8.2 Canlı ortam (homeserver: "Atlas") ### 8.2 Canlı ortam (homeserver: "Atlas")
- Kaynak kod: Atlas üzerindeki **Gitea** reposu (`origin`). - Kaynak kod: Atlas üzerindeki **Gitea** reposu (`origin`).
- Yayın: **Dokploy**, Gitea reposunun `main` dalından build/deploy (Dockerfile ile). - Yayın: **Dokploy**, Gitea reposunun `main` dalından build/deploy (Dockerfile ile).
- Domain: **`butcem.ta1sph.website`** (ASCII). HTTPS Let's Encrypt (Dokploy/Traefik). - Domain: **`butcem.ta1sph.website`** (ASCII). HTTPS Let's Encrypt (Dokploy/Traefik).
@@ -304,33 +277,32 @@ Hesap türleri:
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ı). 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|—| | 0 | Keşif: kalan belirsizlikleri sor (en fazla 5), sayfa listesi, koleksiyonlar ve roller planını onayıma sun | — |
|1|Framework, klasör yapısı, Docker replica set MongoDB, Dockerfile iskeleti, CHANGELOG, sürümleme|0.1.0| | 1 | Framework, klasör yapısı, Docker replica set MongoDB, Dockerfile iskeleti, CHANGELOG, sürümleme | 0.1.0 |
|2|Frontend iskeleti: marka/tema, login (açılış ekranı), layout (mobil alt menü), admin kullanıcı yönetimi, PWA temeli|0.2.0| | 2 | Frontend iskeleti: marka/tema, login (açılış ekranı), layout (mobil alt menü), admin kullanıcı yönetimi, PWA temeli | 0.2.0 |
|3|Backend: Better Auth, DAL, güvenlik başlıkları, `/api/health`|0.3.0| | 3 | Backend: Better Auth, DAL, güvenlik başlıkları, `/api/health` | 0.3.0 |
|4|Seed: admin, örnek hane ve aile üyeleri|0.4.0| | 4 | Seed: admin, örnek hane ve aile üyeleri | 0.4.0 |
|5|Haneler ve hane içi roller, hane seçici, izolasyon testleri, audit log|0.5.0| | 5 | Haneler ve hane içi roller, hane seçici, izolasyon testleri, audit log | 0.5.0 |
|6|Hesaplar (yemek kartı dahil), kategoriler, gelir/gider/transfer, **bölünmüş işlem**, **ek dosyalar + carousel**, mutabakat|0.6.0| | 6 | Hesaplar (yemek kartı dahil), kategoriler, gelir/gider/transfer, **bölünmüş işlem**, **ek dosyalar + carousel**, mutabakat | 0.6.0 |
|7|Planlı/düzenli işlemler ve onay akışı; **kredi kartı ve KMH dönemleri, taksitler**, kart özeti|0.7.0| | 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| | 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| | 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| | 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| | 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| | 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| | 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| | 14 | Dashboard (çizgi grafik + periyotlar) ve raporlar, CSV dışa aktarma | 0.14.0 |
|15|Canlıya alma: `docs/DEPLOY.md`, Dokploy + Gitea, domain, volume, yedekleme, smoke test|**1.0.0**| | 15 | Canlıya alma: `docs/DEPLOY.md`, Dokploy + Gitea, domain, volume, yedekleme, smoke test | **1.0.0** |
|16|`/api/v1` mobil API ve mobil kimlik doğrulama|1.1.0| | 16 | `/api/v1` mobil API ve mobil kimlik doğrulama | 1.1.0 |
|17|Otomatik fiyat sağlayıcıları (market ve altın/döviz) araştırması ve izinliyse entegrasyonu|1.2.0| | 17 | Otomatik fiyat sağlayıcıları (market ve altın/döviz) araştırması ve izinliyse entegrasyonu | 1.2.0 |
--- ---
## 10. Faz 0'da netleştirilecek varsayılanlar ## 10. Faz 0'da netleştirilecek varsayılanlar
Aşağıdakileri varsayılan olarak kabul ettim. Faz 0'da yalnızca bunlardan emin olmadıklarını ve yeni çıkan belirsizlikleri sor: Aşağıdakileri varsayılan olarak kabul ettim. Faz 0'da yalnızca bunlardan emin olmadıklarını ve yeni çıkan belirsizlikleri sor:
- Kart hesap kesim günü **dahil** "Hesap Kesim Dönemi"ne girer. - Kart hesap kesim günü **dahil** "Hesap Kesim Dönemi"ne girer.
- Taksitler bütçede her taksitin kendi ayına yazılır. - Taksitler bütçede her taksitin kendi ayına yazılır.
- Günlük planda sabit tarihli giderler kendi gününe, değişken bütçe günlere eşit dağıtılır. - Günlük planda sabit tarihli giderler kendi gününe, değişken bütçe günlere eşit dağıtılır.
@@ -350,7 +322,6 @@ Aşağıdakileri varsayılan olarak kabul ettim. Faz 0'da yalnızca bunlardan em
## 12. Başlangıç ## 12. Başlangıç
Faz 0 ile başla: Faz 0 ile başla:
1. `node -v` kontrolü (Active LTS değilse uyar). 1. `node -v` kontrolü (Active LTS değilse uyar).
2. `git status` ve `git remote -v` ile repo ve Gitea `origin` bağlantısını doğrula. 2. `git status` ve `git remote -v` ile repo ve Gitea `origin` bağlantısını doğrula.
3. Bu promptu `docs/PROMPT.md` olarak kaydetmeyi öner. 3. Bu promptu `docs/PROMPT.md` olarak kaydetmeyi öner.
+18
View File
@@ -0,0 +1,18 @@
import { defineConfig, globalIgnores } from "eslint/config";
import nextVitals from "eslint-config-next/core-web-vitals";
import nextTs from "eslint-config-next/typescript";
const eslintConfig = defineConfig([
...nextVitals,
...nextTs,
// Override default ignores of eslint-config-next.
globalIgnores([
// Default ignores of eslint-config-next:
".next/**",
"out/**",
"build/**",
"next-env.d.ts",
]),
]);
export default eslintConfig;
+20
View File
@@ -0,0 +1,20 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
experimental: {
agentFeedback: true,
},
cacheComponents: true,
partialPrefetching: true,
turbopack: {
rules: {
"*.css": {
loaders: ["@tailwindcss/turbopack"],
as: "*.css",
},
},
},
};
export default nextConfig;
+6844
View File
File diff suppressed because it is too large Load Diff
+26
View File
@@ -0,0 +1,26 @@
{
"name": "butcem",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "eslint"
},
"dependencies": {
"next": "16.4.5",
"react": "19.3.0",
"react-dom": "19.3.0"
},
"devDependencies": {
"@tailwindcss/turbopack": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"eslint": "^9",
"eslint-config-next": "16.4.5",
"tailwindcss": "^4",
"typescript": "^5"
}
}
+1
View File
@@ -0,0 +1 @@
<svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 391 B

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 128 B

+1
View File
@@ -0,0 +1 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>

After

Width:  |  Height:  |  Size: 385 B

+34
View File
@@ -0,0 +1,34 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "react-jsx",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": [
"next-env.d.ts",
"**/*.ts",
"**/*.tsx",
".next/types/**/*.ts",
".next/dev/types/**/*.ts",
"**/*.mts"
],
"exclude": ["node_modules"]
}