From feb2e1d16c8b519de4af5cc90476e49b9d1f22b4 Mon Sep 17 00:00:00 2001 From: suphicakir Date: Fri, 13 Nov 2026 01:59:58 +0300 Subject: [PATCH] =?UTF-8?q?feat(raporlar):=20raporlar=20sayfas=C4=B1,=20CS?= =?UTF-8?q?V=20d=C4=B1=C5=9Fa=20aktarma=20ve=20yazd=C4=B1rma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Filtreler (kapsam, grup, kategori, ödeme türü) adreste - Gruplar, tüm kategoriler, ödeme türleri, aylar; bütçe sapması; gelir–gider ve birikim oranı; varlık performansı - Her bölümde Excel uyumlu CSV (BOM, ;) ve tek bölüm yazdırma - Yazdırmada açık tema, menüler gizli, kapsam satırı Co-Authored-By: Claude Opus 5.5 --- docs/MEMORY.md | 3 +- docs/PHASES.md | 2 +- frontend/src/components/layout/app-layout.tsx | 10 +- frontend/src/features/reports/charts.tsx | 127 ++++ frontend/src/features/reports/filters.tsx | 186 ++++++ frontend/src/features/reports/page.tsx | 109 +++- frontend/src/features/reports/section.tsx | 145 +++++ frontend/src/features/reports/sections.tsx | 559 ++++++++++++++++++ frontend/src/index.css | 15 + frontend/src/lib/csv.test.ts | 29 + frontend/src/lib/csv.ts | 43 ++ frontend/src/lib/entries.ts | 1 + frontend/src/lib/print.ts | 32 + frontend/src/lib/query.ts | 3 + frontend/src/lib/reports.test.ts | 93 +++ frontend/src/lib/reports.ts | 167 ++++++ frontend/src/lib/strings.ts | 77 +++ frontend/src/main.tsx | 3 + 18 files changed, 1594 insertions(+), 10 deletions(-) create mode 100644 frontend/src/features/reports/charts.tsx create mode 100644 frontend/src/features/reports/filters.tsx create mode 100644 frontend/src/features/reports/section.tsx create mode 100644 frontend/src/features/reports/sections.tsx create mode 100644 frontend/src/lib/csv.test.ts create mode 100644 frontend/src/lib/csv.ts create mode 100644 frontend/src/lib/print.ts create mode 100644 frontend/src/lib/reports.test.ts create mode 100644 frontend/src/lib/reports.ts diff --git a/docs/MEMORY.md b/docs/MEMORY.md index acba6ec..481bbfc 100644 --- a/docs/MEMORY.md +++ b/docs/MEMORY.md @@ -1,7 +1,7 @@ # 🧠 Proje Hafızası ## ▶️ Sıradaki Adım -**Faz 9 – Adım 2:** Raporlar sayfası (`/raporlar`, `features/reports/`): filtreler adreste (`?donem=`/`baslangic`/`bitis`/`grup`/`kategori`/`odeme`), raporlar: gelir–gider (dönemler, `useStats` → çubuk), birikim oranı trendi (`realized_savings ÷ income_total`, çizgi), kategori kırılımı (**tüm** kategoriler tablo + yatay çubuk, `useReportBreakdown`), ödeme türü dağılımı, bütçe sapması (seçili dönem `useBudget`: grup aylık + hafta), varlık performansı (`usePortfolio` kâr/zarar). Her bölümde CSV (UTF-8 BOM, `;`, ondalık virgül — `lib/csv.ts` + test) ve Yazdır (`@media print`: menü/düğmeler gizli). Recharts lazy, ham CSS renkleri. +**Faz 9 – Adım 3:** Uygulamanın kendi CSV'si (harcamalar, plan kalemleri, varlık işlemleri): dışa aktarma (backend ya da frontend; `lib/csv.ts` biçimi: BOM, `;`, `1250,50`, GG.AA.YYYY) + içe aktarma (önizleme → satır satır hata → geçerliler aktarılır; kategori/ödeme türü **adla** eşleşir; dönem tarihten bulunur, yazılamaz dönem → satır hatası). Adım 4 (ekstre) bunun üstüne kurulacak: ortak satır doğrulama/aktarma servisi tasarla. **Bekleyen (kullanıcıda):** Faz 5 – Adım 5 canlı yedek kurulumu (`docs/DEPLOY.md` §6.1–6.3) → çıktılar gelince Faz 5 ✅. ## 📌 Alınan Kararlar @@ -134,3 +134,4 @@ ### 2026-11-13 — Faz 9 - **Adım 1:** Rapor verileri. `/stats/periods` → `PeriodStat` artık `summary: budget::Summary` taşır; DTO'ya `income_total`, `fixed_expense_total`, `savings_goal`, `carryover_debt/surplus`, `realized_savings` (= review 4. soru) eklendi. `services/reports.rs` + `GET /reports/breakdown` (tek `$facet`: toplam, 4 grup sabit sırada (0 dahil), **tüm** kategoriler çoktan aza, ödeme türü (`$ifNull` → `null` = girilmemiş), ay `$substrBytes`; filtre dönem/tarih aralığı (dahil, başlangıç>bitiş 400)/grup/kategori/ödeme türü (`none`)). Bütçe sapması için yeni uç nokta yok (mevcut `/budget`). `tests/reports.rs` (1, kapsamlı) + stats testi genişledi. Mutasyon 2/2. Backend 155 test. +- **Adım 2:** Raporlar sayfası (`features/reports/`): `page.tsx` (filtre adreste: `donem`/`baslangic`/`bitis`/`grup`/`kategori`/`odeme` (`yok` = girilmemiş), dönem varsa tarih yok sayılır), `filters.tsx` (Kapsam: tüm zamanlar / dönem / tarih aralığı (yıl başı → bugün varsayılan), grup seçilince kategori listesi daralır, mobilde katlanır), `section.tsx` (`ReportSection`: `data-report`, CSV indir + bölüm yazdır; `ShareTable`: satır içi CSS pay çubukları — yazdırmada da görünür), `sections.tsx` (gruplar, ödeme türleri, **tüm** kategoriler, aylar = filtreli; bütçe sapması = seçili/açık/son dönem, grup + hafta; gelir–gider + birikim oranı = son 12 dönem; varlıklar), `charts.tsx` lazy (bar + çizgi). `lib/csv.ts` (BOM, `;`, CRLF, tırnaklama, `csvMoney` binliksiz), `lib/reports.ts` (`parseFilter`/`filterToParams`/`filterToQuery`, `describeFilter` → yazdırmada kapsam satırı, `savingsRate`, `deviation`, `formatMonth`), `lib/print.ts` (`installPrintTheme`: beforeprint'te koyu tema kaldırılır; `printSection`: `data-print-one` + `data-print-target`), index.css `@media print`, layout `print:hidden`. Kayıt değişince `['reports']` yenilenir. Frontend 121 test; e2e 34 kontrol (CSV baytları, yazdırma hedefi, tema, filtreler). Not: `Blob.text()` BOM'u siler → BOM'u baytlardan doğrula. diff --git a/docs/PHASES.md b/docs/PHASES.md index 8aa4e46..1933e3d 100644 --- a/docs/PHASES.md +++ b/docs/PHASES.md @@ -80,7 +80,7 @@ ## Faz 9 Adımları - ✅ 1. Backend: rapor verileri — dönem istatistiklerine gelir/sabit gider/devir/gerçekleşen birikim (birikim oranı için) + `GET /reports/breakdown` (grup / **tüm kategoriler** / ödeme türü / ay; filtre: dönem ya da tarih aralığı, grup, kategori, ödeme türü). Bütçe sapması mevcut `budget` verisinden -- ⏳ 2. Frontend: Raporlar sayfası — filtreler (adreste), gelir–gider çubuk grafiği, kategori kırılımı (tablo + grafik), bütçe sapması, ödeme türü dağılımı, birikim oranı trendi, varlık performansı; her rapor CSV (UTF-8 BOM, `;`) + yazdır +- ✅ 2. Frontend: Raporlar sayfası — filtreler (adreste), gelir–gider çubuk grafiği, kategori kırılımı (tablo + grafik), bütçe sapması, ödeme türü dağılımı, birikim oranı trendi, varlık performansı; her rapor CSV (UTF-8 BOM, `;`) + yazdır - ⏳ 3. CSV dışa/içe aktarma (uygulamanın kendi biçimi): harcamalar, plan kalemleri, varlık işlemleri; içe aktarmada önizleme + satır satır hata raporu - ⏳ 4. **Banka / kredi kartı ekstresi içe aktarma** (kullanıcı isteği): CSV/Excel, sütun eşleştirme (banka profili kaydedilir), harcama/gelir yönü, tekrar eden satır tespiti, açıklamadan kategori önerisi (öğrenen kural), grup/kategori eşleştirmesi kullanıcıda; eksik aylar için **geçmiş (arşiv) dönemler** — amaç yıl başından beri veri → sonraki aylara referans (ortalama önerileri) - ⏳ 5. JSON tam hane yedeği: sürümlü dışa aktarma; geri yüklemede önizleme + onay + sunucuda otomatik geri dönüş noktası ("geri yüklemeyi geri al"); başka haneden taşıma diff --git a/frontend/src/components/layout/app-layout.tsx b/frontend/src/components/layout/app-layout.tsx index bd9b191..4ea061d 100644 --- a/frontend/src/components/layout/app-layout.tsx +++ b/frontend/src/components/layout/app-layout.tsx @@ -19,14 +19,14 @@ export function AppLayout() { {/* Mobil üst çubuk */} -
+
{/* md:pl-64 → kenar çubuğu kadar boşluk; içerik bu alanda ortalanır. pb-28 → mobilde alt menünün altında içerik kalmasın. */} -
-
+
+
@@ -39,7 +39,7 @@ export function AppLayout() { function Sidebar() { return ( -