city/town marked mandatory
This commit is contained in:
parent
4926de93d6
commit
ee0dcd34fd
@ -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(", ")}` });
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
|
@ -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,
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user