Files
2026-09-16 17:36:46 +05:30

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);