cc624af69f
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
39 lines
1.8 KiB
TypeScript
39 lines
1.8 KiB
TypeScript
import { model, models, Schema, type InferSchemaType, type Model } from "mongoose";
|
||
|
||
/**
|
||
* Kart/KMH dönem kaydı (Bölüm 6.8, `statements`). Tutarlar işlemlerden hesaplanır ve kart özeti
|
||
* okunurken güncellenir (geriye dönük girilen işlem dönem borcunu doğru değiştirir); bu koleksiyon
|
||
* raporlar ve mobil API için son hesaplanan değerleri tutar.
|
||
*/
|
||
const cardStatementSchema = new Schema(
|
||
{
|
||
householdId: { type: Schema.Types.ObjectId, required: true },
|
||
accountId: { type: Schema.Types.ObjectId, required: true },
|
||
kind: { type: String, enum: ["credit_card", "overdraft"], required: true },
|
||
/** "YYYY-MM-DD" (İstanbul), ikisi de dahil. */
|
||
periodStart: { type: String, required: true },
|
||
periodEnd: { type: String, required: true },
|
||
dueDate: { type: String, default: null },
|
||
/** Kesim günü sonundaki borç (pozitif). */
|
||
statementDebtMinor: { type: Number, default: 0 },
|
||
minimumPaymentMinor: { type: Number, default: 0 },
|
||
/** Kesimden sonra (bir sonraki kesime kadar) yapılan ödemeler. */
|
||
paidMinor: { type: Number, default: 0 },
|
||
/** Dönemdeki harcamalar (çıkışlar). */
|
||
spentMinor: { type: Number, default: 0 },
|
||
/** KMH: tahmini faiz. */
|
||
interestMinor: { type: Number, default: null },
|
||
computedAt: { type: Date, required: true },
|
||
},
|
||
{ timestamps: true, collection: "statements" },
|
||
);
|
||
|
||
cardStatementSchema.index({ accountId: 1, periodEnd: 1 }, { unique: true });
|
||
cardStatementSchema.index({ householdId: 1, accountId: 1, periodEnd: -1 });
|
||
|
||
export type CardStatement = InferSchemaType<typeof cardStatementSchema>;
|
||
|
||
export const CardStatementModel: Model<CardStatement> =
|
||
(models.CardStatement as Model<CardStatement> | undefined) ??
|
||
model<CardStatement>("CardStatement", cardStatementSchema);
|