fix(seed): çakışan transfer seedRef'leri; örnek taksitli alışverişler

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 11:19:17 +03:00
parent 0ad52757ad
commit 6ae98a1cb4
4 changed files with 121 additions and 19 deletions
+68
View File
@@ -0,0 +1,68 @@
import type { Types } from "mongoose";
import { createTransaction } from "@/features/transactions/service";
import { AccountModel } from "@/models/account";
import { CategoryModel } from "@/models/category";
import { TransactionModel } from "@/models/transaction";
import { todayIstanbul } from "@/shared/dates";
import { addDays } from "@/shared/recurrence";
/**
* Örnek taksitli kart harcamaları (Faz 7b): bir kısmı gerçekleşmiş, kalanı planlı taksitler.
* İdempotent: aynı satıcıyla taksit planı varsa atlanır.
*/
const PURCHASES = [
{
payee: "Hepsiburada",
description: "Çamaşır makinesi",
amountMinor: 18_000_00,
count: 9,
daysAgo: 75,
category: "ev",
by: "admin",
},
{
payee: "Teknosa",
description: "Telefon",
amountMinor: 12_000_00,
count: 6,
daysAgo: 20,
category: "diger-gider",
by: "emre",
},
];
export async function seedInstallments(
householdId: Types.ObjectId,
userIds: Map<string, string>,
): Promise<number> {
const today = todayIstanbul();
const card = await AccountModel.findOne({ householdId, name: "Garanti Bonus" }).lean();
if (!card) return 0;
let created = 0;
for (const p of PURCHASES) {
const exists = await TransactionModel.exists({
householdId,
payeeName: p.payee,
"installment.planId": { $type: "objectId" },
});
if (exists) continue;
const category = await CategoryModel.findOne({ householdId, defaultKey: p.category }).lean();
const r = await createTransaction(userIds.get(p.by)!, String(householdId), {
type: "expense",
amount: p.amountMinor,
date: addDays(today, -p.daysAgo),
accountId: String(card._id),
toAccountId: null,
categoryId: String(category!._id),
splits: [],
payee: p.payee,
description: p.description,
tags: [],
installments: p.count,
attachmentIds: [],
});
if (!r.ok) throw new Error(`Seed taksiti oluşturulamadı (${p.payee}): ${r.error}`);
created++;
}
return created;
}