83 lines
2.5 KiB
JavaScript
83 lines
2.5 KiB
JavaScript
import mongoose from 'mongoose';
|
|
import { purchaseOrderModel } from './purchaseorder.schema.js';
|
|
import { aggregateRollups, editObject } from '../../database.js';
|
|
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 }
|
|
);
|
|
|
|
orderItemSchema.statics.recalculate = async function (orderItem, user) {
|
|
// Only purchase orders are supported for now
|
|
if (orderItem.orderType !== 'purchaseOrder') {
|
|
return;
|
|
}
|
|
|
|
const orderId = orderItem.order?._id || orderItem.order;
|
|
if (!orderId) {
|
|
return;
|
|
}
|
|
|
|
const rollupResults = await aggregateRollups({
|
|
model: this,
|
|
baseFilter: {
|
|
order: new mongoose.Types.ObjectId(orderId),
|
|
orderType: orderItem.orderType,
|
|
},
|
|
rollupConfigs: [
|
|
{
|
|
name: 'orderTotals',
|
|
rollups: [
|
|
{ name: 'totalAmount', property: 'totalAmount', operation: 'sum' },
|
|
{
|
|
name: 'totalAmountWithTax',
|
|
property: 'totalAmountWithTax',
|
|
operation: 'sum',
|
|
},
|
|
],
|
|
},
|
|
],
|
|
});
|
|
|
|
const totals = rollupResults.orderTotals || {};
|
|
const totalAmount = totals.totalAmount.sum?.toFixed(2) || 0;
|
|
const totalAmountWithTax = totals.totalAmountWithTax.sum?.toFixed(2) || 0;
|
|
|
|
await editObject({
|
|
model: purchaseOrderModel,
|
|
id: orderId,
|
|
updateData: {
|
|
totalAmount: parseFloat(totalAmount),
|
|
totalAmountWithTax: parseFloat(totalAmountWithTax),
|
|
totalTaxAmount: parseFloat(totalAmountWithTax - totalAmount),
|
|
},
|
|
user,
|
|
});
|
|
};
|
|
|
|
// 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);
|