feat(seed): örnek bütçeler
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
import type { Types } from "mongoose";
|
||||
import { budgetFromActuals, saveBudget } from "@/features/budgets/service";
|
||||
import { BudgetModel } from "@/models/budget";
|
||||
import { CategoryModel } from "@/models/category";
|
||||
import { HouseholdModel } from "@/models/household";
|
||||
import { periodOfDate, shiftMonth } from "@/shared/budget";
|
||||
import { todayIstanbul } from "@/shared/dates";
|
||||
import { budgetLimitsSchema } from "@/shared/schemas/budget";
|
||||
import { formatMoneyInput } from "@/shared/money";
|
||||
|
||||
/**
|
||||
* Örnek bütçeler (Faz 10a): Çakır Ailesi'nde önceki ve bu ay, önceki ayların harcamalarından
|
||||
* oluşturulur. Bu ay "Market" limiti biraz düşürülür ve "Elektrik" alt limiti eklenir; böylece
|
||||
* uyarı ve alt limit örnekleri görünür. İdempotent: bütçesi olan aya dokunulmaz.
|
||||
*/
|
||||
export async function seedBudgets(
|
||||
householdIds: Map<string, Types.ObjectId>,
|
||||
userIds: Map<string, string>,
|
||||
): Promise<number> {
|
||||
const householdId = householdIds.get("Çakır Ailesi")!;
|
||||
const by = userIds.get("ayse")!;
|
||||
const hh = String(householdId);
|
||||
const h = await HouseholdModel.findById(householdId).select({ settings: 1 }).lean();
|
||||
const current = periodOfDate(todayIstanbul(), h?.settings?.budgetMonthStartDay ?? 1);
|
||||
let created = 0;
|
||||
for (const month of [shiftMonth(current, -1), current]) {
|
||||
if (await BudgetModel.exists({ householdId, month })) continue;
|
||||
const r = await budgetFromActuals(by, hh, month);
|
||||
if (!r.ok) continue;
|
||||
created++;
|
||||
}
|
||||
if (created && (await BudgetModel.exists({ householdId, month: current }))) {
|
||||
const doc = (await BudgetModel.findOne({ householdId, month: current }).lean())!;
|
||||
const cats = await CategoryModel.find({
|
||||
householdId,
|
||||
defaultKey: { $in: ["market", "faturalar.elektrik"] },
|
||||
}).lean();
|
||||
const id = (key: string) => String(cats.find((c) => c.defaultKey === key)?._id ?? "");
|
||||
const limits = doc.limits.map((l) => ({
|
||||
categoryId: String(l.categoryId),
|
||||
amount: formatMoneyInput(
|
||||
String(l.categoryId) === id("market") ? Math.round(l.amountMinor * 0.7) : l.amountMinor,
|
||||
),
|
||||
}));
|
||||
if (id("faturalar.elektrik"))
|
||||
limits.push({ categoryId: id("faturalar.elektrik"), amount: "900" });
|
||||
await saveBudget(by, hh, budgetLimitsSchema.parse({ month: current, limits }));
|
||||
}
|
||||
return created;
|
||||
}
|
||||
Reference in New Issue
Block a user