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, userIds: Map, ): Promise { 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; }