86 lines
3.1 KiB
JavaScript
86 lines
3.1 KiB
JavaScript
const mongoose = require('mongoose');
|
|
|
|
const orderItemSchema = new mongoose.Schema({
|
|
product: { type: mongoose.Schema.Types.ObjectId, ref: 'Product', required: true },
|
|
name: { type: String, required: true },
|
|
image: { type: String, required: true },
|
|
price: { type: Number, required: true },
|
|
quantity: { type: Number, required: true },
|
|
variantColor: { type: String, default: '' },
|
|
variantFinish: { type: String, default: '' },
|
|
sku: { type: String, default: '' }
|
|
});
|
|
|
|
const statusHistorySchema = new mongoose.Schema({
|
|
status: { type: String, required: true },
|
|
note: { type: String, default: '' },
|
|
updatedAt: { type: Date, default: Date.now }
|
|
});
|
|
|
|
const orderSchema = new mongoose.Schema({
|
|
orderNumber: { type: String, required: true, unique: true },
|
|
user: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true },
|
|
orderItems: [orderItemSchema],
|
|
|
|
// Indian Shipping Address Schema
|
|
shippingAddress: {
|
|
fullName: { type: String, default: '' },
|
|
mobileNumber: { type: String, required: true },
|
|
addressLine1: { type: String, required: true },
|
|
addressLine2: { type: String, default: '' },
|
|
landmark: { type: String, default: '' },
|
|
city: { type: String, required: true },
|
|
district: { type: String, default: '' },
|
|
state: { type: String, required: true },
|
|
postalCode: { type: String, required: true }, // 6-digit PIN code
|
|
country: { type: String, required: true, default: 'India' }
|
|
},
|
|
|
|
// Payment Configuration
|
|
paymentMethod: {
|
|
type: String,
|
|
required: true,
|
|
enum: ['Razorpay', 'UPI', 'Stripe', 'Credit/Debit Card', 'Net Banking', 'Cash on Delivery']
|
|
},
|
|
paymentResult: {
|
|
id: { type: String },
|
|
status: { type: String },
|
|
update_time: { type: String },
|
|
email_address: { type: String }
|
|
},
|
|
|
|
// Pricing & Indian GST breakdown
|
|
itemsPrice: { type: Number, required: true, default: 0 },
|
|
gstPercentage: { type: Number, default: 18 },
|
|
cgst: { type: Number, default: 0 },
|
|
sgst: { type: Number, default: 0 },
|
|
igst: { type: Number, default: 0 },
|
|
taxPrice: { type: Number, required: true, default: 0 },
|
|
shippingPrice: { type: Number, required: true, default: 0 },
|
|
discountAmount: { type: Number, default: 0 },
|
|
totalAmount: { type: Number, required: true, default: 0 },
|
|
|
|
// Order Status Lifecycle
|
|
orderStatus: {
|
|
type: String,
|
|
enum: ['Pending', 'Payment Pending', 'Payment Confirmed', 'Processing', 'Packed', 'Shipped', 'Out for Delivery', 'Delivered', 'Cancelled', 'Returned', 'Refunded'],
|
|
default: 'Pending'
|
|
},
|
|
statusHistory: [statusHistorySchema],
|
|
|
|
// Indian Courier Logistics
|
|
courierProvider: { type: String, default: 'Delhivery' }, // Delhivery, BlueDart, Bluedart, FedEx, Xpressbees
|
|
awbNumber: { type: String, default: '' },
|
|
trackingNumber: { type: String, default: '' },
|
|
trackingUrl: { type: String, default: '' },
|
|
estimatedDeliveryDate: { type: Date },
|
|
|
|
isPaid: { type: Boolean, default: false },
|
|
paidAt: { type: Date },
|
|
isDelivered: { type: Boolean, default: false },
|
|
deliveredAt: { type: Date },
|
|
notes: { type: String, default: '' }
|
|
}, { timestamps: true });
|
|
|
|
module.exports = mongoose.model('Order', orderSchema);
|