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",
});
}
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) {
return res.status(400).send({
status: "failed",
@ -1358,7 +1363,7 @@ exports.establishmentBulkUpload = async (req, res) => {
// -------------------------------------------------------
// 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 missingHeaders = required.filter(h => !firstKeys.includes(h));
@ -1450,6 +1455,7 @@ exports.establishmentBulkUpload = async (req, res) => {
const email = r.email;
const emirate = r.emirate;
const industry_code_current_production = r.industry_code_current_production;
const city_town = r.city_town;
const missing = [];
if (!est) missing.push("Establishment ID");
@ -1458,6 +1464,7 @@ exports.establishmentBulkUpload = async (req, res) => {
if (!email) missing.push("Email");
if (!emirate) missing.push("Emirate");
if (!industry_code_current_production) missing.push("Industry Code Current Production");
if (!city_town) missing.push("City/Town");
if (missing.length) {
errors.push({ row: rowNum, error: `Missing required fields: ${missing.join(", ")}` });

View File

@ -25,44 +25,17 @@ exports.createSubmission = async (req, res) => {
try {
const { products = [], establishment_id, quarter, year, ...submissionData } = req.body;
if (products.length > 10)
return res.status(400).json({ status: "failed", message: "Max 10 products allowed" });
// check duplicate submission
const exists = await Submission.findOne({ where: {establishment_id,quarter,year} });
if (exists) {
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;
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 = [
const numericFields = [
"annual_installed_capacity",
"previous_quantity_period_one",
"previous_quantity_period_two",
@ -85,8 +58,18 @@ exports.createSubmission = async (req, res) => {
"forecast_cost_period_two",
"forecast_cost_period_three",
];
const hasNegativeNumber = (obj, fields) => {
return fields.find((field) => {
const val = obj[field];
if (val === null || val === undefined || val === "") return false;
for (let i = 0; i < products.length; i++) {
const num = Number(val);
return !isNaN(num) && num < 0;
});
};
for (let i = 0; i < products.length; i++) {
const invalidField = hasNegativeNumber(products[i], numericFields);
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
const processedProducts = products.map((p) => {
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: {
type: DataTypes.STRING(50),
defaultValue: 'Pending',
defaultValue: 'Submitted',
},
created_by: {
type: DataTypes.INTEGER,