6ae98a1cb4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
69 lines
2.0 KiB
TypeScript
69 lines
2.0 KiB
TypeScript
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;
|
||
}
|