diff --git a/app/controllers/calculation.controller.js b/app/controllers/calculation.controller.js index 157249a..b91e62c 100644 --- a/app/controllers/calculation.controller.js +++ b/app/controllers/calculation.controller.js @@ -233,34 +233,89 @@ exports.calculation_log = async (req, res) => { }; +const validateYearQuarter = (year, quarter) => { + if (!year || !quarter) { + return { ok: false, message: "Year and quarter are required" }; + } + if (!["Q1", "Q2", "Q3", "Q4"].includes(quarter)) { + return { + ok: false, + message: "Invalid quarter. Accepted values: Q1, Q2, Q3, Q4", + }; + } + return { ok: true }; +}; + +async function runSurveyAutoSubmit(year, quarter) { + const autoSubmissionService = new SubmissionAutoFillService(dbConfig); + const autoFillMissingSubmissions = + await autoSubmissionService.autoFillMissingSubmissions(year, quarter); + const verifyCompleteness = + await autoSubmissionService.verifyCompleteness(year, quarter); + + return { autoFillMissingSubmissions, verifyCompleteness }; +} + +async function runQuarterCalculation(year, quarter) { + const service = new IPICalculationService(dbConfig); + try { + const data = await service.runCompleteCalculation(year, quarter); + return { message: `IPI calculated for ${year} ${quarter}`, data }; + } finally { + await service.close(); + } +} + // 5. Survey Auto Submit exports.survey_auto_submit = async (req, res) => { try { const { year, quarter } = req.body; + const validation = validateYearQuarter(year, quarter); + if (!validation.ok) { + return res.status(400).json({ success: false, message: validation.message }); + } - const autoSubmissionService = new SubmissionAutoFillService(dbConfig); - - // Auto-fill missing submissions for specific year and quarter - const result = await autoSubmissionService.autoFillMissingSubmissions(year, quarter); - - // Get report for specific quarter - // const result2 = await autoSubmissionService.getAutoFillReport(year, quarter); - - // Verify completeness for specific quarter - const result3 = await autoSubmissionService.verifyCompleteness(year, quarter); - - - - res.json({ success: true, autoFillMissingSubmissions: result , verifyCompleteness: result3 }); - - + const result = await runSurveyAutoSubmit(year, quarter); + res.json({ success: true, ...result }); } catch (error) { - console.error('Error:', error); + console.error("Error:", error); res.status(500).json({ success: false, - message: '', - error: error.message + message: "Error during survey auto submit", + error: error.message, + }); + } +}; + +// 6. Auto submit missing surveys, then run quarterly IPI calculation +exports.survey_auto_submit_and_calculate = async (req, res) => { + try { + const { year, quarter } = req.body; + const validation = validateYearQuarter(year, quarter); + if (!validation.ok) { + return res.status(400).json({ success: false, message: validation.message }); + } + + const autoSubmitResult = await runSurveyAutoSubmit(year, quarter); + const calculationResult = await runQuarterCalculation(year, quarter); + + res.json({ + success: true, + message: `Auto submit and IPI calculation completed for ${year} ${quarter}`, + year, + quarter, + steps: { + survey_auto_submit: autoSubmitResult, + calculate_quarter: calculationResult, + }, + }); + } catch (error) { + console.error("Error:", error); + res.status(500).json({ + success: false, + message: "Error during auto submit and quarterly calculation", + error: error.message, }); } }; diff --git a/app/routes/routes.js b/app/routes/routes.js index 9a054fa..8b7ec47 100644 --- a/app/routes/routes.js +++ b/app/routes/routes.js @@ -134,6 +134,49 @@ router.post("/survey_auto_submit",[] , calculationController.survey_auto_submit) router.post("/calculate_quarter",[] , calculationController.calculate_quarter); +/** + * @swagger + * /api/survey_auto_submit_and_calculate: + * post: + * summary: Auto submit missing surveys, then calculate IPI for the quarter + * description: | + * Runs in sequence: + * 1. survey_auto_submit — auto-fill missing submissions and verify completeness + * 2. calculate_quarter — run IPI calculation for the same year and quarter + * tags: [IIP Calculation] + * security: + * - appSignature: [] + * - CSRF: [] + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * required: + * - year + * - quarter + * properties: + * year: + * type: integer + * example: 2025 + * quarter: + * type: string + * enum: [Q1, Q2, Q3, Q4] + * example: Q2 + * responses: + * 200: + * description: Auto submit and quarterly calculation completed successfully + * 400: + * description: Invalid year or quarter + * 500: + * description: Server error + */ +router.post( + "/survey_auto_submit_and_calculate", + [], + calculationController.survey_auto_submit_and_calculate +); router.get("/calculate_month",[] , calculationController.calculate_month);