Spaces:
Sleeping
Sleeping
| const mongoose = require('mongoose'); | |
| const invoiceSchema = new mongoose.Schema( | |
| { | |
| invoiceNumber: { | |
| type: String, // e.g., "INV-2026-001" | |
| unique: true, | |
| required: true, | |
| }, | |
| bookingId: { | |
| type: mongoose.Schema.Types.ObjectId, | |
| ref: 'Booking', | |
| required: true, | |
| }, | |
| photographerId: { | |
| type: mongoose.Schema.Types.ObjectId, | |
| ref: 'Photographer', | |
| required: true, | |
| }, | |
| customerId: { | |
| type: mongoose.Schema.Types.ObjectId, | |
| ref: 'User', | |
| required: true, | |
| }, | |
| issueDate: { | |
| type: Date, | |
| default: Date.now, | |
| }, | |
| dueDate: { | |
| type: Date, | |
| }, | |
| items: [ | |
| { | |
| description: String, | |
| quantity: Number, | |
| unitPrice: Number, | |
| total: Number, | |
| }, | |
| ], | |
| subtotal: { | |
| type: Number, | |
| required: true, | |
| }, | |
| tax: { | |
| type: Number, | |
| default: 0, | |
| }, | |
| taxRate: { | |
| type: Number, | |
| default: 18, // 18% GST in India | |
| }, | |
| discount: { | |
| type: Number, | |
| default: 0, | |
| }, | |
| totalAmount: { | |
| type: Number, | |
| required: true, | |
| }, | |
| paymentStatus: { | |
| type: String, | |
| enum: ['pending', 'paid', 'overdue'], | |
| default: 'pending', | |
| }, | |
| paidAt: { | |
| type: Date, | |
| default: null, | |
| }, | |
| notes: { | |
| type: String, | |
| default: '', | |
| }, | |
| pdfUrl: { | |
| type: String, | |
| default: null, // URL to generated PDF | |
| }, | |
| }, | |
| { timestamps: true } | |
| ); | |
| module.exports = mongoose.model('Invoice', invoiceSchema); | |