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