- Add MongoDB models for Payment and PaymentSplit with proper splitting logic - Implement API routes for CRUD operations and balance calculations - Create dashboard with balance overview and recent activity - Add payment creation form with file upload (using $IMAGE_DIR) - Implement shallow routing with modal side panel for payment details - Support multiple split methods: equal, full payment, custom proportions - Add responsive design for desktop and mobile - Integrate with existing Authentik authentication 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
51 lines
1.2 KiB
TypeScript
51 lines
1.2 KiB
TypeScript
import mongoose from 'mongoose';
|
|
|
|
export interface IPaymentSplit {
|
|
_id?: string;
|
|
paymentId: mongoose.Schema.Types.ObjectId;
|
|
username: string; // username/nickname of the person who owes/is owed
|
|
amount: number; // amount this person owes (positive) or is owed (negative)
|
|
proportion?: number; // for proportional splits, the proportion (e.g., 0.5 for 50%)
|
|
settled: boolean; // whether this split has been settled
|
|
settledAt?: Date;
|
|
createdAt?: Date;
|
|
updatedAt?: Date;
|
|
}
|
|
|
|
const PaymentSplitSchema = new mongoose.Schema(
|
|
{
|
|
paymentId: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Payment',
|
|
required: true
|
|
},
|
|
username: {
|
|
type: String,
|
|
required: true,
|
|
trim: true
|
|
},
|
|
amount: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
proportion: {
|
|
type: Number,
|
|
min: 0,
|
|
max: 1
|
|
},
|
|
settled: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
settledAt: {
|
|
type: Date
|
|
}
|
|
},
|
|
{
|
|
timestamps: true
|
|
}
|
|
);
|
|
|
|
PaymentSplitSchema.index({ paymentId: 1, username: 1 }, { unique: true });
|
|
|
|
export const PaymentSplit = mongoose.model<IPaymentSplit>("PaymentSplit", PaymentSplitSchema); |