a274d29728
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
51 lines
2.3 KiB
TypeScript
51 lines
2.3 KiB
TypeScript
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;
|
||
}
|