Conflit resolved : GWM
This commit is contained in:
commit
f37e0408d4
@ -97,6 +97,7 @@ exports.login = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({
|
||||
status: "failed",
|
||||
message: "Internal server error",
|
||||
@ -173,7 +174,9 @@ exports.register = async (req, res) => {
|
||||
const ERROR_STATUS = "error";
|
||||
const ERROR_CODE = "SERVER_ERROR";
|
||||
const ERROR_MESSAGE = "An unexpected error occurred";
|
||||
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
|
||||
return res.status(500).send({
|
||||
status: ERROR_STATUS,
|
||||
code: ERROR_CODE,
|
||||
|
||||
@ -48,6 +48,7 @@ exports.updateDeadlineData = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -143,6 +143,16 @@ exports.getEstablishmentDashboard = async (req, res) => {
|
||||
if (activeQuarters?.length > 0) {
|
||||
|
||||
for (const q of activeQuarters) {
|
||||
const endDate = new Date(q.end_date);
|
||||
const graceDays = Number(q.grace_periods_days || 0);
|
||||
const finalDeadline = new Date(endDate);
|
||||
finalDeadline.setDate(finalDeadline.getDate() + graceDays);
|
||||
const now = new Date();
|
||||
|
||||
// Skip this quarter if it's closed (deadline has passed)
|
||||
if (now > finalDeadline) {
|
||||
continue;
|
||||
}
|
||||
|
||||
const submissionMatch = await Submission.findOne({
|
||||
where: {
|
||||
@ -181,6 +191,7 @@ exports.getEstablishmentDashboard = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -282,6 +293,7 @@ exports.adminDashboard = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -121,6 +121,8 @@ exports.deployment = async (req, res) => {
|
||||
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -277,7 +277,8 @@ exports.createEstablishment = async (req, res) => {
|
||||
message: `${field} already exists`
|
||||
});
|
||||
}
|
||||
logger.error('Error creating establishment', { error: err.message });
|
||||
logger.error(`Error creating establishment: ${err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({status: "failed",message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -439,7 +440,8 @@ exports.getAllEstablishments = async (req, res) => {
|
||||
});
|
||||
|
||||
} catch (err) {
|
||||
logger.error('Error on get all establishment', { error: err.message });
|
||||
logger.error(`Error on get all establishment: ${err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.setHeader('X-Frame-Options', 'DENY');
|
||||
res.setHeader('X-Content-Type-Options', 'nosniff');
|
||||
|
||||
@ -527,7 +529,8 @@ exports.getEstablishmentById = async (req, res) => {
|
||||
return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data });
|
||||
|
||||
} catch (err) {
|
||||
logger.error('Error on get establishment by Id', { error: err.message });
|
||||
logger.error(`Error on get establishment by Id: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -698,7 +701,8 @@ exports.updateEstablishment = async (req, res) => {
|
||||
const field = err.errors[0].path;
|
||||
return res.status(400).json({ status:"failed", message:`${field} already exists` });
|
||||
}
|
||||
logger.error('Error updating establishment', { error: err.message });
|
||||
logger.error(`Error updating establishment: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({ status:"failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -714,7 +718,7 @@ exports.deleteEstablishment = async (req, res) => {
|
||||
return res.status(200).send({'status':"success",'message':"Deleted successfully",'data': "" });
|
||||
|
||||
} catch (err) {
|
||||
logger.error('Error deleting establishment', { error: err.message });
|
||||
logger.error(`Error deleting establishment: ${ err.message }`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -729,7 +733,8 @@ exports.getAllEmirates = async (req, res) => {
|
||||
return res.status(200).send({status: "success", message: "Emirates fetched successfully", data: emirates,});
|
||||
|
||||
} catch (err) {
|
||||
logger.error('Error on get all emirates', { error: err.message });
|
||||
logger.error(`Error on get all emirates: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({status: "failed",message: "Internal server error", });
|
||||
}
|
||||
};
|
||||
@ -779,7 +784,8 @@ exports.getAllCityTowns = async (req, res) => {
|
||||
return res.status(200).send({status: "success", message: "City/Town fetched successfully", data: sanitizedCities, });
|
||||
|
||||
} catch (err) {
|
||||
logger.error('Error getting all city towns', { error: err.message });
|
||||
logger.error(`Error getting all city towns: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -795,7 +801,8 @@ exports.getAllRequests = async (req, res) => {
|
||||
data: requests,
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error('Error on getall request', { error: err.message });
|
||||
logger.error(`Error on getall request: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -874,7 +881,8 @@ exports.createRequest = async (req, res) => {
|
||||
});
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error('Error on create request', { error: err.message });
|
||||
logger.error(`Error on create request: ${ err.message }`);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error"});
|
||||
}
|
||||
};
|
||||
@ -959,6 +967,7 @@ exports.forgotPasswordRequestOTP = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -1035,6 +1044,7 @@ exports.forgotPasswordVerifyOTP = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -1086,6 +1096,7 @@ function deleteFileSecure(filePath) {
|
||||
} catch (err) {
|
||||
if (logger && logger.error) {
|
||||
logger.error('File deletion error: ' + err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1637,6 +1648,7 @@ exports.downloadCompanyProfileSample = async (req, res) => {
|
||||
return res.download(safeFilePath, "company_profile_upload_sample.csv");
|
||||
} catch (error) {
|
||||
logger.error('Error on downloading company profile sample file' + error.message );
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
return res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -75,6 +75,7 @@ exports.createEstablishmentProduct = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -118,6 +119,7 @@ exports.getAllEstablishmentProducts = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -133,6 +135,7 @@ exports.getEstablishmentProductById = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -158,6 +161,7 @@ exports.updateEstablishmentProduct = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -173,6 +177,7 @@ exports.deleteEstablishmentProduct = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -107,7 +107,8 @@ exports.createUser = async (req, res) => {
|
||||
message: "Establishment User created successfully.",
|
||||
});
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
return res.status(500).json({ status: "error", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -133,6 +134,7 @@ exports.getAllUsers = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -149,6 +151,7 @@ exports.getUserById = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -178,6 +181,7 @@ exports.updateUser = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -235,6 +239,7 @@ exports.changeUserPassword = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({
|
||||
status: "failed",
|
||||
message: "An unexpected error occurred"
|
||||
@ -255,6 +260,7 @@ exports.deleteUser = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -335,7 +341,8 @@ exports.triggerEstablishmentUsersWelcomeEmail = async (req, res) => {
|
||||
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
return res.status(500).json({ status: "error", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -40,6 +40,7 @@ exports.login = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -53,6 +54,7 @@ exports.logout = async (req, res) => {
|
||||
res.status(200).json({ message: "Logout successful (client should discard token)" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
193
app/controllers/manufacturingIPI.controller.js
Normal file
193
app/controllers/manufacturingIPI.controller.js
Normal file
@ -0,0 +1,193 @@
|
||||
const db = require("../models");
|
||||
const ManufacturingIpi = db.ManufacturingIpi;
|
||||
const Isic2DigitIndices = db.Isic2DigitIndices;
|
||||
const Isic3DigitIndices = db.Isic3DigitIndices;
|
||||
const Isic4DigitIndices = db.Isic4DigitIndices;
|
||||
const logger = require("../services/logger");
|
||||
|
||||
const formatDecimal = (value) => {
|
||||
if (value === null || value === undefined || value === '' || value === 0) {
|
||||
return "0.00";
|
||||
}
|
||||
return parseFloat(value).toFixed(2);
|
||||
};
|
||||
|
||||
exports.getAllManufacturingIndexDetails = async (req, res) => {
|
||||
try {
|
||||
const rawData = await ManufacturingIpi.findAll({
|
||||
order: [["created_at", "DESC"]],
|
||||
});
|
||||
|
||||
// Format decimal fields
|
||||
const data = rawData.map(item => {
|
||||
const plainItem = item.get({ plain: true });
|
||||
return {
|
||||
...plainItem,
|
||||
total_weight: formatDecimal(plainItem.total_weight),
|
||||
weighted_index_sum: formatDecimal(plainItem.weighted_index_sum),
|
||||
manufacturing_index: formatDecimal(plainItem.manufacturing_index),
|
||||
mom_change: formatDecimal(plainItem.mom_change),
|
||||
yoy_change: formatDecimal(plainItem.yoy_change),
|
||||
};
|
||||
});
|
||||
|
||||
logger.info(`getAllManufacturingIndexDetails API: Fetched ${data.length} manufacturing index records successfully`);
|
||||
|
||||
res.status(200).send({
|
||||
status: "success",
|
||||
message: "Fetched successfully",
|
||||
data: data
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
logger.error(`getAllManufacturingIndexDetails API: ${error.message}`);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
exports.getManufacturingMonthlyOverviewByYearMonth = async (req, res) => {
|
||||
try {
|
||||
const { year, month } = req.query;
|
||||
|
||||
// Validate parameters exist
|
||||
if (!year || !month) {
|
||||
logger.warn('getManufacturingMonthlyOverview API: Missing required parameters');
|
||||
return res.status(400).send({
|
||||
status: "failed",
|
||||
message: "Year and month are required"
|
||||
});
|
||||
}
|
||||
|
||||
// Sanitize and validate input - prevent SQL injection
|
||||
const yearInt = parseInt(year, 10);
|
||||
const monthInt = parseInt(month, 10);
|
||||
|
||||
// Validate that parsing was successful
|
||||
if (isNaN(yearInt) || isNaN(monthInt)) {
|
||||
logger.warn(`getManufacturingMonthlyOverview API: Invalid input - year: ${year}, month: ${month}`);
|
||||
return res.status(400).send({
|
||||
status: "failed",
|
||||
message: "Year and month must be valid numbers"
|
||||
});
|
||||
}
|
||||
|
||||
// Validate year range (reasonable bounds)
|
||||
if (yearInt < 2000 || yearInt > 2100) {
|
||||
return res.status(400).send({
|
||||
status: "failed",
|
||||
message: "Year must be between 2000 and 2100"
|
||||
});
|
||||
}
|
||||
|
||||
// Validate month range
|
||||
if (monthInt < 1 || monthInt > 12) {
|
||||
return res.status(400).send({
|
||||
status: "failed",
|
||||
message: "Month must be between 1 and 12"
|
||||
});
|
||||
}
|
||||
|
||||
// Common where clause
|
||||
const whereClause = {
|
||||
year: yearInt,
|
||||
month: monthInt
|
||||
};
|
||||
|
||||
// Fetch data from all tables in parallel
|
||||
const [manufacturingData, isic2DigitData, isic3DigitData, isic4DigitData] = await Promise.all([
|
||||
ManufacturingIpi.findOne({
|
||||
attributes: ['manufacturing_index', 'mom_change', 'yoy_change'],
|
||||
where: whereClause
|
||||
}),
|
||||
Isic2DigitIndices.findAll({
|
||||
attributes: ['isic_2digit_code', 'isic_description', 'total_weight', 'weighted_index_sum', 'isic_2digit_index'],
|
||||
where: whereClause,
|
||||
order: [['isic_2digit_code', 'ASC']]
|
||||
}),
|
||||
Isic3DigitIndices.findAll({
|
||||
attributes: ['isic_3digit_code', 'isic_description', 'total_weight', 'weighted_index_sum', 'isic_3digit_index'],
|
||||
where: whereClause,
|
||||
order: [['isic_3digit_code', 'ASC']]
|
||||
}),
|
||||
Isic4DigitIndices.findAll({
|
||||
attributes: ['isic_4digit_code', 'isic_description', 'total_weight', 'weighted_index_sum', 'isic_4digit_index'],
|
||||
where: whereClause,
|
||||
order: [['isic_4digit_code', 'ASC']]
|
||||
})
|
||||
]);
|
||||
|
||||
// Check if manufacturing data exists (main data)
|
||||
if (!manufacturingData) {
|
||||
logger.info(`getManufacturingMonthlyOverview API: No data found for year ${yearInt}, month ${monthInt}`);
|
||||
return res.status(404).send({
|
||||
status: "failed",
|
||||
message: "No data found for the specified period"
|
||||
});
|
||||
}
|
||||
|
||||
// Format Manufacturing IPI data
|
||||
const plainManufacturing = manufacturingData.get({ plain: true });
|
||||
const formattedManufacturing = {
|
||||
manufacturing_index: formatDecimal(plainManufacturing.manufacturing_index),
|
||||
mom_change: formatDecimal(plainManufacturing.mom_change),
|
||||
yoy_change: formatDecimal(plainManufacturing.yoy_change),
|
||||
};
|
||||
|
||||
// Format ISIC 2-digit data
|
||||
const formattedIsic2Digit = isic2DigitData.map(item => {
|
||||
const plainItem = item.get({ plain: true });
|
||||
return {
|
||||
isic_2digit_code: plainItem.isic_2digit_code,
|
||||
isic_description: plainItem.isic_description,
|
||||
total_weight: formatDecimal(plainItem.total_weight),
|
||||
weighted_index_sum: formatDecimal(plainItem.weighted_index_sum),
|
||||
isic_2digit_index: formatDecimal(plainItem.isic_2digit_index),
|
||||
};
|
||||
});
|
||||
|
||||
// Format ISIC 3-digit data
|
||||
const formattedIsic3Digit = isic3DigitData.map(item => {
|
||||
const plainItem = item.get({ plain: true });
|
||||
return {
|
||||
isic_3digit_code: plainItem.isic_3digit_code,
|
||||
isic_description: plainItem.isic_description,
|
||||
total_weight: formatDecimal(plainItem.total_weight),
|
||||
weighted_index_sum: formatDecimal(plainItem.weighted_index_sum),
|
||||
isic_3digit_index: formatDecimal(plainItem.isic_3digit_index),
|
||||
};
|
||||
});
|
||||
|
||||
// Format ISIC 4-digit data
|
||||
const formattedIsic4Digit = isic4DigitData.map(item => {
|
||||
const plainItem = item.get({ plain: true });
|
||||
return {
|
||||
isic_4digit_code: plainItem.isic_4digit_code,
|
||||
isic_description: plainItem.isic_description,
|
||||
total_weight: formatDecimal(plainItem.total_weight),
|
||||
weighted_index_sum: formatDecimal(plainItem.weighted_index_sum),
|
||||
isic_4digit_index: formatDecimal(plainItem.isic_4digit_index),
|
||||
};
|
||||
});
|
||||
|
||||
logger.info(`getManufacturingMonthlyOverview API: Successfully fetched data for year ${yearInt}, month ${monthInt}`);
|
||||
|
||||
res.status(200).send({
|
||||
status: "success",
|
||||
message: "Fetched successfully",
|
||||
manufacturing_total: formattedManufacturing,
|
||||
isic_2digit: formattedIsic2Digit,
|
||||
isic_3digit: formattedIsic3Digit,
|
||||
isic_4digit: formattedIsic4Digit
|
||||
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
logger.error(`getManufacturingMonthlyOverview API Error: ${error.message}`);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({
|
||||
status: "failed",
|
||||
message: "Internal server error"
|
||||
});
|
||||
}
|
||||
};
|
||||
@ -40,6 +40,7 @@ exports.createTemplate = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -81,6 +82,7 @@ exports.updateTemplate = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({
|
||||
status: "failed",
|
||||
message: "Internal server error"
|
||||
@ -99,6 +101,7 @@ exports.getAllTemplates = async (req, res) => {
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -119,6 +122,7 @@ exports.getTemplateById = async (req, res) => {
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -140,6 +144,7 @@ exports.deleteTemplate = async (req, res) => {
|
||||
.send({ status: "success", message: "Deleted successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -72,7 +72,8 @@ exports.createProduct = async (req, res) => {
|
||||
|
||||
res.status(201).send({'status':"success",'message':"created successfully." });
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -118,7 +119,8 @@ exports.getAllProducts = async (req, res) => {
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -133,7 +135,8 @@ exports.getProductById = async (req, res) => {
|
||||
res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data });
|
||||
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -154,7 +157,8 @@ exports.updateProduct = async (req, res) => {
|
||||
res.status(200).send({'status':"success",'message':"Updated successfully",'data': "" });
|
||||
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -170,7 +174,8 @@ exports.deleteProduct = async (req, res) => {
|
||||
res.status(200).send({'status':"success",'message':"Deleted successfully",'data': "" });
|
||||
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -181,7 +186,8 @@ exports.downloadProductSample = async (req, res) => {
|
||||
const filePath = path.join(__dirname, "../downloads_csv/products_upload_sample.csv");
|
||||
return res.download(filePath, "products_upload_sample.csv");
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -228,6 +234,7 @@ function deleteFileSecure(filePath) {
|
||||
} catch (err) {
|
||||
if (logger && logger.error) {
|
||||
logger.error('File deletion error: ' + err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -592,6 +599,7 @@ exports.uploadProductsFromCSV = async (req, res) => {
|
||||
deleteFileSecure(sanitizedPath);
|
||||
if (logger && logger.error) {
|
||||
logger.error("CSV processing error: " + processingError.message);
|
||||
logger.error(`Stack trace: ${processingError.stack}`);
|
||||
}
|
||||
return res.status(500).send({
|
||||
status: "failed",
|
||||
@ -614,6 +622,7 @@ exports.uploadProductsFromCSV = async (req, res) => {
|
||||
deleteFileSecure(sanitizedPath);
|
||||
if (logger && logger.error) {
|
||||
logger.error("Upload error: " + error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
}
|
||||
return res.status(500).send({
|
||||
status: "failed",
|
||||
|
||||
@ -70,6 +70,7 @@ exports.createConfig = async (req, res) => {
|
||||
sendEmailsToEstablishments(placeholder);
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -86,12 +87,15 @@ async function sendEmailsToEstablishments(placeholder) {
|
||||
|
||||
await new Promise(resolve => setTimeout(resolve, 1000));
|
||||
} catch (emailErr) {
|
||||
console.error("Email failed:", user.email, emailErr.message);
|
||||
logger.error(emailErr.message);
|
||||
logger.error(`Stack trace: ${emailErr.stack}`);
|
||||
console.error("Email failed:", emailErr.message);
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
console.error("Email background job failed:", err.message);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
}
|
||||
@ -118,6 +122,7 @@ exports.getAllConfigs = async (req, res) => {
|
||||
.send({ status: "success", message: "Fetched successfully", quarter_count: data.length, data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -136,6 +141,7 @@ exports.getConfigById = async (req, res) => {
|
||||
.send({ status: "success", message: "Fetched successfully", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -158,6 +164,7 @@ exports.updateConfig = async (req, res) => {
|
||||
.send({ status: "success", message: "Updated successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -178,6 +185,7 @@ exports.deleteConfig = async (req, res) => {
|
||||
.send({ status: "success", message: "Deleted successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -196,6 +196,7 @@ exports.createSubmission = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -295,6 +296,7 @@ exports.updateSubmission = async (req, res) => {
|
||||
});
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).json({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -329,6 +331,7 @@ exports.submissionHistory = async (req, res) => {
|
||||
res.status(200).json({ status: "success", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -481,6 +484,7 @@ exports.submissionList = async (req, res) => {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -556,6 +560,7 @@ exports.viewSubmissionDetails = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -656,6 +661,7 @@ exports.getSubmissionHistory = async (req, res) => {
|
||||
} catch (err) {
|
||||
console.log(err);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
}
|
||||
@ -683,6 +689,7 @@ exports.submissionEditRequest = async (req, res) => {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -710,6 +717,7 @@ exports.enableOrDisableSubmissionEditAccess = async (req, res) => {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -783,6 +791,7 @@ exports.approveOrRejectSubmission = async (req, res) => {
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
|
||||
@ -799,12 +808,28 @@ exports.getQuarterPeriods = async (req, res) => {
|
||||
.json({ status: "failed", message: "current_year and current_quarter are required" });
|
||||
}
|
||||
|
||||
const quarter_periods = getQuarterPeriods(Number(current_year), current_quarter);
|
||||
const config = await QuarterlyWindowsConfiguration.findOne({
|
||||
where: {
|
||||
year: current_year,
|
||||
quarter: current_quarter,
|
||||
is_active: true
|
||||
}
|
||||
});
|
||||
|
||||
if (!config) {
|
||||
return res.status(404).json({
|
||||
status: "failed",
|
||||
message: `No configuration found for Quarter ${current_quarter} ${current_year}`
|
||||
});
|
||||
}
|
||||
|
||||
const quarter_periods = getQuarterPeriods(Number(current_year), current_quarter);
|
||||
return res.status(200).json({ status: "success", data: quarter_periods });
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: err.message, stack:err.stack });
|
||||
}
|
||||
};
|
||||
|
||||
@ -854,6 +879,7 @@ exports.getPreviousForecastData = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -937,6 +963,7 @@ exports.getBeforePreviousData = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -1009,6 +1036,7 @@ exports.getProductSubmissionHistory = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -135,6 +135,7 @@ exports.createUnit = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -170,6 +171,7 @@ exports.getAllUnits = async (req, res) => {
|
||||
res.status(200).json({ status: "success",unit_count : units.length, data: units });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -183,6 +185,7 @@ exports.getUnitById = async (req, res) => {
|
||||
res.status(200).json({ status: "success", data: unit });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -200,6 +203,7 @@ exports.updateUnit = async (req, res) => {
|
||||
res.status(200).json({ status: "success" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -214,6 +218,7 @@ exports.deleteUnit = async (req, res) => {
|
||||
res.status(200).json({ status: "success", message: "Unit deleted successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -269,6 +274,8 @@ function deleteFileSecure(filePath) {
|
||||
}
|
||||
return false;
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
console.error("File delete error:", err.message);
|
||||
return false;
|
||||
}
|
||||
@ -589,6 +596,7 @@ exports.uploadUnitMasterFromCSV = async (req, res) => {
|
||||
} catch (err) {
|
||||
deleteFileSecure(sanitizedPath);
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -608,7 +616,8 @@ exports.downloadUnitMasterFile = async (req, res) => {
|
||||
|
||||
return res.download(safeFilePath, "unit_master_sample.csv");
|
||||
} catch (error) {
|
||||
logger.error(err.message);
|
||||
logger.error(error.message);
|
||||
logger.error(`Stack trace: ${error.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -21,6 +21,7 @@ exports.createUser = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -35,6 +36,7 @@ exports.getAllUsers = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -51,6 +53,7 @@ exports.getUserById = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -77,6 +80,7 @@ exports.updateUser = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message':"Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -95,6 +99,7 @@ exports.deleteUser = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({'status':"failed",'message': 'Internal server error' });
|
||||
}
|
||||
};
|
||||
@ -137,6 +142,7 @@ exports.changeAdminUserPassword = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -40,6 +40,7 @@ exports.createReason = async (req, res) => {
|
||||
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
return res.status(500).json({
|
||||
status: "failed",
|
||||
message: "Internal server error"
|
||||
@ -54,6 +55,7 @@ exports.getAllReasons = async (req, res) => {
|
||||
res.status(200).send({ status: "success", message: "Fetched successfully", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error"});
|
||||
}
|
||||
};
|
||||
@ -66,6 +68,7 @@ exports.getReasonById = async (req, res) => {
|
||||
res.status(200).send({ status: "success", message: "Fetched successfully", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -83,6 +86,7 @@ exports.updateReason = async (req, res) => {
|
||||
res.status(200).send({ status: "success", message: "Updated successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -95,6 +99,7 @@ exports.deleteReason = async (req, res) => {
|
||||
res.status(200).send({ status: "success", message: "Deleted successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message:"Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -21,6 +21,7 @@ exports.create = async (req, res) => {
|
||||
res.status(201).send({ status: "success", message: "Record created successfully",});
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -32,6 +33,7 @@ exports.getAll = async (req, res) => {
|
||||
res.status(200).send({ status: "success", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -45,6 +47,7 @@ exports.getById = async (req, res) => {
|
||||
res.status(200).send({ status: "success", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
@ -61,6 +64,7 @@ exports.update = async (req, res) => {
|
||||
res.status(200).send({ status: "success", data });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error"});
|
||||
}
|
||||
};
|
||||
@ -74,6 +78,7 @@ exports.delete = async (req, res) => {
|
||||
res.status(200).send({ status: "success", message: "Deleted successfully" });
|
||||
} catch (err) {
|
||||
logger.error(err.message);
|
||||
logger.error(`Stack trace: ${err.stack}`);
|
||||
res.status(500).send({ status: "failed", message: "Internal server error" });
|
||||
}
|
||||
};
|
||||
|
||||
@ -29,7 +29,10 @@ db.EstablishmentPasswordResetRequest = require("./establishmentPasswordResetRequ
|
||||
db.Emirate = require("./emirate.model")(sequelize, DataTypes);
|
||||
db.CityTown = require("./cityTown.model")(sequelize, DataTypes);
|
||||
db.SubmissionHistory = require("./submissionHistory.model")(sequelize, DataTypes);
|
||||
|
||||
db.ManufacturingIpi = require("./manufacturingIPI.model.js")(sequelize, DataTypes);
|
||||
db.Isic2DigitIndices = require("./isic2DigitIndices.model.js")(sequelize, DataTypes);
|
||||
db.Isic3DigitIndices = require("./isic3DigitIndices.model.js")(sequelize, DataTypes);
|
||||
db.Isic4DigitIndices = require("./isic4DigitIndices.model.js")(sequelize, DataTypes);
|
||||
// Associations
|
||||
db.Establishment.hasMany(db.EstablishmentUser, {
|
||||
foreignKey: "establishment_id",
|
||||
|
||||
59
app/models/isic2DigitIndices.model.js
Normal file
59
app/models/isic2DigitIndices.model.js
Normal file
@ -0,0 +1,59 @@
|
||||
module.exports = (sequelize, DataTypes) => {
|
||||
const Isic2DigitIndices = sequelize.define("isic_2digit_indices", {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
autoIncrement: true,
|
||||
primaryKey: true,
|
||||
},
|
||||
isic_2digit_code: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
isic_description: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: true,
|
||||
validate: {
|
||||
len: {
|
||||
args: [0, 1000],
|
||||
msg: "Description is too long. Maximum allowed length is 1000 characters."
|
||||
}}
|
||||
},
|
||||
year: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month_name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
total_weight: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
weighted_index_sum: {
|
||||
type: DataTypes.DECIMAL(10, 4),
|
||||
allowNull: false,
|
||||
},
|
||||
isic_2digit_index: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
created_at: {
|
||||
type: DataTypes.DATE,
|
||||
defaultValue: DataTypes.NOW,
|
||||
},
|
||||
updated_at: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
},
|
||||
}, {
|
||||
tableName: "isic_2digit_indices",
|
||||
timestamps: false,
|
||||
});
|
||||
|
||||
return Isic2DigitIndices;
|
||||
};
|
||||
59
app/models/isic3DigitIndices.model.js
Normal file
59
app/models/isic3DigitIndices.model.js
Normal file
@ -0,0 +1,59 @@
|
||||
module.exports = (sequelize, DataTypes) => {
|
||||
const Isic3DigitIndices = sequelize.define("isic_3digit_indices", {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
autoIncrement: true,
|
||||
primaryKey: true,
|
||||
},
|
||||
isic_3digit_code: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
isic_description: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: true,
|
||||
validate: {
|
||||
len: {
|
||||
args: [0, 1000],
|
||||
msg: "Description is too long. Maximum allowed length is 1000 characters."
|
||||
}}
|
||||
},
|
||||
year: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month_name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
total_weight: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
weighted_index_sum: {
|
||||
type: DataTypes.DECIMAL(10, 4),
|
||||
allowNull: false,
|
||||
},
|
||||
isic_3digit_index: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
created_at: {
|
||||
type: DataTypes.DATE,
|
||||
defaultValue: DataTypes.NOW,
|
||||
},
|
||||
updated_at: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
},
|
||||
}, {
|
||||
tableName: "isic_3digit_indices",
|
||||
timestamps: false,
|
||||
});
|
||||
|
||||
return Isic3DigitIndices;
|
||||
};
|
||||
59
app/models/isic4DigitIndices.model.js
Normal file
59
app/models/isic4DigitIndices.model.js
Normal file
@ -0,0 +1,59 @@
|
||||
module.exports = (sequelize, DataTypes) => {
|
||||
const Isic4DigitIndices = sequelize.define("isic_4digit_indices", {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
autoIncrement: true,
|
||||
primaryKey: true,
|
||||
},
|
||||
isic_4digit_code: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
isic_description: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: true,
|
||||
validate: {
|
||||
len: {
|
||||
args: [0, 1000],
|
||||
msg: "Description is too long. Maximum allowed length is 1000 characters."
|
||||
}}
|
||||
},
|
||||
year: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month_name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
total_weight: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
weighted_index_sum: {
|
||||
type: DataTypes.DECIMAL(10, 4),
|
||||
allowNull: false,
|
||||
},
|
||||
isic_4digit_index: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
created_at: {
|
||||
type: DataTypes.DATE,
|
||||
defaultValue: DataTypes.NOW,
|
||||
},
|
||||
updated_at: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
},
|
||||
}, {
|
||||
tableName: "isic_4digit_indices",
|
||||
timestamps: false,
|
||||
});
|
||||
|
||||
return Isic4DigitIndices;
|
||||
};
|
||||
67
app/models/manufacturingIPI.model.js
Normal file
67
app/models/manufacturingIPI.model.js
Normal file
@ -0,0 +1,67 @@
|
||||
module.exports = (sequelize, DataTypes) => {
|
||||
const ManufacturingIpi = sequelize.define("manufacturing_ipi", {
|
||||
id: {
|
||||
type: DataTypes.INTEGER,
|
||||
autoIncrement: true,
|
||||
primaryKey: true,
|
||||
},
|
||||
year: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month: {
|
||||
type: DataTypes.INTEGER,
|
||||
allowNull: false,
|
||||
},
|
||||
month_name: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
},
|
||||
reference_date: {
|
||||
type: DataTypes.DATEONLY,
|
||||
allowNull: false,
|
||||
},
|
||||
total_weight: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
weighted_index_sum: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
manufacturing_index: {
|
||||
type: DataTypes.DECIMAL(10, 2),
|
||||
allowNull: false,
|
||||
},
|
||||
mom_change: {
|
||||
type: DataTypes.DECIMAL(12, 2),
|
||||
allowNull: true,
|
||||
},
|
||||
yoy_change: {
|
||||
type: DataTypes.DECIMAL(12, 2),
|
||||
allowNull: true,
|
||||
},
|
||||
status: {
|
||||
type: DataTypes.STRING,
|
||||
allowNull: false,
|
||||
defaultValue: 'Completed',
|
||||
},
|
||||
generated_on: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
},
|
||||
created_at: {
|
||||
type: DataTypes.DATE,
|
||||
defaultValue: DataTypes.NOW,
|
||||
},
|
||||
updated_at: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: true,
|
||||
},
|
||||
}, {
|
||||
tableName: "manufacturing_ipi",
|
||||
timestamps: false,
|
||||
});
|
||||
|
||||
return ManufacturingIpi;
|
||||
};
|
||||
@ -18,6 +18,7 @@ const dashboardController = require("../controllers/dashboard.controller");
|
||||
const notificationTemplateController = require("../controllers/notificationTemplate.controller");
|
||||
const quarterlyWindowsController = require("../controllers/quarterlyWindowsConfiguration.controller");
|
||||
const calculationController = require("../controllers/calculation.controller");
|
||||
const ManufacturingIpiController = require("../controllers/manufacturingIPI.controller")
|
||||
const fs = require("fs");
|
||||
const path = require("path");
|
||||
const multer = require("multer");
|
||||
@ -3101,6 +3102,61 @@ router.get("/establishment/download-sample-file",[verifySignature, verifyToken],
|
||||
*/
|
||||
router.get("/unit_master_download_sample_file",[verifySignature, verifyToken], unitMasterController.downloadUnitMasterFile);
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /api/manufacturing/getManufacturingIndex:
|
||||
* get:
|
||||
* summary: Get all Manufacturing IPI Index list
|
||||
* tags: [ManufacturingIPI]
|
||||
* security:
|
||||
* - appSignature: []
|
||||
* - CSRF: []
|
||||
* cookieAuth: [] # or bearerAuth: [] if you use Authorization header
|
||||
* responses:
|
||||
* 200:
|
||||
* description: ManufacturingIpi Index details fetched successfully
|
||||
* 404:
|
||||
* description: Not found
|
||||
* 500:
|
||||
* description: Server error
|
||||
*/
|
||||
router.get("/manufacturing/getManufacturingIndex",[verifySignature, verifyToken], ManufacturingIpiController.getAllManufacturingIndexDetails);
|
||||
|
||||
/**
|
||||
* @swagger
|
||||
* /api/manufacturing/getManufacturingMonthlyOverview:
|
||||
* get:
|
||||
* summary: Get Manufacturing IPI Monthly Overview by year and month
|
||||
* tags: [ManufacturingIPI]
|
||||
* security:
|
||||
* - appSignature: []
|
||||
* - CSRF: []
|
||||
* cookieAuth: [] # or bearerAuth: [] if you use Authorization header
|
||||
* parameters:
|
||||
* - in: query
|
||||
* name: year
|
||||
* required: true
|
||||
* schema:
|
||||
* type: integer
|
||||
* description: Year (e.g., 2025)
|
||||
* - in: query
|
||||
* name: month
|
||||
* required: true
|
||||
* schema:
|
||||
* type: integer
|
||||
* description: Month (1-12)
|
||||
* responses:
|
||||
* 200:
|
||||
* description: Manufacturing IPI Monthly Overview fetched successfully
|
||||
* 400:
|
||||
* description: Invalid parameters
|
||||
* 404:
|
||||
* description: Data not found
|
||||
* 500:
|
||||
* description: Server error
|
||||
*/
|
||||
router.get("/manufacturing/getManufacturingMonthlyOverview", [verifySignature, verifyToken], ManufacturingIpiController.getManufacturingMonthlyOverviewByYearMonth);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user