/** * Transform Request Model * Represents requests from processors to buy raw materials and produce by-products */ import mongoose from "mongoose"; const transformRequestSchema = new mongoose.Schema( { processorId: { type: mongoose.Schema.Types.ObjectId, ref: "Processor", required: true, index: true, }, listingId: { type: mongoose.Schema.Types.ObjectId, ref: "Listing", }, sellerId: { type: mongoose.Schema.Types.ObjectId, ref: "User", }, requestType: { type: String, enum: ["spot_purchase", "contract_farming", "toll_processing", "buyback"], required: true, }, rawMaterial: { productType: { type: String, required: true, }, quantityKg: { type: Number, required: true, min: 0, }, grade: String, pricePerKg: Number, }, expectedOutput: [ { productType: String, expectedQuantityKg: Number, expectedGrade: String, }, ], processingFee: { amount: Number, currency: { type: String, default: "INR", }, per: { type: String, enum: ["kg", "quintal", "ton", "batch"], default: "kg", }, }, timeline: { requestedDeliveryDate: Date, estimatedProcessingDays: Number, expectedCompletionDate: Date, }, terms: { paymentMode: { type: String, enum: ["advance", "on_delivery", "credit", "escrow"], default: "escrow", }, advancePercentage: Number, qualityStandards: String, penaltyClause: String, }, status: { type: String, enum: [ "pending", "accepted", "rejected", "in_progress", "completed", "cancelled", "disputed", ], default: "pending", index: true, }, messages: [ { senderId: mongoose.Schema.Types.ObjectId, message: String, createdAt: { type: Date, default: Date.now, }, }, ], completionDetails: { actualOutputQuantity: Number, qualityReport: String, deliveryDate: Date, invoiceNumber: String, invoiceUrl: String, }, }, { timestamps: true, } ); // Indexes transformRequestSchema.index({ processorId: 1, status: 1 }); transformRequestSchema.index({ sellerId: 1, status: 1 }); const TransformRequest = mongoose.model("TransformRequest", transformRequestSchema); export default TransformRequest;