city/town marked mandatory

This commit is contained in:
unknown 2026-01-06 22:28:09 +05:30
parent 4926de93d6
commit ee0dcd34fd
4 changed files with 39 additions and 34 deletions

View File

@ -119,7 +119,12 @@ exports.createEstablishment = async (req, res) => {
message: "Missing required field: city/town", message: "Missing required field: city/town",
}); });
} }
if (!industry_code_production) {
return res.status(400).send({
status: "failed",
message: "Missing required field: Industry Code (Current Production)",
});
}
if (!Array.isArray(establishment_products) || establishment_products.length === 0) { if (!Array.isArray(establishment_products) || establishment_products.length === 0) {
return res.status(400).send({ return res.status(400).send({
status: "failed", status: "failed",
@ -1358,7 +1363,7 @@ exports.establishmentBulkUpload = async (req, res) => {
// ------------------------------------------------------- // -------------------------------------------------------
// REQUIRED HEADERS // REQUIRED HEADERS
// ------------------------------------------------------- // -------------------------------------------------------
const required = ["establishment_id", "factory_name", "user_name", "email", "emirate", "industry_code_current_production"]; const required = ["establishment_id", "factory_name", "user_name", "email", "emirate", "industry_code_current_production", "city_town"];
const firstKeys = Object.keys(rows[0]); const firstKeys = Object.keys(rows[0]);
const missingHeaders = required.filter(h => !firstKeys.includes(h)); const missingHeaders = required.filter(h => !firstKeys.includes(h));
@ -1450,6 +1455,7 @@ exports.establishmentBulkUpload = async (req, res) => {
const email = r.email; const email = r.email;
const emirate = r.emirate; const emirate = r.emirate;
const industry_code_current_production = r.industry_code_current_production; const industry_code_current_production = r.industry_code_current_production;
const city_town = r.city_town;
const missing = []; const missing = [];
if (!est) missing.push("Establishment ID"); if (!est) missing.push("Establishment ID");
@ -1458,6 +1464,7 @@ exports.establishmentBulkUpload = async (req, res) => {
if (!email) missing.push("Email"); if (!email) missing.push("Email");
if (!emirate) missing.push("Emirate"); if (!emirate) missing.push("Emirate");
if (!industry_code_current_production) missing.push("Industry Code Current Production"); if (!industry_code_current_production) missing.push("Industry Code Current Production");
if (!city_town) missing.push("City/Town");
if (missing.length) { if (missing.length) {
errors.push({ row: rowNum, error: `Missing required fields: ${missing.join(", ")}` }); errors.push({ row: rowNum, error: `Missing required fields: ${missing.join(", ")}` });

View File

@ -25,7 +25,6 @@ exports.createSubmission = async (req, res) => {
try { try {
const { products = [], establishment_id, quarter, year, ...submissionData } = req.body; const { products = [], establishment_id, quarter, year, ...submissionData } = req.body;
if (products.length > 10) if (products.length > 10)
return res.status(400).json({ status: "failed", message: "Max 10 products allowed" }); return res.status(400).json({ status: "failed", message: "Max 10 products allowed" });
@ -36,33 +35,7 @@ exports.createSubmission = async (req, res) => {
return res.status(400).json({status: "failed", message: `Submission already exists for establishment_id: ${establishment_id}, quarter: ${quarter}, year: ${year}`}); return res.status(400).json({status: "failed", message: `Submission already exists for establishment_id: ${establishment_id}, quarter: ${quarter}, year: ${year}`});
} }
submissionData.created_by = submissionData.created_by || req.user.id; submissionData.created_by = submissionData.created_by || req.user.id;
const numericFields = [
const submission = await Submission.create({establishment_id, quarter, year, ...submissionData});
// find config
const config = await QuarterlyWindowsConfiguration.findOne({where: { quarter, year }});
if (config) {
const currentResponded = config.responded ?? 0;
const currentNotResponded = config.not_responded ?? 0;
// respond increase, not responded decrease
await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1, updated_at: new Date() }, {where: { id: config.id }} );
}
const hasNegativeNumber = (obj, fields) => {
return fields.find((field) => {
const val = obj[field];
if (val === null || val === undefined || val === "") return false;
const num = Number(val);
return !isNaN(num) && num < 0;
});
};
if (products.length) {
// products.forEach((p) => (p.submission_id = submission.id));
// await SubmissionProduct.bulkCreate(products);
const numericFields = [
"annual_installed_capacity", "annual_installed_capacity",
"previous_quantity_period_one", "previous_quantity_period_one",
"previous_quantity_period_two", "previous_quantity_period_two",
@ -86,7 +59,17 @@ exports.createSubmission = async (req, res) => {
"forecast_cost_period_three", "forecast_cost_period_three",
]; ];
for (let i = 0; i < products.length; i++) { const hasNegativeNumber = (obj, fields) => {
return fields.find((field) => {
const val = obj[field];
if (val === null || val === undefined || val === "") return false;
const num = Number(val);
return !isNaN(num) && num < 0;
});
};
for (let i = 0; i < products.length; i++) {
const invalidField = hasNegativeNumber(products[i], numericFields); const invalidField = hasNegativeNumber(products[i], numericFields);
if (invalidField) { if (invalidField) {
@ -97,6 +80,21 @@ exports.createSubmission = async (req, res) => {
} }
} }
const submission = await Submission.create({establishment_id, quarter, year, ...submissionData});
// find config
const config = await QuarterlyWindowsConfiguration.findOne({where: { quarter, year }});
if (config) {
const currentResponded = config.responded ?? 0;
const currentNotResponded = config.not_responded ?? 0;
// respond increase, not responded decrease
await QuarterlyWindowsConfiguration.update({responded: currentResponded + 1, not_responded: currentNotResponded - 1, updated_at: new Date() }, {where: { id: config.id }} );
}
if (products.length) {
// products.forEach((p) => (p.submission_id = submission.id));
// await SubmissionProduct.bulkCreate(products);
// Process products before insert // Process products before insert
const processedProducts = products.map((p) => { const processedProducts = products.map((p) => {
const num = (v) => (isNaN(parseFloat(v)) ? 0 : parseFloat(v)); // safe number conversion const num = (v) => (isNaN(parseFloat(v)) ? 0 : parseFloat(v)); // safe number conversion

View File

@ -1 +1 @@
Establishment Id * (Mandatory),Factory Name * (Mandatory),User Name * (Mandatory),Email * (Mandatory),Emirate * (Mandatory),Industry Code Current Production * (Mandatory),HS Code 1 * (Mandatory),HS Code 2,HS Code 3,HS Code 4,HS Code 5,Permanent Factory Code,Industry Code Business Register,Description,Industry Code Mismatch Remarks,Establishment Address,City/Town,Postal Code,PO Box,Makani Number,Contact Person Name,Contact Person Designation,Mobile Number,Website,Number of Emirati Male,Number of Emirati Female,Number of Non-Emirati Male,Number of Non-Emirati Female Establishment Id * (Mandatory),Factory Name * (Mandatory),User Name * (Mandatory),Email * (Mandatory),Emirate * (Mandatory),City/Town * (Mandatory),Industry Code Current Production * (Mandatory),HS Code 1 * (Mandatory),HS Code 2,HS Code 3,HS Code 4,HS Code 5,Permanent Factory Code,Industry Code Business Register,Description,Industry Code Mismatch Remarks,Establishment Address,Postal Code,PO Box,Makani Number,Contact Person Name,Contact Person Designation,Mobile Number,Website,Number of Emirati Male,Number of Emirati Female,Number of Non-Emirati Male,Number of Non-Emirati Female

1 Establishment Id * (Mandatory) Factory Name * (Mandatory) User Name * (Mandatory) Email * (Mandatory) Emirate * (Mandatory) City/Town * (Mandatory) Industry Code Current Production * (Mandatory) HS Code 1 * (Mandatory) HS Code 2 HS Code 3 HS Code 4 HS Code 5 Permanent Factory Code Industry Code Business Register Description Industry Code Mismatch Remarks City/Town Establishment Address Postal Code PO Box Makani Number Contact Person Name Contact Person Designation Mobile Number Website Number of Emirati Male Number of Emirati Female Number of Non-Emirati Male Number of Non-Emirati Female

View File

@ -41,7 +41,7 @@ module.exports = (sequelize, DataTypes) => {
}, },
status: { status: {
type: DataTypes.STRING(50), type: DataTypes.STRING(50),
defaultValue: 'Pending', defaultValue: 'Submitted',
}, },
created_by: { created_by: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,