Establishment changes : GWM
This commit is contained in:
parent
efa18d4f78
commit
291f06f2b2
@ -3,79 +3,300 @@ const bcrypt = require("bcryptjs");
|
|||||||
const Establishment = db.Establishment;
|
const Establishment = db.Establishment;
|
||||||
const EstablishmentUser = db.EstablishmentUser;
|
const EstablishmentUser = db.EstablishmentUser;
|
||||||
const EstablishmentPasswordResetRequest = db.EstablishmentPasswordResetRequest;
|
const EstablishmentPasswordResetRequest = db.EstablishmentPasswordResetRequest;
|
||||||
|
const CityTown = db.CityTown;
|
||||||
|
const Emirate = db.Emirate;
|
||||||
|
const user = db.user;
|
||||||
const { sendEmail } = require("../services/emailHelper"); // custom helper
|
const { sendEmail } = require("../services/emailHelper"); // custom helper
|
||||||
const logger = require("../services/logger");
|
const logger = require("../services/logger");
|
||||||
// Create Establishment + linked user
|
|
||||||
|
|
||||||
exports.createEstablishment = async (req, res) => {
|
exports.createEstablishment = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
const {
|
||||||
const { establishment_code, factory_name, email, permanent_factory_code, industry_code, license_number, isic_code, emirate, emirati_male,emirati_female,non_emirati_male,non_emirati_female,total_emirati,total_employees, establishment_user, } = req.body;
|
|
||||||
|
|
||||||
// if ( !establishment_code || !factory_name || !email || !establishment_user?.name || !establishment_user?.email || !establishment_user?.password )
|
|
||||||
// {
|
|
||||||
// res.status(400).send({'status':"failed",'message':"Missing required fields",'data': "" });
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Create Establishment
|
|
||||||
const establishment = await Establishment.create({
|
|
||||||
establishment_code,
|
establishment_code,
|
||||||
factory_name,
|
factory_name,
|
||||||
email,
|
|
||||||
permanent_factory_code,
|
permanent_factory_code,
|
||||||
industry_code,
|
industry_code,
|
||||||
license_number,
|
license_number,
|
||||||
isic_code,
|
isic_code,
|
||||||
emirate,
|
description,
|
||||||
emirati_male,emirati_female,non_emirati_male,non_emirati_female,total_emirati,total_employees,
|
// Establishment Contact Details
|
||||||
|
establishment_address,
|
||||||
|
establishment_city_town_id,
|
||||||
|
establishment_emirate_id,
|
||||||
|
establishment_postal_code,
|
||||||
|
establishment_po_box,
|
||||||
|
establishment_makani_number,
|
||||||
|
establishment_contact_person_name,
|
||||||
|
establishment_contact_person_designation,
|
||||||
|
establishment_mobile_number,
|
||||||
|
establishment_contact_email,
|
||||||
|
establishment_website,
|
||||||
|
// Corporate Details
|
||||||
|
corporate_same_as_establishment,
|
||||||
|
corporate_name,
|
||||||
|
corporate_address,
|
||||||
|
corporate_city_town_id,
|
||||||
|
corporate_emirate_id,
|
||||||
|
corporate_postal_code,
|
||||||
|
corporate_po_box,
|
||||||
|
corporate_makani_number,
|
||||||
|
corporate_contact_person_name,
|
||||||
|
corporate_contact_person_designation,
|
||||||
|
corporate_mobile_number,
|
||||||
|
corporate_email,
|
||||||
|
corporate_website,
|
||||||
|
emirati_male,
|
||||||
|
emirati_female,
|
||||||
|
non_emirati_male,
|
||||||
|
non_emirati_female,
|
||||||
|
total_emirati,
|
||||||
|
total_employees,
|
||||||
|
created_by,
|
||||||
|
establishment_user,
|
||||||
|
} = req.body;
|
||||||
|
|
||||||
|
// Basic Validation
|
||||||
|
if (!establishment_code || !factory_name || !establishment_user) {
|
||||||
|
return res.status(400).send({
|
||||||
|
status: "failed",
|
||||||
|
message: "Missing required fields: establishment_code, factory_name, email, establishment_user",
|
||||||
});
|
});
|
||||||
|
|
||||||
// Hash password for user
|
|
||||||
// const hashedPassword = await bcrypt.hash(establishment_user.password, 10);
|
|
||||||
|
|
||||||
// Create related Establishment User
|
|
||||||
// const user = await EstablishmentUser.create({
|
|
||||||
// establishment_id: establishment.id,
|
|
||||||
// name: establishment_user.name,
|
|
||||||
// email: establishment_user.email,
|
|
||||||
// password: hashedPassword,
|
|
||||||
// });
|
|
||||||
|
|
||||||
|
|
||||||
return res.status(201).send({'status':"success",'message':"Establishment and linked user created successfully",'data': { establishment } });
|
|
||||||
|
|
||||||
} catch (err) {
|
|
||||||
return res.status(500).send({'status':"failed",'message':err.message });
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
|
// Check if establishment already exists
|
||||||
|
const existingEstablishment = await Establishment.findOne({where: { establishment_code }, });
|
||||||
|
if (existingEstablishment) {
|
||||||
|
return res.status(400).send({status: "failed",message: "Establishment code already exists", });
|
||||||
|
}
|
||||||
|
|
||||||
// Get all establishments (with user details)
|
// Create establishment record
|
||||||
exports.getAllEstablishments = async (req, res) => {
|
const establishment = await Establishment.create({
|
||||||
try {
|
establishment_code,
|
||||||
|
factory_name,
|
||||||
const data = await Establishment.findAll({
|
permanent_factory_code,
|
||||||
include: [
|
industry_code,
|
||||||
{
|
license_number,
|
||||||
model: EstablishmentUser,
|
isic_code,
|
||||||
as: "users",
|
description,
|
||||||
attributes: ["id", "name", "email", "is_active"],
|
establishment_address,
|
||||||
},
|
establishment_city_town_id,
|
||||||
],
|
establishment_emirate_id,
|
||||||
|
establishment_postal_code,
|
||||||
|
establishment_po_box,
|
||||||
|
establishment_makani_number,
|
||||||
|
establishment_contact_person_name,
|
||||||
|
establishment_contact_person_designation,
|
||||||
|
establishment_mobile_number,
|
||||||
|
establishment_contact_email,
|
||||||
|
establishment_website,
|
||||||
|
corporate_same_as_establishment,
|
||||||
|
corporate_name,
|
||||||
|
corporate_address,
|
||||||
|
corporate_city_town_id,
|
||||||
|
corporate_emirate_id,
|
||||||
|
corporate_postal_code,
|
||||||
|
corporate_po_box,
|
||||||
|
corporate_makani_number,
|
||||||
|
corporate_contact_person_name,
|
||||||
|
corporate_contact_person_designation,
|
||||||
|
corporate_mobile_number,
|
||||||
|
corporate_email,
|
||||||
|
corporate_website,
|
||||||
|
emirati_male,
|
||||||
|
emirati_female,
|
||||||
|
non_emirati_male,
|
||||||
|
non_emirati_female,
|
||||||
|
total_emirati,
|
||||||
|
total_employees,
|
||||||
|
created_by,
|
||||||
|
created_at: new Date(),
|
||||||
|
});
|
||||||
|
|
||||||
|
// Hash password
|
||||||
|
const hashedPassword = await bcrypt.hash(establishment_user.password, 10);
|
||||||
|
|
||||||
|
// Create linked Establishment User
|
||||||
|
const user = await EstablishmentUser.create({
|
||||||
|
establishment_id: establishment.id,
|
||||||
|
name: establishment_user.name,
|
||||||
|
email: establishment_user.email,
|
||||||
|
password: hashedPassword,
|
||||||
|
});
|
||||||
|
|
||||||
|
// 🔹 Return success response
|
||||||
|
return res.status(201).send({
|
||||||
|
status: "success",
|
||||||
|
message: "Establishment and linked user created successfully",
|
||||||
|
data: {
|
||||||
|
establishment,
|
||||||
|
user: {
|
||||||
|
id: user.id,
|
||||||
|
name: user.name,
|
||||||
|
email: user.email,
|
||||||
|
},
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data });
|
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
return res.status(500).send({'status':"failed",'message':err.message });
|
return res.status(500).send({status: "failed",message: err.message || "Internal server error",});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Get all establishments
|
||||||
|
// exports.getAllEstablishments = async (req, res) => {
|
||||||
|
// try {
|
||||||
|
|
||||||
|
// const data = await Establishment.findAll({
|
||||||
|
// include: [
|
||||||
|
// // {
|
||||||
|
// // model: EstablishmentUser,
|
||||||
|
// // as: "users",
|
||||||
|
// // attributes: ["id", "name", "email", "is_active"],
|
||||||
|
// // },
|
||||||
|
// {
|
||||||
|
// model: CityTown,
|
||||||
|
// as: "establishment_city",
|
||||||
|
// attributes: ["name"],
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// model: Emirate,
|
||||||
|
// as: "establishment_emirate",
|
||||||
|
// attributes: ["name"],
|
||||||
|
// },{
|
||||||
|
// model: CityTown,
|
||||||
|
// as: "corporate_city",
|
||||||
|
// attributes: ["name"],
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// model: Emirate,
|
||||||
|
// as: "corporate_emirate",
|
||||||
|
// attributes: ["name"],
|
||||||
|
// },
|
||||||
|
// {
|
||||||
|
// model: user,
|
||||||
|
// as: "created_user",
|
||||||
|
// attributes: ["name"],
|
||||||
|
// }
|
||||||
|
|
||||||
|
// ],
|
||||||
|
// });
|
||||||
|
|
||||||
|
// return res.status(200).send({'status':"success",'message':"Fetched successfully",'data': data });
|
||||||
|
|
||||||
|
// } catch (err) {
|
||||||
|
// return res.status(500).send({'status':"failed",'message':err.message });
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
exports.getAllEstablishments = async (req, res) => {
|
||||||
|
try {
|
||||||
|
let {
|
||||||
|
page = 1,
|
||||||
|
limit = 10,
|
||||||
|
search = "",
|
||||||
|
emirate_id,
|
||||||
|
isic_code,
|
||||||
|
status,
|
||||||
|
sort_by = "created_at",
|
||||||
|
sort_order = "DESC",
|
||||||
|
} = req.query;
|
||||||
|
|
||||||
|
page = parseInt(page);
|
||||||
|
limit = parseInt(limit);
|
||||||
|
const offset = (page - 1) * limit;
|
||||||
|
|
||||||
|
// Build dynamic where clause
|
||||||
|
const whereClause = {};
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
if (status) whereClause.is_active = status === "active" ? 1 : 0;
|
||||||
|
if (isic_code) whereClause.isic_code = isic_code;
|
||||||
|
if (emirate_id) whereClause.establishment_emirate_id = emirate_id;
|
||||||
|
|
||||||
|
// Search by name, establishment_code, or contact emails
|
||||||
|
if (search) {
|
||||||
|
whereClause[Op.or] = [
|
||||||
|
{ factory_name: { [Op.like]: `%${search}%` } },
|
||||||
|
{ establishment_code: { [Op.like]: `%${search}%` } },
|
||||||
|
{ establishment_contact_email: { [Op.like]: `%${search}%` } },
|
||||||
|
{ corporate_email: { [Op.like]: `%${search}%` } },
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fetch Data
|
||||||
|
const { count, rows } = await Establishment.findAndCountAll({
|
||||||
|
where: whereClause,
|
||||||
|
include: [
|
||||||
|
{ model: CityTown, as: "establishment_city", attributes: ["name"] },
|
||||||
|
{ model: Emirate, as: "establishment_emirate", attributes: ["name"] },
|
||||||
|
{ model: CityTown, as: "corporate_city", attributes: ["name"] },
|
||||||
|
{ model: Emirate, as: "corporate_emirate", attributes: ["name"] },
|
||||||
|
{ model: user, as: "created_user", attributes: ["name"] },
|
||||||
|
],
|
||||||
|
order: [[sort_by, sort_order]],
|
||||||
|
limit,
|
||||||
|
offset,
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.status(200).json({
|
||||||
|
status: "success",
|
||||||
|
message: "Fetched establishments successfully",
|
||||||
|
data: rows,
|
||||||
|
pagination: {
|
||||||
|
total_records: count,
|
||||||
|
current_page: page,
|
||||||
|
total_pages: Math.ceil(count / limit),
|
||||||
|
limit,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err);
|
||||||
|
return res.status(500).json({
|
||||||
|
status: "failed",
|
||||||
|
message: err.message || "Internal server error",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
// Get one establishment
|
// Get one establishment
|
||||||
exports.getEstablishmentById = async (req, res) => {
|
exports.getEstablishmentById = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
const data = await Establishment.findByPk(req.params.id, {
|
const data = await Establishment.findByPk(req.params.id, {
|
||||||
include: [{ model: EstablishmentUser, as: "users" }],
|
include: [
|
||||||
|
// {
|
||||||
|
// model: EstablishmentUser,
|
||||||
|
// as: "users",
|
||||||
|
// attributes: ["id", "name", "email", "is_active"],
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
model: CityTown,
|
||||||
|
as: "establishment_city",
|
||||||
|
attributes: ["name"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: Emirate,
|
||||||
|
as: "establishment_emirate",
|
||||||
|
attributes: ["name"],
|
||||||
|
},{
|
||||||
|
model: CityTown,
|
||||||
|
as: "corporate_city",
|
||||||
|
attributes: ["name"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: Emirate,
|
||||||
|
as: "corporate_emirate",
|
||||||
|
attributes: ["name"],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
model: user,
|
||||||
|
as: "created_user",
|
||||||
|
attributes: ["name"],
|
||||||
|
}
|
||||||
|
|
||||||
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!data) return res.status(404).send({'status':"failed",'message':"Record Not found",'data': "" });
|
if (!data) return res.status(404).send({'status':"failed",'message':"Record Not found",'data': "" });
|
||||||
@ -119,11 +340,42 @@ exports.deleteEstablishment = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.getAllEmirates = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const emirates = await Emirate.findAll({
|
||||||
|
attributes: ["id", "name", "code"],
|
||||||
|
order: [["name", "ASC"]],
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.status(200).send({status: "success", message: "Emirates fetched successfully", data: emirates,});
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
return res.status(500).send({status: "failed",message: err.message || "Internal server error", });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.getAllCityTowns = async (req, res) => {
|
||||||
|
try {
|
||||||
|
const { emirate_id } = req.query;
|
||||||
|
|
||||||
|
const whereClause = {};
|
||||||
|
if (emirate_id) {
|
||||||
|
whereClause.emirate_id = emirate_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cities = await CityTown.findAll({
|
||||||
|
where: whereClause,
|
||||||
|
attributes: ["id", "name", "emirate_id"],
|
||||||
|
order: [["name", "ASC"]],
|
||||||
|
});
|
||||||
|
|
||||||
|
return res.status(200).send({status: "success", message: "City/Town fetched successfully", data: cities, });
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
return res.status(500).send({ status: "failed", message: err.message || "Internal server error", });
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// GET ALL RESET REQUESTS
|
|
||||||
exports.getAllRequests = async (req, res) => {
|
exports.getAllRequests = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const requests = await EstablishmentPasswordResetRequest.findAll({
|
const requests = await EstablishmentPasswordResetRequest.findAll({
|
||||||
@ -139,7 +391,7 @@ exports.getAllRequests = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// CREATE RESET REQUEST
|
|
||||||
exports.createRequest = async (req, res) => {
|
exports.createRequest = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const {
|
const {
|
||||||
@ -217,42 +469,6 @@ exports.createRequest = async (req, res) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
exports.forgotPasswordRequestOTP = async (req, res) => {
|
exports.forgotPasswordRequestOTP = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { establishment_name, establishment_code, registered_email } = req.body;
|
const { establishment_name, establishment_code, registered_email } = req.body;
|
||||||
@ -304,9 +520,6 @@ exports.forgotPasswordRequestOTP = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
exports.forgotPasswordVerifyOTP = async (req, res) => {
|
exports.forgotPasswordVerifyOTP = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
const { registered_email, otp, password, confirm_password } = req.body;
|
const { registered_email, otp, password, confirm_password } = req.body;
|
||||||
|
|||||||
@ -90,57 +90,7 @@ exports.createSubmission = async (req, res) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// exports.updateSubmission = async (req, res) => {
|
|
||||||
// try {
|
|
||||||
// const { id } = req.params;
|
|
||||||
// const { products = [], ...submissionData } = req.body;
|
|
||||||
|
|
||||||
// // Check submission exists
|
|
||||||
// const submission = await Submission.findByPk(id);
|
|
||||||
// if (!submission)
|
|
||||||
// return res.status(404).json({ status: "failed", message: "Submission not found" });
|
|
||||||
|
|
||||||
// // Update submission main data
|
|
||||||
// await submission.update(submissionData);
|
|
||||||
|
|
||||||
// // Process products
|
|
||||||
// for (const product of products) {
|
|
||||||
// if (product.id) {
|
|
||||||
// // If product ID exists, update
|
|
||||||
// const existingProduct = await SubmissionProduct.findOne({
|
|
||||||
// where: { id: product.id, submission_id: id },
|
|
||||||
// });
|
|
||||||
|
|
||||||
// if (existingProduct) {
|
|
||||||
// await existingProduct.update(product);
|
|
||||||
// } else {
|
|
||||||
// // fallback: if given ID not found, create new
|
|
||||||
// product.submission_id = id;
|
|
||||||
// await SubmissionProduct.create(product);
|
|
||||||
// }
|
|
||||||
// } else {
|
|
||||||
// // If product has no ID → create new record
|
|
||||||
// product.submission_id = id;
|
|
||||||
// await SubmissionProduct.create(product);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// // Get updated full record
|
|
||||||
// const updatedSubmission = await Submission.findByPk(id, {
|
|
||||||
// include: [{ model: SubmissionProduct, as: "products" }],
|
|
||||||
// });
|
|
||||||
|
|
||||||
// res.status(200).json({
|
|
||||||
// status: "success",
|
|
||||||
// message: "Submission updated successfully",
|
|
||||||
// data: updatedSubmission,
|
|
||||||
// });
|
|
||||||
|
|
||||||
// } catch (err) {
|
|
||||||
// console.error(err);
|
|
||||||
// res.status(500).json({ status: "failed", message: err.message });
|
|
||||||
// }
|
|
||||||
// };
|
|
||||||
|
|
||||||
exports.updateSubmission = async (req, res) => {
|
exports.updateSubmission = async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
21
app/models/cityTown.model.js
Normal file
21
app/models/cityTown.model.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
module.exports = (sequelize, DataTypes) => {
|
||||||
|
const CityTown = sequelize.define('CityTown', {
|
||||||
|
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
|
||||||
|
emirate_id: { type: DataTypes.INTEGER, allowNull: true },
|
||||||
|
name: { type: DataTypes.STRING, allowNull: false },
|
||||||
|
code: { type: DataTypes.STRING },
|
||||||
|
is_active: { type: DataTypes.BOOLEAN, defaultValue: true },
|
||||||
|
created_at: DataTypes.DATE,
|
||||||
|
updated_at: DataTypes.DATE,
|
||||||
|
}, {
|
||||||
|
tableName: 'city_towns',
|
||||||
|
timestamps: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
CityTown.associate = (models) => {
|
||||||
|
CityTown.belongsTo(models.Emirate, { foreignKey: 'emirate_id', as: 'emirate' });
|
||||||
|
};
|
||||||
|
|
||||||
|
return CityTown;
|
||||||
|
};
|
||||||
|
|
||||||
20
app/models/emirate.model.js
Normal file
20
app/models/emirate.model.js
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
module.exports = (sequelize, DataTypes) => {
|
||||||
|
const Emirate = sequelize.define('Emirate', {
|
||||||
|
id: { type: DataTypes.INTEGER, autoIncrement: true, primaryKey: true },
|
||||||
|
name: { type: DataTypes.STRING, allowNull: false },
|
||||||
|
code: { type: DataTypes.STRING },
|
||||||
|
is_active: { type: DataTypes.BOOLEAN, defaultValue: true },
|
||||||
|
created_at: DataTypes.DATE,
|
||||||
|
updated_at: DataTypes.DATE,
|
||||||
|
}, {
|
||||||
|
tableName: 'emirates',
|
||||||
|
timestamps: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
Emirate.associate = (models) => {
|
||||||
|
Emirate.hasMany(models.CityTown, { foreignKey: 'emirate_id', as: 'cities' });
|
||||||
|
};
|
||||||
|
|
||||||
|
return Emirate;
|
||||||
|
};
|
||||||
|
|
||||||
@ -15,10 +15,6 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
type: DataTypes.STRING,
|
type: DataTypes.STRING,
|
||||||
allowNull: false,
|
allowNull: false,
|
||||||
},
|
},
|
||||||
email: {
|
|
||||||
type: DataTypes.STRING,
|
|
||||||
allowNull: false,
|
|
||||||
},
|
|
||||||
permanent_factory_code: {
|
permanent_factory_code: {
|
||||||
type: DataTypes.STRING,
|
type: DataTypes.STRING,
|
||||||
},
|
},
|
||||||
@ -31,17 +27,42 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
isic_code: {
|
isic_code: {
|
||||||
type: DataTypes.STRING,
|
type: DataTypes.STRING,
|
||||||
},
|
},
|
||||||
emirate: {
|
// Establishment Contact Details
|
||||||
type: DataTypes.STRING,
|
establishment_address: { type: DataTypes.STRING },
|
||||||
},
|
establishment_city_town_id: { type: DataTypes.INTEGER },
|
||||||
|
establishment_emirate_id: { type: DataTypes.INTEGER },
|
||||||
|
establishment_postal_code: { type: DataTypes.STRING },
|
||||||
|
establishment_po_box: { type: DataTypes.STRING },
|
||||||
|
establishment_makani_number: { type: DataTypes.STRING },
|
||||||
|
establishment_contact_person_name: { type: DataTypes.STRING },
|
||||||
|
establishment_contact_person_designation: { type: DataTypes.STRING },
|
||||||
|
establishment_mobile_number: { type: DataTypes.STRING },
|
||||||
|
establishment_contact_email: { type: DataTypes.STRING },
|
||||||
|
establishment_website: { type: DataTypes.STRING },
|
||||||
|
|
||||||
|
// Corporate/Head Office Contact Details
|
||||||
|
corporate_same_as_establishment: { type: DataTypes.BOOLEAN, defaultValue: false },
|
||||||
|
corporate_name: { type: DataTypes.STRING },
|
||||||
|
corporate_address: { type: DataTypes.STRING },
|
||||||
|
corporate_city_town_id: { type: DataTypes.INTEGER },
|
||||||
|
corporate_emirate_id: { type: DataTypes.INTEGER },
|
||||||
|
corporate_postal_code: { type: DataTypes.STRING },
|
||||||
|
corporate_po_box: { type: DataTypes.STRING },
|
||||||
|
corporate_makani_number: { type: DataTypes.STRING },
|
||||||
|
corporate_contact_person_name: { type: DataTypes.STRING },
|
||||||
|
corporate_contact_person_designation: { type: DataTypes.STRING },
|
||||||
|
corporate_mobile_number: { type: DataTypes.STRING },
|
||||||
|
corporate_email: { type: DataTypes.STRING },
|
||||||
|
corporate_website: { type: DataTypes.STRING },
|
||||||
|
|
||||||
|
description: { type: DataTypes.TEXT },
|
||||||
emirati_male: DataTypes.INTEGER,
|
emirati_male: DataTypes.INTEGER,
|
||||||
emirati_female: DataTypes.INTEGER,
|
emirati_female: DataTypes.INTEGER,
|
||||||
non_emirati_male: DataTypes.INTEGER,
|
non_emirati_male: DataTypes.INTEGER,
|
||||||
non_emirati_female: DataTypes.INTEGER,
|
non_emirati_female: DataTypes.INTEGER,
|
||||||
total_emirati: DataTypes.INTEGER,
|
total_emirati: DataTypes.INTEGER,
|
||||||
total_employees: {
|
total_employees: {
|
||||||
type: DataTypes.INTEGER,
|
type: DataTypes.INTEGER,},
|
||||||
},
|
|
||||||
is_active: {
|
is_active: {
|
||||||
type: DataTypes.BOOLEAN,
|
type: DataTypes.BOOLEAN,
|
||||||
defaultValue: true,
|
defaultValue: true,
|
||||||
@ -71,10 +92,37 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
|
|
||||||
|
|
||||||
Establishment.associate = (models) => {
|
Establishment.associate = (models) => {
|
||||||
|
|
||||||
Establishment.hasMany(models.Submission, {
|
Establishment.hasMany(models.Submission, {
|
||||||
foreignKey: "establishment_id",
|
foreignKey: "establishment_id",
|
||||||
as: "establishment"
|
as: "establishment"
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Establishment.belongsTo(models.CityTown, {
|
||||||
|
foreignKey: 'establishment_city_town_id',
|
||||||
|
as: 'establishment_city',
|
||||||
|
});
|
||||||
|
|
||||||
|
Establishment.belongsTo(models.Emirate, {
|
||||||
|
foreignKey: 'establishment_emirate_id',
|
||||||
|
as: 'establishment_emirate',
|
||||||
|
});
|
||||||
|
|
||||||
|
Establishment.belongsTo(models.CityTown, {
|
||||||
|
foreignKey: 'corporate_city_town_id',
|
||||||
|
as: 'corporate_city',
|
||||||
|
});
|
||||||
|
|
||||||
|
Establishment.belongsTo(models.Emirate, {
|
||||||
|
foreignKey: 'corporate_emirate_id',
|
||||||
|
as: 'corporate_emirate',
|
||||||
|
});
|
||||||
|
|
||||||
|
Establishment.belongsTo(models.user, {
|
||||||
|
foreignKey: "created_by",
|
||||||
|
as: "created_user",
|
||||||
|
});
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
return Establishment;
|
return Establishment;
|
||||||
|
|||||||
@ -26,7 +26,7 @@ module.exports = (sequelize, DataTypes) => {
|
|||||||
},
|
},
|
||||||
gender: {
|
gender: {
|
||||||
type: DataTypes.STRING,
|
type: DataTypes.STRING,
|
||||||
allowNull: false,
|
allowNull: true,
|
||||||
},
|
},
|
||||||
is_active: {
|
is_active: {
|
||||||
type: DataTypes.BOOLEAN,
|
type: DataTypes.BOOLEAN,
|
||||||
|
|||||||
@ -26,6 +26,8 @@ db.SubmissionDeadline = require("./submissionDeadline.model")(sequelize, DataTyp
|
|||||||
db.NotificationTemplate = require("./notificationTemplate.model")(sequelize, DataTypes);
|
db.NotificationTemplate = require("./notificationTemplate.model")(sequelize, DataTypes);
|
||||||
db.QuarterlyWindowsConfiguration = require("./quarterlyWindowsConfiguration.model")(sequelize, DataTypes);
|
db.QuarterlyWindowsConfiguration = require("./quarterlyWindowsConfiguration.model")(sequelize, DataTypes);
|
||||||
db.EstablishmentPasswordResetRequest = require("./establishmentPasswordResetRequest.model")(sequelize, DataTypes);
|
db.EstablishmentPasswordResetRequest = require("./establishmentPasswordResetRequest.model")(sequelize, DataTypes);
|
||||||
|
db.Emirate = require("./emirate.model")(sequelize, DataTypes);
|
||||||
|
db.CityTown = require("./cityTown.model")(sequelize, DataTypes);
|
||||||
|
|
||||||
// Associations
|
// Associations
|
||||||
db.Establishment.hasMany(db.EstablishmentUser, {
|
db.Establishment.hasMany(db.EstablishmentUser, {
|
||||||
|
|||||||
@ -51,8 +51,10 @@ const quarterlyWindowsController = require("../controllers/quarterlyWindowsConfi
|
|||||||
* description: Manage notification templates
|
* description: Manage notification templates
|
||||||
* - name: Quarterly Windows Configuration
|
* - name: Quarterly Windows Configuration
|
||||||
* description: Manage quarterly windows configuration master data
|
* description: Manage quarterly windows configuration master data
|
||||||
* - name: Establishment Password Reset
|
* - name: Establishment Password Reset Requests
|
||||||
* description: Manage Establishment Password Reset Requests
|
* description: Manage Establishment Password Reset Requests
|
||||||
|
* - name: Master
|
||||||
|
* description:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
@ -357,18 +359,42 @@ router.delete("/admin_users/:id",[verifySignature, verifyToken], adminUserContro
|
|||||||
* properties:
|
* properties:
|
||||||
* establishment_code: { type: string }
|
* establishment_code: { type: string }
|
||||||
* factory_name: { type: string }
|
* factory_name: { type: string }
|
||||||
* email: { type: string }
|
|
||||||
* permanent_factory_code: { type: string }
|
* permanent_factory_code: { type: string }
|
||||||
* industry_code: { type: string }
|
* industry_code: { type: string }
|
||||||
* license_number: { type: string }
|
* license_number: { type: string }
|
||||||
* isic_code: { type: string }
|
* isic_code: { type: string }
|
||||||
* emirate: { type: string }
|
* description: { type: string }
|
||||||
|
* establishment_address: { type: string }
|
||||||
|
* establishment_city_town_id: { type: integer, description: "FK from city_towns" }
|
||||||
|
* establishment_emirate_id: { type: integer, description: "FK from emirates" }
|
||||||
|
* establishment_postal_code: { type: string }
|
||||||
|
* establishment_po_box: { type: string }
|
||||||
|
* establishment_makani_number: { type: string }
|
||||||
|
* establishment_contact_person_name: { type: string }
|
||||||
|
* establishment_contact_person_designation: { type: string }
|
||||||
|
* establishment_mobile_number: { type: string }
|
||||||
|
* establishment_contact_email: { type: string }
|
||||||
|
* establishment_website: { type: string }
|
||||||
|
* corporate_same_as_establishment: { type: boolean }
|
||||||
|
* corporate_name: { type: string }
|
||||||
|
* corporate_address: { type: string }
|
||||||
|
* corporate_city_town_id: { type: integer, description: "FK from city_towns" }
|
||||||
|
* corporate_emirate_id: { type: integer, description: "FK from emirates" }
|
||||||
|
* corporate_postal_code: { type: string }
|
||||||
|
* corporate_po_box: { type: string }
|
||||||
|
* corporate_makani_number: { type: string }
|
||||||
|
* corporate_contact_person_name: { type: string }
|
||||||
|
* corporate_contact_person_designation: { type: string }
|
||||||
|
* corporate_mobile_number: { type: string }
|
||||||
|
* corporate_email: { type: string }
|
||||||
|
* corporate_website: { type: string }
|
||||||
* emirati_male: { type: integer }
|
* emirati_male: { type: integer }
|
||||||
* emirati_female: { type: integer }
|
* emirati_female: { type: integer }
|
||||||
* non_emirati_male: { type: integer }
|
* non_emirati_male: { type: integer }
|
||||||
* non_emirati_female: { type: integer }
|
* non_emirati_female: { type: integer }
|
||||||
* total_emirati: { type: integer }
|
* total_emirati: { type: integer }
|
||||||
* total_employees: { type: integer }
|
* total_employees: { type: integer }
|
||||||
|
* created_by: { type: integer }
|
||||||
* establishment_user:
|
* establishment_user:
|
||||||
* type: object
|
* type: object
|
||||||
* required:
|
* required:
|
||||||
@ -393,14 +419,49 @@ router.post("/establishments",[verifySignature, verifyToken], establishmentContr
|
|||||||
* @swagger
|
* @swagger
|
||||||
* /api/establishments:
|
* /api/establishments:
|
||||||
* get:
|
* get:
|
||||||
* summary: Get all Establishments
|
* summary: Get all Establishments with pagination, filters, and sorting
|
||||||
* tags: [Establishments]
|
* tags: [Establishments]
|
||||||
* security:
|
* security:
|
||||||
* - appSignature: []
|
* - appSignature: []
|
||||||
* - bearerAuth: []
|
* - bearerAuth: []
|
||||||
|
* parameters:
|
||||||
|
* - in: query
|
||||||
|
* name: page
|
||||||
|
* schema: { type: integer, default: 1 }
|
||||||
|
* description: Current page number
|
||||||
|
* - in: query
|
||||||
|
* name: limit
|
||||||
|
* schema: { type: integer, default: 10 }
|
||||||
|
* description: Number of records per page
|
||||||
|
* - in: query
|
||||||
|
* name: search
|
||||||
|
* schema: { type: string }
|
||||||
|
* description: Search by Establishment name, email, or code
|
||||||
|
* - in: query
|
||||||
|
* name: emirate_id
|
||||||
|
* schema: { type: integer }
|
||||||
|
* description: Filter by Emirate ID
|
||||||
|
* - in: query
|
||||||
|
* name: isic_code
|
||||||
|
* schema: { type: string }
|
||||||
|
* description: Filter by ISIC code
|
||||||
|
* - in: query
|
||||||
|
* name: status
|
||||||
|
* schema: { type: string, enum: [active, inactive] }
|
||||||
|
* description: Filter by active/inactive status
|
||||||
|
* - in: query
|
||||||
|
* name: sort_by
|
||||||
|
* schema: { type: string, default: created_at }
|
||||||
|
* description: Column to sort by (e.g. name, created_at)
|
||||||
|
* - in: query
|
||||||
|
* name: sort_order
|
||||||
|
* schema: { type: string, enum: [ASC, DESC], default: DESC }
|
||||||
|
* description: Sorting order
|
||||||
* responses:
|
* responses:
|
||||||
* 200:
|
* 200:
|
||||||
* description: List of establishments
|
* description: Fetched establishments successfully
|
||||||
|
* 500:
|
||||||
|
* description: Internal server error
|
||||||
*/
|
*/
|
||||||
router.get("/establishments",[verifySignature, verifyToken], establishmentController.getAllEstablishments);
|
router.get("/establishments",[verifySignature, verifyToken], establishmentController.getAllEstablishments);
|
||||||
|
|
||||||
@ -453,18 +514,42 @@ router.get("/establishments/:id",[verifySignature, verifyToken], establishmentCo
|
|||||||
* properties:
|
* properties:
|
||||||
* establishment_code: { type: string }
|
* establishment_code: { type: string }
|
||||||
* factory_name: { type: string }
|
* factory_name: { type: string }
|
||||||
* email: { type: string }
|
|
||||||
* permanent_factory_code: { type: string }
|
* permanent_factory_code: { type: string }
|
||||||
* industry_code: { type: string }
|
* industry_code: { type: string }
|
||||||
* license_number: { type: string }
|
* license_number: { type: string }
|
||||||
* isic_code: { type: string }
|
* isic_code: { type: string }
|
||||||
* emirate: { type: string }
|
* description: { type: string }
|
||||||
|
* establishment_address: { type: string }
|
||||||
|
* establishment_city_town_id: { type: integer, description: "FK from city_towns" }
|
||||||
|
* establishment_emirate_id: { type: integer, description: "FK from emirates" }
|
||||||
|
* establishment_postal_code: { type: string }
|
||||||
|
* establishment_po_box: { type: string }
|
||||||
|
* establishment_makani_number: { type: string }
|
||||||
|
* establishment_contact_person_name: { type: string }
|
||||||
|
* establishment_contact_person_designation: { type: string }
|
||||||
|
* establishment_mobile_number: { type: string }
|
||||||
|
* establishment_contact_email: { type: string }
|
||||||
|
* establishment_website: { type: string }
|
||||||
|
* corporate_same_as_establishment: { type: boolean }
|
||||||
|
* corporate_name: { type: string }
|
||||||
|
* corporate_address: { type: string }
|
||||||
|
* corporate_city_town_id: { type: integer, description: "FK from city_towns" }
|
||||||
|
* corporate_emirate_id: { type: integer, description: "FK from emirates" }
|
||||||
|
* corporate_postal_code: { type: string }
|
||||||
|
* corporate_po_box: { type: string }
|
||||||
|
* corporate_makani_number: { type: string }
|
||||||
|
* corporate_contact_person_name: { type: string }
|
||||||
|
* corporate_contact_person_designation: { type: string }
|
||||||
|
* corporate_mobile_number: { type: string }
|
||||||
|
* corporate_email: { type: string }
|
||||||
|
* corporate_website: { type: string }
|
||||||
* emirati_male: { type: integer }
|
* emirati_male: { type: integer }
|
||||||
* emirati_female: { type: integer }
|
* emirati_female: { type: integer }
|
||||||
* non_emirati_male: { type: integer }
|
* non_emirati_male: { type: integer }
|
||||||
* non_emirati_female: { type: integer }
|
* non_emirati_female: { type: integer }
|
||||||
* total_emirati: { type: integer }
|
* total_emirati: { type: integer }
|
||||||
* total_employees: { type: integer }
|
* total_employees: { type: integer }
|
||||||
|
* updated_by: { type: integer }
|
||||||
* responses:
|
* responses:
|
||||||
* 200:
|
* 200:
|
||||||
* description: Establishment updated successfully
|
* description: Establishment updated successfully
|
||||||
@ -2261,6 +2346,54 @@ router.post("/forgot-password/verify-otp", establishmentController.forgotPasswor
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /api/emirates:
|
||||||
|
* get:
|
||||||
|
* summary: Get all Emirates
|
||||||
|
* tags: [Master]
|
||||||
|
* security:
|
||||||
|
* - appSignature: []
|
||||||
|
* - bearerAuth: []
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: Emirates fetched successfully
|
||||||
|
* 500:
|
||||||
|
* description: Server error
|
||||||
|
*/
|
||||||
|
router.get("/emirates", [verifySignature, verifyToken], establishmentController.getAllEmirates);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @swagger
|
||||||
|
* /api/city-towns:
|
||||||
|
* get:
|
||||||
|
* summary: Get all City/Town (optional filter by emirate_id)
|
||||||
|
* tags: [Master]
|
||||||
|
* security:
|
||||||
|
* - appSignature: []
|
||||||
|
* - bearerAuth: []
|
||||||
|
* parameters:
|
||||||
|
* - in: query
|
||||||
|
* name: emirate_id
|
||||||
|
* schema:
|
||||||
|
* type: integer
|
||||||
|
* description: Filter cities by emirate_id
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: City/Town fetched successfully
|
||||||
|
* 500:
|
||||||
|
* description: Server error
|
||||||
|
*/
|
||||||
|
router.get("/city-towns", [verifySignature, verifyToken], establishmentController.getAllCityTowns);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user