api/resources/PD_Orders/pdOrderModal.js
2024-08-23 10:21:22 +05:30

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