import { Schema, model, models, Model, Types, Document } from "mongoose"; export interface IProduct extends Document { _id: Types.ObjectId; businessId: Types.ObjectId; // tenant this product belongs to label: string; // Size measured in `unit` (litres for water, a count for side items). // The field keeps its historical name so existing data needs no migration. sizeLiters: number; unit: string; // see PRODUCT_UNITS in src/lib/units.ts: "L", "pcs", "tray"... category: string; // e.g. "Water", "Eggs" unitPrice: number; sortOrder: number; isActive: boolean; lowStockThreshold: number; // a branch at or below this many units shows a low-stock warning createdAt: Date; updatedAt: Date; } const productSchema = new Schema( { businessId: { type: Schema.Types.ObjectId, ref: "Business", required: true, index: true }, label: { type: String, required: true, trim: true }, sizeLiters: { type: Number, required: true, min: 0.1 }, unit: { type: String, default: "L", trim: true }, category: { type: String, default: "Water", trim: true }, unitPrice: { type: Number, required: true, min: 0 }, sortOrder: { type: Number, default: 0 }, isActive: { type: Boolean, default: true, index: true }, lowStockThreshold: { type: Number, default: 10, min: 0 }, }, { timestamps: true } ); export const Product = (models.Product as Model) || model("Product", productSchema); // Branch-specific price override — optional, falls back to Product.unitPrice. export interface IBranchPricing extends Document { businessId: Types.ObjectId; branchId: Types.ObjectId; productId: Types.ObjectId; unitPrice: number; updatedBy: Types.ObjectId | null; updatedAt: Date; } const branchPricingSchema = new Schema( { businessId: { type: Schema.Types.ObjectId, ref: "Business", required: true, index: true }, branchId: { type: Schema.Types.ObjectId, ref: "Branch", required: true }, productId: { type: Schema.Types.ObjectId, ref: "Product", required: true }, unitPrice: { type: Number, required: true, min: 0 }, updatedBy: { type: Schema.Types.ObjectId, ref: "User", default: null }, }, { timestamps: { createdAt: false, updatedAt: true } } ); branchPricingSchema.index({ branchId: 1, productId: 1 }, { unique: true }); export const BranchPricing = (models.BranchPricing as Model) || model("BranchPricing", branchPricingSchema);