feat(yedek): JSON tam hane yedeği backend (önizleme, geri yükleme, geri dönüş noktaları)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-13 20:49:13 +03:00
parent 6e1000afd2
commit 0d70576df7
20 changed files with 1768 additions and 2 deletions
+25
View File
@@ -66,6 +66,7 @@ Renkler ve ikonlar frontend tasarım token'larında.
budget_split_pct: { needs: 50, wants: 30, culture: 10, unexpected: 10 },
budget_suggestion: "previous" | "avg3" | "default" // varsayılan öneri yöntemi
},
last_backup_at, // son JSON dışa aktarma ("son yedek X gün önce")
created_at, updated_at, deleted_at, version }
```
- `household_id` = `_id` (ortak `scope()` filtresi tüm koleksiyonlarda aynı çalışsın diye).
@@ -202,6 +203,30 @@ Renkler ve ikonlar frontend tasarım token'larında.
- Otomatik kurlar gün başına tek kayıt (kod × kaynak × gün; aynı gün yeniden çekilince güncellenir) → günlük geçmiş birikir. TCMB `rate_date` = bülten tarihi; altın = Türkiye'de bugün.
- Altın: xaus.com gram (saf) USD × TCMB USD alış; çeyrek/yarım/tam = has gram (1,603 / 3,206 / 6,412) × gram, ons = 31,1034768 gr. İşçilik payı yok → gerekirse manuel.
### 3.14a `restore_points` — JSON geri yüklemeden önceki durum ("geri al")
```js
{ _id, household_id, created_at, created_by,
reason: "before_restore" | "before_undo",
counts: { periods: 3, entries: 412, ... }, // o anki silinmemiş kayıt sayıları
size, // sıkıştırılmış bayt
data: BinData } // gzip(JSON yedek dosyası)
```
- Her geri yükleme / geri alma öncesinde aynı transaction içinde yazılır. Son **3** nokta, en fazla **30 gün** (`backup::prune`). Hane verisi değil → yedeğe girmez.
### 3.14b JSON yedek dosyası (`services/backup.rs`)
```js
{ "format": "kakeibo-backup", "format_version": 1, "schema_version": 3, "app_version": "0.1.0",
"exported_at": "2026-11-13T17:22:00Z",
"household": { "id", "name", "settings" },
"counts": { "entries": 412, ... }, // silinmemiş
"checksum": "sha256:…", // household + data, anahtarlar sıralı
"data": { "periods": [ {…}, … ], "entries": [ … ], … } } // her kayıt bir satır
```
- İçerik: dönem, plan kalemi, bütçe, harcama, devir, not, kategori, ödeme türü, varlık, varlık işlemi, elle girilen kur, ekstre kuralı — **silinmiş işaretliler dahil** (referanslar kopmasın, "geri al" birebir olsun). Kullanıcı, şifre, oturum, davet, otomatik kur **yok**.
- Değerler: UUID `{"$uuid": "…"}`, zaman `{"$date": "…"}`, tam sayılar `i64` (`version`, `sort_order` ve ayarlar `i32`).
- Geri yükleme = **tam değiştirme** (birleştirme yok), tek transaction. Aynı hane → kimlikler korunur; başka hane → tüm `_id`'ler yeniden üretilir, `*_id` referansları çevrilir, `household_id` hedef hane, `*_by` hanede yoksa geri yükleyen kişi. Hane adı yalnız aynı hanede geri gelir; ayarlar her zaman.
- Sürüm: `format_version`/`schema_version` daha yeniyse reddedilir; eskiyse hane düzeyi yükseltmeler uygulanır (v<2 → varsayılan varlıklar).
### 3.15 `schema_migrations`
```js
{ _id: 1 /* sürüm numarası */, name: "initial", applied_at }