Add complete Cospend expense sharing feature
- 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>
This commit is contained in:
51
src/models/PaymentSplit.ts
Normal file
51
src/models/PaymentSplit.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user