174 lines
5.1 KiB
JavaScript

import dotenv from "dotenv";
import { stockAuditModel } from "../../schemas/stockaudit.schema.js";
import log4js from "log4js";
import mongoose from "mongoose";
import { auditLogModel } from "../../schemas/auditlog.schema.js";
dotenv.config();
const logger = log4js.getLogger("Stock Audits");
logger.level = process.env.LOG_LEVEL;
export const listStockAuditsRouteHandler = async (
req,
res,
page = 1,
limit = 25,
property = "",
filter = {},
) => {
try {
const skip = (page - 1) * limit;
let stockAudits;
let aggregateCommand = [];
// Lookup createdBy user
aggregateCommand.push({
$lookup: {
from: "users",
localField: "createdBy",
foreignField: "_id",
as: "createdBy",
},
});
aggregateCommand.push({ $unwind: "$createdBy" });
if (filter != {}) {
aggregateCommand.push({ $match: filter });
}
if (property != "") {
aggregateCommand.push({ $group: { _id: `$${property}` } });
aggregateCommand.push({ $project: { _id: 0, [property]: "$_id" } });
}
aggregateCommand.push({ $skip: skip });
aggregateCommand.push({ $limit: Number(limit) });
stockAudits = await stockAuditModel.aggregate(aggregateCommand);
logger.trace(
`List of stock audits (Page ${page}, Limit ${limit}, Property ${property}):`,
stockAudits,
);
res.send(stockAudits);
} catch (error) {
logger.error("Error listing stock audits:", error);
res.status(500).send({ error: error });
}
};
export const getStockAuditRouteHandler = async (req, res) => {
try {
const id = new mongoose.Types.ObjectId(req.params.id);
const stockAudit = await stockAuditModel
.findOne({
_id: id,
})
.populate("createdBy")
.populate("items.filamentStock")
.populate("items.partStock");
if (!stockAudit) {
logger.warn(`Stock audit not found with supplied id.`);
return res.status(404).send({ error: "Stock audit not found." });
}
logger.trace(`Stock audit with ID: ${id}:`, stockAudit);
const auditLogs = await auditLogModel.find({
target: id
}).populate('owner');
res.send({...stockAudit._doc, auditLogs: auditLogs});
} catch (error) {
logger.error("Error fetching stock audit:", error);
res.status(500).send({ error: error.message });
}
};
export const newStockAuditRouteHandler = async (req, res) => {
try {
const newStockAudit = {
type: req.body.type,
status: req.body.status || "pending",
notes: req.body.notes,
items: req.body.items.map(item => ({
type: item.type,
stock: item.type === "filament"
? new mongoose.Types.ObjectId(item.filamentStock)
: new mongoose.Types.ObjectId(item.partStock),
expectedQuantity: item.expectedQuantity,
actualQuantity: item.actualQuantity,
notes: item.notes
})),
createdBy: new mongoose.Types.ObjectId(req.body.createdBy),
completedAt: req.body.status === "completed" ? new Date() : null
};
const result = await stockAuditModel.create(newStockAudit);
if (!result) {
logger.error("No stock audit created.");
return res.status(500).send({ error: "No stock audit created." });
}
return res.send({ status: "ok", id: result._id });
} catch (error) {
logger.error("Error adding stock audit:", error);
return res.status(500).send({ error: error.message });
}
};
export const updateStockAuditRouteHandler = async (req, res) => {
try {
const id = new mongoose.Types.ObjectId(req.params.id);
const updateData = {
...req.body,
items: req.body.items?.map(item => ({
type: item.type,
stock: item.type === "filament"
? new mongoose.Types.ObjectId(item.filamentStock)
: new mongoose.Types.ObjectId(item.partStock),
expectedQuantity: item.expectedQuantity,
actualQuantity: item.actualQuantity,
notes: item.notes
})),
completedAt: req.body.status === "completed" ? new Date() : null
};
const result = await stockAuditModel.findByIdAndUpdate(
id,
{ $set: updateData },
{ new: true }
);
if (!result) {
logger.warn(`Stock audit not found with supplied id.`);
return res.status(404).send({ error: "Stock audit not found." });
}
logger.trace(`Updated stock audit with ID: ${id}:`, result);
res.send(result);
} catch (error) {
logger.error("Error updating stock audit:", error);
res.status(500).send({ error: error.message });
}
};
export const deleteStockAuditRouteHandler = async (req, res) => {
try {
const id = new mongoose.Types.ObjectId(req.params.id);
const result = await stockAuditModel.findByIdAndDelete(id);
if (!result) {
logger.warn(`Stock audit not found with supplied id.`);
return res.status(404).send({ error: "Stock audit not found." });
}
logger.trace(`Deleted stock audit with ID: ${id}`);
res.send({ status: "ok" });
} catch (error) {
logger.error("Error deleting stock audit:", error);
res.status(500).send({ error: error.message });
}
};