From 30295dad3a1bd2db7fdceed64887195faf3df541 Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 7 Dec 2025 02:37:10 +0000 Subject: [PATCH] Added order items, shipments etc --- .../schemas/inventory/orderitem.schema.js | 32 ++++++++++++ .../schemas/inventory/purchaseorder.schema.js | 2 +- .../schemas/inventory/shipment.schema.js | 50 +++++++++++++++++++ 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 src/database/schemas/inventory/orderitem.schema.js create mode 100644 src/database/schemas/inventory/shipment.schema.js diff --git a/src/database/schemas/inventory/orderitem.schema.js b/src/database/schemas/inventory/orderitem.schema.js new file mode 100644 index 0000000..42a68f8 --- /dev/null +++ b/src/database/schemas/inventory/orderitem.schema.js @@ -0,0 +1,32 @@ +import mongoose from 'mongoose'; +import { generateId } from '../../utils.js'; +const { Schema } = mongoose; + +const orderItemSchema = new Schema( + { + _reference: { type: String, default: () => generateId()() }, + orderType: { type: String, required: true }, + order: { type: Schema.Types.ObjectId, refPath: 'orderType', required: true }, + itemType: { type: String, required: true }, + item: { type: Schema.Types.ObjectId, refPath: 'itemType', required: true }, + syncAmount: { type: String, required: true, default: null }, + itemAmount: { type: Number, required: true }, + quantity: { type: Number, required: true }, + totalAmount: { type: Number, required: true }, + taxRate: { type: Schema.Types.ObjectId, ref: 'taxRate', required: false }, + totalAmountWithTax: { type: Number, required: true }, + timestamp: { type: Date, default: Date.now }, + }, + { timestamps: true } +); + +// Add virtual id getter +orderItemSchema.virtual('id').get(function () { + return this._id; +}); + +// Configure JSON serialization to include virtuals +orderItemSchema.set('toJSON', { virtuals: true }); + +// Create and export the model +export const orderItemModel = mongoose.model('orderItem', orderItemSchema); diff --git a/src/database/schemas/inventory/purchaseorder.schema.js b/src/database/schemas/inventory/purchaseorder.schema.js index d88fe3e..4d08762 100644 --- a/src/database/schemas/inventory/purchaseorder.schema.js +++ b/src/database/schemas/inventory/purchaseorder.schema.js @@ -4,7 +4,7 @@ const { Schema } = mongoose; const itemSchema = new Schema({ itemType: { type: String, required: true }, - item: { type: Schema.Types.ObjectId, refPath: 'itemType', required: true }, + item: { type: Schema.Types.ObjectId, refPath: 'items.itemType', required: true }, quantity: { type: Number, required: true }, itemCost: { type: Number, required: true }, totalCost: { type: Number, required: true }, diff --git a/src/database/schemas/inventory/shipment.schema.js b/src/database/schemas/inventory/shipment.schema.js new file mode 100644 index 0000000..67331ae --- /dev/null +++ b/src/database/schemas/inventory/shipment.schema.js @@ -0,0 +1,50 @@ +import mongoose from 'mongoose'; +import { generateId } from '../../utils.js'; +const { Schema } = mongoose; + +const shipmentItemSchema = new Schema({ + itemType: { type: String, required: true }, + item: { type: Schema.Types.ObjectId, refPath: 'itemType', required: true }, + quantity: { type: Number, required: true }, + itemCost: { type: Number, required: true }, + totalCost: { type: Number, required: true }, + totalCostWithTax: { type: Number, required: true }, + taxRate: { type: Schema.Types.ObjectId, ref: 'taxRate', required: false }, +}); + +const shipmentSchema = new Schema( + { + _reference: { type: String, default: () => generateId()() }, + purchaseOrder: { type: Schema.Types.ObjectId, ref: 'purchaseOrder', required: true }, + vendor: { type: Schema.Types.ObjectId, ref: 'vendor', required: true }, + courierService: { type: Schema.Types.ObjectId, ref: 'courierService', required: false }, + trackingNumber: { type: String, required: false }, + items: [shipmentItemSchema], + cost: { net: { type: Number, required: true }, gross: { type: Number, required: true } }, + shippedDate: { type: Date, required: false }, + expectedDeliveryDate: { type: Date, required: false }, + actualDeliveryDate: { type: Date, required: false }, + state: { + type: { + type: String, + required: true, + default: 'pending', + enum: ['pending', 'shipped', 'in_transit', 'delivered', 'cancelled'], + }, + }, + notes: { type: String }, + timestamp: { type: Date, default: Date.now }, + }, + { timestamps: true } +); + +// Add virtual id getter +shipmentSchema.virtual('id').get(function () { + return this._id; +}); + +// Configure JSON serialization to include virtuals +shipmentSchema.set('toJSON', { virtuals: true }); + +// Create and export the model +export const shipmentModel = mongoose.model('shipment', shipmentSchema);