Files
suphicakir afc6da1606 feat(kakeibo): dört harcama grubu, banka maliyeti ve geri alınabilir migration
- shared/kakeibo: grup devralma, banka maliyeti, kayıt bazında grup, grup özeti (saf, testli)
- kategori ve işlem/kalem modellerine kakeiboGroup ve bankCost; form şemaları
- migration 016 varsayılanları doldurur; npm run migrate -- --down <ad> ile geri alma
- Kakeibo rapor servisi: tutarlar bütçeyle aynı kaynaktan, grup değiştirmeler taşınır

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-07 04:51:35 +03:00

44 lines
1.7 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { defaultKakeibo } from "@/features/categories/service";
import { CategoryModel } from "@/models/category";
import { TransactionModel } from "@/models/transaction";
import type { Migration } from "./types";
/**
* Kakeibo dört grup (Faz 16): gider kategorilerine `kakeiboGroup` ve `bankCost`. Varsayılan
* kategoriler beceri eşlemesine göre doldurulur; kullanıcının kategorileri grupsuz kalır (arayüz
* "grup seç" uyarısı gösterir). Alanı zaten olan kategoriye dokunulmaz. Hiçbir kategori silinmez.
* Geri alma: alanlar kaldırılır (npm run migrate -- --down 016-kakeibo-groups).
*/
export const migration: Migration = {
name: "016-kakeibo-groups",
description: "gider kategorilerine Kakeibo grubu ve banka maliyeti; varsayılanlar dolduruldu",
async up() {
const defaults = await CategoryModel.find({
kind: "expense",
defaultKey: { $type: "string" },
kakeiboGroup: { $exists: false },
})
.select({ defaultKey: 1 })
.lean<{ _id: unknown; defaultKey: string }[]>();
const ops = defaults.map((c) => ({
updateOne: { filter: { _id: c._id }, update: { $set: defaultKakeibo(c.defaultKey) } },
}));
if (ops.length) await CategoryModel.bulkWrite(ops);
await CategoryModel.updateMany(
{ kakeiboGroup: { $exists: false } },
{ $set: { kakeiboGroup: null, bankCost: false } },
);
},
async down() {
await CategoryModel.updateMany({}, { $unset: { kakeiboGroup: "", bankCost: "" } });
await TransactionModel.updateMany(
{ kakeiboGroup: { $exists: true } },
{ $unset: { kakeiboGroup: "" } },
);
await TransactionModel.updateMany(
{ "splits.kakeiboGroup": { $exists: true } },
{ $unset: { "splits.$[].kakeiboGroup": "" } },
);
},
};