115 lines
2.6 KiB
JavaScript
115 lines
2.6 KiB
JavaScript
import mongoose, { Schema } from "mongoose";
|
|
import { nanoid } from "nanoid"; // To generate unique 6-char IDs
|
|
|
|
const OrderItemSchema = new mongoose.Schema({
|
|
productId: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: "Product",
|
|
required: true,
|
|
},
|
|
quantity: {
|
|
type: Number,
|
|
required: true,
|
|
min: 1,
|
|
},
|
|
});
|
|
|
|
const StatusHistorySchema = new mongoose.Schema({
|
|
status: {
|
|
type: String,
|
|
enum: ["new", "dispatched", "paid", "process"], // Ensure this matches your status enum
|
|
required: true,
|
|
},
|
|
timestamp: {
|
|
type: Date,
|
|
default: Date.now,
|
|
},
|
|
});
|
|
|
|
const pdOrderSchema = new Schema(
|
|
{
|
|
paymentMode: {
|
|
type: String,
|
|
enum: ["cheque", "online-transfer", "credit"],
|
|
required: true,
|
|
},
|
|
shipTo: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
billTo: {
|
|
type: String,
|
|
required: true,
|
|
},
|
|
orderItem: [OrderItemSchema],
|
|
subtotal: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
gstTotal: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
grandTotal: {
|
|
type: Number,
|
|
required: true,
|
|
},
|
|
status: {
|
|
type: String,
|
|
enum: ["new", "dispatched", "paid", "processing"],
|
|
default: "new",
|
|
},
|
|
statusUpdatedAt: {
|
|
type: Date,
|
|
default: Date.now,
|
|
},
|
|
uniqueId: {
|
|
type: String,
|
|
unique: true,
|
|
default: () => nanoid(6), // Generates a 6-character unique ID
|
|
},
|
|
addedBy: {
|
|
type: Schema.Types.ObjectId,
|
|
ref: "User",
|
|
required: true,
|
|
},
|
|
status_timeline: {
|
|
new: { type: Date },
|
|
paid: { type: Date },
|
|
processing: { type: Date },
|
|
dispatched: { type: Date },
|
|
delivered: { type: Date },
|
|
cancelled: { type: Date },
|
|
returned: { type: Date },
|
|
},
|
|
iscancelled: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
order_Cancelled_Reason: {
|
|
type: String,
|
|
},
|
|
courier_name: { type: String },
|
|
courier_tracking_id: { type: String },
|
|
isDelivered: { type: Boolean, required: true, default: false },
|
|
DeliveredDate: { type: String, default: "" },
|
|
statusHistory: [StatusHistorySchema], // Add this field to store the status history
|
|
},
|
|
{ timestamps: true }
|
|
);
|
|
|
|
// Middleware to update the statusUpdatedAt field whenever status changes
|
|
pdOrderSchema.pre("save", function (next) {
|
|
if (this.isModified("status")) {
|
|
this.statusUpdatedAt = Date.now();
|
|
// Add the new status and timestamp to statusHistory
|
|
this.statusHistory.push({
|
|
status: this.status,
|
|
timestamp: this.statusUpdatedAt,
|
|
});
|
|
}
|
|
next();
|
|
});
|
|
|
|
export const PdOrder = mongoose.model("PdOrder", pdOrderSchema);
|