diff --git a/app/controllers/submission.controller.js b/app/controllers/submission.controller.js index 9ff633b..59eea7a 100644 --- a/app/controllers/submission.controller.js +++ b/app/controllers/submission.controller.js @@ -872,6 +872,11 @@ exports.getPreviousForecastData = async (req, res) => { return res.status(404).json({ status:"failed", message:"No previous product row found" }); } + submissionProduct.dataValues.quarter_periods = getQuarterPeriods( + Number(year), + quarter + ); + return res.status(200).json({ status:"success", data: submissionProduct }); } catch (err) { @@ -879,3 +884,72 @@ exports.getPreviousForecastData = async (req, res) => { } }; +exports.getProductSubmissionHistory = async (req, res) => { + try { + + const { establishment_id, product_id } = req.query; + + if(!establishment_id || !product_id){ + return res.status(400).json({ status:"failed", message:"Missing required query params" }); + } + + // find submission id + const submissions = await Submission.findAll({ + where: { establishment_id }, + attributes: ["id"] + }); + + if(!submissions){ + return res.status(404).json({ status:"failed", message:"No submissions found for this establishment" }); + } + + const submissionIds = submissions.map(s => s.id); + + // 2. Find submission product history with quarter + year + sorting + let submissionProductsData = await SubmissionProduct.findAll({ + where: { + submission_id: submissionIds, + product_id + }, + include: [ + { + model: Submission, + as: "submission", + attributes: ["quarter", "year", "created_at"] + }, + { + model: Product, + as: "product", + attributes: ["product_name", "hs_code"] + } + ], + order: [ + [{ model: Submission, as: "submission" }, "year", "ASC"], + [ + Sequelize.literal(` + FIELD(submission.quarter, 'Q4', 'Q3', 'Q2', 'Q1') + `), + "DESC" + ], + ] + }); + + if(!submissionProductsData){ + return res.status(404).json({ status:"failed", message:"No previous product row found" }); + } + + for (const d of submissionProductsData) { + d.dataValues.quarter_periods = getQuarterPeriods( + Number(d.submission.year), + d.submission.quarter + ); + } + + + return res.status(200).json({ status:"success", data: submissionProductsData }); + + } catch (err) { + return res.status(500).json({ status:"failed", message: err.message }); + } +}; + diff --git a/app/models/submissionProduct.model.js b/app/models/submissionProduct.model.js index d9c9293..e44709c 100644 --- a/app/models/submissionProduct.model.js +++ b/app/models/submissionProduct.model.js @@ -76,15 +76,15 @@ module.exports = (sequelize, DataTypes) => { timestamps: false, }); - SubmissionProduct.associate = (models) => { - SubmissionProduct.belongsTo(models.Submission, { - foreignKey: "submission_id", - as: "submission", - }); - }; + SubmissionProduct.associate = (models) => { + SubmissionProduct.belongsTo(models.Submission, { + foreignKey: "submission_id", + as: "submission", + }); + SubmissionProduct.belongsTo(models.Product, { foreignKey: "product_id", as: "product", diff --git a/app/routes/routes.js b/app/routes/routes.js index 7f81fff..511c9bd 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -2227,6 +2227,34 @@ router.post("/getQuarterPeriods",[verifySignature, verifyToken], submissionContr */ router.get("/submissions/getPreviousForecastData",[verifySignature, verifyToken], submissionController.getPreviousForecastData); +/** + * @swagger + * /api/submissions/getProductSubmissionHistory: + * get: + * summary: Get Product submission history data based on Establishment + Product + * tags: [Submissions] + * security: + * - appSignature: [] + * - bearerAuth: [] + * parameters: + * - in: query + * name: establishment_id + * required: true + * schema: { type: integer } + * - in: query + * name: product_id + * required: true + * schema: { type: integer } + * responses: + * 200: + * description: Product submission history data fetched successfully + * 404: + * description: Not found + * 500: + * description: Server error + */ +router.get("/submissions/getProductSubmissionHistory",[verifySignature, verifyToken], submissionController.getProductSubmissionHistory); + /** * @swagger * /api/submission-audit-history: diff --git a/app/services/quarterService.js b/app/services/quarterService.js index 8fa8d17..4d66422 100644 --- a/app/services/quarterService.js +++ b/app/services/quarterService.js @@ -6,7 +6,7 @@ * @param {string} currentQuarter - e.g. 'Q4' * @returns {object} - structured period data */ -exports.getQuarterPeriods = (currentYear, currentQuarter) => { +exports.getQuarterPeriods = (currentYear, currentQuarter) => { // Define quarters based on Calander year (Jan–Dec) const quarters = { Q1: ["Jan", "Feb", "Mar"],