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>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
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": "" } },
|
||||
);
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user