feat(transactions): işlem servisi, bakiye hesaplama, satıcı kuralları ve izolasyon

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 03:23:30 +03:00
parent d18c8a0d76
commit 1208e2d1eb
9 changed files with 1394 additions and 11 deletions
+25
View File
@@ -0,0 +1,25 @@
import { model, models, Schema, type InferSchemaType, type Model } from "mongoose";
import { TRANSACTION_TYPES } from "@/shared/transactions";
/** Satıcı / karşı taraf ve "akıllı giriş" kuralı: son kullanılan kategori ve hesap (Bölüm 6.3). */
const payeeSchema = new Schema(
{
householdId: { type: Schema.Types.ObjectId, required: true },
name: { type: String, required: true, trim: true, maxlength: 80 },
nameKey: { type: String, required: true },
lastType: { type: String, enum: TRANSACTION_TYPES, default: "expense" },
lastCategoryId: { type: Schema.Types.ObjectId, default: null },
lastAccountId: { type: Schema.Types.ObjectId, default: null },
useCount: { type: Number, default: 0 },
lastUsedAt: { type: Date, default: () => new Date() },
},
{ timestamps: true, collection: "payees" },
);
payeeSchema.index({ householdId: 1, nameKey: 1 }, { unique: true });
payeeSchema.index({ householdId: 1, useCount: -1 });
export type Payee = InferSchemaType<typeof payeeSchema>;
export const PayeeModel: Model<Payee> =
(models.Payee as Model<Payee> | undefined) ?? model<Payee>("Payee", payeeSchema);